diff --git a/DEPS b/DEPS
index c601d53..c3fde421 100644
--- a/DEPS
+++ b/DEPS
@@ -177,7 +177,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:c9957ed0ce0fd363aac127056344eba1b873bad0',
+  'luci_go': 'git_revision:2cc9805d5ad186367461ef1c4f0c59098b450418',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -209,7 +209,7 @@
   # 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': 'a1a3afe95136aa688372af3047ef9d3a4688096b',
+  'skia_revision': '08d0d86b8180011a57f00281f1884a74476850a8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -229,7 +229,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '5790eb518cf476b473e52b0a03784e699580abe5',
+  'pdfium_revision': 'bb27d59629cb6011dd98dbe3ffcf205687ec93bb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -288,7 +288,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': '49b68def657abf35d54d044317854c5d66973a5e',
+  'devtools_frontend_revision': 'f5ed01df29c3e27ab2e9b21389ec7c46a38e7368',
   # 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.
@@ -328,7 +328,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'cac1d35f71cc361952a6da85588844da20600bf8',
+  'dawn_revision': 'b44000e7af648a05fe7075ac189d9174a05654b0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -573,7 +573,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '22faa4d34a5ecc871cce0c9d115c3ca7b028f0da',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '07075f8e7a9e8db5422cd62b37e7f93967292d8f',
       'condition': 'checkout_ios',
   },
 
@@ -643,7 +643,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'AuRsBzJA9Y6af0fcM4IGlO6_aewhxhwOsNR1GkV39aYC',
+          'version': 'uPb1yeI6S76mes4-I2-QnICUSuSlqx2HtNtKj_VwNjsC',
         },
       ],
       'dep_type': 'cipd',
@@ -654,7 +654,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'WOrwX1yQ3gpyGuJlcfl4bzOHIPiGcSr3FBvYYMs-DW8C',
+          'version': 'qO5bBO5jhQMaN1C-qNqj9qkQhx8yPh6D_-6YqYZ0_d4C',
         },
       ],
       'dep_type': 'cipd',
@@ -665,7 +665,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': '6EZxobRsu9uWCW3TGRN0cj_8H388lPgt2e2AV0NJEcoC',
+          'version': 'r2LdbqZcTkgMTleeafRmqwbJpZIC-G_0ocKSOcIT3oUC',
         },
       ],
       'dep_type': 'cipd',
@@ -966,7 +966,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '9705687c250c2f5a3e5eb5e9491ded272f53cdc1',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '88910921065a288830f04199aedd2a41da3c6c40',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1349,7 +1349,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'ae2171b89cb3e49f73ff100fc1647a93048ca472',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '5874d918cfb305895233228f4307b00fe5ac9c2d',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1560,7 +1560,7 @@
 
   # Wayland protocols that add functionality not available in the core protocol.
   'src/third_party/wayland-protocols/src': {
-      'url': Var('chromium_git') + '/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git' + '@' + '684cd23ae31fafb9eda2a0cd15edb4e96de92259',
+      'url': Var('chromium_git') + '/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git' + '@' + '177ff9119da526462e5d35fbfde6c84794913787',
       'condition': 'checkout_linux',
   },
 
@@ -1571,10 +1571,10 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'a0b8774ce8cec1dc8f4308810bf05eb8867c62de',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'd3af0bf85d4771b0809a4571bb01ac3f8edeb8a0',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6e5cab434bacd6fcbb833b8e5cb8ff47495d4a64',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '43eb4f588646c346c97a1e1c1dda00dd837b13db',
+    Var('webrtc_git') + '/src.git' + '@' + 'd25af8ceac786684fed6c801b0f9c5e76443b640',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1635,7 +1635,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3ed0d614fb4afb27e048f1ff9e387a4885794a04',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d932a2542eedd96d513e33e17cc2afb2a9120eec',
     'condition': 'checkout_src_internal',
   },
 
@@ -1643,7 +1643,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/eche_app/app',
-        'version': 'AUJhYkzbzJl9DaA6dZf9n-deCS26X6bkSED8DZ5yKuQC',
+        'version': 'xOL6NPitN97NnC6-mtC9UiA6_mh3TTXh7NGMHD5f3SUC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 61ec9599..3a07e2d 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1142,8 +1142,8 @@
     'build/android/gyp/prepare_resources.pydeps',
     'build/android/gyp/process_native_prebuilt.pydeps',
     'build/android/gyp/proguard.pydeps',
+    'build/android/gyp/resources_shrinker/shrinker.pydeps',
     'build/android/gyp/turbine.pydeps',
-    'build/android/gyp/unused_resources.pydeps',
     'build/android/gyp/validate_static_library_dex_references.pydeps',
     'build/android/gyp/write_build_config.pydeps',
     'build/android/gyp/write_native_libraries_java.pydeps',
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn
index d64c05d..c72525b 100644
--- a/android_webview/browser/BUILD.gn
+++ b/android_webview/browser/BUILD.gn
@@ -235,7 +235,6 @@
     "//components/pref_registry",
     "//components/prefs",
     "//components/safe_browsing/android:remote_database_manager",
-    "//components/safe_browsing/content",
     "//components/safe_browsing/content/browser",
     "//components/safe_browsing/content/common:interfaces",
     "//components/safe_browsing/content/web_ui",
diff --git a/android_webview/browser/safe_browsing/aw_safe_browsing_blocking_page.h b/android_webview/browser/safe_browsing/aw_safe_browsing_blocking_page.h
index 900b57a..875bade 100644
--- a/android_webview/browser/safe_browsing/aw_safe_browsing_blocking_page.h
+++ b/android_webview/browser/safe_browsing/aw_safe_browsing_blocking_page.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "android_webview/browser/network_service/aw_web_resource_request.h"
-#include "components/safe_browsing/content/base_blocking_page.h"
+#include "components/safe_browsing/content/browser/base_blocking_page.h"
 #include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
 
 namespace security_interstitials {
diff --git a/android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.cc b/android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.cc
index e86c9b0..b9cbfab6 100644
--- a/android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.cc
+++ b/android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.cc
@@ -16,7 +16,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/path_service.h"
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/safe_browsing/core/browser/safe_browsing_network_context.h"
 #include "components/safe_browsing/core/common/safebrowsing_constants.h"
 #include "components/safe_browsing/core/db/v4_protocol_manager_util.h"
diff --git a/android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h b/android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h
index 47f200a..d602619 100644
--- a/android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h
+++ b/android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <string>
 
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/security_interstitials/core/unsafe_resource.h"
 #include "content/public/browser/web_contents.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index b561b22..734af6cb 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -460,11 +460,6 @@
 const base::Feature kEnableInputNoiseCancellationUi{
     "EnableInputNoiseCancellationUi", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Enables the Kerberos Section in ChromeOS settings. When disabled, Kerberos
-// settings will stay under People Section. https://crbug.com/983041
-const base::Feature kKerberosSettingsSection{"KerberosSettingsSection",
-                                             base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enables to use lacros-chrome as a primary web browser on Chrome OS.
 // This works only when LacrosSupport below is enabled.
 // NOTE: Use crosapi::browser_util::IsLacrosPrimary() instead of checking
@@ -864,10 +859,6 @@
       kInstantTetheringBackgroundAdvertisementSupport);
 }
 
-bool IsKerberosSettingsSectionEnabled() {
-  return base::FeatureList::IsEnabled(kKerberosSettingsSection);
-}
-
 bool IsMicMuteNotificationsEnabled() {
   return base::FeatureList::IsEnabled(kMicMuteNotifications);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 814ca9c..f2355fa 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -208,7 +208,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kInstantTethering;
 COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const base::Feature kKerberosSettingsSection;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosSupport;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosPrimary;
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -378,7 +377,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsInputInDiagnosticsAppEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsInstantTetheringBackgroundAdvertisingSupported();
-COMPONENT_EXPORT(ASH_CONSTANTS) bool IsKerberosSettingsSectionEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsMicMuteNotificationsEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsMinimumChromeVersionEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsNetworkingInDiagnosticsAppEnabled();
diff --git a/ash/login/ui/animated_rounded_image_view.cc b/ash/login/ui/animated_rounded_image_view.cc
index 1354083..bfb4f03 100644
--- a/ash/login/ui/animated_rounded_image_view.cc
+++ b/ash/login/ui/animated_rounded_image_view.cc
@@ -21,7 +21,8 @@
 class SingleFrameImageDecoder
     : public AnimatedRoundedImageView::AnimationDecoder {
  public:
-  SingleFrameImageDecoder(const gfx::ImageSkia& image) : image_(image) {}
+  explicit SingleFrameImageDecoder(const gfx::ImageSkia& image)
+      : image_(image) {}
   ~SingleFrameImageDecoder() override = default;
 
   // AnimatedRoundedImageView::AnimationDecoder:
diff --git a/ash/login/ui/bottom_status_indicator.h b/ash/login/ui/bottom_status_indicator.h
index c0487e0..e5ac791 100644
--- a/ash/login/ui/bottom_status_indicator.h
+++ b/ash/login/ui/bottom_status_indicator.h
@@ -20,7 +20,7 @@
  public:
   using TappedCallback = base::RepeatingClosure;
 
-  BottomStatusIndicator(TappedCallback on_tapped_callback);
+  explicit BottomStatusIndicator(TappedCallback on_tapped_callback);
   BottomStatusIndicator(const BottomStatusIndicator&) = delete;
   BottomStatusIndicator& operator=(const BottomStatusIndicator&) = delete;
   ~BottomStatusIndicator() override;
diff --git a/ash/login/ui/login_base_bubble_view.cc b/ash/login/ui/login_base_bubble_view.cc
index e64deee..d2776a7 100644
--- a/ash/login/ui/login_base_bubble_view.cc
+++ b/ash/login/ui/login_base_bubble_view.cc
@@ -47,7 +47,7 @@
 // associated bubble in response.
 class LoginBubbleHandler : public ui::EventHandler {
  public:
-  LoginBubbleHandler(LoginBaseBubbleView* bubble) : bubble_(bubble) {
+  explicit LoginBubbleHandler(LoginBaseBubbleView* bubble) : bubble_(bubble) {
     Shell::Get()->AddPreTargetHandler(this);
   }
 
diff --git a/ash/login/ui/login_user_view.cc b/ash/login/ui/login_user_view.cc
index e9504de..df220e66 100644
--- a/ash/login/ui/login_user_view.cc
+++ b/ash/login/ui/login_user_view.cc
@@ -88,7 +88,7 @@
 class PassthroughAnimationDecoder
     : public AnimatedRoundedImageView::AnimationDecoder {
  public:
-  PassthroughAnimationDecoder(const AnimationFrames& frames)
+  explicit PassthroughAnimationDecoder(const AnimationFrames& frames)
       : frames_(frames) {}
   ~PassthroughAnimationDecoder() override = default;
 
@@ -102,7 +102,7 @@
 
 class IconRoundedView : public views::View {
  public:
-  IconRoundedView(int size) : size_(size) {}
+  explicit IconRoundedView(int size) : size_(size) {}
   ~IconRoundedView() override = default;
 
   IconRoundedView(const IconRoundedView&) = delete;
@@ -166,7 +166,7 @@
     LoginUserView::UserImage* const view_;
   };
 
-  UserImage(LoginDisplayStyle style)
+  explicit UserImage(LoginDisplayStyle style)
       : NonAccessibleView(kLoginUserImageClassName) {
     SetLayoutManager(std::make_unique<views::FillLayout>());
 
diff --git a/ash/login/ui/public_account_warning_dialog.h b/ash/login/ui/public_account_warning_dialog.h
index 189d3461..b1042cb 100644
--- a/ash/login/ui/public_account_warning_dialog.h
+++ b/ash/login/ui/public_account_warning_dialog.h
@@ -17,7 +17,7 @@
 // clicks on the learn more link on the pubic account expanded view.
 class ASH_EXPORT PublicAccountWarningDialog : public views::DialogDelegateView {
  public:
-  PublicAccountWarningDialog(
+  explicit PublicAccountWarningDialog(
       base::WeakPtr<LoginExpandedPublicAccountView> controller);
   ~PublicAccountWarningDialog() override;
 
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index adce0b7f..0ec6caa 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -474,7 +474,7 @@
 <translation id="4696813013609194136">Gerät mit Elterncode entsperren</translation>
 <translation id="4702647871202761252">Der Datenschutzbildschirm ist momentan deaktiviert</translation>
 <translation id="4705716602320768426">Feedback geben</translation>
-<translation id="4731797938093519117">Elternfreigabe</translation>
+<translation id="4731797938093519117">Elternzugang</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4735498845456076464">Die Tastenkombination <ph name="LAUNCHER_KEY_NAME" /> + Ziffer hat sich geändert. Wenn Sie jetzt eine Funktionstaste benötigen, drücken Sie die <ph name="LAUNCHER_KEY_NAME" />-Taste + eine Taste in der oberen Reihe.</translation>
 <translation id="4744944742468440486">Informationen in Bezug auf Ihre Auswahl</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index d43be3c..b29b887 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -253,7 +253,7 @@
 <translation id="3017687597151988916">ناحیه انتخاب روی پنجره تنظیم شد</translation>
 <translation id="3033545621352269033">روشن</translation>
 <translation id="3036649622769666520">باز کردن فایل‌ها</translation>
-<translation id="3038571455154067151">‏برای ورود به سیستم، کد دسترسی والدین Family Link خود را وارد کنید</translation>
+<translation id="3038571455154067151">‏برای ورود به سیستم، کد دسترسی ولی Family Link خود را وارد کنید</translation>
 <translation id="3039939407102840004">شارژ باتری قلم <ph name="PERCENTAGE" /> درصد است.</translation>
 <translation id="3045488863354895414">بعدازظهر به‌خیر،</translation>
 <translation id="3051189971848907985">درحال تغییر نام نمایه. چند دقیقه صبر کنید.</translation>
@@ -474,7 +474,7 @@
 <translation id="4696813013609194136">باز کردن قفل دستگاه با کد والدین</translation>
 <translation id="4702647871202761252">صفحه حریم‌خصوصی خاموش است</translation>
 <translation id="4705716602320768426">ثبت بازخورد</translation>
-<translation id="4731797938093519117">دسترسی والدین</translation>
+<translation id="4731797938093519117">دسترسی ولی</translation>
 <translation id="4734965478015604180">افقی</translation>
 <translation id="4735498845456076464">میان‌بر صفحه‌کلید «<ph name="LAUNCHER_KEY_NAME" /> + عدد» تغییر کرده است. برای استفاده از کلیدهای عملکرد، کلید <ph name="LAUNCHER_KEY_NAME" /> + یکی از کلیدهای ردیف بالا را فشار دهید.</translation>
 <translation id="4744944742468440486">اطلاعات مرتبط با انتخاب شما</translation>
@@ -786,7 +786,7 @@
 <translation id="7378889811480108604">حالت «بهینه‌سازی باتری» خاموش است</translation>
 <translation id="7392563512730092880">همیشه می‌توانید راه‌اندازی را در زمان دیگری ازطریق «تنظیمات» انجام دهید.</translation>
 <translation id="7398254312354928459">اتصال شبکه تغییریافته</translation>
-<translation id="7405710164030118432">‏برای باز کردن قفل دستگاه، کد دسترسی والدین را برای Family Link وارد کنید</translation>
+<translation id="7405710164030118432">‏برای باز کردن قفل دستگاه، کد دسترسی ولی را برای Family Link وارد کنید</translation>
 <translation id="7406608787870898861">تکمیل کردن راه‌اندازی شبکه تلفن همراه</translation>
 <translation id="741244894080940828">تبدیل</translation>
 <translation id="7413851974711031813">برای بستن، کلید «گریز» را فشار دهید</translation>
@@ -943,7 +943,7 @@
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> باقی‌مانده</translation>
 <translation id="8641805545866562088">درحال بازخوانی فهرست نمایه. چند دقیقه صبر کنید.</translation>
 <translation id="8646417893960517480">زمان‌سنج <ph name="TOTAL_TIME" /></translation>
-<translation id="8647931990447795414">‏برای افزودن فرد، کد دسترسی والدین Family Link خود را وارد کنید</translation>
+<translation id="8647931990447795414">‏برای افزودن فرد، کد دسترسی ولی Family Link خود را وارد کنید</translation>
 <translation id="8649101189709089199">انتخاب برای شنیدن</translation>
 <translation id="8652175077544655965">بستن تنظیمات</translation>
 <translation id="8653151467777939995">نمایش تنظیمات اعلان. اعلان‌ها روشن است</translation>
@@ -997,7 +997,7 @@
 <translation id="8983038754672563810">HSPA</translation>
 <translation id="8990809378771970590">درحال استفاده از <ph name="IME_NAME" /></translation>
 <translation id="899350903320462459">به‌عنوان <ph name="LOGIN_ID" />، قفل دستگاه را باز کنید تا کنش اعلان اجرا شود</translation>
-<translation id="9017320285115481645">‏کد دسترسی والدین Family Link را وارد کنید</translation>
+<translation id="9017320285115481645">‏کد دسترسی ولی Family Link را وارد کنید</translation>
 <translation id="9024331582947483881">تمام‌صفحه</translation>
 <translation id="9047624247355796468">باز کردن تنظیمات <ph name="NETWORK_NAME" /></translation>
 <translation id="9056839673611986238">دستگاه عقب‌گرد می‌کند</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index acab42ed..caaac5e 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -1003,7 +1003,7 @@
 <translation id="9056839673611986238">ਡੀਵਾਈਸ ਨੂੰ ਪਿਛਲੇ ਵਰਜਨ 'ਤੇ ਵਾਪਸ ਲਿਆਇਆ ਜਾਵੇਗਾ</translation>
 <translation id="9063800855227801443">ਗੁਪਤ ਸਮੱਗਰੀ ਨੂੰ ਕੈਪਚਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation>
 <translation id="9065203028668620118">ਸੰਪਾਦਿਤ ਕਰੋ</translation>
-<translation id="9070640332319875144">'ਅਸਿਸਟੈਂਟ' ਸੈਟਿੰਗਾਂ</translation>
+<translation id="9070640332319875144">'Assistant' ਸੈਟਿੰਗਾਂ</translation>
 <translation id="9072519059834302790">ਬੈਟਰੀ ਮੁੱਕਣ ਵਿੱਚ <ph name="TIME_LEFT" /> ਬਾਕੀ।</translation>
 <translation id="9074739597929991885">ਬਲੂਟੁੱਥ</translation>
 <translation id="9077515519330855811">ਮੀਡੀਆ ਕੰਟਰੋਲ, ਹੁਣ <ph name="MEDIA_TITLE" /> ਚੱਲ ਰਿਹਾ ਹੈ</translation>
diff --git a/base/allocator/partition_allocator/partition_alloc_config.h b/base/allocator/partition_allocator/partition_alloc_config.h
index c5ccd81..6d15bfd 100644
--- a/base/allocator/partition_allocator/partition_alloc_config.h
+++ b/base/allocator/partition_allocator/partition_alloc_config.h
@@ -33,9 +33,12 @@
 
 #if defined(PA_HAS_64_BITS_POINTERS) && \
     (defined(OS_LINUX) || defined(OS_ANDROID))
+#include <linux/version.h>
 // TODO(bikineev): Enable for ChromeOS.
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
 #define PA_STARSCAN_UFFD_WRITE_PROTECTOR_SUPPORTED
 #endif
+#endif
 
 // POSIX is not only UNIX, e.g. macOS and other OSes. We do use Linux-specific
 // features such as futex(2).
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py
index 42b34f2..48409de 100755
--- a/build/android/gyp/compile_resources.py
+++ b/build/android/gyp/compile_resources.py
@@ -177,10 +177,29 @@
       '--no-xml-namespaces',
       action='store_true',
       help='Whether to strip xml namespaces from processed xml resources.')
+  input_opts.add_argument(
+      '--short-resource-paths',
+      action='store_true',
+      help='Whether to shorten resource paths inside the apk or module.')
+  input_opts.add_argument(
+      '--strip-resource-names',
+      action='store_true',
+      help='Whether to strip resource names from the resource table of the apk '
+      'or module.')
 
   output_opts.add_argument('--arsc-path', help='Apk output for arsc format.')
   output_opts.add_argument('--proto-path', help='Apk output for proto format.')
   group = input_opts.add_mutually_exclusive_group()
+  group.add_argument(
+      '--optimized-arsc-path',
+      help='Output for `aapt2 optimize` for arsc format (enables the step).')
+  group.add_argument(
+      '--optimized-proto-path',
+      help='Output for `aapt2 optimize` for proto format (enables the step).')
+  input_opts.add_argument(
+      '--resources-config-paths',
+      default='[]',
+      help='GN list of paths to aapt2 resources config files.')
 
   output_opts.add_argument(
       '--info-path', help='Path to output info file for the partial apk.')
@@ -203,6 +222,11 @@
   output_opts.add_argument(
       '--emit-ids-out', help='Path to file produced by aapt2 --emit-ids.')
 
+  output_opts.add_argument(
+      '--resources-path-map-out-path',
+      help='Path to file produced by aapt2 that maps original resource paths '
+      'to shortened resource paths inside the apk or module.')
+
   input_opts.add_argument(
       '--is-bundle-module',
       action='store_true',
@@ -233,10 +257,20 @@
       options.values_filter_rules)
   options.extra_main_r_text_files = build_utils.ParseGnList(
       options.extra_main_r_text_files)
+  options.resources_config_paths = build_utils.ParseGnList(
+      options.resources_config_paths)
+
+  if options.optimized_proto_path and not options.proto_path:
+    # We could write to a temp file, but it's simpler to require it.
+    parser.error('--optimized-proto-path requires --proto-path')
 
   if not options.arsc_path and not options.proto_path:
     parser.error('One of --arsc-path or --proto-path is required.')
 
+  if options.resources_path_map_out_path and not options.short_resource_paths:
+    parser.error(
+        '--resources-path-map-out-path requires --short-resource-paths')
+
   if options.package_id and options.shared_resources:
     parser.error('--package-id and --shared-resources are mutually exclusive')
 
@@ -812,6 +846,9 @@
 
   # We always create a binary arsc file first, then convert to proto, so flags
   # such as --shared-lib can be supported.
+  arsc_path = build.arsc_path
+  if arsc_path is None:
+    _, arsc_path = tempfile.mkstmp()
   link_command += ['-o', build.arsc_path]
 
   logging.debug('Starting: aapt2 link')
@@ -859,9 +896,100 @@
         build.arsc_path, build.proto_path
     ])
 
+  if build.arsc_path is None:
+    os.remove(arsc_path)
+
+  if options.optimized_proto_path:
+    _OptimizeApk(build.optimized_proto_path, options, build.temp_dir,
+                 build.proto_path, build.r_txt_path)
+  elif options.optimized_arsc_path:
+    _OptimizeApk(build.optimized_arsc_path, options, build.temp_dir,
+                 build.arsc_path, build.r_txt_path)
+
   return desired_manifest_package_name
 
 
+def _CombineResourceConfigs(resources_config_paths, out_config_path):
+  with open(out_config_path, 'w') as out_config:
+    for config_path in resources_config_paths:
+      with open(config_path) as config:
+        out_config.write(config.read())
+        out_config.write('\n')
+
+
+def _OptimizeApk(output, options, temp_dir, unoptimized_path, r_txt_path):
+  """Optimize intermediate .ap_ file with aapt2.
+
+  Args:
+    output: Path to write to.
+    options: The command-line options.
+    temp_dir: A temporary directory.
+    unoptimized_path: path of the apk to optimize.
+    r_txt_path: path to the R.txt file of the unoptimized apk.
+  """
+  optimize_command = [
+      options.aapt2_path,
+      'optimize',
+      unoptimized_path,
+      '-o',
+      output,
+  ]
+
+  # Optimize the resources.arsc file by obfuscating resource names and only
+  # allow usage via R.java constant.
+  if options.strip_resource_names:
+    no_collapse_resources = _ExtractNonCollapsableResources(r_txt_path)
+    gen_config_path = os.path.join(temp_dir, 'aapt2.config')
+    if options.resources_config_paths:
+      _CombineResourceConfigs(options.resources_config_paths, gen_config_path)
+    with open(gen_config_path, 'a') as config:
+      for resource in no_collapse_resources:
+        config.write('{}#no_collapse\n'.format(resource))
+
+    optimize_command += [
+        '--collapse-resource-names',
+        '--resources-config-path',
+        gen_config_path,
+    ]
+
+  if options.short_resource_paths:
+    optimize_command += ['--shorten-resource-paths']
+  if options.resources_path_map_out_path:
+    optimize_command += [
+        '--resource-path-shortening-map', options.resources_path_map_out_path
+    ]
+
+  logging.debug('Running aapt2 optimize')
+  build_utils.CheckOutput(
+      optimize_command, print_stdout=False, print_stderr=False)
+
+
+def _ExtractNonCollapsableResources(rtxt_path):
+  """Extract resources that should not be collapsed from the R.txt file
+
+  Resources of type ID are references to UI elements/views. They are used by
+  UI automation testing frameworks. They are kept in so that they don't break
+  tests, even though they may not actually be used during runtime. See
+  https://crbug.com/900993
+  App icons (aka mipmaps) are sometimes referenced by other apps by name so must
+  be keps as well. See https://b/161564466
+
+  Args:
+    rtxt_path: Path to R.txt file with all the resources
+  Returns:
+    List of resources in the form of <resource_type>/<resource_name>
+  """
+  resources = []
+  _NO_COLLAPSE_TYPES = ['id', 'mipmap']
+  with open(rtxt_path) as rtxt:
+    for line in rtxt:
+      for resource_type in _NO_COLLAPSE_TYPES:
+        if ' {} '.format(resource_type) in line:
+          resource_name = line.split()[2]
+          resources.append('{}/{}'.format(resource_type, resource_name))
+  return resources
+
+
 @contextlib.contextmanager
 def _CreateStableIdsFile(in_path, out_path, package_name):
   """Transforms a file generated by --emit-ids from another package.
@@ -890,6 +1018,8 @@
       (options.r_text_out, build.r_txt_path),
       (options.arsc_path, build.arsc_path),
       (options.proto_path, build.proto_path),
+      (options.optimized_arsc_path, build.optimized_arsc_path),
+      (options.optimized_proto_path, build.optimized_proto_path),
       (options.proguard_file, build.proguard_path),
       (options.proguard_file_main_dex, build.proguard_main_dex_path),
       (options.emit_ids_out, build.emit_ids_path),
diff --git a/build/android/gyp/optimize_resources.py b/build/android/gyp/optimize_resources.py
deleted file mode 100755
index d3b11636..0000000
--- a/build/android/gyp/optimize_resources.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/env python3
-#
-# 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 argparse
-import logging
-import os
-import sys
-
-from util import build_utils
-
-
-def _ParseArgs(args):
-  """Parses command line options.
-
-  Returns:
-    An options object as from argparse.ArgumentParser.parse_args()
-  """
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--aapt2-path',
-                      required=True,
-                      help='Path to the Android aapt2 tool.')
-  parser.add_argument(
-      '--short-resource-paths',
-      action='store_true',
-      help='Whether to shorten resource paths inside the apk or module.')
-  parser.add_argument(
-      '--strip-resource-names',
-      action='store_true',
-      help='Whether to strip resource names from the resource table of the apk '
-      'or module.')
-  parser.add_argument('--proto-path',
-                      required=True,
-                      help='Input proto format resources APK.')
-  parser.add_argument('--resources-config-paths',
-                      default='[]',
-                      help='GN list of paths to aapt2 resources config files.')
-  parser.add_argument('--r-text-in',
-                      required=True,
-                      help='Path to R.txt. Used to exclude id/ resources.')
-  parser.add_argument(
-      '--resources-path-map-out-path',
-      help='Path to file produced by aapt2 that maps original resource paths '
-      'to shortened resource paths inside the apk or module.')
-  parser.add_argument('--optimized-proto-path',
-                      required=True,
-                      help='Output for `aapt2 optimize`.')
-  options = parser.parse_args(args)
-
-  options.resources_config_paths = build_utils.ParseGnList(
-      options.resources_config_paths)
-
-  if options.resources_path_map_out_path and not options.short_resource_paths:
-    parser.error(
-        '--resources-path-map-out-path requires --short-resource-paths')
-  return options
-
-
-def _CombineResourceConfigs(resources_config_paths, out_config_path):
-  with open(out_config_path, 'w') as out_config:
-    for config_path in resources_config_paths:
-      with open(config_path) as config:
-        out_config.write(config.read())
-        out_config.write('\n')
-
-
-def _ExtractNonCollapsableResources(rtxt_path):
-  """Extract resources that should not be collapsed from the R.txt file
-
-  Resources of type ID are references to UI elements/views. They are used by
-  UI automation testing frameworks. They are kept in so that they don't break
-  tests, even though they may not actually be used during runtime. See
-  https://crbug.com/900993
-  App icons (aka mipmaps) are sometimes referenced by other apps by name so must
-  be keps as well. See https://b/161564466
-
-  Args:
-    rtxt_path: Path to R.txt file with all the resources
-  Returns:
-    List of resources in the form of <resource_type>/<resource_name>
-  """
-  resources = []
-  _NO_COLLAPSE_TYPES = ['id', 'mipmap']
-  with open(rtxt_path) as rtxt:
-    for line in rtxt:
-      for resource_type in _NO_COLLAPSE_TYPES:
-        if ' {} '.format(resource_type) in line:
-          resource_name = line.split()[2]
-          resources.append('{}/{}'.format(resource_type, resource_name))
-  return resources
-
-
-def _OptimizeApk(output, options, temp_dir, unoptimized_path, r_txt_path):
-  """Optimize intermediate .ap_ file with aapt2.
-
-  Args:
-    output: Path to write to.
-    options: The command-line options.
-    temp_dir: A temporary directory.
-    unoptimized_path: path of the apk to optimize.
-    r_txt_path: path to the R.txt file of the unoptimized apk.
-  """
-  optimize_command = [
-      options.aapt2_path,
-      'optimize',
-      unoptimized_path,
-      '-o',
-      output,
-  ]
-
-  # Optimize the resources.pb file by obfuscating resource names and only
-  # allow usage via R.java constant.
-  if options.strip_resource_names:
-    no_collapse_resources = _ExtractNonCollapsableResources(r_txt_path)
-    gen_config_path = os.path.join(temp_dir, 'aapt2.config')
-    if options.resources_config_paths:
-      _CombineResourceConfigs(options.resources_config_paths, gen_config_path)
-    with open(gen_config_path, 'a') as config:
-      for resource in no_collapse_resources:
-        config.write('{}#no_collapse\n'.format(resource))
-
-    optimize_command += [
-        '--collapse-resource-names',
-        '--resources-config-path',
-        gen_config_path,
-    ]
-
-  if options.short_resource_paths:
-    optimize_command += ['--shorten-resource-paths']
-  if options.resources_path_map_out_path:
-    optimize_command += [
-        '--resource-path-shortening-map', options.resources_path_map_out_path
-    ]
-
-  logging.debug('Running aapt2 optimize')
-  build_utils.CheckOutput(optimize_command,
-                          print_stdout=False,
-                          print_stderr=False)
-
-
-def main(args):
-  options = _ParseArgs(args)
-  with build_utils.TempDir() as temp_dir:
-    _OptimizeApk(options.optimized_proto_path, options, temp_dir,
-                 options.proto_path, options.r_text_in)
-
-
-if __name__ == '__main__':
-  main(sys.argv[1:])
diff --git a/build/android/gyp/optimize_resources.pydeps b/build/android/gyp/optimize_resources.pydeps
deleted file mode 100644
index e69de29..0000000
--- a/build/android/gyp/optimize_resources.pydeps
+++ /dev/null
diff --git a/build/android/gyp/resources_shrinker/BUILD.gn b/build/android/gyp/resources_shrinker/BUILD.gn
new file mode 100644
index 0000000..e6381e1
--- /dev/null
+++ b/build/android/gyp/resources_shrinker/BUILD.gn
@@ -0,0 +1,15 @@
+import("//build/config/android/rules.gni")
+
+java_binary("resources_shrinker") {
+  sources = [ "//build/android/gyp/resources_shrinker/Shrinker.java" ]
+  main_class = "build.android.gyp.resources_shrinker.Shrinker"
+  deps = [
+    "//third_party/android_deps:com_android_tools_common_java",
+    "//third_party/android_deps:com_android_tools_layoutlib_layoutlib_api_java",
+    "//third_party/android_deps:com_android_tools_sdk_common_java",
+    "//third_party/android_deps:com_google_guava_guava_java",
+    "//third_party/android_deps:org_jetbrains_kotlin_kotlin_stdlib_java",
+    "//third_party/r8:r8_java",
+  ]
+  wrapper_script_name = "helper/resources_shrinker"
+}
diff --git a/build/android/unused_resources/UnusedResources.java b/build/android/gyp/resources_shrinker/Shrinker.java
similarity index 94%
rename from build/android/unused_resources/UnusedResources.java
rename to build/android/gyp/resources_shrinker/Shrinker.java
index 6334223..50e2f93e 100644
--- a/build/android/unused_resources/UnusedResources.java
+++ b/build/android/gyp/resources_shrinker/Shrinker.java
@@ -19,7 +19,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package build.android.unused_resources;
+package build.android.gyp.resources_shrinker;
 
 import static com.android.ide.common.symbols.SymbolIo.readFromAapt;
 import static com.android.utils.SdkUtils.endsWithIgnoreCase;
@@ -44,7 +44,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Closeables;
-import com.google.common.io.Files;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
@@ -55,6 +54,7 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Arrays;
@@ -77,7 +77,7 @@
     - Reduce dependencies unless absolutely required.
 */
 
-public class UnusedResources {
+public class Shrinker {
     private static final String ANDROID_RES = "android_res/";
     private static final String DOT_DEX = ".dex";
     private static final String DOT_CLASS = ".class";
@@ -97,6 +97,9 @@
     private final StringWriter mDebugOutput;
     private final PrintWriter mDebugPrinter;
 
+    /** Easy way to invoke more verbose output for debugging */
+    private boolean mDebug = false;
+
     /** The computed set of unused resources */
     private List<Resource> mUnused;
 
@@ -133,8 +136,8 @@
         }
     }
 
-    public UnusedResources(Iterable<File> rTxtFiles, Iterable<File> classes,
-            Iterable<File> manifests, File mapping, Iterable<File> resources, File reportFile) {
+    public Shrinker(Iterable<File> rTxtFiles, Iterable<File> classes, Iterable<File> manifests,
+            File mapping, Iterable<File> resources, File reportFile) {
         mRTxtFiles = rTxtFiles;
         mProguardMapping = mapping;
         mClasses = classes;
@@ -210,11 +213,13 @@
             throws IOException, SAXException, ParserConfigurationException {
         for (File resDir : resources) {
             File[] resourceFolders = resDir.listFiles();
-            assert resourceFolders != null : "Invalid resource directory " + resDir;
-            for (File folder : resourceFolders) {
-                ResourceFolderType folderType = ResourceFolderType.getFolderType(folder.getName());
-                if (folderType != null) {
-                    recordResources(folderType, folder);
+            if (resourceFolders != null) {
+                for (File folder : resourceFolders) {
+                    ResourceFolderType folderType =
+                            ResourceFolderType.getFolderType(folder.getName());
+                    if (folderType != null) {
+                        recordResources(folderType, folder);
+                    }
                 }
             }
         }
@@ -387,7 +392,7 @@
 
             @Override
             public void referencedInt(int value) {
-                UnusedResources.this.referencedInt("dex", value, file, name);
+                Shrinker.this.referencedInt("dex", value, file, name);
             }
 
             @Override
@@ -497,7 +502,8 @@
 
     private void referencedInt(String context, int value, File file, String currentClass) {
         Resource resource = mModel.getResource(value);
-        if (ResourceUsageModel.markReachable(resource) && mDebugPrinter != null) {
+        if (ResourceUsageModel.markReachable(resource) && mDebug) {
+            assert mDebugPrinter != null : "mDebug is true, but mDebugPrinter is null.";
             mDebugPrinter.println("Marking " + resource + " reachable: referenced from " + context
                     + " in " + file + ":" + currentClass);
         }
@@ -557,7 +563,7 @@
                                         .map(s -> new File(s))
                                         .collect(Collectors.toList());
                     break;
-                case "--dexes":
+                case "--dex":
                     classes = Arrays.stream(args[i + 1].split(":"))
                                       .map(s -> new File(s))
                                       .collect(Collectors.toList());
@@ -585,10 +591,9 @@
                     throw new IllegalArgumentException(args[i] + " is not a valid arg.");
             }
         }
-        UnusedResources unusedResources =
-                new UnusedResources(rTxtFiles, classes, manifests, mapping, resources, log);
-        unusedResources.analyze();
-        unusedResources.close();
-        unusedResources.emitConfig(configPath);
+        Shrinker shrinker = new Shrinker(rTxtFiles, classes, manifests, mapping, resources, log);
+        shrinker.analyze();
+        shrinker.close();
+        shrinker.emitConfig(configPath);
     }
 }
diff --git a/build/android/gyp/unused_resources.py b/build/android/gyp/resources_shrinker/shrinker.py
similarity index 65%
rename from build/android/gyp/unused_resources.py
rename to build/android/gyp/resources_shrinker/shrinker.py
index 4b603d1..2800ce29 100755
--- a/build/android/gyp/unused_resources.py
+++ b/build/android/gyp/resources_shrinker/shrinker.py
@@ -24,21 +24,16 @@
   parser.add_argument(
       '--dependencies-res-zips',
       required=True,
-      action='append',
       help='Resources zip archives to investigate for unused resources.')
-  parser.add_argument('--dexes',
-                      action='append',
+  parser.add_argument('--dex',
                       required=True,
                       help='Path to dex file, or zip with dex files.')
   parser.add_argument(
       '--proguard-mapping',
+      required=True,
       help='Path to proguard mapping file for the optimized dex.')
-  parser.add_argument('--r-texts',
-                      action='append',
-                      required=True,
-                      help='Path to R.txt')
-  parser.add_argument('--android-manifests',
-                      action='append',
+  parser.add_argument('--r-text', required=True, help='Path to R.txt')
+  parser.add_argument('--android-manifest',
                       required=True,
                       help='Path to AndroidManifest')
   parser.add_argument('--output-config',
@@ -59,31 +54,20 @@
     for dependency_res_zip in options.dependencies_res_zips:
       dep_subdirs += resource_utils.ExtractDeps([dependency_res_zip], temp_dir)
 
-    cmd = [
-        options.script,
-        '--rtxts',
-        ':'.join(options.r_texts),
-        '--manifests',
-        ':'.join(options.android_manifests),
-        '--resourceDirs',
-        ':'.join(dep_subdirs),
-        '--dexes',
-        ':'.join(options.dexes),
-        '--outputConfig',
-        options.output_config,
-    ]
-    if options.proguard_mapping:
-      cmd += [
-          '--mapping',
-          options.proguard_mapping,
-      ]
-    build_utils.CheckOutput(cmd)
+    build_utils.CheckOutput([
+        options.script, '--rtxts', options.r_text, '--manifests',
+        options.android_manifest, '--resourceDirs', ':'.join(dep_subdirs),
+        '--dex', options.dex, '--mapping', options.proguard_mapping,
+        '--outputConfig', options.output_config
+    ])
 
   if options.depfile:
-    depfile_deps = (options.dependencies_res_zips + options.r_texts +
-                    options.android_manifests + options.dexes)
-    if options.proguard_mapping:
-      depfile_deps.append(options.proguard_mapping)
+    depfile_deps = options.dependencies_res_zips + [
+        options.r_text,
+        options.android_manifest,
+        options.dex,
+        options.proguard_mapping,
+    ]
     build_utils.WriteDepfile(options.depfile, options.output_config,
                              depfile_deps)
 
diff --git a/build/android/gyp/resources_shrinker/shrinker.pydeps b/build/android/gyp/resources_shrinker/shrinker.pydeps
new file mode 100644
index 0000000..92c8905e
--- /dev/null
+++ b/build/android/gyp/resources_shrinker/shrinker.pydeps
@@ -0,0 +1,30 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp/resources_shrinker --output build/android/gyp/resources_shrinker/shrinker.pydeps build/android/gyp/resources_shrinker/shrinker.py
+../../../../third_party/jinja2/__init__.py
+../../../../third_party/jinja2/_compat.py
+../../../../third_party/jinja2/asyncfilters.py
+../../../../third_party/jinja2/asyncsupport.py
+../../../../third_party/jinja2/bccache.py
+../../../../third_party/jinja2/compiler.py
+../../../../third_party/jinja2/defaults.py
+../../../../third_party/jinja2/environment.py
+../../../../third_party/jinja2/exceptions.py
+../../../../third_party/jinja2/filters.py
+../../../../third_party/jinja2/idtracking.py
+../../../../third_party/jinja2/lexer.py
+../../../../third_party/jinja2/loaders.py
+../../../../third_party/jinja2/nodes.py
+../../../../third_party/jinja2/optimizer.py
+../../../../third_party/jinja2/parser.py
+../../../../third_party/jinja2/runtime.py
+../../../../third_party/jinja2/tests.py
+../../../../third_party/jinja2/utils.py
+../../../../third_party/jinja2/visitor.py
+../../../../third_party/markupsafe/__init__.py
+../../../../third_party/markupsafe/_compat.py
+../../../../third_party/markupsafe/_native.py
+../../../gn_helpers.py
+../util/__init__.py
+../util/build_utils.py
+../util/resource_utils.py
+shrinker.py
diff --git a/build/android/gyp/unused_resources.pydeps b/build/android/gyp/unused_resources.pydeps
deleted file mode 100644
index 4753ec3..0000000
--- a/build/android/gyp/unused_resources.pydeps
+++ /dev/null
@@ -1,30 +0,0 @@
-# Generated by running:
-#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/unused_resources.pydeps build/android/gyp/unused_resources.py
-../../../third_party/jinja2/__init__.py
-../../../third_party/jinja2/_compat.py
-../../../third_party/jinja2/asyncfilters.py
-../../../third_party/jinja2/asyncsupport.py
-../../../third_party/jinja2/bccache.py
-../../../third_party/jinja2/compiler.py
-../../../third_party/jinja2/defaults.py
-../../../third_party/jinja2/environment.py
-../../../third_party/jinja2/exceptions.py
-../../../third_party/jinja2/filters.py
-../../../third_party/jinja2/idtracking.py
-../../../third_party/jinja2/lexer.py
-../../../third_party/jinja2/loaders.py
-../../../third_party/jinja2/nodes.py
-../../../third_party/jinja2/optimizer.py
-../../../third_party/jinja2/parser.py
-../../../third_party/jinja2/runtime.py
-../../../third_party/jinja2/tests.py
-../../../third_party/jinja2/utils.py
-../../../third_party/jinja2/visitor.py
-../../../third_party/markupsafe/__init__.py
-../../../third_party/markupsafe/_compat.py
-../../../third_party/markupsafe/_native.py
-../../gn_helpers.py
-unused_resources.py
-util/__init__.py
-util/build_utils.py
-util/resource_utils.py
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
index 752ab30..489dc607 100755
--- a/build/android/gyp/write_build_config.py
+++ b/build/android/gyp/write_build_config.py
@@ -966,10 +966,7 @@
   parser.add_option('--resources-zip', help='Path to target\'s resources zip.')
   parser.add_option('--package-name',
       help='Java package name for these resources.')
-  parser.add_option('--android-manifest',
-                    help='Path to the root android manifest.')
-  parser.add_option('--merged-android-manifest',
-                    help='Path to the merged android manifest.')
+  parser.add_option('--android-manifest', help='Path to android manifest.')
   parser.add_option('--resource-dirs', action='append', default=[],
                     help='GYP-list of resource dirs')
   parser.add_option(
@@ -1350,9 +1347,6 @@
   if options.android_manifest:
     deps_info['android_manifest'] = options.android_manifest
 
-  if options.merged_android_manifest:
-    deps_info['merged_android_manifest'] = options.merged_android_manifest
-
   if options.bundled_srcjars:
     deps_info['bundled_srcjars'] = build_utils.ParseGnList(
         options.bundled_srcjars)
diff --git a/build/android/unused_resources/BUILD.gn b/build/android/unused_resources/BUILD.gn
deleted file mode 100644
index 1596104..0000000
--- a/build/android/unused_resources/BUILD.gn
+++ /dev/null
@@ -1,19 +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("//build/config/android/rules.gni")
-
-java_binary("unused_resources") {
-  sources = [ "//build/android/unused_resources/UnusedResources.java" ]
-  main_class = "build.android.unused_resources.UnusedResources"
-  deps = [
-    "//third_party/android_deps:com_android_tools_common_java",
-    "//third_party/android_deps:com_android_tools_layoutlib_layoutlib_api_java",
-    "//third_party/android_deps:com_android_tools_sdk_common_java",
-    "//third_party/android_deps:com_google_guava_guava_java",
-    "//third_party/android_deps:org_jetbrains_kotlin_kotlin_stdlib_java",
-    "//third_party/r8:r8_java",
-  ]
-  wrapper_script_name = "helper/unused_resources"
-}
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index 652ea74..cbfbba9 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -274,7 +274,7 @@
 
     # Desugar lambdas and interfaces methods using Desugar.jar rather than
     # D8/R8. D8/R8 will still be used for backported method desugaring.
-    enable_bazel_desugar = true
+    enable_bazel_desugar = false
 
     # Enables Java library desugaring.
     # This will cause an extra classes.dex file to appear in every apk.
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 3486660..11eb48cd 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -360,12 +360,6 @@
       args += [ "--treat-as-locale-paks" ]
     }
 
-    if (defined(invoker.merged_android_manifest)) {
-      args += [
-        "--merged-android-manifest",
-        rebase_path(invoker.merged_android_manifest, root_build_dir),
-      ]
-    }
     if (defined(invoker.android_manifest)) {
       inputs += [ invoker.android_manifest ]
       args += [
@@ -2255,15 +2249,29 @@
   #     Use resource IDs provided by another APK target when compiling resources
   #     (via. "aapt2 link --stable-ids")
   #
+  #   short_resource_paths: (optional)
+  #     Rename the paths within a the apk to be randomly generated short
+  #     strings to reduce binary size.
+  #
+  #   strip_resource_names: (optional)
+  #     Strip resource names from the resources table of the apk.
   #
   # Output variables:
   #   arsc_output: Path to output .ap_ file (optional).
   #
   #   proto_output: Path to output .proto.ap_ file (optional).
   #
+  #   optimized_arsc_output: Path to optimized .ap_ file (optional).
+  #
+  #   optimized_proto_output: Path to optimized .proto.ap_ file (optional).
+  #
   #   r_text_out_path: (optional):
   #       Path for the corresponding generated R.txt file.
   #
+  #   resources_path_map_out_path: (optional):
+  #       Path for the generated map between original resource paths and
+  #       shortend resource paths.
+  #
   #   proguard_file: (optional)
   #       Path to proguard configuration file for this apk target.
   #
@@ -2293,6 +2301,9 @@
     if (defined(invoker.arsc_output)) {
       _arsc_output = invoker.arsc_output
     }
+    if (defined(invoker.optimized_arsc_output)) {
+      _optimized_arsc_output = invoker.optimized_arsc_output
+    }
     _final_srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
 
     _script = "//build/android/gyp/compile_resources.py"
@@ -2360,6 +2371,36 @@
         rebase_path(invoker.size_info_path, root_build_dir),
       ]
     }
+    if (defined(_optimized_arsc_output)) {
+      _outputs += [ _optimized_arsc_output ]
+      _args += [
+        "--optimized-arsc-path",
+        rebase_path(_optimized_arsc_output, root_build_dir),
+      ]
+    }
+    if (defined(invoker.optimized_proto_output)) {
+      _outputs += [ invoker.optimized_proto_output ]
+      _args += [
+        "--optimized-proto-path",
+        rebase_path(invoker.optimized_proto_output, root_build_dir),
+      ]
+    }
+    if (defined(invoker.resources_config_paths)) {
+      _inputs += invoker.resources_config_paths
+      _rebased_resource_configs =
+          rebase_path(invoker.resources_config_paths, root_build_dir)
+      _args += [ "--resources-config-paths=${_rebased_resource_configs}" ]
+    }
+    if (defined(invoker.short_resource_paths) && invoker.short_resource_paths) {
+      _args += [ "--short-resource-paths" ]
+      if (defined(invoker.resources_path_map_out_path)) {
+        _outputs += [ invoker.resources_path_map_out_path ]
+        _args += [
+          "--resources-path-map-out-path",
+          rebase_path(invoker.resources_path_map_out_path, root_build_dir),
+        ]
+      }
+    }
 
     if (defined(invoker.r_java_root_package_name)) {
       _args += [
@@ -2368,6 +2409,10 @@
       ]
     }
 
+    if (defined(invoker.strip_resource_names) && invoker.strip_resource_names) {
+      _args += [ "--strip-resource-names" ]
+    }
+
     # Useful to have android:debuggable in the manifest even for Release
     # builds. Just omit it for officai
     if (debuggable_apks) {
@@ -2594,115 +2639,35 @@
     }
   }
 
-  # A template that is used to optimize compiled resources using aapt2 optimize.
-  #
-  #   proto_input_path:
-  #     Path to input compiled .proto.ap_ file.
-  #
-  #   short_resource_paths: (optional)
-  #     Rename the paths within a the apk to be randomly generated short
-  #     strings to reduce binary size.
-  #
-  #   strip_resource_names: (optional)
-  #     Strip resource names from the resources table of the apk.
-  #
-  #   resources_configs_paths: (optional)
-  #     List of resource configs to use for optimization.
-  #
-  #   optimized_proto_output:
-  #     Path to output optimized .proto.ap_ file.
-  #
-  #   resources_path_map_out_path: (optional):
-  #       Path for the generated map between original resource paths and
-  #       shortened resource paths.
-  template("optimize_resources") {
-    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
-    action_with_pydeps(target_name) {
-      forward_variables_from(invoker, [ "deps" ])
-      script = "//build/android/gyp/optimize_resources.py"
-      outputs = [ invoker.optimized_proto_output ]
-      inputs = [
-        android_sdk_tools_bundle_aapt2,
-        invoker.r_text_path,
-        invoker.proto_input_path,
-      ]
-      args = [
-        "--aapt2-path",
-        rebase_path(android_sdk_tools_bundle_aapt2, root_build_dir),
-        "--r-text-in",
-        rebase_path(invoker.r_text_path, root_build_dir),
-        "--proto-path",
-        rebase_path(invoker.proto_input_path, root_build_dir),
-        "--optimized-proto-path",
-        rebase_path(invoker.optimized_proto_output, root_build_dir),
-      ]
-
-      if (defined(invoker.resources_config_paths)) {
-        inputs += invoker.resources_config_paths
-        _rebased_resource_configs =
-            rebase_path(invoker.resources_config_paths, root_build_dir)
-        args += [ "--resources-config-paths=${_rebased_resource_configs}" ]
-      }
-
-      if (defined(invoker.short_resource_paths) &&
-          invoker.short_resource_paths) {
-        args += [ "--short-resource-paths" ]
-        if (defined(invoker.resources_path_map_out_path)) {
-          outputs += [ invoker.resources_path_map_out_path ]
-          args += [
-            "--resources-path-map-out-path",
-            rebase_path(invoker.resources_path_map_out_path, root_build_dir),
-          ]
-        }
-      }
-
-      if (defined(invoker.strip_resource_names) &&
-          invoker.strip_resource_names) {
-        args += [ "--strip-resource-names" ]
-      }
-    }
-  }
-
-  # A template that is used to find unused resources.
   template("unused_resources") {
+    _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
+    _shrinker_dep = "//build/android/gyp/resources_shrinker:resources_shrinker"
+    _shrinker_script = "$root_build_dir/bin/helper/resources_shrinker"
     action_with_pydeps(target_name) {
       forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "deps" ])
-      script = "//build/android/gyp/unused_resources.py"
-      depfile = "$target_gen_dir/${target_name}.d"
-      _unused_resources_script = "$root_build_dir/bin/helper/unused_resources"
-      inputs = [ _unused_resources_script ]
+      script = "//build/android/gyp/resources_shrinker/shrinker.py"
+      inputs = [
+        invoker.build_config,
+        invoker.proguard_mapping_path,
+        _shrinker_script,
+      ]
       outputs = [ invoker.output_config ]
       if (!defined(deps)) {
         deps = []
       }
-      deps += [ "//build/android/unused_resources:unused_resources" ]
+      deps += [ _shrinker_dep ]
       args = [
         "--script",
-        rebase_path(_unused_resources_script, root_build_dir),
+        rebase_path(_shrinker_script, root_build_dir),
+        "--dependencies-res-zips=@FileArg($_rebased_build_config:deps_info:dependency_zips)",
+        "--proguard-mapping",
+        rebase_path(invoker.proguard_mapping_path, root_build_dir),
+        "--r-text=@FileArg($_rebased_build_config:deps_info:r_text_path)",
+        "--dex=@FileArg($_rebased_build_config:final_dex:path)",
+        "--android-manifest=@FileArg($_rebased_build_config:deps_info:android_manifest)",
         "--output-config",
         rebase_path(invoker.output_config, root_build_dir),
-        "--depfile",
-        rebase_path(depfile, root_build_dir),
       ]
-
-      if (defined(invoker.proguard_mapping_path)) {
-        inputs += [ invoker.proguard_mapping_path ]
-        args += [
-          "--proguard-mapping",
-          rebase_path(invoker.proguard_mapping_path, root_build_dir),
-        ]
-      }
-
-      foreach(_build_config, invoker.module_build_configs) {
-        inputs += [ _build_config ]
-        _rebased_build_config = rebase_path(_build_config, root_build_dir)
-        args += [
-          "--dependencies-res-zips=@FileArg($_rebased_build_config:deps_info:dependency_zips)",
-          "--r-texts=@FileArg($_rebased_build_config:deps_info:r_text_path)",
-          "--dexes=@FileArg($_rebased_build_config:final_dex:path)",
-          "--android-manifests=@FileArg($_rebased_build_config:deps_info:merged_android_manifest)",
-        ]
-      }
     }
   }
 
@@ -3657,7 +3622,6 @@
             [
               "android_manifest",
               "android_manifest_dep",
-              "merged_android_manifest",
               "final_dex_path",
               "loadable_modules",
               "native_lib_placeholders",
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index bab3386..d33240d 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2077,8 +2077,6 @@
   #   uncompress_dex: Store final .dex files uncompressed in the apk.
   #   strip_resource_names: True if resource names should be stripped from the
   #     resources.arsc file in the apk or module.
-  #   strip_unused_resources: True if unused resources should be stripped from
-  #     the apk or module.
   #   short_resource_paths: True if resource paths should be shortened in the
   #     apk or module.
   #   resources_config_paths: List of paths to the aapt2 optimize config files
@@ -2165,8 +2163,20 @@
 
     if (!_is_bundle_module) {
       _final_apk_path = invoker.final_apk_path
+      _final_rtxt_path = "${_final_apk_path}.R.txt"
     }
 
+    _short_resource_paths =
+        defined(invoker.short_resource_paths) && invoker.short_resource_paths &&
+        enable_arsc_obfuscation
+    _strip_resource_names =
+        defined(invoker.strip_resource_names) && invoker.strip_resource_names &&
+        enable_arsc_obfuscation
+    _optimize_resources = _strip_resource_names || _short_resource_paths
+
+    if (!_is_bundle_module && _short_resource_paths) {
+      _final_pathmap_path = "${_final_apk_path}.pathmap.txt"
+    }
     _res_size_info_path = "$target_out_dir/$target_name.ap_.info"
     if (!_is_bundle_module) {
       _final_apk_path_no_ext_list =
@@ -2183,12 +2193,20 @@
     if (_is_bundle_module) {
       # Path to the intermediate proto-format resources zip file.
       _proto_resources_path = "$target_out_dir/$target_name.proto.ap_"
+      if (_optimize_resources) {
+        _optimized_proto_resources_path =
+            "$target_out_dir/$target_name.optimized.proto.ap_"
+      }
     } else {
       # resource_sizes.py needs to be able to find the unpacked resources.arsc
       # file based on apk name to compute normatlized size.
       _resource_sizes_arsc_path =
           "$root_out_dir/arsc/" +
           rebase_path(_final_apk_path_no_ext, root_build_dir) + ".ap_"
+      if (_optimize_resources) {
+        _optimized_arsc_resources_path =
+            "$target_out_dir/$target_name.optimized.ap_"
+      }
     }
 
     if (defined(invoker.version_code)) {
@@ -2431,6 +2449,11 @@
           "${_shared_resources_allowlist_target}__compile_resources"
     }
 
+    if (_short_resource_paths) {
+      _resources_path_map_out_path =
+          "${target_gen_dir}/${_template_name}_resources_path_map.txt"
+    }
+
     _compile_resources_target = "${_template_name}__compile_resources"
     _compile_resources_rtxt_out =
         "${target_gen_dir}/${_compile_resources_target}_R.txt"
@@ -2456,10 +2479,13 @@
                                "resource_exclusion_exceptions",
                                "resource_exclusion_regex",
                                "resource_values_filter_rules",
+                               "resources_config_paths",
                                "shared_resources",
                                "shared_resources_allowlist_locales",
                                "uses_split",
                              ])
+      short_resource_paths = _short_resource_paths
+      strip_resource_names = _strip_resource_names
       android_manifest = _android_manifest
       android_manifest_dep = ":$_merge_manifest_target"
       version_code = _version_code
@@ -2485,6 +2511,9 @@
       if (_enable_main_dex_list) {
         proguard_file_main_dex = _generated_proguard_main_dex_config
       }
+      if (_short_resource_paths) {
+        resources_path_map_out_path = _resources_path_map_out_path
+      }
 
       build_config = _build_config
       build_config_dep = ":$_build_config_target"
@@ -2521,6 +2550,9 @@
       if (_is_bundle_module) {
         is_bundle_module = true
         proto_output = _proto_resources_path
+        if (_optimize_resources) {
+          optimized_proto_output = _optimized_proto_resources_path
+        }
 
         if (defined(invoker.base_module_target)) {
           include_resource =
@@ -2528,6 +2560,8 @@
               "/" + get_label_info(invoker.base_module_target, "name") + ".ap_"
           _link_against = invoker.base_module_target
         }
+      } else if (_optimize_resources) {
+        optimized_arsc_output = _optimized_arsc_resources_path
       }
 
       if (defined(_link_against)) {
@@ -2550,55 +2584,6 @@
     }
     _srcjar_deps += [ ":$_compile_resources_target" ]
 
-    # We don't ship apks anymore, only optimize bundle builds
-    if (_is_bundle_module) {
-      _short_resource_paths =
-          defined(invoker.short_resource_paths) &&
-          invoker.short_resource_paths && enable_arsc_obfuscation
-      _strip_resource_names =
-          defined(invoker.strip_resource_names) &&
-          invoker.strip_resource_names && enable_arsc_obfuscation
-      _strip_unused_resources = defined(invoker.strip_unused_resources) &&
-                                invoker.strip_unused_resources
-      _optimize_resources = _strip_resource_names || _short_resource_paths ||
-                            _strip_unused_resources
-    }
-
-    if (_is_bundle_module && _optimize_resources) {
-      _optimized_proto_resources_path =
-          "$target_out_dir/$target_name.optimized.proto.ap_"
-      if (_short_resource_paths) {
-        _resources_path_map_out_path =
-            "${target_gen_dir}/${_template_name}_resources_path_map.txt"
-      }
-      _optimize_resources_target = "${_template_name}__optimize_resources"
-      optimize_resources(_optimize_resources_target) {
-        deps = _deps + [ ":$_compile_resources_target" ]
-        short_resource_paths = _short_resource_paths
-        strip_resource_names = _strip_resource_names
-        if (_short_resource_paths) {
-          resources_path_map_out_path = _resources_path_map_out_path
-        }
-        r_text_path = _compile_resources_rtxt_out
-        proto_input_path = _proto_resources_path
-        optimized_proto_output = _optimized_proto_resources_path
-        if (_strip_unused_resources) {
-          # These need to be kept in sync with the target names + output paths
-          # in the android_app_bundle template.
-          _unused_resources_target = "${_template_name}__unused_resources"
-          _unused_resources_config_path =
-              "$target_gen_dir/${_template_name}_unused_resources.config"
-          resources_config_paths = [ _unused_resources_config_path ]
-          deps += [ ":$_unused_resources_target" ]
-        } else {
-          resources_config_paths = []
-        }
-        if (defined(invoker.resources_config_paths)) {
-          resources_config_paths += invoker.resources_config_paths
-        }
-      }
-    }
-
     if (defined(_resource_sizes_arsc_path)) {
       _copy_arsc_target = "${_template_name}__copy_arsc"
       copy(_copy_arsc_target) {
@@ -2611,6 +2596,36 @@
       _final_deps += [ ":$_copy_arsc_target" ]
     }
 
+    if (!_is_bundle_module) {
+      # Output the R.txt file to a more easily discoverable location for
+      # archiving. This is necessary when stripping resource names so that we
+      # have an archive of resource names to ids for shipped apks (for
+      # debugging purposes). We copy the file rather than change the location
+      # of the original because other targets rely on the location of the R.txt
+      # file.
+      _copy_rtxt_target = "${_template_name}__copy_rtxt"
+      copy(_copy_rtxt_target) {
+        deps = [ ":$_compile_resources_target" ]
+        sources = [ _compile_resources_rtxt_out ]
+        outputs = [ _final_rtxt_path ]
+      }
+      _final_deps += [ ":$_copy_rtxt_target" ]
+
+      if (_short_resource_paths) {
+        # Do the same for path map
+        _copy_pathmap_target = "${_template_name}__copy_pathmap"
+        copy(_copy_pathmap_target) {
+          deps = [ ":$_compile_resources_target" ]
+          sources = [ _resources_path_map_out_path ]
+          outputs = [ _final_pathmap_path ]
+
+          # The monochrome_public_apk_checker test needs pathmap when run on swarming.
+          data = [ _final_pathmap_path ]
+        }
+        _final_deps += [ ":$_copy_pathmap_target" ]
+      }
+    }
+
     _generate_native_libraries_java =
         (!_is_bundle_module || _is_base_module) &&
         (_native_libs_deps != [] || _secondary_abi_native_libs_deps != []) &&
@@ -2773,7 +2788,6 @@
       supports_android = true
       requires_android = true
       srcjar_deps = _srcjar_deps
-      merged_android_manifest = _android_manifest
       if (defined(_final_dex_path)) {
         final_dex_path = _final_dex_path
       }
@@ -3041,9 +3055,6 @@
                        ":$_build_config_target",
                        ":$_compile_resources_target",
                      ] + _all_native_libs_deps
-      if (_optimize_resources) {
-        _final_deps += [ ":$_optimize_resources_target" ]
-      }
       if (defined(_final_dex_target_dep)) {
         not_needed([ "_final_dex_target_dep" ])
       }
@@ -3187,7 +3198,11 @@
             deps += [ _final_dex_target_dep ]
           }
 
-          packaged_resources_path = _arsc_resources_path
+          if (_optimize_resources) {
+            packaged_resources_path = _optimized_arsc_resources_path
+          } else {
+            packaged_resources_path = _arsc_resources_path
+          }
 
           if (defined(_native_libs_filearg)) {
             native_libs_filearg = _native_libs_filearg
@@ -3466,6 +3481,7 @@
                                "resource_exclusion_regex",
                                "resource_ids_provider_dep",
                                "resource_values_filter_rules",
+                               "resources_config_paths",
                                "require_native_mocks",
                                "secondary_abi_loadable_modules",
                                "secondary_abi_shared_libraries",
@@ -3474,11 +3490,13 @@
                                "shared_resources",
                                "shared_resources_allowlist_locales",
                                "shared_resources_allowlist_target",
+                               "short_resource_paths",
                                "sources",
                                "srcjar_deps",
                                "static_library_dependent_targets",
                                "static_library_provider",
                                "static_library_synchronized_proguard",
+                               "strip_resource_names",
                                "target_sdk_version",
                                "testonly",
                                "uncompress_dex",
@@ -3606,7 +3624,6 @@
                                "static_library_provider",
                                "static_library_synchronized_proguard",
                                "strip_resource_names",
-                               "strip_unused_resources",
                                "target_sdk_version",
                                "testonly",
                                "uncompress_shared_libraries",
@@ -4715,7 +4732,6 @@
     _all_create_module_targets = []
     _all_module_zip_paths = []
     _all_module_build_configs = []
-    _all_module_unused_resources_deps = []
     foreach(_module, _modules) {
       _module_target = _module.module_target
       _module_build_config = _module.build_config
@@ -4734,6 +4750,7 @@
       # this file *must* be named ${_module.name}.zip
       _create_module_target = "${_target_name}__${_module.name}__create"
       _module_zip_path = "$target_gen_dir/$target_name/${_module.name}.zip"
+
       create_android_app_bundle_module(_create_module_target) {
         forward_variables_from(invoker,
                                [
@@ -4784,27 +4801,6 @@
       ]
       _all_module_zip_paths += [ _module_zip_path ]
       _all_module_build_configs += [ _module_build_config ]
-      _all_module_unused_resources_deps += [
-        "${_module_target}__compile_resources",
-        _dex_target_for_module,
-        _module_build_config_target,
-      ]
-    }
-    if (defined(invoker.strip_unused_resources) &&
-        invoker.strip_unused_resources) {
-      # Resources only live in the base module so we define the unused resources
-      # target only on the base module target.
-      _unused_resources_target = "${_base_target_name}__unused_resources"
-      _unused_resources_config =
-          "${_base_target_gen_dir}/${_base_target_name}_unused_resources.config"
-      unused_resources(_unused_resources_target) {
-        deps = _all_module_unused_resources_deps
-        module_build_configs = _all_module_build_configs
-        if (_proguard_enabled) {
-          proguard_mapping_path = _proguard_mapping_path
-        }
-        output_config = _unused_resources_config
-      }
     }
 
     _all_rebased_module_zip_paths =
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index c5089dd..c485c30a 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -179,23 +179,10 @@
       png_to_webp = !is_java_debug
     }
 
-    # We only optimize resources for bundles since APKs are not shipped.
-    # Resources only live in the base module atm as such we only need to set
-    # these on the base module
-    if (_is_bundle) {
-      # Removes metadata needed for Resources.getIdentifier("resource_name").
-      strip_resource_names = !is_java_debug
+    # Removes metadata needed for Resources.getIdentifier("resource_name").
+    strip_resource_names = !is_java_debug
 
-      # Shortens resource file names in apk eg: res/drawable/button.xml -> res/a.xml
-      short_resource_paths = true
-
-      # Removes unused resources from the apk. Only enabled on official builds
-      # since it adds a slow step and serializes the build graph causing fewer
-      # expensive tasks (eg: proguarding, resource optimization) to be run in
-      # parallel by adding dependencies between them (adds around 10-20
-      # seconds on my machine).
-      strip_unused_resources = is_official_build
-    }
+    short_resource_paths = true
 
     if (!defined(aapt_locale_allowlist)) {
       # Include resource strings files only for supported locales.
@@ -552,16 +539,13 @@
         }
       }
 
-      # We only optimize resources in bundles.
-      if (_is_bundle_module) {
-        # Resources config for blocklisting resource names from obfuscation
-        resources_config_paths = [
-          "//android_webview/aapt2.config",
-          "//chrome/android/aapt2.config",
-        ]
-        if (defined(invoker.resources_config_paths)) {
-          resources_config_paths += invoker.resources_config_paths
-        }
+      # Resources config for blocklisting resource names from obfuscation
+      resources_config_paths = [
+        "//android_webview/aapt2.config",
+        "//chrome/android/aapt2.config",
+      ]
+      if (defined(invoker.resources_config_paths)) {
+        resources_config_paths += invoker.resources_config_paths
       }
 
       if (defined(invoker.never_incremental)) {
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java
index 79f5cc3..0930b45 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java
@@ -174,16 +174,16 @@
                             : null);
             view.mContactDetailsSection.setListener(collectUserDataDelegate == null
                             ? null
-                            : m -> collectUserDataDelegate.onContactInfoChanged(m.mOption));
+                            : collectUserDataDelegate::onContactInfoChanged);
             view.mPaymentMethodSection.setListener(collectUserDataDelegate == null
                             ? null
-                            : m -> collectUserDataDelegate.onPaymentMethodChanged(m.mOption));
+                            : collectUserDataDelegate::onPaymentMethodChanged);
             view.mShippingAddressSection.setListener(collectUserDataDelegate == null
                             ? null
-                            : m -> collectUserDataDelegate.onShippingAddressChanged(m.mOption));
+                            : collectUserDataDelegate::onShippingAddressChanged);
             view.mLoginSection.setListener(collectUserDataDelegate == null
                             ? null
-                            : m -> collectUserDataDelegate.onLoginChoiceChanged(m.mOption));
+                            : collectUserDataDelegate::onLoginChoiceChanged);
             view.mDateRangeStartSection.setDelegate(dateStartDelegate);
             view.mDateRangeEndSection.setDelegate(dateEndDelegate);
             view.mPrependedSections.setDelegate(collectUserDataDelegate != null
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java
index a855500f..26e41b0 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java
@@ -7,9 +7,6 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue;
-import org.chromium.chrome.browser.payments.AutofillAddress;
-import org.chromium.chrome.browser.payments.AutofillContact;
-import org.chromium.chrome.browser.payments.AutofillPaymentInstrument;
 
 /**
  * Common interface for autofill assistant payment request delegates.
@@ -19,13 +16,15 @@
  */
 public interface AssistantCollectUserDataDelegate {
     /** The currently selected contact has changed. */
-    void onContactInfoChanged(@Nullable AutofillContact contact);
+    void onContactInfoChanged(@Nullable AssistantCollectUserDataModel.ContactModel contactModel);
 
     /** The currently selected shipping address has changed. */
-    void onShippingAddressChanged(@Nullable AutofillAddress address);
+    void onShippingAddressChanged(
+            @Nullable AssistantCollectUserDataModel.AddressModel addressModel);
 
     /** The currently selected payment method has changed. */
-    void onPaymentMethodChanged(@Nullable AutofillPaymentInstrument paymentInstrument);
+    void onPaymentMethodChanged(
+            @Nullable AssistantCollectUserDataModel.PaymentInstrumentModel paymentInstrumentModel);
 
     /** The currently selected terms & conditions state has changed. */
     void onTermsAndConditionsChanged(@AssistantTermsAndConditionsState int state);
@@ -34,7 +33,8 @@
     void onTextLinkClicked(int link);
 
     /** The currently selected login choice has changed. */
-    void onLoginChoiceChanged(@Nullable AssistantLoginChoice loginChoice);
+    void onLoginChoiceChanged(
+            @Nullable AssistantCollectUserDataModel.LoginChoiceModel loginChoiceModel);
 
     /** The start date of the date/time range has changed. */
     void onDateTimeRangeStartDateChanged(@Nullable AssistantDateTime date);
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java
index 80f8b00..69b79b4 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java
@@ -11,9 +11,6 @@
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue;
-import org.chromium.chrome.browser.payments.AutofillAddress;
-import org.chromium.chrome.browser.payments.AutofillContact;
-import org.chromium.chrome.browser.payments.AutofillPaymentInstrument;
 
 /** Delegate for the Collect user data UI which forwards events to a native counterpart. */
 @JNINamespace("autofill_assistant")
@@ -31,33 +28,39 @@
     }
 
     @Override
-    public void onContactInfoChanged(@Nullable AutofillContact contact) {
+    public void onContactInfoChanged(
+            @Nullable AssistantCollectUserDataModel.ContactModel contactModel) {
         if (mNativeAssistantCollectUserDataDelegate != 0) {
             AssistantCollectUserDataNativeDelegateJni.get().onContactInfoChanged(
                     mNativeAssistantCollectUserDataDelegate,
                     AssistantCollectUserDataNativeDelegate.this,
-                    contact != null ? contact.getProfile() : null);
+                    contactModel == null ? null : contactModel.mOption.getProfile());
         }
     }
 
     @Override
-    public void onShippingAddressChanged(@Nullable AutofillAddress address) {
+    public void onShippingAddressChanged(
+            @Nullable AssistantCollectUserDataModel.AddressModel addressModel) {
         if (mNativeAssistantCollectUserDataDelegate != 0) {
             AssistantCollectUserDataNativeDelegateJni.get().onShippingAddressChanged(
                     mNativeAssistantCollectUserDataDelegate,
                     AssistantCollectUserDataNativeDelegate.this,
-                    address != null ? address.getProfile() : null);
+                    addressModel == null ? null : addressModel.mOption.getProfile());
         }
     }
 
     @Override
-    public void onPaymentMethodChanged(@Nullable AutofillPaymentInstrument paymentInstrument) {
+    public void onPaymentMethodChanged(
+            @Nullable AssistantCollectUserDataModel.PaymentInstrumentModel paymentInstrumentModel) {
         if (mNativeAssistantCollectUserDataDelegate != 0) {
             AssistantCollectUserDataNativeDelegateJni.get().onCreditCardChanged(
                     mNativeAssistantCollectUserDataDelegate,
                     AssistantCollectUserDataNativeDelegate.this,
-                    paymentInstrument != null ? paymentInstrument.getCard() : null,
-                    paymentInstrument != null ? paymentInstrument.getBillingProfile() : null);
+                    paymentInstrumentModel == null ? null
+                                                   : paymentInstrumentModel.mOption.getCard(),
+                    paymentInstrumentModel == null
+                            ? null
+                            : paymentInstrumentModel.mOption.getBillingProfile());
         }
     }
 
@@ -80,12 +83,13 @@
     }
 
     @Override
-    public void onLoginChoiceChanged(AssistantLoginChoice loginChoice) {
+    public void onLoginChoiceChanged(
+            @Nullable AssistantCollectUserDataModel.LoginChoiceModel loginChoiceModel) {
         if (mNativeAssistantCollectUserDataDelegate != 0) {
             AssistantCollectUserDataNativeDelegateJni.get().onLoginChoiceChanged(
                     mNativeAssistantCollectUserDataDelegate,
                     AssistantCollectUserDataNativeDelegate.this,
-                    loginChoice != null ? loginChoice.getIdentifier() : null);
+                    loginChoiceModel == null ? null : loginChoiceModel.mOption.getIdentifier());
         }
     }
 
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java
index 54db6630..f75cea15 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java
@@ -22,6 +22,7 @@
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantChoiceList;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataCoordinator;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataDelegate;
+import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantDateTime;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantLoginChoice;
 import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantTermsAndConditionsState;
@@ -122,18 +123,21 @@
         Map<String, AssistantValue> mAdditionalValues = new HashMap<>();
 
         @Override
-        public void onContactInfoChanged(@Nullable AutofillContact contact) {
-            mContact = contact;
+        public void onContactInfoChanged(
+                @Nullable AssistantCollectUserDataModel.ContactModel contactModel) {
+            mContact = contactModel == null ? null : contactModel.mOption;
         }
 
         @Override
-        public void onShippingAddressChanged(@Nullable AutofillAddress address) {
-            mAddress = address;
+        public void onShippingAddressChanged(
+                @Nullable AssistantCollectUserDataModel.AddressModel addressModel) {
+            mAddress = addressModel == null ? null : addressModel.mOption;
         }
 
         @Override
-        public void onPaymentMethodChanged(@Nullable AutofillPaymentInstrument paymentInstrument) {
-            mPaymentMethod = paymentInstrument;
+        public void onPaymentMethodChanged(@Nullable AssistantCollectUserDataModel
+                                                   .PaymentInstrumentModel paymentInstrumentModel) {
+            mPaymentMethod = paymentInstrumentModel == null ? null : paymentInstrumentModel.mOption;
         }
 
         @Override
@@ -142,8 +146,9 @@
         }
 
         @Override
-        public void onLoginChoiceChanged(@Nullable AssistantLoginChoice loginChoice) {
-            mLoginChoice = loginChoice;
+        public void onLoginChoiceChanged(
+                @Nullable AssistantCollectUserDataModel.LoginChoiceModel loginChoiceModel) {
+            mLoginChoice = loginChoiceModel == null ? null : loginChoiceModel.mOption;
         }
 
         @Override
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java
index 23f3caaa..47909bf2 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java
@@ -60,7 +60,6 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
@@ -873,21 +872,20 @@
      */
     @Test
     @MediumTest
-    @FlakyTest(message = "https://crbug.com/1213197")
     public void testEditOfServerCard() throws Exception {
         String profileId = mHelper.addDummyProfile("Adam West", "adamwest@google.com");
         mHelper.addServerCreditCard(mHelper.createDummyCreditCard(
                 profileId, "4111111111111111", /* isLocal = */ false));
 
         ArrayList<ActionProto> list = new ArrayList<>();
-        list.add((ActionProto) ActionProto.newBuilder()
+        list.add(ActionProto.newBuilder()
                          .setCollectUserData(CollectUserDataProto.newBuilder()
                                                      .setRequestPaymentMethod(true)
                                                      .setBillingAddressName("billing_address")
                                                      .setRequestTermsAndConditions(false))
                          .build());
         AutofillAssistantTestScript script = new AutofillAssistantTestScript(
-                (SupportedScriptProto) SupportedScriptProto.newBuilder()
+                SupportedScriptProto.newBuilder()
                         .setPath("form_target_website.html")
                         .setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
                                 ChipProto.newBuilder().setText("Payment")))
@@ -901,7 +899,7 @@
         waitUntilViewMatchesCondition(withText("Continue"), isCompletelyDisplayed());
 
         onView(withText("Payment method")).perform(click());
-        waitUntilViewMatchesCondition(withContentDescription("Edit card"), isDisplayed());
+        waitUntilViewMatchesCondition(withContentDescription("Edit card"), isCompletelyDisplayed());
         onView(withContentDescription("Edit card")).perform(click());
         waitUntilViewMatchesCondition(withText("Billing address*"), isDisplayed());
         // TODO(b/155624806) edit billing address and fill/check values on test website.
@@ -993,10 +991,9 @@
      */
     @Test
     @MediumTest
-    @DisabledTest(message = "Flaky - https://crbug.com/1215465")
     public void testCreateAndEnterShippingAddress() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
-        list.add((ActionProto) ActionProto.newBuilder()
+        list.add(ActionProto.newBuilder()
                          .setCollectUserData(
                                  CollectUserDataProto.newBuilder()
                                          .setShippingAddressName("shipping")
@@ -1004,7 +1001,7 @@
                                                  buildRequiredDataPiece("Requires valid state", 34))
                                          .setRequestTermsAndConditions(false))
                          .build());
-        list.add((ActionProto) ActionProto.newBuilder()
+        list.add(ActionProto.newBuilder()
                          .setUseAddress(
                                  UseAddressProto.newBuilder()
                                          .setName("shipping")
@@ -1012,12 +1009,12 @@
                                                  SelectorProto.Filter.newBuilder().setCssSelector(
                                                          "#address_name"))))
                          .build());
-        list.add((ActionProto) ActionProto.newBuilder()
+        list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder().setMessage("Prompt").addChoices(
                                  PromptProto.Choice.newBuilder()))
                          .build());
         AutofillAssistantTestScript script = new AutofillAssistantTestScript(
-                (SupportedScriptProto) SupportedScriptProto.newBuilder()
+                SupportedScriptProto.newBuilder()
                         .setPath("form_target_website.html")
                         .setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
                                 ChipProto.newBuilder().setText("Address")))
@@ -1058,6 +1055,7 @@
         onView(withContentDescription("Edit address")).perform(click());
         waitUntilViewMatchesCondition(
                 withContentDescription("Name*"), allOf(isDisplayed(), isEnabled()));
+        Espresso.closeSoftKeyboard();
         onView(withContentDescription("State*"))
                 .perform(scrollTo(), clearText(), typeText("California"));
         Espresso.closeSoftKeyboard();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
index 24064c8..9818277a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
@@ -20,7 +20,7 @@
 import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
 import org.chromium.chrome.browser.signin.ui.SyncConsentActivityLauncher.AccessPoint;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
-import org.chromium.chrome.browser.sync.settings.SyncAndServicesSettings;
+import org.chromium.chrome.browser.sync.settings.ManageSyncSettings;
 import org.chromium.components.browser_ui.settings.SettingsLauncher;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
 
@@ -180,8 +180,8 @@
 
         ButtonState positiveButton = new ButtonPresent(R.string.enable_sync_button, view -> {
             SettingsLauncher settingsLauncher = new SettingsLauncherImpl();
-            settingsLauncher.launchSettingsActivity(getContext(), SyncAndServicesSettings.class,
-                    SyncAndServicesSettings.createArguments(false));
+            settingsLauncher.launchSettingsActivity(getContext(), ManageSyncSettings.class,
+                    ManageSyncSettings.createArguments(false));
         });
 
         return new ViewState(descId, positiveButton);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java
index 3e01f68..a945bd1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java
@@ -30,7 +30,7 @@
  *
  * This class mostly makes calls to native and contains a minimum of business logic. It is only
  * usable from the UI thread as the native ProfileSyncService requires its access to be on the
- * UI thread. See components/sync/driver/profile_sync_service.h for more details.
+ * UI thread. See components/sync/driver/sync_service_impl.h for more details.
  */
 public class ProfileSyncService {
 
@@ -556,7 +556,7 @@
 
     @VisibleForTesting
     public long getNativeProfileSyncServiceForTest() {
-        return ProfileSyncServiceJni.get().getProfileSyncServiceForTest(
+        return ProfileSyncServiceJni.get().getSyncServiceImplForTest(
                 mNativeProfileSyncServiceAndroid);
     }
 
@@ -677,7 +677,7 @@
                 long nativeProfileSyncServiceAndroid);
         void markPassphrasePromptMutedForCurrentProductVersion(
                 long nativeProfileSyncServiceAndroid);
-        long getProfileSyncServiceForTest(long nativeProfileSyncServiceAndroid);
+        long getSyncServiceImplForTest(long nativeProfileSyncServiceAndroid);
         long getLastSyncedTimeForTest(long nativeProfileSyncServiceAndroid);
         void getAllNodes(long nativeProfileSyncServiceAndroid, GetAllNodesCallback callback);
         void recordKeyRetrievalTrigger(
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java
index d9b6272a..94469fd 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java
@@ -17,6 +17,7 @@
 
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -43,6 +44,7 @@
  */
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@Ignore("https://crbug.com/1216298")
 public class DisplayCutoutControllerTest {
     @Mock
     private TabImpl mTab;
diff --git a/chrome/android/modules/chrome_bundle_tmpl.gni b/chrome/android/modules/chrome_bundle_tmpl.gni
index e2c5808..18233436 100644
--- a/chrome/android/modules/chrome_bundle_tmpl.gni
+++ b/chrome/android/modules/chrome_bundle_tmpl.gni
@@ -168,9 +168,6 @@
     is_multi_abi = _is_multi_abi
     validate_services = _enable_chrome_module
 
-    # For this to be respected, it must also be set on the base module target.
-    strip_unused_resources = is_official_build
-
     # List of DFMs that are installed by default by wrapper scripts, to make
     # testing easier. This removes the need to manually specify, e.g.,
     # "-m dev_ui" on every install or run.
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 178d561..d0a06c3 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -5400,6 +5400,9 @@
   <message name="IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_DOWNLOAD_FAILED" desc="Text of the Plugin VM installer if the installation failed because something went wrong while downloading the virtual machine.">
     Couldn't install the virtual machine because of a network error. Please try again, or contact your administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
   </message>
+  <message name="IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_DOWNLOAD_HTTP_ERROR" desc="Text of the Parallels Desktop installer when downloading the virtual machine image failed due to a HTTP error (e.g. 401, 403, 404).">
+    Couldn't install <ph name="VM_NAME">$1<ex>Parallels Desktop</ex></ph>: Image URL returned a <ph name="HTTP_ERROR">$2<ex>404</ex></ph> error code. Please contact your administrator.
+  </message>
   <message name="IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_INSTALLING_FAILED" desc="Text of the Plugin VM installer if the installation failed because downloaded Plugin VM could not be installed.">
     Couldn't install the virtual machine. Please try again, or contact your administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
   </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_DOWNLOAD_HTTP_ERROR.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_DOWNLOAD_HTTP_ERROR.png.sha1
new file mode 100644
index 0000000..66055e2
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_DOWNLOAD_HTTP_ERROR.png.sha1
@@ -0,0 +1 @@
+183d32b583c41d907b322b549c264698ec1efaf7
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index fcebfb3..10a3260 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -1985,9 +1985,24 @@
   <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE" desc="In CUPS printing settings subpage, this message will be read aloud to the user to inform them there are no printers available to save.">
     There are no printers available to save.
   </message>
+  <message name="IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_TITLE" desc="Text for the title of the user's managed printers list.">
+    Managed printers
+  </message>
+  <message name="IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTERS_COUNT_MANY" desc="In CUPS printing settings subpage, this message will be read aloud to the user to inform them on the number of managed printers showing on the screen.">
+    There are <ph name="PRINTER_COUNT">$1<ex>3</ex></ph> managed printers.
+  </message>
+  <message name="IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE" desc="In CUPS printing settings subpage, this message will be read aloud to the user to inform them there is only 1 managed printer.">
+    There is 1 managed printer.
+  </message>
+  <message name="IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE" desc="In CUPS printing settings subpage, this message will be read aloud to the user to inform them there are no managed printers.">
+    There are no managed printers.
+  </message>
   <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT" desc="Text for the drop down menu which allows the user to edit the printer details.">
     Edit
   </message>
+  <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_VIEW" desc="Text for the drop down menu which allows the user to view the managed printer details.">
+    View
+  </message>
   <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_REMOVE" desc="Text for the drop down menu which allows the user to remove the selected printer.">
     Remove
   </message>
@@ -2171,6 +2186,9 @@
   <message name="IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_DIALOG_TITLE" desc="Text for the title of the dialog that is used to edit a CUPS printer's information.">
     Edit printer
   </message>
+  <message name="IDS_SETTINGS_PRINTING_CUPS_VIEW_PRINTER_DIALOG_TITLE" desc="Text for the title of the dialog that is used to view a CUPS managed printer's information.">
+    View printer
+  </message>
   <message name="IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_BUTTON" desc="Text for the button which allows the user to save the modification of a CUPS printer.">
     Save
   </message>
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_CUPS_PRINTERS_VIEW.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_CUPS_PRINTERS_VIEW.png.sha1
new file mode 100644
index 0000000..e8ab247
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_CUPS_PRINTERS_VIEW.png.sha1
@@ -0,0 +1 @@
+562faf77aef65558eebe7db040f498f9392db0db
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_CUPS_VIEW_PRINTER_DIALOG_TITLE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_CUPS_VIEW_PRINTER_DIALOG_TITLE.png.sha1
new file mode 100644
index 0000000..1521cec7
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_CUPS_VIEW_PRINTER_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@
+fe08efc5e796adc472c224c80da277dc0b1b833f
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTERS_COUNT_MANY.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTERS_COUNT_MANY.png.sha1
new file mode 100644
index 0000000..7ea3e71
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTERS_COUNT_MANY.png.sha1
@@ -0,0 +1 @@
+b6a1e4081d5140e7f546bfc8d03577631159759f
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE.png.sha1
new file mode 100644
index 0000000..61435eef
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE.png.sha1
@@ -0,0 +1 @@
+e4e7324de44d97b611a21b94872d0a0461f35d2b
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE.png.sha1
new file mode 100644
index 0000000..4207b8f3
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE.png.sha1
@@ -0,0 +1 @@
+540caee45685958b001f42008a6942503bedaf18
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_TITLE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_TITLE.png.sha1
new file mode 100644
index 0000000..7ea3e71
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_TITLE.png.sha1
@@ -0,0 +1 @@
+b6a1e4081d5140e7f546bfc8d03577631159759f
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb
index 67fe5de..632e3faa 100644
--- a/chrome/app/resources/chromium_strings_mr.xtb
+++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -180,7 +180,7 @@
 <translation id="6434250628340475518">Chromium OS सिस्टम</translation>
 <translation id="6455857529632101747">Chromium प्रोफाइलमध्ये स्वागत आहे</translation>
 <translation id="6457450909262716557">{SECONDS,plural, =1{Chromium १ सेकंदात रीस्टार्ट होईल}other{Chromium # सेकंदांत रीस्टार्ट होईल}}</translation>
-<translation id="6475912303565314141">तुम्ही Chromium सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
+<translation id="6475912303565314141">तुम्ही Chromium सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
 <translation id="6510925080656968729">Chromium अनइंस्टॉल करा</translation>
 <translation id="6542839706527980775">प्रत्येक प्रोफाइलमध्ये तिची स्वतःची Chromium माहिती असते जसे की, बुकमार्क, इतिहास, पासवर्ड आणि आणखी बरेच काही</translation>
 <translation id="6570579332384693436">शब्दलेखनाच्या चुकांमध्ये सुधारणा करण्यासाठी Chromium तुम्ही मजकूर भागामध्ये टाइप केलेला मजकूर Google ला पाठवते</translation>
@@ -258,7 +258,7 @@
 <translation id="8586442755830160949">Copyright <ph name="YEAR" /> The Chromium लेखक. सर्व हक्क राखीव.</translation>
 <translation id="8619360774459241877">Chromium लाँच करत आहे...</translation>
 <translation id="8621669128220841554">नमूद न केलेल्या एररमुळे स्थापना अयशस्वी झाली. कृपया Chromium पुन्‍हा डाउनलोड करा.</translation>
-<translation id="8697124171261953979">तुम्ही Chromium सुरू करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
+<translation id="8697124171261953979">तुम्ही Chromium सुरू करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
 <translation id="8704119203788522458">हे तुमचे Chromium आहे</translation>
 <translation id="8796602469536043152">या साइटसाठी Chromium ला तुमचा कॅमेरा आणि मायक्रोफोन ॲक्सेस करण्याची परवानगी हवी आहे</translation>
 <translation id="8803635938069941624">Chromium OS अटी</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index 767a1d8..cdc6c521 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">Zoemvlakke</translation>
 <translation id="1708338024780164500">(Onaktief)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Eksperimentele blaaier! Kan dalk data verloor of privaatheid of sekuriteit kompromitteer. Gee kwessies aan met Hulp &gt; "Gee 'n kwessie aan …".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (oorspronklik)</translation>
 <translation id="1709217939274742847">Kies 'n kaartjie om vir stawing te gebruik. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Kan nie deel nie</translation>
@@ -1100,6 +1101,7 @@
 <translation id="2144557304298909478">Android-programontwikkeling in Linux</translation>
 <translation id="2146263598007866206">Werwe kan dalk outomaties verwante lêers saam aflaai om jou tyd te bespaar</translation>
 <translation id="2147151613919729065">Jy moet alle gasvensters toemaak om Gasmodus-geskiedenis uit te vee.</translation>
+<translation id="2147218225094845757">Versteek kantpaneel</translation>
 <translation id="2148219725039824548">Kon nie deling monteer nie. Die gespesifiseerde deling is nie in die netwerk gevind nie.</translation>
 <translation id="2148756636027685713">Formatering afgehandel</translation>
 <translation id="2148892889047469596">Saai oortjie uit</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">Kon nie uitdruk nie</translation>
 <translation id="5275352920323889391">Hond</translation>
 <translation id="527605982717517565">Laat JavaScript altyd op <ph name="HOST" /> toe.</translation>
+<translation id="5277127016695466621">Wys kantpaneel</translation>
 <translation id="5278823018825269962">Status-ID</translation>
 <translation id="5280064835262749532">Dateer eiebewyse vir <ph name="SHARE_PATH" /> op</translation>
 <translation id="5280243692621919988">Vee webkoekies en werfdata uit wanneer jy alle vensters toemaak</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 43ea5ad..00d0a9f6 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -679,6 +679,7 @@
 <translation id="1706625117072057435">የማጉላት ደረጃዎች</translation>
 <translation id="1708338024780164500">(የቦዘነ)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (መታወቂያ፦ <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">የሙከራ አሳሽ! ውሂብዎ ሊጠፋ ወይም ግላዊነትን ወይም ደህንነትን አደጋ ላይ ሊጥል ይችላል። እባክዎ ችግሮችን በሚከተለው ሪፖርት ያድርጉ፦ እገዛ &gt; «ችግርን ሪፖርት አድርግ...»።</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ቤተኛ)</translation>
 <translation id="1709217939274742847">ለማረጋገጥ የሚጠቀሙበት ቲኬት ይምረጡ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">ማጋራት አይችሉም</translation>
@@ -1096,6 +1097,7 @@
 <translation id="2144557304298909478">የLinux Android መተግበሪያ ግንባታ</translation>
 <translation id="2146263598007866206">ጣቢያዎች እርስዎን ጊዜ ለመቆጠብ ተዛማጅ ፋይሎችን በራስ-ሰር አብረው ማውረድ ይችላሉ</translation>
 <translation id="2147151613919729065">የእንግዳ ሁነታን ታሪክ ለማፅዳት፣ ሁሉንም የእንግዳ መስኮቶች ይዝጉ።</translation>
+<translation id="2147218225094845757">የጎን ፓነልን ደብቅ</translation>
 <translation id="2148219725039824548">ማጋራትን ማፈናጠጥ ላይ ስህተት። የተገለጸው ማጋራት በአውታረ መረቡ ላይ አልተገኘም።</translation>
 <translation id="2148756636027685713">ቅርጸት መስራት ተጠናቅቋል</translation>
 <translation id="2148892889047469596">ትር ውስድ</translation>
@@ -3943,6 +3945,7 @@
 <translation id="5269977353971873915">ማተም አልተሳካም</translation>
 <translation id="5275352920323889391">ውሻ</translation>
 <translation id="527605982717517565">ሁልጊዜ በ<ph name="HOST" /> ላይ ጃቫስክሪፕት ፍቀድ</translation>
+<translation id="5277127016695466621">የጎን ፓነልን አሳይ</translation>
 <translation id="5278823018825269962">የሁኔታ መታወቂያ</translation>
 <translation id="5280064835262749532">ለ <ph name="SHARE_PATH" /> የዕውቅና ማረጋገጫዎችን ያዘምኑ</translation>
 <translation id="5280243692621919988">ሁሉንም መስኮቶች ሲዘጉ ኩኪዎችን እና የጣቢያ ውሂብን ያጽዱ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 706370b..2c97106 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -675,6 +675,7 @@
 <translation id="1706625117072057435">مستويات التكبير أو التصغير</translation>
 <translation id="1708338024780164500">(غير نشطة)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (رقم التعريف: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">المتصفِّح تجريبي، ولذلك قد تفقد البيانات أو تُنتهَك خصوصيتك أو يُخترَق أمانك. يُرجى الإبلاغ عن أي مشاكل من خلال الانتقال إلى: مساعدة &gt; "الإبلاغ عن مشكلة...".</translation>
 <translation id="1709106626015023981">‏<ph name="WIDTH" /> x <ph name="HEIGHT" /> (الأصلي)</translation>
 <translation id="1709217939274742847">اختَر تذكرة لاستخدامها في المصادقة. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">تعذَّرت المشاركة</translation>
@@ -1092,6 +1093,7 @@
 <translation id="2144557304298909478">‏تطوير تطبيق متوافق مع Android لنظام التشغيل Linux</translation>
 <translation id="2146263598007866206">قد تعمل المواقع الإلكترونية على تنزيل الملفات المتشابهة معًا تلقائيًا لتوفير الوقت.</translation>
 <translation id="2147151613919729065">لمحو سجلّ "وضع الضيف"، أغلِق كل النوافذ المفتوحة في هذا الوضع.</translation>
+<translation id="2147218225094845757">إخفاء اللوحة الجانبية</translation>
 <translation id="2148219725039824548">حدث خطأ في تحميل المشاركة. لم يتم العثور على المشاركة المُحدَّدة في الشبكة.</translation>
 <translation id="2148756636027685713">انتهت عملية التنسيق</translation>
 <translation id="2148892889047469596">علامة التبويب "إرسال"</translation>
@@ -3939,6 +3941,7 @@
 <translation id="5269977353971873915">تعذّرت الطباعة</translation>
 <translation id="5275352920323889391">كلب</translation>
 <translation id="527605982717517565">‏السماح بتشغيل JavaScript على الموقع <ph name="HOST" /> دومًا</translation>
+<translation id="5277127016695466621">إظهار اللوحة الجانبية</translation>
 <translation id="5278823018825269962">رقم تعريف الحالة</translation>
 <translation id="5280064835262749532">تحديث بيانات اعتماد <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">محو ملفات تعريف الارتباط وبيانات الموقع الإلكتروني عند إغلاق جميع النوافذ</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 10aac1b3..b169577 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -680,6 +680,7 @@
 <translation id="1706625117072057435">জুমৰ স্তৰ</translation>
 <translation id="1708338024780164500">(নিষ্ক্ৰিয়)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (আইডি: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">পৰীক্ষামূলক ব্ৰাউজাৰ! ডেটা হেৰুৱাব পাৰে অথবা গোপনীয়তা অথবা সুৰক্ষাৰ ক্ষেত্ৰত আপোচ কৰা হ’ব পাৰে। অনুগ্ৰহ কৰি ইয়াৰ জৰিয়তে সমস্যাৰ অভিযোগ দিয়ক: সহায় &gt; "সমস্যাৰ অভিযোগ দিয়ক…"।</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (স্থানীয়)</translation>
 <translation id="1709217939274742847">বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে ব্যৱহাৰ কৰিবলৈ এটা টিকেট বাছনি কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">শ্বেয়াৰ কৰিব নোৱাৰি</translation>
@@ -1098,6 +1099,7 @@
 <translation id="2144557304298909478">Linux Android এপৰ বিকাশ</translation>
 <translation id="2146263598007866206">ছাইটসমূহে আপোনাৰ সময় ৰাহি কৰিবলৈ মিল থকা ফাইলসমূহ স্বয়ংক্ৰিয়ভাৱে ডাউনল'ড কৰিব পাৰে</translation>
 <translation id="2147151613919729065">অতিথি ম’ডৰ ইতিহাস মচিবলৈ আটাইবোৰ অতিথিৰ ৱিণ্ড’ বন্ধ কৰক।</translation>
+<translation id="2147218225094845757">ছাইডৰ পেনেল লুকুৱাওক</translation>
 <translation id="2148219725039824548">শ্বেয়াৰ মাউণ্ট কৰোঁতে আসোঁৱাহ হ’ল। নেটৱর্কত নির্দিষ্ট কৰা শ্বেয়াৰ কৰা কার্যটো বিচাৰি পোৱ নগ’ল।</translation>
 <translation id="2148756636027685713">ফৰ্মেট কৰা সম্পূৰ্ণ হ’ল</translation>
 <translation id="2148892889047469596">টেব কাষ্ট কৰক</translation>
@@ -3945,6 +3947,7 @@
 <translation id="5269977353971873915">প্ৰিণ্ট কৰিব পৰা নগ'ল</translation>
 <translation id="5275352920323889391">কুকুৰ</translation>
 <translation id="527605982717517565"><ph name="HOST" />ত সদায় JavaScriptক অনুমতি দিয়ক</translation>
+<translation id="5277127016695466621">ছাইডৰ পেনেল দেখুৱাওক</translation>
 <translation id="5278823018825269962">স্থিতিৰ আইডি</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" />ৰ বাবে ক্ৰিডেনশ্বিয়েলসমূহ আপডে’ট কৰক</translation>
 <translation id="5280243692621919988">আপুনি সকলো ৱিণ্ড' বন্ধ কৰিলে কুকিসমূহ আৰু ছাইটৰ ডেটা মচক</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index fd1a448..5b407b12 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -667,6 +667,7 @@
 <translation id="1706625117072057435">Zoom səviyyələri</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Eksperimental brauzer! Data itirilə, yaxud məxfilik və ya güvənlik təhlükəsi yarana bilər. Yardım &gt; "Problem barədə bildirin..." vasitəsilə problemlər barədə bildirin.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Milli)</translation>
 <translation id="1709217939274742847">Doğrulamada istifadə edəcəyiniz bileti seçin. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Paylaşmaq mümkün deyil</translation>
@@ -1084,6 +1085,7 @@
 <translation id="2144557304298909478">Linux Android tətbiqinin inkişafı ayarları</translation>
 <translation id="2146263598007866206">Saytlar vaxtınıza qənaət etmək üçün əlaqəli faylları birlikdə avtomatik olaraq endirə bilər</translation>
 <translation id="2147151613919729065">Qonaq rejimi tarixçəsini silmək üçün bütün Qonaq pəncərələrini bağlayın.</translation>
+<translation id="2147218225094845757">Yan paneli gizlədin</translation>
 <translation id="2148219725039824548">Paylaşım xətası. Göstərilən paylaşım şəbəkədə tapılmadı.</translation>
 <translation id="2148756636027685713">Formatlama tamamlandı</translation>
 <translation id="2148892889047469596">Yayım paneli</translation>
@@ -3932,6 +3934,7 @@
 <translation id="5269977353971873915">Çap alınmadı</translation>
 <translation id="5275352920323889391">İt</translation>
 <translation id="527605982717517565"><ph name="HOST" /> hostunda həmişə JavaScript'ə icazə verin</translation>
+<translation id="5277127016695466621">Yan paneli göstərin</translation>
 <translation id="5278823018825269962">Status Id'si</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> üçün giriş məlumatlarını yeniləyin</translation>
 <translation id="5280243692621919988">Bütün pəncərələri bağladıqda kukilər və sayt datasını silin</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 5eef047..3c4caf0f 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -674,6 +674,7 @@
 <translation id="1706625117072057435">Узроўні маштабавання</translation>
 <translation id="1708338024780164500">(Неактыўная)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ідэнтыфікатар: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Эксперыментальны браўзер! Існуе імавернасць страты даных і пагроза прыватнасці і бяспецы. Просім вас паведамляць пра праблемы праз меню "Даведка &gt; Паведаміць аб праблеме...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (уласная)</translation>
 <translation id="1709217939274742847">Выберыце, які білет выкарыстоўваць для аўтэнтыфікацыі. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Збой абагульвання</translation>
@@ -1091,6 +1092,7 @@
 <translation id="2144557304298909478">Распрацоўка праграм для Android у Linux</translation>
 <translation id="2146263598007866206">Сайты могуць аўтаматычна спампоўваць звязаныя файлы разам, каб эканоміць час</translation>
 <translation id="2147151613919729065">Каб выдаліць гісторыю гасцявога рэжыму, закрыйце ўсе вокны, адкрытыя ў гэтым рэжыме.</translation>
+<translation id="2147218225094845757">Схаваць бакавую панэль</translation>
 <translation id="2148219725039824548">Не ўдалося падключыць абагулены рэсурс. Вызначаны рэсурс не знойдзены ў сетцы.</translation>
 <translation id="2148756636027685713">Фармаціраванне завершана</translation>
 <translation id="2148892889047469596">Укладка трансляцыі</translation>
@@ -3936,6 +3938,7 @@
 <translation id="5269977353971873915">Збой друку</translation>
 <translation id="5275352920323889391">Сабака</translation>
 <translation id="527605982717517565">Заўсёды дазваляць сайту <ph name="HOST" /> выкарыстоўваць JavaScript</translation>
+<translation id="5277127016695466621">Паказаць бакавую панэль</translation>
 <translation id="5278823018825269962">Ідэнтыфікатар стану</translation>
 <translation id="5280064835262749532">Змяніце ўліковыя даныя для <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Выдаляць файлы cookie і даныя сайтаў пры закрыцці ўсіх вокнаў</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index fee66fb..8935340 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -681,6 +681,7 @@
 <translation id="1706625117072057435">Nivoi zumiranja</translation>
 <translation id="1708338024780164500">(Neaktivan)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Eksperimentalni preglednik! Moguć je gubitak podataka ili ugrožavanje privatnosti ili sigurnosti. Prijavite probleme u odjeljku: Pomoć &gt; "Prijavite problem...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (izvorna)</translation>
 <translation id="1709217939274742847">Odaberite tiket za autentifikaciju. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Nije moguće dijeliti</translation>
@@ -1099,6 +1100,7 @@
 <translation id="2144557304298909478">Razvoj Android aplikacija na Linuxu</translation>
 <translation id="2146263598007866206">Web lokacije mogu automatski zajedno preuzimati srodne fajlove radi uštede na vremenu</translation>
 <translation id="2147151613919729065">Da obrišete historiju Načina rada za gosta, zatvorite sve prozore gosta.</translation>
+<translation id="2147218225094845757">Sakrivanje bočne ploče</translation>
 <translation id="2148219725039824548">Greška prilikom aktiviranja dijeljenog sadržaja. Navedeni dijeljeni sadržaj nije pronađen na mreži.</translation>
 <translation id="2148756636027685713">Formatiranje je završeno</translation>
 <translation id="2148892889047469596">Emitiraj karticu</translation>
@@ -3950,6 +3952,7 @@
 <translation id="5269977353971873915">Štampanje nije uspjelo</translation>
 <translation id="5275352920323889391">Pas</translation>
 <translation id="527605982717517565">Uvijek omogući JavaScript na web lokaciji <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Prikaz bočne ploče</translation>
 <translation id="5278823018825269962">ID statusa</translation>
 <translation id="5280064835262749532">Ažurirajte akreditive za <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Obriši kolačiće i podatke o web lokaciji kada se svi prozori zatvore</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index c6b6f7d..9e63a91a 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">Nivells de zoom</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (identificador: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Aquest és un navegador experimental. És possible que es perdin dades o que es posin en perill la privadesa i seguretat. Informa de qualsevol problema des d'Ajuda &gt; Informa d'un problema...</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativa)</translation>
 <translation id="1709217939274742847">Tria un tiquet per autenticar-te. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">No es pot compartir</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Desenvolupament d'aplicacions d'Android a Linux</translation>
 <translation id="2146263598007866206">És possible que els llocs web baixin automàticament fitxers relacionats en grup per estalviar-te temps</translation>
 <translation id="2147151613919729065">Per esborrar l'historial del mode de convidat, tanca totes les finestres de convidat.</translation>
+<translation id="2147218225094845757">Amaga el tauler lateral</translation>
 <translation id="2148219725039824548">S'ha produït un error en activar l'ús compartit especificat perquè no s'ha trobat a la xarxa.</translation>
 <translation id="2148756636027685713">Format finalitzat</translation>
 <translation id="2148892889047469596">Emet la pestanya</translation>
@@ -3936,6 +3938,7 @@
 <translation id="5269977353971873915">Error d'impressió</translation>
 <translation id="5275352920323889391">Gos</translation>
 <translation id="527605982717517565">Permet sempre JavaScript a <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Mostra el tauler lateral</translation>
 <translation id="5278823018825269962">Identificador d'estat</translation>
 <translation id="5280064835262749532">Actualitza les credencials per a <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Esborra les galetes i les dades dels llocs web en tancar totes les finestres</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 3f42e83..512620c3 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -673,6 +673,7 @@
 <translation id="1706625117072057435">Úrovně přiblížení</translation>
 <translation id="1708338024780164500">(Neaktivní)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Experimentální prohlížeč! Může dojít ke ztrátě dat nebo porušení ochrany soukromí či zabezpečení. Problémy hlaste v sekci Nápověda &gt; Nahlásit problém…</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> × <ph name="HEIGHT" /> (nativní)</translation>
 <translation id="1709217939274742847">Vyberte lístek, který chcete použít k ověření. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Sdílení se nezdařilo</translation>
@@ -1089,6 +1090,7 @@
 <translation id="2144557304298909478">Vývoj aplikací Android pro Linux</translation>
 <translation id="2146263598007866206">Weby mohou automaticky stahovat související soubory, aby vám ušetřily čas</translation>
 <translation id="2147151613919729065">Pokud chcete vymazat historii režimu hosta, zavřete všechna okna hosta.</translation>
+<translation id="2147218225094845757">Skrýt boční panel</translation>
 <translation id="2148219725039824548">Při připojování sdílené složky došlo k chybě. Zadaná sdílená složka v síti nebyla nalezena.</translation>
 <translation id="2148756636027685713">Formátování je dokončeno</translation>
 <translation id="2148892889047469596">Odeslat kartu</translation>
@@ -3934,6 +3936,7 @@
 <translation id="5269977353971873915">Tisk se nezdařil</translation>
 <translation id="5275352920323889391">Pes</translation>
 <translation id="527605982717517565">Vždy povolovat JavaScript z webu <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Zobrazit boční panel</translation>
 <translation id="5278823018825269962">ID stavu</translation>
 <translation id="5280064835262749532">Aktualizujte identifikační údaje pro <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Smazat soubory cookie a data webů, když zavřete všechna okna</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index f717797..570365d2 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -683,6 +683,7 @@
 <translation id="1706625117072057435">Zoomniveauer</translation>
 <translation id="1708338024780164500">(inaktiv)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (id: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Eksperimentel browser! Data kan gå tabt, og beskyttelsen af personlige oplysninger og sikkerheden kan blive kompromitteret. Du kan rapportere problemer ved at gå til Hjælp &gt; "Rapportér et problem...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Oprindelig)</translation>
 <translation id="1709217939274742847">Vælg en billet, som du vil bruge til godkendelse. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Delingen lykkedes ikke</translation>
@@ -1101,6 +1102,7 @@
 <translation id="2144557304298909478">Udvikling af Android-apps i Linux</translation>
 <translation id="2146263598007866206">Websites kan automatisk downloade relaterede filer sammen for at spare tid</translation>
 <translation id="2147151613919729065">Du kan rydde historikken for Gæstetilstand ved at lukke alle gæstevinduer.</translation>
+<translation id="2147218225094845757">Skjul sidepanel</translation>
 <translation id="2148219725039824548">Der opstod en fejl ved anvendelse af deling. Den angivne deling blev ikke fundet på netværket.</translation>
 <translation id="2148756636027685713">Formatering er fuldført</translation>
 <translation id="2148892889047469596">Cast fanen</translation>
@@ -3953,6 +3955,7 @@
 <translation id="5269977353971873915">Udskrift mislykkedes</translation>
 <translation id="5275352920323889391">Hund</translation>
 <translation id="527605982717517565">Tillad altid JavaScript på <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Vis sidepanel</translation>
 <translation id="5278823018825269962">Status-id</translation>
 <translation id="5280064835262749532">Opdater loginoplysninger for <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Ryd cookies og websitedata, når du lukker alle vinduer</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 3cbd7286..0eb9939 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -668,6 +668,7 @@
 <translation id="1706625117072057435">Zoomstufen</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Dies ist ein experimenteller Browser. Es besteht die Gefahr, dass Sie Daten verlieren oder Ihre Privatsphäre oder Sicherheit kompromittiert wird. Melden Sie Probleme über „Hilfe“ &gt; „Problem melden…“.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativ)</translation>
 <translation id="1709217939274742847">Wählen Sie ein Ticket für die Authentifizierung aus. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Teilen nicht möglich</translation>
@@ -1085,6 +1086,7 @@
 <translation id="2144557304298909478">Android-App-Entwicklung in Linux</translation>
 <translation id="2146263598007866206">Websites laden zusammengehörende Dateien möglicherweise automatisch gemeinsam herunter, um Ihnen Zeit zu sparen</translation>
 <translation id="2147151613919729065">Wenn Sie den Verlauf des Gastmodus löschen möchten, müssen Sie zuerst alle Fenster schließen, die darin geöffnet sind.</translation>
+<translation id="2147218225094845757">Seitenleiste ausblenden</translation>
 <translation id="2148219725039824548">Fehler beim Bereitstellen der Freigabe. Die angegebene Freigabe wurde im Netzwerk nicht gefunden.</translation>
 <translation id="2148756636027685713">Formatierung beendet</translation>
 <translation id="2148892889047469596">Tab streamen</translation>
@@ -3931,6 +3933,7 @@
 <translation id="5269977353971873915">Fehler beim Drucken</translation>
 <translation id="5275352920323889391">Hund</translation>
 <translation id="527605982717517565">JavaScript auf <ph name="HOST" /> immer zulassen</translation>
+<translation id="5277127016695466621">Seitenleiste einblenden</translation>
 <translation id="5278823018825269962">Status-ID</translation>
 <translation id="5280064835262749532">Anmeldedaten für <ph name="SHARE_PATH" /> aktualisieren</translation>
 <translation id="5280243692621919988">Cookies und Websitedaten löschen, wenn alle Fenster geschlossen werden</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index e623eb8..0f72537 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">Επίπεδα εστίασης</translation>
 <translation id="1708338024780164500">(Ανενεργή)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (Αναγνωριστικό: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Πειραματικό πρόγραμμα περιήγησης! Είναι πιθανό να χάσετε δεδομένα ή να θέσει σε κίνδυνο το απόρρητο ή την ασφάλειά σας. Αναφέρετε τυχόν προβλήματα στην ενότητα: Βοήθεια &gt; Αναφορά προβλήματος…</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Εγγενής)</translation>
 <translation id="1709217939274742847">Επιλέξτε ένα εισιτήριο που θα χρησιμοποιηθεί για έλεγχο ταυτότητας. <ph name="LINK_BEGIN" />Μάθετε περισσότερα.<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Δεν είναι δυνατή η κοινοποίηση</translation>
@@ -1100,6 +1101,7 @@
 <translation id="2144557304298909478">Ανάπτυξη εφαρμογών Android Linux</translation>
 <translation id="2146263598007866206">Οι ιστότοποι μπορεί να κατεβάζουν αυτόματα όλα τα σχετικά αρχεία μαζί για την εξοικονόμηση χρόνου.</translation>
 <translation id="2147151613919729065">Για διαγραφή του ιστορικού της λειτουργίας επισκέπτη, κλείστε όλα τα παράθυρα επισκέπτη.</translation>
+<translation id="2147218225094845757">Απόκρυψη πλαϊνού πλαισίου</translation>
 <translation id="2148219725039824548">Σφάλμα κατά την προσάρτηση του συστήματος κοινοποίησης. Το καθορισμένο σύστημα κοινοποίησης δεν βρέθηκε στο δίκτυο.</translation>
 <translation id="2148756636027685713">Η μορφοποίηση ολοκληρώθηκε</translation>
 <translation id="2148892889047469596">Μετάδοση καρτέλας</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">Η εκτύπωση απέτυχε</translation>
 <translation id="5275352920323889391">Σκύλος</translation>
 <translation id="527605982717517565">Να επιτρέπεται πάντα το JavaScript στο <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Εμφάνιση πλαϊνού πλαισίου</translation>
 <translation id="5278823018825269962">Αναγνωριστικό κατάστασης</translation>
 <translation id="5280064835262749532">Ενημέρωση διαπιστευτηρίων για το <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Διαγραφή cookie και δεδομένων ιστοτόπου κατά το κλείσιμο όλων των παραθύρων</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 25486ca3..8318797 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">Zoom levels</translation>
 <translation id="1708338024780164500">(Inactive)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Experimental browser! May lose data or compromise privacy or security. Please report issues with: Help &gt; 'Report an issue…'</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Native)</translation>
 <translation id="1709217939274742847">Choose a ticket to use for authentication. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Can’t share</translation>
@@ -1100,6 +1101,7 @@
 <translation id="2144557304298909478">Linux Android app development</translation>
 <translation id="2146263598007866206">Sites might automatically download related files together to save you time</translation>
 <translation id="2147151613919729065">To clear Guest mode history, close all Guest windows.</translation>
+<translation id="2147218225094845757">Hide side panel</translation>
 <translation id="2148219725039824548">Error mounting share. The specified share was not found on the network.</translation>
 <translation id="2148756636027685713">Formatting finished</translation>
 <translation id="2148892889047469596">Cast tab</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">Print Failed</translation>
 <translation id="5275352920323889391">Dog</translation>
 <translation id="527605982717517565">Always allow JavaScript on <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Show side panel</translation>
 <translation id="5278823018825269962">Status ID</translation>
 <translation id="5280064835262749532">Update credentials for <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Clear cookies and site data when you close all windows</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index ae00325..e252ca6 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -668,6 +668,7 @@
 <translation id="1706625117072057435">Niveles de zoom</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">¡Navegador experimental! Es posible que se pierdan datos o se ponga en riesgo la seguridad o la privacidad. Para informar problemas, usa la opción Ayuda &gt; "Informar un problema…".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> × <ph name="HEIGHT" /> (resolución nativa)</translation>
 <translation id="1709217939274742847">Elige un ticket para usar en la autenticación. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">No se puede compartir</translation>
@@ -1085,6 +1086,7 @@
 <translation id="2144557304298909478">Desarrollo de apps para Android en Linux</translation>
 <translation id="2146263598007866206">Es posible que los sitios descarguen automáticamente archivos relacionados de forma conjunta para ahorrar tiempo.</translation>
 <translation id="2147151613919729065">Para borrar el historial del modo de invitado, cierra todas las ventanas de invitado.</translation>
+<translation id="2147218225094845757">Ocultar panel lateral</translation>
 <translation id="2148219725039824548">Se produjo un error al activar el recurso compartido porque no se lo encontró en la red.</translation>
 <translation id="2148756636027685713">Formato terminado</translation>
 <translation id="2148892889047469596">Transmitir pestaña</translation>
@@ -3933,6 +3935,7 @@
 <translation id="5269977353971873915">Error de impresión</translation>
 <translation id="5275352920323889391">Perro</translation>
 <translation id="527605982717517565">Siempre permitir JavaScript en <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Mostrar panel lateral</translation>
 <translation id="5278823018825269962">ID de estado</translation>
 <translation id="5280064835262749532">Actualiza las credenciales para <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Borrar las cookies y los datos de los sitios cuando cierras todas las ventanas</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index ee5d1b89..8a60d257 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">Niveles de zoom</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Navegador experimental. Es posible que se pierdan datos o que se vulnere la privacidad o la seguridad. Para informar de cualquier problema, ve a Ayuda &gt; Notificar un problema.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (resolución nativa)</translation>
 <translation id="1709217939274742847">Selecciona el ticket que vas a usar para autenticarte. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">No se puede compartir</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Desarrollo de aplicaciones Android en Linux</translation>
 <translation id="2146263598007866206">Los sitios podrían descargar de forma automática varios archivos relacionados a la vez para ahorrar tiempo.</translation>
 <translation id="2147151613919729065">Para borrar el historial del Modo invitados, cierra todas las ventanas de la sesión de invitados.</translation>
+<translation id="2147218225094845757">Ocultar panel lateral</translation>
 <translation id="2148219725039824548">No se ha podido activar el recurso compartido. No se ha encontrado el recurso especificado en la red.</translation>
 <translation id="2148756636027685713">El proceso de formateo ha terminado.</translation>
 <translation id="2148892889047469596">Enviar pestaña</translation>
@@ -3935,6 +3937,7 @@
 <translation id="5269977353971873915">Error de impresión</translation>
 <translation id="5275352920323889391">Perro</translation>
 <translation id="527605982717517565">Permitir siempre JavaScript en <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Mostrar panel lateral</translation>
 <translation id="5278823018825269962">ID de estado</translation>
 <translation id="5280064835262749532">Actualiza las credenciales de <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Borrar cookies y datos de sitios al cerrar todas las ventanas</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index d511f93..b815438 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -674,6 +674,7 @@
 <translation id="1706625117072057435">Suumitasemed</translation>
 <translation id="1708338024780164500">(Passiivne)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Katseline brauser! Andmed võivad kaduma minna, privaatsus või turvalisus võib olla ohustatud. Teavitage probleemidest valikutega Abi &gt; „Probleemist teavitamine …”.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (omaeraldusvõime)</translation>
 <translation id="1709217939274742847">Valige pilet, mida autentimiseks kasutada. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Ei saa jagada</translation>
@@ -1091,6 +1092,7 @@
 <translation id="2144557304298909478">Linuxi Androidi rakenduse arendamine</translation>
 <translation id="2146263598007866206">Saidid võivad seotud faile koos automaatselt alla laadida, et teie aega säästa</translation>
 <translation id="2147151613919729065">Külalisrežiimi ajaloo kustutamiseks sulgege kõik külalise aknad.</translation>
+<translation id="2147218225094845757">Peida külgpaneel</translation>
 <translation id="2148219725039824548">Viga jagatava üksuse ühendamisel. Jagatavat üksust võrgust ei leitud.</translation>
 <translation id="2148756636027685713">Vormindamine on lõpetatud</translation>
 <translation id="2148892889047469596">Vahelehe ülekandmine</translation>
@@ -3942,6 +3944,7 @@
 <translation id="5269977353971873915">Printimine nurjus</translation>
 <translation id="5275352920323889391">Koer</translation>
 <translation id="527605982717517565">Luba alati JavaScript saidil <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Kuva külgpaneel</translation>
 <translation id="5278823018825269962">Oleku ID</translation>
 <translation id="5280064835262749532">Värskendage üksuse <ph name="SHARE_PATH" /> mandaati</translation>
 <translation id="5280243692621919988">Kustuta kõigi akende sulgemisel küpsisefailid ja saitide andmed</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index 330c064..f48b076 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">Zoom-mailak</translation>
 <translation id="1708338024780164500">(Inaktibo)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (IDa: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Probako arakatzailea. Baliteke datuak galtzea, edo pribatutasuna edo segurtasuna arriskuan jartzea. Arazoren bat aurkituz gero, jakinaraz ezazu hemen: Laguntza &gt; "Eman arazo baten berri…".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> × <ph name="HEIGHT" /> (natiboa)</translation>
 <translation id="1709217939274742847">Aukeratu autentifikazioan erabiltzeko zerbitzu-eskaera bat. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Ezin da partekatu</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Linux-en Android-erako aplikazioen garapena</translation>
 <translation id="2146263598007866206">Baliteke webguneek erlazionatutako fitxategiak automatikoki deskargatzea, denbora aurrezteko</translation>
 <translation id="2147151613919729065">Gonbidatu moduko historia garbitzeko, itxi gonbidatu moduko leiho guztiak.</translation>
+<translation id="2147218225094845757">Ezkutatu alboko panela</translation>
 <translation id="2148219725039824548">Errore bat gertatu da fitxategiak partekatzeko biltegia muntatzean. Zehaztutako fitxategiak partekatzeko biltegia ez da aurkitu sarean.</translation>
 <translation id="2148756636027685713">Formateatzen amaitu da</translation>
 <translation id="2148892889047469596">Igorri fitxa</translation>
@@ -3935,6 +3937,7 @@
 <translation id="5269977353971873915">Inprimatzeak huts egin du</translation>
 <translation id="5275352920323889391">Txakurra</translation>
 <translation id="527605982717517565">Eman beti JavaScript <ph name="HOST" /> ostalarian erabiltzeko baimena</translation>
+<translation id="5277127016695466621">Erakutsi alboko panela</translation>
 <translation id="5278823018825269962">Egoeraren IDa</translation>
 <translation id="5280064835262749532">Eguneratu hemengo kredentzialak: <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Garbitu cookieak eta webguneetako datuak leiho guztiak ixten dituzunean</translation>
@@ -4861,7 +4864,7 @@
 <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> ezin izan da konfiguratu automatikoki. Zehaztu inprimagailuaren xehetasun aurreratuak. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="630292539633944562">Informazio pertsonalari buruzko iradokizunak</translation>
 <translation id="6305607932814307878">Gidalerro orokorra:</translation>
-<translation id="6307990684951724544">Sistema lanpetuta dago</translation>
+<translation id="6307990684951724544">Sistema okupatuta dago</translation>
 <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> luzapenaren bidezko saio-hasiera</translation>
 <translation id="6308937455967653460">Gorde &amp;esteka honela…</translation>
 <translation id="6309443618838462258">Administratzaileak ez du onartzen idazketa-metodo hau</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 7e28931d..0ddc5ff3 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -680,6 +680,7 @@
 <translation id="1706625117072057435">سطوح بزرگ‌نمایی</translation>
 <translation id="1708338024780164500">(غیرفعال)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (شناسه: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">مرورگر آزمایشی! ممکن است داده‌ها ازبین برود یا امنیت یا حریم‌خصوصی به‌خطر بیفتد. لطفاً مشکلات را ازطریق «راهنمایی &gt; گزارش مشکل…» گزارش کنید.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> × <ph name="HEIGHT" /> (اصلی)</translation>
 <translation id="1709217939274742847">بلیتی انتخاب کنید تا برای اصالت‌سنجی از آن استفاده کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">هم‌رسانی نشد</translation>
@@ -1097,6 +1098,7 @@
 <translation id="2144557304298909478">‏تولید برنامه Android در Linux</translation>
 <translation id="2146263598007866206">سایت‌ها شاید به‌طور خودکار فایل‌های مرتبط را با هم بارگیری کنند تا در زمان صرفه‌جویی شود</translation>
 <translation id="2147151613919729065">برای پاک کردن سابقه «حالت مهمان»، همه پنحره‌های «مهمان» را ببندید.</translation>
+<translation id="2147218225094845757">پنهان کردن پانل کناری</translation>
 <translation id="2148219725039824548">هنگام نشاندن دستگاه ذخیره‌سازی متصل به شبکه خطایی روی داد. دستگاه ذخیره‌سازی مشخص‌شده در شبکه پیدا نشد.</translation>
 <translation id="2148756636027685713">قالب‌بندی تمام شد</translation>
 <translation id="2148892889047469596">برگه فرستادن</translation>
@@ -3949,6 +3951,7 @@
 <translation id="5269977353971873915">چاپ نشد</translation>
 <translation id="5275352920323889391">سگ</translation>
 <translation id="527605982717517565">همیشه جاوا اسکریپت در <ph name="HOST" /> مجاز باشد</translation>
+<translation id="5277127016695466621">نمایش پانل کناری</translation>
 <translation id="5278823018825269962">شناسه وضعیت</translation>
 <translation id="5280064835262749532">به‌روزرسانی اطلاعات کاربری <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">وقتی همه پنجره‌ها را می‌بندید، کوکی‌ها و داده‌های سایت پاک شود</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 2c97ad2..05e1304 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -681,6 +681,7 @@
 <translation id="1706625117072057435">Zoomaustasot</translation>
 <translation id="1708338024780164500">(Ei-aktiivinen)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (tunnus: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Kokeellinen selain. Dataa saatetaan menettää tai yksityisyys tai turvallisuus voivat vaarantua. Ilmoita ongelmista kohdassa Ohje &gt; "Ilmoita ongelmasta…".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (natiivitarkkuus)</translation>
 <translation id="1709217939274742847">Valitse todennukseen käytettävä tukipyyntö. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Jakaminen ei onnistu</translation>
@@ -1099,6 +1100,7 @@
 <translation id="2144557304298909478">Linuxin Android-sovellusten kehittäminen</translation>
 <translation id="2146263598007866206">Sivustot voivat ladata toisiinsa liittyviä tiedostoja automaattisesti yhdessä säästääkseen aikaa</translation>
 <translation id="2147151613919729065">Voit tyhjentää vierastilan historian sulkemalla kaikki vierasikkunat.</translation>
+<translation id="2147218225094845757">Piilota sivupaneeli</translation>
 <translation id="2148219725039824548">Virhe jaon käyttöönotossa. Kyseistä jakoa ei löytynyt verkosta.</translation>
 <translation id="2148756636027685713">Alustus valmis</translation>
 <translation id="2148892889047469596">Suoratoista välilehti</translation>
@@ -3948,6 +3950,7 @@
 <translation id="5269977353971873915">Tulostus epäonnistui</translation>
 <translation id="5275352920323889391">Koira</translation>
 <translation id="527605982717517565">Salli aina JavaScript sivustossa <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Näytä sivupaneeli</translation>
 <translation id="5278823018825269962">Tilatunnus</translation>
 <translation id="5280064835262749532">Päivitä kirjautumistiedot: <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Tyhjennä evästeet ja sivustodata, kun kaikki ikkunat suljetaan</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index b668e6c4..46f65a5 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -683,6 +683,7 @@
 <translation id="1706625117072057435">Mga antas ng pag-zoom</translation>
 <translation id="1708338024780164500">(Hindi aktibo)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Pang-eksperimentong browser! Posibleng mawalan ng data o makompromiso ang privacy o seguridad. Pakiulat ang mga isyu sa: Tulong &gt; "Mag-ulat ng isyu...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Native)</translation>
 <translation id="1709217939274742847">Pumili ng ticket para magamit sa pag-authenticate. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Hindi maibahagi</translation>
@@ -1101,6 +1102,7 @@
 <translation id="2144557304298909478">Pag-develop ng Android app sa Linux</translation>
 <translation id="2146263598007866206">Posibleng awtomatikong i-download ng mga site ang magkakaugnay na file nang magkakasama para makatipid ka sa oras</translation>
 <translation id="2147151613919729065">Para i-clear ang history ng Guest mode, isara ang lahat ng Guest window.</translation>
+<translation id="2147218225094845757">Itago ang panel sa gilid</translation>
 <translation id="2148219725039824548">Nagka-error sa pag-mount ng share. Hindi nakita ang isinaad na share sa network.</translation>
 <translation id="2148756636027685713">Tapos na ang pag-format</translation>
 <translation id="2148892889047469596">I-cast ang tab</translation>
@@ -3953,6 +3955,7 @@
 <translation id="5269977353971873915">Nabigo ang Pag-print</translation>
 <translation id="5275352920323889391">Aso</translation>
 <translation id="527605982717517565">Palaging hayaan ang JavaScript sa <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Ipakita ang panel sa gilid</translation>
 <translation id="5278823018825269962">Status Id</translation>
 <translation id="5280064835262749532">I-update ang mga kredensyal para sa <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">I-clear ang cookies at data ng site kapag isinara mo ang lahat ng window</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 808a9dd..0b712af 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -672,6 +672,7 @@
 <translation id="1706625117072057435">Niveaux de zoom</translation>
 <translation id="1708338024780164500">(Inactive)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID : <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Navigateur expérimental! Il risque de perdre des données ou de compromettre votre sécurité ou la confidentialité de vos données. Veuillez signaler tout problème en sélectionnant Aide &gt; « Signaler un problème… ».</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Résolution native)</translation>
 <translation id="1709217939274742847">Choisissez un ticket à utiliser pour l'authentification. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Impossible de partager</translation>
@@ -1089,6 +1090,7 @@
 <translation id="2144557304298909478">Conception d'applications Android pour Linux</translation>
 <translation id="2146263598007866206">Les sites peuvent télécharger automatiquement et en même temps les fichiers associés pour vous faire gagner du temps</translation>
 <translation id="2147151613919729065">Pour effacer l'historique du mode Invité, fermez toutes les fenêtres de ce mode.</translation>
+<translation id="2147218225094845757">Masquer le panneau latéral</translation>
 <translation id="2148219725039824548">Erreur lors du partage. Le partage spécifié n'a pas été trouvé sur le réseau.</translation>
 <translation id="2148756636027685713">Formatage terminé</translation>
 <translation id="2148892889047469596">Diffuser l’onglet</translation>
@@ -3938,6 +3940,7 @@
 <translation id="5269977353971873915">Échec de l'impression</translation>
 <translation id="5275352920323889391">Chien</translation>
 <translation id="527605982717517565">Toujours autoriser l'utilisation de JavaScript sur <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Afficher le panneau latéral</translation>
 <translation id="5278823018825269962">Identifiant d'état</translation>
 <translation id="5280064835262749532">Mettez à jour l'authentifiant pour <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Effacer les témoins et les données des sites à la fermeture de toutes les fenêtres</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 2cd516f..2654825a 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -672,6 +672,7 @@
 <translation id="1706625117072057435">Niveaux de zoom</translation>
 <translation id="1708338024780164500">(Inactive)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID : <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Ce navigateur expérimental risque de perdre des données ou de compromettre votre sécurité ou la confidentialité de vos données. En cas de problème, veuillez sélectionner Aide &gt; Signaler un problème.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (native)</translation>
 <translation id="1709217939274742847">Sélectionnez un ticket à utiliser pour l'authentification. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Échec du partage</translation>
@@ -1089,6 +1090,7 @@
 <translation id="2144557304298909478">Développement d'applications Android sous Linux</translation>
 <translation id="2146263598007866206">Les sites peuvent télécharger automatiquement et en même temps les fichiers associés pour vous faire gagner du temps</translation>
 <translation id="2147151613919729065">Pour effacer l'historique du mode Invité, fermez toutes les fenêtres de ce mode.</translation>
+<translation id="2147218225094845757">Masquer le panneau latéral</translation>
 <translation id="2148219725039824548">Erreur lors de l'installation du partage. Le partage indiqué est introuvable sur le réseau.</translation>
 <translation id="2148756636027685713">Formatage terminé</translation>
 <translation id="2148892889047469596">Caster l'onglet</translation>
@@ -3937,6 +3939,7 @@
 <translation id="5269977353971873915">Échec de l'impression</translation>
 <translation id="5275352920323889391">Chien</translation>
 <translation id="527605982717517565">Toujours exécuter JavaScript sur <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Afficher le panneau latéral</translation>
 <translation id="5278823018825269962">ID d'état</translation>
 <translation id="5280064835262749532">Mettre à jour les identifiants pour <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Effacer les cookies et les données des sites à la fermeture du navigateur</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 130e791..f9b2bf50 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -670,6 +670,7 @@
 <translation id="1706625117072057435">Niveis de zoom</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Estás usando un navegador experimental. É posible que che faga perder datos e que poña en risco a túa privacidade ou a túa seguranza. Se tes algún problema, indícanolo en Axuda &gt; Informar dun problema...</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativa)</translation>
 <translation id="1709217939274742847">Escolle o tícket que queres utilizar para a autenticación. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Non se puido compartir o ficheiro</translation>
@@ -1087,6 +1088,7 @@
 <translation id="2144557304298909478">Programación de aplicacións de Android en Linux</translation>
 <translation id="2146263598007866206">Os sitios poderían descargar automaticamente conxuntos de ficheiros relacionados para aforrarche tempo</translation>
 <translation id="2147151613919729065">Para borrar o historial do modo Invitados, pecha todas as ventás da sesión de invitado.</translation>
+<translation id="2147218225094845757">Ocultar panel lateral</translation>
 <translation id="2148219725039824548">Produciuse un erro ao montar a localización compartida. A localización compartida especificada non se atopou na rede.</translation>
 <translation id="2148756636027685713">Formatado finalizado</translation>
 <translation id="2148892889047469596">Emitir contido da pestana</translation>
@@ -3934,6 +3936,7 @@
 <translation id="5269977353971873915">Non se puido efectuar a impresión</translation>
 <translation id="5275352920323889391">Can</translation>
 <translation id="527605982717517565">Permitir sempre JavaScript en <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Mostrar panel lateral</translation>
 <translation id="5278823018825269962">Identificador de estado</translation>
 <translation id="5280064835262749532">Actualiza as credenciais de <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Borrar as cookies e os datos dos sitios cando peches todas as ventás</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 9514567b..0527f638 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -683,6 +683,7 @@
 <translation id="1706625117072057435">ज़ूम स्तर</translation>
 <translation id="1708338024780164500">(प्रयोग में नहीं)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (आईडी: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">एक्सपेरिमेंटल ब्राउज़र! डेटा खो सकता है. इसके अलावा, निजता या सुरक्षा को खतरा हो सकता है. इससे जुड़ी किसी भी समस्या की शिकायत करने के लिए, कृपया यहां जाएं: सहायता &gt; "समस्या की शिकायत करें...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (स्थानीय)</translation>
 <translation id="1709217939274742847">पुष्टि करने के लिए टिकट चुनें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">फ़ाइल शेयर नहीं की जा सकती</translation>
@@ -1101,6 +1102,7 @@
 <translation id="2144557304298909478">Linux के लिए Android ऐप्लिकेशन बनाना</translation>
 <translation id="2146263598007866206">साइटें समय बचाने के लिए, संबंधित फ़ाइलों को अपने-आप डाउनलोड कर सकती हैं</translation>
 <translation id="2147151613919729065">मेहमान मोड का इतिहास मिटाने के लिए, मेहमान मोड वाली सभी विंडो बंद करें.</translation>
+<translation id="2147218225094845757">साइड पैनल छिपाएं</translation>
 <translation id="2148219725039824548">शेयर माउंट करने में गड़बड़ी. बताया गया शेयर नेटवर्क पर नहीं मिला.</translation>
 <translation id="2148756636027685713">स्वरूपण खत्म हो गया</translation>
 <translation id="2148892889047469596">टैब कास्ट करें</translation>
@@ -3951,6 +3953,7 @@
 <translation id="5269977353971873915">प्रिंट विफल</translation>
 <translation id="5275352920323889391">श्‍वान</translation>
 <translation id="527605982717517565"><ph name="HOST" /> पर JavaScript को हमेशा अनुमति दें</translation>
+<translation id="5277127016695466621">साइड पैनल दिखाएं</translation>
 <translation id="5278823018825269962">स्थिति का आईडी</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> के क्रेडेंशियल अपडेट करें</translation>
 <translation id="5280243692621919988">सभी विंडो बंद करने के बाद कुकी और साइट का डेटा मिटाएं</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index fbc4edb..37442147 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -672,6 +672,7 @@
 <translation id="1706625117072057435">Razine zumiranja</translation>
 <translation id="1708338024780164500">(Neaktivno)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Eksperimentalni preglednik! Može izgubiti podatke ili ugroziti privatnost ili sigurnost. Poteškoće prijavite putem odjeljka Pomoć &gt; Prijavite poteškoću...</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativno)</translation>
 <translation id="1709217939274742847">Odaberite tiket koji ćete upotrebljavati za autentifikaciju. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Dijeljenje nije moguće</translation>
@@ -1089,6 +1090,7 @@
 <translation id="2144557304298909478">Linuxov razvoj Android aplikacija</translation>
 <translation id="2146263598007866206">Web-lokacije mogu automatski zajedno preuzimati povezane datoteke kako bi vam uštedjele vrijeme</translation>
 <translation id="2147151613919729065">Da biste izbrisali povijest u načinu rada za goste, zatvorite sve gostujuće prozore.</translation>
+<translation id="2147218225094845757">Sakrij bočnu ploču</translation>
 <translation id="2148219725039824548">Pogreška pri učitavanju dijeljenja. Navedeno dijeljenje nije pronađeno na mreži.</translation>
 <translation id="2148756636027685713">Formatiranje je dovršeno</translation>
 <translation id="2148892889047469596">Emitiraj karticu</translation>
@@ -3938,6 +3940,7 @@
 <translation id="5269977353971873915">Ispis nije uspio</translation>
 <translation id="5275352920323889391">Pas</translation>
 <translation id="527605982717517565">Uvijek dopusti JavaScript na web-lokaciji <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Prikaži bočnu ploču</translation>
 <translation id="5278823018825269962">ID statusa</translation>
 <translation id="5280064835262749532">Ažurirajte vjerodajnice za <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Izbriši kolačiće i podatke web-lokacije nakon što zatvorite sve prozore</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 6f819863..5014eb43 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">Nagyítási/kicsinyítési szintek</translation>
 <translation id="1708338024780164500">(Inaktív)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (azonosító: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Kísérleti böngésző! Adatvesztés, illetve adatvédelmi vagy biztonsági probléma léphet fel. A hibákat a Súgó „Probléma bejelentése...” pontjában jelentheti be.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> képpont (natív)</translation>
 <translation id="1709217939274742847">Válassza ki a hitelesítéshez használni kívánt jegyet. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation>
 <translation id="1709972045049031556">Sikertelen megosztás</translation>
@@ -1099,6 +1100,7 @@
 <translation id="2144557304298909478">Android-alkalmazás fejlesztése Linuxra</translation>
 <translation id="2146263598007866206">Előfordulhat, hogy a webhelyek automatikusan együtt töltik le a kapcsolódó fájlokat, hogy időt takarítsanak meg Önnek</translation>
 <translation id="2147151613919729065">A vendég mód előzményeinek törléséhez zárja be a vendég módban megnyitott összes ablakot.</translation>
+<translation id="2147218225094845757">Oldalsó panel elrejtése</translation>
 <translation id="2148219725039824548">Hiba történt a megosztott tároló csatlakoztatása során. A megadott megosztott tároló nem található a hálózaton.</translation>
 <translation id="2148756636027685713">A formázás elkészült</translation>
 <translation id="2148892889047469596">Lap átküldése</translation>
@@ -3949,6 +3951,7 @@
 <translation id="5269977353971873915">A nyomtatás nem sikerült</translation>
 <translation id="5275352920323889391">Kutya</translation>
 <translation id="527605982717517565">Mindig engedélyezze a JavaScriptet itt: <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Oldalsó panel megjelenítése</translation>
 <translation id="5278823018825269962">Állapotazonosító</translation>
 <translation id="5280064835262749532">A(z) <ph name="SHARE_PATH" /> hitelesítési adatainak frissítése</translation>
 <translation id="5280243692621919988">A cookie-k és webhelyadatok törlése az összes ablak bezárásakor</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 3c118ad..54b8cbe 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -673,6 +673,7 @@
 <translation id="1706625117072057435">Մասշտաբավորման մակարդակներ</translation>
 <translation id="1708338024780164500">(Անգործուն)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID` <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Փորձնական դիտարկիչ։ Ձեր տվյալները, գաղտնիությունն ու անվտանգությունը կարող են վտանգված լինել։ Խնդիրների մասին կարող եք հաղորդել՝ սեղմելով Օգնություն &gt; «Հաղորդել խնդրի մասին»։</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (օրիգինալ)</translation>
 <translation id="1709217939274742847">Ընտրեք տոմս՝ նույնականացման համար օգտագործելու համար: <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Սխալ առաջացավ</translation>
@@ -1090,6 +1091,7 @@
 <translation id="2144557304298909478">Android-ի համար հավելվածների մշակում Լինուքսում</translation>
 <translation id="2146263598007866206">Կայքերը կարող են առնչվող ֆայլերն ավտոմատ միասին ներբեռնել՝ ձեր ժամանակը խնայելու համար</translation>
 <translation id="2147151613919729065">Հյուրի ռեժիմի պատմությունը ջնջելու համար փակեք այդ ռեժիմում բացված բոլոր պատուհանները։</translation>
+<translation id="2147218225094845757">Թաքցնել կողային վահանակը</translation>
 <translation id="2148219725039824548">Ընդհանուր միացման սխալ կա։ Նշված սարքը չի գտնվել ցանցում։</translation>
 <translation id="2148756636027685713">Ձևաչափումն ավարտված է</translation>
 <translation id="2148892889047469596">Ներդիրի հեռարձակում</translation>
@@ -3938,6 +3940,7 @@
 <translation id="5269977353971873915">Չհաջողվեց տպել</translation>
 <translation id="5275352920323889391">Շուն</translation>
 <translation id="527605982717517565">Միշտ թույլ տալ JavaScript-ը <ph name="HOST" />-ում</translation>
+<translation id="5277127016695466621">Ցուցադրել կողային վահանակը</translation>
 <translation id="5278823018825269962">Կարգավիճակի նույնացուցիչ</translation>
 <translation id="5280064835262749532">Թարմացրեք <ph name="SHARE_PATH" />-ի տվյալները</translation>
 <translation id="5280243692621919988">Բոլոր պատուհանները փակելիս մաքրել քուքիները և կայքերի տվյալները</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 98c74614b..7b46f8b8 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">Tingkat perbesar/perkecil</translation>
 <translation id="1708338024780164500">(Tidak aktif)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Browser eksperimental. Bisa kehilangan data atau membahayakan privasi atau keamanan. Laporkan masalah melalui: Bantuan &gt; "Laporkan masalah ...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Asli)</translation>
 <translation id="1709217939274742847">Pilih tiket untuk digunakan dalam proses autentikasi. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Tidak dapat berbagi</translation>
@@ -1100,6 +1101,7 @@
 <translation id="2144557304298909478">Pengembangan aplikasi Android di Linux</translation>
 <translation id="2146263598007866206">Situs mungkin dapat otomatis mendownload file yang berkaitan sekaligus untuk menghemat waktu Anda</translation>
 <translation id="2147151613919729065">Untuk menghapus histori mode Tamu, tutup semua jendela Tamu.</translation>
+<translation id="2147218225094845757">Sembunyikan panel samping</translation>
 <translation id="2148219725039824548">Error saat memasang URL berbagi. URL berbagi yang ditentukan tidak ditemukan di jaringan.</translation>
 <translation id="2148756636027685713">Pemformatan selesai</translation>
 <translation id="2148892889047469596">Transmisikan tab</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">Gagal Mencetak</translation>
 <translation id="5275352920323889391">Anjing</translation>
 <translation id="527605982717517565">Selalu izinkan JavaScript di <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Tampilkan panel samping</translation>
 <translation id="5278823018825269962">ID Status</translation>
 <translation id="5280064835262749532">Perbarui kredensial untuk <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Hapus cookie dan data situs saat Anda menutup semua jendela</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 662ad2c..9abceef 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -683,6 +683,7 @@
 <translation id="1706625117072057435">Aðdráttarstig</translation>
 <translation id="1708338024780164500">(Óvirk)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (auðkenni: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Vafri á tilraunastigi! Gæti glatað gögnum og stefnt persónuvernd eða öryggi í hættu. Tilkynntu vandamál með: Hjálp &gt; „Tilkynna vandamál…“.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (rétt)</translation>
 <translation id="1709217939274742847">Veldu miða til að nota fyrir auðkenningu. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Ekki er hægt að deila</translation>
@@ -1101,6 +1102,7 @@
 <translation id="2144557304298909478">Android forritaþróun í Linux</translation>
 <translation id="2146263598007866206">Vefsvæði gætu sjálfkrafa sótt tengdar skrár saman til að spara þér tíma</translation>
 <translation id="2147151613919729065">Til að hreinsa feril gestastillingar skaltu loka öllum gestagluggum.</translation>
+<translation id="2147218225094845757">Fela hliðarglugga</translation>
 <translation id="2148219725039824548">Villa við að tengja deilt efni. Tilgreint deilt efni fannst ekki á netinu.</translation>
 <translation id="2148756636027685713">Lokið við að sníða</translation>
 <translation id="2148892889047469596">Senda út flipa</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">Prentun mistókst</translation>
 <translation id="5275352920323889391">Hundur</translation>
 <translation id="527605982717517565">Leyfa alltaf JavaScript á <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Sýna hliðarglugga</translation>
 <translation id="5278823018825269962">Stöðukenni</translation>
 <translation id="5280064835262749532">Uppfæra skilríki fyrir <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Hreinsa fótspor og vefsvæðisgögn þegar öllum gluggum er lokað</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 9236051f..8222342 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">Livelli di zoom</translation>
 <translation id="1708338024780164500">(Non attiva)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Browser sperimentale. Potresti perdere dati oppure compromettere la sicurezza o la privacy. Segnala eventuali problemi selezionando Guida &gt; "Segnala un problema".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (formato nativo)</translation>
 <translation id="1709217939274742847">Scegli una richiesta da usare per l'autenticazione. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Impossibile condividere</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Sviluppo di app Android in Linux</translation>
 <translation id="2146263598007866206">I siti potrebbero scaricare automaticamente file correlati per aiutarti a risparmiare tempo</translation>
 <translation id="2147151613919729065">Per cancellare la cronologia della modalità Ospite, chiudi tutte le finestre Ospite.</translation>
+<translation id="2147218225094845757">Nascondi riquadro laterale</translation>
 <translation id="2148219725039824548">Errore durante il montaggio della condivisione. Impossibile trovare la condivisione specificata sulla rete.</translation>
 <translation id="2148756636027685713">Formattazione terminata</translation>
 <translation id="2148892889047469596">Trasmetti scheda</translation>
@@ -3936,6 +3938,7 @@
 <translation id="5269977353971873915">Stampa non riuscita</translation>
 <translation id="5275352920323889391">Cane</translation>
 <translation id="527605982717517565">Consenti sempre JavaScript su <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Mostra riquadro laterale</translation>
 <translation id="5278823018825269962">ID stato</translation>
 <translation id="5280064835262749532">Aggiorna le credenziali relative a <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Cancella cookie e dati dei siti alla chiusura di tutte le finestre</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 84942c6..160aac1e 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -681,6 +681,7 @@
 <translation id="1706625117072057435">רמות מרחק מתצוגה</translation>
 <translation id="1708338024780164500">(לא פעיל)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (מזהה: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">דפדפן ניסיוני! השימוש בו עלול לגרום לאובדן נתונים ולסכן את ההגנה על הפרטיות והאבטחה. אפשר לדווח על בעיות דרך 'עזרה' &gt; "דיווח על בעיה…".</translation>
 <translation id="1709106626015023981">‏<ph name="WIDTH" />‏ x ‏<ph name="HEIGHT" />‏ (מקורי)</translation>
 <translation id="1709217939274742847">בחירת כרטיס שישמש לאימות. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">השיתוף נכשל</translation>
@@ -1099,6 +1100,7 @@
 <translation id="2144557304298909478">‏פיתוח אפליקציות ל-Android ב-Linux</translation>
 <translation id="2146263598007866206">כדי לחסוך זמן, אתרים עשויים להוריד קבצים קשורים יחד, באופן אוטומטי</translation>
 <translation id="2147151613919729065">כדי לנקות את ההיסטוריה של 'מצב אורח', עליך לסגור את כל החלונות של האורחים.</translation>
+<translation id="2147218225094845757">הסתרת החלונית הצדדית</translation>
 <translation id="2148219725039824548">קרתה שגיאה בטעינת התקן הרשת לשיתוף קבצים. ההתקן שצוין לא נמצא ברשת.</translation>
 <translation id="2148756636027685713">הפרמוט הסתיים</translation>
 <translation id="2148892889047469596">העברת הכרטיסייה</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">ההדפסה נכשלה</translation>
 <translation id="5275352920323889391">כלב</translation>
 <translation id="527605982717517565">‏לאפשר תמיד JavaScript ב-<ph name="HOST" /></translation>
+<translation id="5277127016695466621">הצגת החלונית הצדדית</translation>
 <translation id="5278823018825269962">מזהה סטטוס</translation>
 <translation id="5280064835262749532">עדכון פרטי הכניסה אל <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">‏ניקוי קובצי cookie ונתוני אתרים כשכל החלונות נסגרים</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index b98cf415..b53d5f7 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">ズームレベル</translation>
 <translation id="1708338024780164500">(無効)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" />(ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">試験運用版のブラウザのため、データが失われたり、セキュリティやプライバシーが侵害されたりする可能性があります。問題が発生した場合は、[ヘルプ] &gt; [問題の報告...] からご報告ください。</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" />x<ph name="HEIGHT" />(ネイティブ)</translation>
 <translation id="1709217939274742847">認証に使用するチケットを選択します。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">共有できません</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Linux Android アプリの開発</translation>
 <translation id="2146263598007866206">時間節約のために、関連する複数のファイルをまとめて自動的にダウンロードするサイトもあります</translation>
 <translation id="2147151613919729065">ゲストモードの履歴を消去するには、ゲスト ウィンドウをすべて閉じてください。</translation>
+<translation id="2147218225094845757">サイドパネルを非表示</translation>
 <translation id="2148219725039824548">共有フォルダのマウントエラー。指定された共有フォルダがネットワークで見つかりませんでした。</translation>
 <translation id="2148756636027685713">フォーマットが完了しました</translation>
 <translation id="2148892889047469596">タブをキャスト</translation>
@@ -3936,6 +3938,7 @@
 <translation id="5269977353971873915">印刷の失敗</translation>
 <translation id="5275352920323889391">犬</translation>
 <translation id="527605982717517565"><ph name="HOST" /> の JavaScript を常に許可する</translation>
+<translation id="5277127016695466621">サイドパネルを表示</translation>
 <translation id="5278823018825269962">ステータス ID</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> の認証情報を更新してください</translation>
 <translation id="5280243692621919988">すべてのウィンドウを閉じるときに Cookie とサイトデータを削除する</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index e8fc4cc..cf82807 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">მასშტაბირების დონეები</translation>
 <translation id="1708338024780164500">(არააქტიური)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">ბრაუზერი ექსპერიმენტულია! შესაძლებელია მონაცემების დაკარგვა ან კონფიდენციალურობის/უსაფრთხოების დარღვევა. პრობლემების შესატყობინებლად გადადით აქ: დახმარება &gt; „შეტყობინება პრობლემის შესახებ...“.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (საკუთარი)</translation>
 <translation id="1709217939274742847">აირჩიეთ ავტორიზაციისთვის გამოსაყენებელი ბილეთი. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">გაზიარება ვერ ხერხდება</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Linux-ის Android აპის შემუშავება</translation>
 <translation id="2146263598007866206">საიტებმა შეიძლება ავტომატურად, ერთდროულად ჩამოტვირთოს დაკავშირებული ფაილები, რომ დროის დაზოგვაში დაგეხმაროთ</translation>
 <translation id="2147151613919729065">სტუმრის რეჟიმის ისტორიის წასაშლელად დახურეთ სტუმრის ყველა ფანჯარა.</translation>
+<translation id="2147218225094845757">გვერდითი პანელის დამალვა</translation>
 <translation id="2148219725039824548">გაზიარების მიერთებისას მოხდა შეცდომა. მითითებული გაზიარება ქველში ვერ მოიძებნა.</translation>
 <translation id="2148756636027685713">ფორმატირება დასრულდა</translation>
 <translation id="2148892889047469596">ჩანართის ტრანსლირება</translation>
@@ -3936,6 +3938,7 @@
 <translation id="5269977353971873915">ბეჭვდის შეცდომა</translation>
 <translation id="5275352920323889391">ძაღლი</translation>
 <translation id="527605982717517565">ყოველთვის დაუშვით JavaScript <ph name="HOST" />-ზე</translation>
+<translation id="5277127016695466621">გვერდითი პანელის ჩვენება</translation>
 <translation id="5278823018825269962">სტატუსის ID</translation>
 <translation id="5280064835262749532">განაახლეთ ავტორიზაციის მონაცემები <ph name="SHARE_PATH" />-ისთვის</translation>
 <translation id="5280243692621919988">ქუქი-ჩანაწერებისა და საიტების მონაცემების გასუფთავება ყველა ფანჯრის დახურვისას</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index e59307f..a3d2eba3 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -668,6 +668,7 @@
 <translation id="1706625117072057435">Масштабтау деңгейлері</translation>
 <translation id="1708338024780164500">(Белсенді емес)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ИДЕНТИФИКАТОР: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Эксперименттік браузер! Деректер жоғалуы немесе құпиялылық пен қауіпсіздікке қатер төнуі мүмкін. Кез келген ақауды "Анықтама &gt; Ақау туралы хабарлау" тармағы арқылы көрсетіңіз.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (жергілікті)</translation>
 <translation id="1709217939274742847">Аутентификация үшін қолдануға арналған билетті таңдаңыз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Бөлісу мүмкін емес</translation>
@@ -1085,6 +1086,7 @@
 <translation id="2144557304298909478">Linux жүйесінде Android қолданбаларын әзірлеу</translation>
 <translation id="2146263598007866206">Сайттар уақыт үнемдеу үшін ұқсас файлдарды автоматты түрде жүктеп ала алады.</translation>
 <translation id="2147151613919729065">Қонақ режимі тарихын тазалау үшін осы режимдегі барлық терезені жабыңыз.</translation>
+<translation id="2147218225094845757">Бүйірлік панельді жасыру</translation>
 <translation id="2148219725039824548">Ортақ файлды бөлісу кезінде қате шықты. Көрсетілген ортақ файл желіден табылмады.</translation>
 <translation id="2148756636027685713">Пішімдеу аяқталды</translation>
 <translation id="2148892889047469596">Қойынды трансляциясы</translation>
@@ -3932,6 +3934,7 @@
 <translation id="5269977353971873915">Басып шығару сәтсіз аяқталды</translation>
 <translation id="5275352920323889391">Ит</translation>
 <translation id="527605982717517565"><ph name="HOST" /> үшін JavaScript қосуға әрдайым рұқсат беру</translation>
+<translation id="5277127016695466621">Бүйірлік панельді көрсету</translation>
 <translation id="5278823018825269962">Күй идентификаторы</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> тіркелу деректерін жаңартыңыз</translation>
 <translation id="5280243692621919988">Терезелердің барлығы жабылғанда, cookie файлдары мен сайт деректерін өшіріп отыру</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 8dd967c..4086fcf 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">확대/축소 수준</translation>
 <translation id="1708338024780164500">(비활성)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" />(ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">실험용 브라우저입니다. 데이터가 손실되거나 개인 정보 보호 또는 보안 문제가 발생할 수 있습니다. 문제가 발생하면 도움말 &gt; '문제 신고...'에서 신고해 주세요.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" />x<ph name="HEIGHT" />(기본)</translation>
 <translation id="1709217939274742847">인증에 사용할 티켓을 선택하세요. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">공유할 수 없음</translation>
@@ -1100,6 +1101,7 @@
 <translation id="2144557304298909478">Linux Android 앱 개발</translation>
 <translation id="2146263598007866206">시간 절약을 위해 사이트에서 자동으로 여러 관련 파일을 한꺼번에 다운로드할 수 있습니다.</translation>
 <translation id="2147151613919729065">게스트 모드 기록을 삭제하려면 게스트 창을 모두 닫으세요.</translation>
+<translation id="2147218225094845757">측면 패널 숨기기</translation>
 <translation id="2148219725039824548">공유를 마운트하는 중에 오류가 발생했습니다. 네트워크에서 지정된 공유를 찾을 수 없습니다.</translation>
 <translation id="2148756636027685713">포맷을 마쳤습니다.</translation>
 <translation id="2148892889047469596">탭 전송</translation>
@@ -3949,6 +3951,7 @@
 <translation id="5269977353971873915">인쇄 실패</translation>
 <translation id="5275352920323889391">개</translation>
 <translation id="527605982717517565"><ph name="HOST" />에서 자바스크립트 항상 허용</translation>
+<translation id="5277127016695466621">측면 패널 표시</translation>
 <translation id="5278823018825269962">상태 ID</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> 사용자 인증 정보 업데이트</translation>
 <translation id="5280243692621919988">모든 창이 닫히면 쿠키 및 사이트 데이터 삭제</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 07e93a5..1c22ee7 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">Ченөлчөм деңгээлдери</translation>
 <translation id="1708338024780164500">(Жигерсиз)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Бул сынамык серепчи. Дайын-даректер жоголуп, же болбосо, купуялыгыңызга же коопсуздугуңузга коркунуч жаралышы мүмкүн. Көйгөйлөрдү кабарлоо үчүн Жардам &gt; "Көйгөйдү кабарлоо..." бөлүмүнө өтүңүз.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> х <ph name="HEIGHT" /> (Түпнуска)</translation>
 <translation id="1709217939274742847">Аутентификациядан өтүү үчүн билет тандоо. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Бөлүшүү мүмкүн эмес</translation>
@@ -1100,6 +1101,7 @@
 <translation id="2144557304298909478">Linux Android колдонмосун иштеп чыгуу</translation>
 <translation id="2146263598007866206">Сайттар убактыңызды үнөмдөө үчүн окшош файлдарды автоматтык түрдө жүктөп алышы мүмкүн</translation>
 <translation id="2147151613919729065">Конок режиминин таржымалын тазалоо үчүн бардык Конок терезелерин жабыңыз.</translation>
+<translation id="2147218225094845757">Капталдагы тилкени жашыруу</translation>
 <translation id="2148219725039824548">Түзмөктү кошууда ката кетти. Белгиленген түзмөк тармакта табылган жок.</translation>
 <translation id="2148756636027685713">Форматталып</translation>
 <translation id="2148892889047469596">Тышкы экранга чыгаруу өтмөгү</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">Басылып чыкпай калды</translation>
 <translation id="5275352920323889391">Ит</translation>
 <translation id="527605982717517565"><ph name="HOST" /> ичинде JavaScript'ке ар дайым уруксат берилсин</translation>
+<translation id="5277127016695466621">Капталдагы тилкени көрсөтүү</translation>
 <translation id="5278823018825269962">Абалынын идентификатору</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> үчүн эсептик дайындарды жаңыртуу</translation>
 <translation id="5280243692621919988">Бардык терезелер жабылганда, cookie файлдары менен сайттын маалыматын өчүрүү</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index e80ba01..283bc3c 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -680,6 +680,7 @@
 <translation id="1706625117072057435">ລະດັບການຊູມ</translation>
 <translation id="1708338024780164500">(ບໍ່ເຮັດວຽກ)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">ໂປຣແກຣມທ່ອງເວັບທົດລອງ! ອາດເສຍຂໍ້ມູນ ຫຼື ຖືກລະເມີດຄວາມເປັນສ່ວນຕົວ ຫຼື ຄວາມປອດໄພ. ກະລຸນາລາຍງານບັນຫາຕ່າງໆດ້ວຍ: ຊ່ວຍເຫຼືອ &gt; "ລາຍງານບັນຫາ...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ເດີມ)</translation>
 <translation id="1709217939274742847">ເລືອກປີ້ເພື່ອໃຊ້ການກວດສອບຄວາມຖືກຕ້ອງ <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">ບໍ່ສາມາດແບ່ງປັນໄດ້</translation>
@@ -1097,6 +1098,7 @@
 <translation id="2144557304298909478">ການພັດທະນາແອັບ Android ໃນ Linux</translation>
 <translation id="2146263598007866206">ເວັບໄຊອາດຈະດາວໂຫຼດໄຟລ໌ທີ່ກ່ຽວຂ້ອງຮວມກັນໂດຍອັດຕະໂນມັດເພື່ອປະຢັດເວລາໃຫ້ທ່ານ</translation>
 <translation id="2147151613919729065">ເພື່ອລຶບລ້າງປະຫວັດໃນໂໝດແຂກ, ກະລຸນາປິດໜ້າຈໍແຂກທັງໝົດ.</translation>
+<translation id="2147218225094845757">ເຊື່ອງແຜງຄວບຄຸມດ້ານຂ້າງ</translation>
 <translation id="2148219725039824548">ເກີດຂໍ້ຜິດພາດໃນການເຊື່ອມຕໍ່ການແບ່ງປັນ. ບໍ່ພົບການແບ່ງປັນທີ່ລະບຸໄວ້ຢູ່ໃນເຄືອຂ່າຍ.</translation>
 <translation id="2148756636027685713">ການຟໍແມັດສໍາເລັດແລ້ວ</translation>
 <translation id="2148892889047469596">​ແຖບຄາສ໌ທ</translation>
@@ -3949,6 +3951,7 @@
 <translation id="5269977353971873915">ພິມບໍ່ສໍາເລັດ</translation>
 <translation id="5275352920323889391">ໝາ</translation>
 <translation id="527605982717517565">ອະ​ນຸ​ຍາດ​ JavaScript ຢູ່ເທິງ <ph name="HOST" /> ຢູ່ສະເໝີ</translation>
+<translation id="5277127016695466621">ສະແດງແຜງຄວບຄຸມດ້ານຂ້າງ</translation>
 <translation id="5278823018825269962">ID ສະຖານະ</translation>
 <translation id="5280064835262749532">ອັບເດດຂໍ້ມູນປະຈຳຕົວສຳລັບ <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">ລຶບລ້າງຄຸກກີ້ ແລະ ຂໍ້ມູນເວັບໄຊເມື່ອທ່ານປິດໜ້າຈໍທັງໝົດ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 6eebfb895..4179ab1 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -685,6 +685,7 @@
 <translation id="1706625117072057435">Mastelio keitimo lygiai</translation>
 <translation id="1708338024780164500">(Neaktyvus)</translation>
 <translation id="1708713382908678956">„<ph name="NAME_PH" />“ (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Eksperimentinė naršyklė! Gali būti prarasti duomenys arba pažeistas privatumas ar sauga. Praneškite, jei kils problemų, skiltyje „Pagalba“ &gt; „Pranešti apie problemą...“</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (savoji)</translation>
 <translation id="1709217939274742847">Pasirinkite bilietą, kurį naudosite tapatybei nustatyti. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Negalima bendrinti</translation>
@@ -1103,6 +1104,7 @@
 <translation id="2144557304298909478">„Android“ programų kūrimas „Linux“</translation>
 <translation id="2146263598007866206">Svetainėse galima automatiškai kartu atsisiųsti susijusius failus, kad sutaupytumėte laiko</translation>
 <translation id="2147151613919729065">Norėdami išvalyti svečio režimo istoriją, uždarykite visus svečio langus.</translation>
+<translation id="2147218225094845757">Slėpti šoninį skydelį</translation>
 <translation id="2148219725039824548">Klaida įdedant bendrinamą objektą. Nurodytas bendrinamas objektas nerastas tinkle.</translation>
 <translation id="2148756636027685713">Formatavimas baigtas</translation>
 <translation id="2148892889047469596">Skirtuko perdavimas</translation>
@@ -3955,6 +3957,7 @@
 <translation id="5269977353971873915">Spausdinant įvyko klaida</translation>
 <translation id="5275352920323889391">Šuo</translation>
 <translation id="527605982717517565">Visada leisti „JavaScript“ <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Rodyti šoninį skydelį</translation>
 <translation id="5278823018825269962">Būsenos ID</translation>
 <translation id="5280064835262749532">Atnaujinkite <ph name="SHARE_PATH" /> prisijungimo duomenis</translation>
 <translation id="5280243692621919988">Išvalykite slapukus ir svetainių duomenis uždarę visus langus</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 2e96af8..694eb7f 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -673,6 +673,7 @@
 <translation id="1706625117072057435">Tālummaiņas līmeņi</translation>
 <translation id="1708338024780164500">(Neaktīva)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Eksperimentāls pārlūks! Var tikt zaudēti dati vai apdraudēta konfidencialitāte vai drošība. Lūdzu, ziņojiet par problēmām šeit: Palīdzība &gt; Ziņot par problēmu…</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (sākotnējā)</translation>
 <translation id="1709217939274742847">Izvēlieties biļeti, ko izmantot autentificēšanai. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Nevar kopīgot</translation>
@@ -1090,6 +1091,7 @@
 <translation id="2144557304298909478">Linux Android lietotņu izstrāde</translation>
 <translation id="2146263598007866206">Vietnes var automātiski lejupielādēt saistītos failus kopā, lai jums ietaupītu laiku.</translation>
 <translation id="2147151613919729065">Lai notīrītu viesa režīma vēsturi, aizveriet visus viesa režīmā atvērtos logus.</translation>
+<translation id="2147218225094845757">Slēpt sānu paneli</translation>
 <translation id="2148219725039824548">Iekļaujot kopīgošanu, radās kļūda. Norādītais kopīgošanas vienums netika atrasts tīklā.</translation>
 <translation id="2148756636027685713">Formatēšana pabeigta</translation>
 <translation id="2148892889047469596">Cilnes apraide</translation>
@@ -3938,6 +3940,7 @@
 <translation id="5269977353971873915">Drukāšana neizdevās</translation>
 <translation id="5275352920323889391">Suns</translation>
 <translation id="527605982717517565">Vienmēr atļaut izmantot JavaScript vietnē <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Rādīt sānu paneli</translation>
 <translation id="5278823018825269962">Statusa ID</translation>
 <translation id="5280064835262749532">Atjauniniet akreditācijas datus kopīgošanas ceļam <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Aizverot visus logus, notīrīt sīkfailus un vietņu datus</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index a0af9a3..d8db9f9 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -683,6 +683,7 @@
 <translation id="1706625117072057435">Нивоа на зумирање</translation>
 <translation id="1708338024780164500">(Неактивна)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Експериментален прелистувач! Може да дојде до загуба на податоци или нарушување на приватноста или безбедноста. Ако наидете на проблем, пријавете го во „Помош &gt; Пријавете проблем…“</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (природна)</translation>
 <translation id="1709217939274742847">Изберете билет што ќе го користите за проверка. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Не може да се сподели</translation>
@@ -1101,6 +1102,7 @@
 <translation id="2144557304298909478">Развој на апликации на Android за Linux</translation>
 <translation id="2146263598007866206">Сајтовите може автоматски да преземаат слични датотеки одеднаш за да ви штедат време</translation>
 <translation id="2147151613919729065">За да ја избришете историјата на „Режим на гостин“, затворете ги сите гостински прозорци.</translation>
+<translation id="2147218225094845757">Сокриј ја страничната табла</translation>
 <translation id="2148219725039824548">Грешка при монтирање на споделувањето. Наведеното споделување не е најдено на мрежата.</translation>
 <translation id="2148756636027685713">Форматирањето заврши</translation>
 <translation id="2148892889047469596">Картичка за емитување</translation>
@@ -3953,6 +3955,7 @@
 <translation id="5269977353971873915">Печатењето не успеа</translation>
 <translation id="5275352920323889391">Куче</translation>
 <translation id="527605982717517565">Секогаш дозволи JavaScript на <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Прикажи ја страничната табла</translation>
 <translation id="5278823018825269962">ID на статусот</translation>
 <translation id="5280064835262749532">Ажурирајте ги акредитивите за <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Бриши ги колачињата и податоците за сајтовите при затворање на сите прозорци</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index c356c6bf..87e32369 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -670,6 +670,7 @@
 <translation id="1706625117072057435">സൂം ലെവലുകൾ</translation>
 <translation id="1708338024780164500">(നിഷ്‌ക്രിയം)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ഐഡി: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">പരീക്ഷണാടിസ്ഥാനത്തിലുള്ള ബ്രൗസർ! ഡാറ്റ നഷ്ടപ്പെട്ടേക്കാം അല്ലെങ്കിൽ സ്വകാര്യതയോ സുരക്ഷയോ അപകടത്തിലായേക്കാം. സഹായം &gt; "പ്രശ്നം റിപ്പോർട്ട് ചെയ്യുക..." ഉപയോഗിച്ച് പ്രശ്‌നങ്ങൾ റിപ്പോർട്ട് ചെയ്യുക.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (പ്രാദേശികം)</translation>
 <translation id="1709217939274742847">പരിശോധിച്ചുറപ്പിക്കലിനായി ഒരു ടിക്കറ്റ് തിരഞ്ഞെടുക്കുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">പങ്കിടാനാകുന്നില്ല</translation>
@@ -1087,6 +1088,7 @@
 <translation id="2144557304298909478">Linux Android ആപ്പ് വികസിപ്പിക്കൽ</translation>
 <translation id="2146263598007866206">നിങ്ങളുടെ സമയം ലാഭിക്കാൻ, സൈറ്റുകൾ ബന്ധപ്പെട്ട ഫയലുകൾ ഒന്നിച്ച് സ്വയമേവ ഡൗൺലോഡ് ചെയ്‌തേക്കാം</translation>
 <translation id="2147151613919729065">അതിഥി മോഡ് ചരിത്രം മായ്ക്കാൻ എല്ലാ അതിഥി വിൻഡോകളും അടയ്ക്കുക.</translation>
+<translation id="2147218225094845757">സൈഡ് പാനൽ മറയ്‌ക്കുക</translation>
 <translation id="2148219725039824548">പങ്കിടൽ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. നെറ്റ്‌വർക്കിൽ നിർദ്ദിഷ്‌ട പങ്കിടൽ കണ്ടെത്തിയില്ല,</translation>
 <translation id="2148756636027685713">ഫോർമാറ്റിംഗ് പൂർത്തിയായി</translation>
 <translation id="2148892889047469596">കാസ്റ്റ് ടാബ്</translation>
@@ -3934,6 +3936,7 @@
 <translation id="5269977353971873915">പ്രിന്‍റ് ചെയ്യൽ പരാജയപ്പെട്ടു</translation>
 <translation id="5275352920323889391">നായ</translation>
 <translation id="527605982717517565"><ph name="HOST" /> ല്‍‌ എപ്പോഴുംJavaScript അനുവദിക്കുക</translation>
+<translation id="5277127016695466621">സൈഡ് പാനൽ കാണിക്കുക</translation>
 <translation id="5278823018825269962">സ്‌റ്റാറ്റസ് ഐഡി</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> എന്നതിനായി ക്രെഡന്‍ഷ്യലുകൾ അപ്‌ഡേറ്റ് ചെയ്യുക</translation>
 <translation id="5280243692621919988">എല്ലാ വിൻ‌ഡോകളും‌ അടയ്‌ക്കുമ്പോൾ‌ കുക്കികളും സൈറ്റ് ഡാറ്റയും മായ്‌ക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index b474c30..047b025 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -698,7 +698,7 @@
 <translation id="1725562816265788801">टॅब स्क्रोल करणे</translation>
 <translation id="1726100011689679555">नाव सर्व्हर</translation>
 <translation id="1727662110063605623">Parallels Desktop किंवा Linux शी <ph name="USB_DEVICE_NAME" /> कनेक्ट करण्यासाठी सेटिंग्ज उघडा</translation>
-<translation id="1729533290416704613">तुम्ही ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
+<translation id="1729533290416704613">तुम्ही ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
 <translation id="1730917990259790240"><ph name="BEGIN_PARAGRAPH1" />ॲप्स काढून टाकण्यासाठी, सेटिंग्ज &gt; Google Play स्टोअर &gt; Androआयडी प्राधान्ये व्यवस्थापित करा &gt; ॲप्स किंवा अ‍ॅप्लिकेशन व्यवस्थापक यावर जा. नंतर तुम्हाला जे ॲप अनइंस्टॉल करायचे आहे त्यावर टॅप करा (ॲप शोधण्‍यासाठी तुम्हाला कदाचित उजवीकडे किंवा डावीकडे स्वाइप करावे लागेल). यानंतर अनइंस्टॉल करा किंवा बंद करा यावर टॅप करा.<ph name="END_PARAGRAPH1" /></translation>
 <translation id="1731911755844941020">विनंती पाठवत आहे...</translation>
 <translation id="1733064249834771892">फॉंट</translation>
@@ -4268,7 +4268,7 @@
 <translation id="5623842676595125836">लॉग</translation>
 <translation id="5624120631404540903">पासवर्ड व्यवस्थापित करा</translation>
 <translation id="5626134646977739690">नाव:</translation>
-<translation id="5627086634964711283">तुम्ही होम बटण क्लिक करता तेव्हा कोणते पेज दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
+<translation id="5627086634964711283">तुम्ही होम बटण क्लिक करता तेव्हा कोणते पेज दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
 <translation id="5627676517703583263">Chromeसह स्मार्ट ब्राउझ करा</translation>
 <translation id="5627832140542566187">डिस्प्ले ओरिएंटेशन</translation>
 <translation id="562935524653278697">तुमच्या ॲडमिनिस्ट्रेटरने तुमचे बुकमार्क, इतिहास, संंकेतशब्द आणि अन्य सेटिंग्ज सिंक करणे अक्षम केले आहे.</translation>
@@ -4565,7 +4565,7 @@
 <translation id="5963117322306686970">टॅबचा एकत्र गट करण्यासाठी, टॅबवर राइट क्लिक करा</translation>
 <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (<ph name="NUM_KILOBYTES_LIVE" /> सर्वोच्च)</translation>
 <translation id="5964113968897211042">{COUNT,plural, =0{Open all in new window}=1{नवीन विंडोमध्ये उघडा}other{सर्व ({COUNT}) नवीन विंडोमध्ये उघडा}}</translation>
-<translation id="5965661248935608907">तुम्ही होम बटण क्लिक करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पेज दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
+<translation id="5965661248935608907">तुम्ही होम बटण क्लिक करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पेज दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
 <translation id="5969419185858894314"><ph name="ORIGIN" /> <ph name="FOLDERNAME" /> मधील फाइल पाहू शकते</translation>
 <translation id="5971037678316050792">ब्लूटूथ अडाप्टर स्थिती आणि पेअरिंग नियंत्रित करा</translation>
 <translation id="597235323114979258">आणखी गंतव्यस्थाने पहा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 56078e7..e289a875d 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">Tahap zum</translation>
 <translation id="1708338024780164500">(Tidak Aktif)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Penyemak imbas percubaan! Mungkin menyebabkan data hilang atau privasi atau keselamatan terjejas. Sila laporkan isu pada: Bantuan &gt; "Laporkan isu...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Natif)</translation>
 <translation id="1709217939274742847">Pilih tiket untuk digunakan bagi pengesahan. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Tidak dapat berkongsi</translation>
@@ -1100,6 +1101,7 @@
 <translation id="2144557304298909478">Pembangunan apl Android Linux</translation>
 <translation id="2146263598007866206">Tapak mungkin memuat turun beberapa fail yang berkaitan bersama-sama secara automatik untuk menjimatkan masa anda</translation>
 <translation id="2147151613919729065">Untuk mengosongkan sejarah mod Tetamu, tutup semua tetingkap Tetamu.</translation>
+<translation id="2147218225094845757">Sembunyikan panel sisi</translation>
 <translation id="2148219725039824548">Ralat melekapkan perkongsian. Perkongsian yang dinyatakan tidak ditemui pada rangkaian.</translation>
 <translation id="2148756636027685713">Selesai memformat</translation>
 <translation id="2148892889047469596">Hantar tab</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">Cetakan Gagal</translation>
 <translation id="5275352920323889391">Anjing</translation>
 <translation id="527605982717517565">Sentiasa benarkan JavaScript di <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Tunjukkan panel sisi</translation>
 <translation id="5278823018825269962">ID Status</translation>
 <translation id="5280064835262749532">Kemas kini bukti kelayakan untuk <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Kosongkan kuki dan data tapak apabila anda menutup semua tetingkap</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index a306c73..b3d3c72 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">Zoomniveaus</translation>
 <translation id="1708338024780164500">(Inactief)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Experimentele browser. Kan gegevens kwijtraken of je privacy of beveiliging in gevaar brengen. Meld problemen via Hulp &gt; Een probleem melden.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (native)</translation>
 <translation id="1709217939274742847">Kies een ticket dat je voor verificatie wilt gebruiken. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Kan niet delen</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Android-app-ontwikkeling voor Linux</translation>
 <translation id="2146263598007866206">Sites kunnen gerelateerde bestanden automatisch samen downloaden om tijd te besparen</translation>
 <translation id="2147151613919729065">Sluit alle gastvensters om de geschiedenis van de gastmodus te wissen.</translation>
+<translation id="2147218225094845757">Zijvenster verbergen</translation>
 <translation id="2148219725039824548">Fout bij het activeren van de fileshare. De opgegeven fileshare kan niet in het netwerk worden gevonden.</translation>
 <translation id="2148756636027685713">Formatteren voltooid</translation>
 <translation id="2148892889047469596">Tabblad casten</translation>
@@ -3933,6 +3935,7 @@
 <translation id="5269977353971873915">Afdrukken mislukt</translation>
 <translation id="5275352920323889391">Hond</translation>
 <translation id="527605982717517565">JavaScript altijd toestaan op <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Zijvenster tonen</translation>
 <translation id="5278823018825269962">Status-ID</translation>
 <translation id="5280064835262749532">Update je inloggegevens voor <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Cookies en sitegegevens wissen als je alle vensters sluit</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 8bad808..501b302d 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -677,6 +677,7 @@
 <translation id="1706625117072057435">Zoomnivåer</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Eksperimentell nettleser! Det kan forekomme tap av data eller brudd på personvernet eller sikkerheten. Rapportér problemer via Hjelp &gt; «Rapportér et problem».</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (innebygd)</translation>
 <translation id="1709217939274742847">Velg en sak som skal brukes til autentisering. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Kan ikke dele</translation>
@@ -1094,6 +1095,7 @@
 <translation id="2144557304298909478">Android-apputvikling i Linux</translation>
 <translation id="2146263598007866206">Nettsteder kan automatisk laste ned beslektede filer sammen for å spare tid</translation>
 <translation id="2147151613919729065">For å slette loggen for Gjestemodus, lukk alle gjestevinduer.</translation>
+<translation id="2147218225094845757">Skjul sidepanelet</translation>
 <translation id="2148219725039824548">Feil ved innsetting av deling. Den spesifiserte delingen ble ikke funnet på nettverket.</translation>
 <translation id="2148756636027685713">Formatering er fullført</translation>
 <translation id="2148892889047469596">Castefane</translation>
@@ -3943,6 +3945,7 @@
 <translation id="5269977353971873915">Utskrift mislyktes</translation>
 <translation id="5275352920323889391">Hund</translation>
 <translation id="527605982717517565">Tillat alltid JavaScript på <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Vis sidepanelet</translation>
 <translation id="5278823018825269962">Status-ID</translation>
 <translation id="5280064835262749532">Oppdater legitimasjonen for <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Slett informasjonskapsler og nettstedsdata når du lukker alle vinduer</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index d096368..a206e5311 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -670,6 +670,7 @@
 <translation id="1706625117072057435">ଜୁମ୍-ସ୍ତର</translation>
 <translation id="1708338024780164500">(ନିଷ୍କ୍ରିୟ)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">ପରୀକ୍ଷାମୂଳକ ବ୍ରାଉଜର୍! ଡାଟା ହରାଇ ପାରନ୍ତି କିମ୍ବା ଗୋପନୀୟତା ବା ସୁରକ୍ଷା ଭଙ୍ଗ ହୋଇପାରେ। ଦୟାକରି ସମସ୍ୟାଗୁଡ଼ିକ ବିଷୟରେ ଏଠାରେ ରିପୋର୍ଟ କରନ୍ତୁ: ସହାୟତା &gt; "ଏକ ସମସ୍ୟା ବିଷୟରେ ରିପୋର୍ଟ କରନ୍ତୁ..."।</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ମୂଳ)</translation>
 <translation id="1709217939274742847">ପ୍ରାମାଣିକତା ପାଇଁ ବ୍ୟବହାର କରିବାକୁ ଏକ ଟିକେଟ୍ ବାଛନ୍ତୁ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">ସେୟାର୍ କରାଯାଇପାରିବ ନାହିଁ</translation>
@@ -1085,6 +1086,7 @@
 <translation id="2144557304298909478">Linux Android ଆପ୍ ଡେଭଲପମେଣ୍ଟ</translation>
 <translation id="2146263598007866206">ଆପଣଙ୍କ ସମୟ ବଞ୍ଚାଇବା ପାଇଁ ସାଇଟଗୁଡ଼ିକ ସମ୍ବନ୍ଧିତ ଫାଇଲଗୁଡ଼ିକୁ ଏକାଠି ସ୍ୱଚାଳିତ ଭାବେ ଡାଉନଲୋଡ୍ କରିପାରେ</translation>
 <translation id="2147151613919729065">ଅତିଥି ମୋଡର ଇତିହାସକୁ ଖାଲି କରିବା ପାଇଁ, ସମସ୍ତ ଅତିଥି ୱିଣ୍ଡୋ ବନ୍ଦ କରନ୍ତୁ।</translation>
+<translation id="2147218225094845757">ସାଇଡ୍ ପ୍ୟାନେଲକୁ ଲୁଚାନ୍ତୁ</translation>
 <translation id="2148219725039824548">ସେୟାର୍ ଖଞ୍ଜିବାରେ ତ୍ରୁଟି। ନେଟ୍‌ୱର୍କରେ ଧାର୍ଯ୍ୟ କରାଯାଇଥିବା ସେୟାର୍ ମିଳିଲା ନାହିଁ।</translation>
 <translation id="2148756636027685713">ଫର୍ମାଟିଂ ଶେଷ ହୋଇଛି</translation>
 <translation id="2148892889047469596">ଟାବ୍ କାଷ୍ଟ କରନ୍ତୁ</translation>
@@ -3934,6 +3936,7 @@
 <translation id="5269977353971873915">ପ୍ରିଣ୍ଟ ହେଲାନାହିଁ</translation>
 <translation id="5275352920323889391">ଶ୍ୱାନ</translation>
 <translation id="527605982717517565">ସର୍ବଦା <ph name="HOST" />ରେ JavaScriptକୁ ଅନୁମତି ଦିଅନ୍ତୁ</translation>
+<translation id="5277127016695466621">ସାଇଡ୍ ପ୍ୟାନେଲ୍ ଦେଖାନ୍ତୁ</translation>
 <translation id="5278823018825269962">ସ୍ଥିତି Id</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> ପାଇଁ କ୍ରେଡେନ୍ସିଆଲଗୁଡ଼ିକ ଅପଡେଟ୍ କରନ୍ତୁ</translation>
 <translation id="5280243692621919988">ଆପଣ ସମସ୍ତ ୱିଣ୍ଡୋ ବନ୍ଦ କରିବା ସମୟରେ କୁକୀଗୁଡ଼ିକୁ ଏବଂ ସାଇଟ୍ ଡାଟା ଖାଲି କରନ୍ତୁ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 25a52e9..9733861 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -683,6 +683,7 @@
 <translation id="1706625117072057435">ਜ਼ੂਮ ਪੱਧਰ</translation>
 <translation id="1708338024780164500">(ਨਿਸ਼ਕਿਰਿਆ)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ਆਈ.ਡੀ.: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">ਪ੍ਰਯੋਗਮਈ ਬ੍ਰਾਊਜ਼ਰ! ਡਾਟਾ ਗੁੰਮ ਹੋ ਸਕਦਾ ਹੈ ਜਾਂ ਪਰਦੇਦਾਰੀ ਜਾਂ ਸੁਰੱਖਿਆ ਨਾਲ ਛੇੜਛਾੜ ਹੋ ਸਕਦੀ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਸਮੱਸਿਆਵਾਂ ਦੀ ਰਿਪੋਰਟ ਕਰਨ ਲਈ ਇੱਥੇ ਜਾਓ: ਮਦਦ &gt; "ਕਿਸੇ ਸਮੱਸਿਆ ਦੀ ਰਿਪੋਰਟ ਕਰੋ..."।</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ਜੱਦੀ)</translation>
 <translation id="1709217939274742847">ਪ੍ਰਮਾਣੀਕਰਨ ਵਰਤਣ ਲਈ ਟਿਕਟ ਚੁਣੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">ਸਾਂਝੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ</translation>
@@ -1101,6 +1102,7 @@
 <translation id="2144557304298909478">Linux Android ਐਪ ਵਿਕਾਸ</translation>
 <translation id="2146263598007866206">ਸਾਈਟਾਂ ਤੁਹਾਡਾ ਸਮਾਂ ਬਚਾਉਣ ਲਈ ਸੰਬੰਧਿਤ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਇਕੱਠਿਆਂ ਹੀ ਡਾਊਨਲੋਡ ਕਰ ਸਕਦੀਆਂ ਹਨ</translation>
 <translation id="2147151613919729065">ਮਹਿਮਾਨ ਮੋਡ ਇਤਿਹਾਸ ਨੂੰ ਕਲੀਅਰ ਕਰਨ ਲਈ, ਸਾਰੀਆਂ ਮਹਿਮਾਨ ਵਿੰਡੋਆਂ ਨੂੰ ਬੰਦ ਕਰੋ।</translation>
+<translation id="2147218225094845757">ਸਾਈਡ ਪੈਨਲ ਲੁਕਾਓ</translation>
 <translation id="2148219725039824548">ਸਾਂਝਾਕਰਨ ਮਾਊਂਟ ਕਰਨ ਵਿੱਚ ਗੜਬੜ ਹੋਈ। ਨਿਰਧਾਰਤ ਸਾਂਝਾਕਰਨ ਨੈੱਟਵਰਕ 'ਤੇ ਨਹੀਂ ਮਿਲਿਆ।</translation>
 <translation id="2148756636027685713">ਫੌਰਮੈਟ ਕਰਨਾ ਪੂਰਾ ਕੀਤਾ</translation>
 <translation id="2148892889047469596">ਟੈਬ ਨੂੰ ਕਾਸਟ ਕਰੋ</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">ਪ੍ਰਿੰਟ ਲੈਣਾ ਅਸਫਲ ਰਿਹਾ</translation>
 <translation id="5275352920323889391">ਕੁੱਤਾ</translation>
 <translation id="527605982717517565">ਹਮੇਸ਼ਾਂ <ph name="HOST" /> ਤੇ JavaScript ਦੀ ਆਗਿਆ ਦਿਓ</translation>
+<translation id="5277127016695466621">ਸਾਈਡ ਪੈਨਲ ਦਿਖਾਓ</translation>
 <translation id="5278823018825269962">ਸਥਿਤੀ ਦੀ ਆਈਡੀ</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> ਲਈ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਅੱਪਡੇਟ ਕਰੋ</translation>
 <translation id="5280243692621919988">ਸਾਰੀਆਂ ਵਿੰਡੋ ਨੂੰ ਬੰਦ ਕਰਨ ਵੇਲੇ ਕੁਕੀਜ਼ ਅਤੇ ਸਾਈਟ ਡਾਟੇ ਨੂੰ ਕਲੀਅਰ ਕਰੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 7ec5f304..60af114 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -673,6 +673,7 @@
 <translation id="1706625117072057435">Poziomy powiększenia</translation>
 <translation id="1708338024780164500">(Nieaktywne)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (identyfikator: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Uwaga: to jest przeglądarka eksperymentalna. Może dojść do utraty danych lub naruszenia prywatności i bezpieczeństwa. Jeśli pojawią się problemy, zgłoś je, klikając Pomoc &gt; „Zgłoś problem…”.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (natywna)</translation>
 <translation id="1709217939274742847">Wybierz zgłoszenie, które ma być używane do uwierzytelniania. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Nie udało się udostępnić</translation>
@@ -1086,6 +1087,7 @@
 <translation id="2144557304298909478">Programowanie aplikacji Linux na Androida</translation>
 <translation id="2146263598007866206">Strony mogą automatycznie pobierać powiązane pliki, by zaoszczędzić Twój czas</translation>
 <translation id="2147151613919729065">Aby wyczyścić historię trybu gościa, zamknij wszystkie okna tego trybu.</translation>
+<translation id="2147218225094845757">Ukryj panel boczny</translation>
 <translation id="2148219725039824548">Błąd podczas podłączania udziału. Udziału nie znaleziono w sieci.</translation>
 <translation id="2148756636027685713">Formatowanie zostało zakończone.</translation>
 <translation id="2148892889047469596">Przesyłaj kartę</translation>
@@ -3933,6 +3935,7 @@
 <translation id="5269977353971873915">Niepowodzenie drukowania</translation>
 <translation id="5275352920323889391">Pies</translation>
 <translation id="527605982717517565">Zawsze zezwalaj na wykonywanie kodu JavaScript w witrynie <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Pokaż panel boczny</translation>
 <translation id="5278823018825269962">Identyfikator stanu</translation>
 <translation id="5280064835262749532">Zaktualizuj dane logowania do <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Wyczyść pliki cookie i dane stron w momencie zamknięcia wszystkich okien</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index cad286a..f5b0182 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -683,6 +683,7 @@
 <translation id="1706625117072057435">Níveis de zoom</translation>
 <translation id="1708338024780164500">(Inativa)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (código: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Este é um navegador experimental. Pode causar perda de dados ou comprometer a privacidade ou a segurança. Informe um problema em "Ajuda &gt; Informar um problema…".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativo)</translation>
 <translation id="1709217939274742847">Selecione um tíquete para usar na autenticação. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Não foi possível compartilhar</translation>
@@ -1101,6 +1102,7 @@
 <translation id="2144557304298909478">Desenvolvimento de apps Android no Linux</translation>
 <translation id="2146263598007866206">Os sites podem fazer o download automático de arquivos relacionados em conjunto para economizar tempo</translation>
 <translation id="2147151613919729065">Para apagar o histórico do modo visitante, feche todas as janelas que estejam nesse modo.</translation>
+<translation id="2147218225094845757">Ocultar painel lateral</translation>
 <translation id="2148219725039824548">Erro ao ativar o compartilhamento. O compartilhamento especificado não foi encontrado na rede.</translation>
 <translation id="2148756636027685713">Formatação concluída</translation>
 <translation id="2148892889047469596">Transmitir guia</translation>
@@ -3954,6 +3956,7 @@
 <translation id="5269977353971873915">Falha ao imprimir</translation>
 <translation id="5275352920323889391">Cachorro</translation>
 <translation id="527605982717517565">Sempre permitir JavaScript em <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Mostrar painel lateral</translation>
 <translation id="5278823018825269962">ID de status</translation>
 <translation id="5280064835262749532">Atualizar credenciais para <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Limpar cookies e dados de sites quando você fechar todas as janelas</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 70c0bee0..6cc90f6 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">Níveis de zoom</translation>
 <translation id="1708338024780164500">(Inativa)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Navegador experimental! Pode perder dados ou comprometer a privacidade ou a segurança. Comunique problemas em Ajuda &gt; "Comunicar um problema…".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativa)</translation>
 <translation id="1709217939274742847">Escolha uma permissão para utilizar para a autenticação. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Não é possível partilhar</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Programação de apps Android no Linux</translation>
 <translation id="2146263598007866206">Os sites podem transferir automaticamente ficheiros relacionados em simultâneo para poupar tempo.</translation>
 <translation id="2147151613919729065">Para limpar o histórico do Modo convidado, feche todas as janelas de convidado.</translation>
+<translation id="2147218225094845757">Oculte o painel lateral</translation>
 <translation id="2148219725039824548">Erro ao montar a partilha. A partilha especificada não foi encontrada na rede.</translation>
 <translation id="2148756636027685713">Formatação concluída</translation>
 <translation id="2148892889047469596">Transmitir separador</translation>
@@ -3937,6 +3939,7 @@
 <translation id="5269977353971873915">Falha de Impressão</translation>
 <translation id="5275352920323889391">Cão</translation>
 <translation id="527605982717517565">Permitir sempre JavaScript em <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Mostre o painel lateral</translation>
 <translation id="5278823018825269962">ID de estado</translation>
 <translation id="5280064835262749532">Atualize as credenciais de <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Limpar cookies e dados de sites quando fechar todas as janelas</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 1fab5cc..7157705 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -672,6 +672,7 @@
 <translation id="1706625117072057435">Niveluri de zoom</translation>
 <translation id="1708338024780164500">(Inactivă)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Browser experimental! Poate să piardă date ori să compromită confidențialitatea sau securitatea. Raportează problemele accesând Ajutor &gt; Raportează o problemă…</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (nativă)</translation>
 <translation id="1709217939274742847">Alege un tichet pe care să îl folosești pentru autentificare. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Nu se pot trimite fișierele</translation>
@@ -1089,6 +1090,7 @@
 <translation id="2144557304298909478">Dezvoltarea aplicațiilor pentru Android în Linux</translation>
 <translation id="2146263598007866206">Site-urile pot descărca automat fișierele conexe împreună pentru a te ajuta să economisești timp</translation>
 <translation id="2147151613919729065">Pentru a șterge istoricul din modul pentru invitați, închide toate ferestrele pentru invitați.</translation>
+<translation id="2147218225094845757">Ascunde panoul lateral</translation>
 <translation id="2148219725039824548">Eroare la montarea dispozitivului de stocare în rețea. Dispozitivul indicat nu a fost găsit în rețea.</translation>
 <translation id="2148756636027685713">Formatarea a fost finalizată</translation>
 <translation id="2148892889047469596">Proiectează fila</translation>
@@ -3937,6 +3939,7 @@
 <translation id="5269977353971873915">Printarea a eșuat</translation>
 <translation id="5275352920323889391">Câine</translation>
 <translation id="527605982717517565">Permite întotdeauna JavaScript pe <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Afișează panoul lateral</translation>
 <translation id="5278823018825269962">Cod de stare</translation>
 <translation id="5280064835262749532">Actualizează datele de conectare pentru <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Șterge cookie-urile și datele privind site-urile când închizi toate ferestrele</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 4567400..29a5eef8 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -673,6 +673,7 @@
 <translation id="1706625117072057435">Масштабирование</translation>
 <translation id="1708338024780164500">(неактивно)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (идентификатор: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Это экспериментальный браузер. Вы можете потерять данные, а также подвергнуть риску безопасность и конфиденциальность своих данных. Чтобы сообщить о проблемах с браузером, нажмите "Справка &gt; Сообщить о проблеме".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (оригинальное)</translation>
 <translation id="1709217939274742847">Выберите билет для аутентификации. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Ошибка</translation>
@@ -1090,6 +1091,7 @@
 <translation id="2144557304298909478">Разработка приложений для Android в Linux</translation>
 <translation id="2146263598007866206">Сайты могут автоматически скачивать сразу несколько связанных файлов. Это позволяет вам экономить время.</translation>
 <translation id="2147151613919729065">Чтобы очистить историю гостевого режима, закройте все соответствующие окна</translation>
+<translation id="2147218225094845757">Скрыть боковую панель</translation>
 <translation id="2148219725039824548">Ошибка. Не удалось найти указанный ресурс в сети.</translation>
 <translation id="2148756636027685713">Форматирование завершено</translation>
 <translation id="2148892889047469596">Трансляция содержимого вкладки</translation>
@@ -3937,6 +3939,7 @@
 <translation id="5269977353971873915">Печать не выполнена</translation>
 <translation id="5275352920323889391">Собака</translation>
 <translation id="527605982717517565">Всегда разрешать JavaScript для сайта <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Показать боковую панель</translation>
 <translation id="5278823018825269962">Идентификатор состояния</translation>
 <translation id="5280064835262749532">Обновите учетные данные для <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Удалять файлы cookie и данные сайтов при закрытии всех окон</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index 958d3862..0d71234 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">විශාලන මට්ටම්</translation>
 <translation id="1708338024780164500">(අක්‍රියයි)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">අත්හදා බැලීමේ බ්‍රව්සරය! දත්ත නැති වීමට හෝ පෞද්ගලිකත්වය හෝ ආරක්ෂාව අවදානමට පත් කිරීමට ඉඩ ඇත. කරුණාකර ගැටලු මෙලෙස වාර්තා කරන්න: උදවු &gt; "ගැටලුවක් වාර්තා කරන්න...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ආවේණික)</translation>
 <translation id="1709217939274742847">සත්‍යාපනය සඳහා භාවිත කිරීමට ප්‍රවේශපත්‍රයක් තෝරන්න. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">බෙදා ගත නොහැකිය</translation>
@@ -1089,6 +1090,7 @@
 <translation id="2144557304298909478">ලිනක්ස් Android යෙදුම් සංවර්ධනය</translation>
 <translation id="2146263598007866206">අඩවි ඔබේ කාලය ඉතිරි කිරීම සඳහා ස්වයංක්‍රියව අදාළ ගොනු බාගත හැකිය</translation>
 <translation id="2147151613919729065">ආගන්තුක ප්‍රකාර ඉතිහාසය හිස් කිරීමට, සියලු ආගන්තුක කවුළු වසන්න.</translation>
+<translation id="2147218225094845757">පැති පැනලය සඟවන්න</translation>
 <translation id="2148219725039824548">කොටස නැංවීමේ දෝෂයකි. විශේෂිත කොටස ජාලයෙහි සොයා ගත නොහැකි විය.</translation>
 <translation id="2148756636027685713">ආකෘතිගත කිරීම නිමයි</translation>
 <translation id="2148892889047469596">විකාශ පටිත්ත</translation>
@@ -3940,6 +3942,7 @@
 <translation id="5269977353971873915">මුදණය අසාර්ථක විය</translation>
 <translation id="5275352920323889391">බල්ලා</translation>
 <translation id="527605982717517565"><ph name="HOST" /> මත සැමවිට JavaScript ඉඩ දෙන්න</translation>
+<translation id="5277127016695466621">පැති පැනලය පෙන්වන්න</translation>
 <translation id="5278823018825269962">තත්ත්ව හැඳුනුම</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> සඳහා අක්තපත්‍ර යාවත්කාලීන කරන්න</translation>
 <translation id="5280243692621919988">ඔබ සියලුම කවුළු වසන විට කුකී සහ වෙබ් අඩවි දත්ත හිස් කරන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index a575bab..7e7da8e 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -673,6 +673,7 @@
 <translation id="1706625117072057435">Úrovne priblíženia</translation>
 <translation id="1708338024780164500">(Neaktívne)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Experimentálny prehliadač. Môže dôjsť k strate údajov alebo porušeniu ochrany súkromia či zabezpečenia. Prípadné problémy nahláste v sekcii Pomocník &gt; Nahlásiť problém…</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (natívne)</translation>
 <translation id="1709217939274742847">Vyberte tiket, ktorý sa má použiť na overenie. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Nedá sa zdieľať</translation>
@@ -1090,6 +1091,7 @@
 <translation id="2144557304298909478">Vývoj aplikácií pre Android v systéme Linux</translation>
 <translation id="2146263598007866206">Weby môžu automaticky spolu sťahovať súvisiace súbory a šetriť tým váš čas</translation>
 <translation id="2147151613919729065">Ak chcete vymazať históriu režimu pre hostí, zatvorte všetky okná režimu pre hostí.</translation>
+<translation id="2147218225094845757">Skryť bočný panel</translation>
 <translation id="2148219725039824548">Pri pripájaní zdieľaného úložiska sa vyskytla chyba. Uvedené úložisko sa v sieti nenašlo.</translation>
 <translation id="2148756636027685713">Formátovanie bolo dokončené</translation>
 <translation id="2148892889047469596">Prenášanie karty</translation>
@@ -3938,6 +3940,7 @@
 <translation id="5269977353971873915">Zlyhanie tlače</translation>
 <translation id="5275352920323889391">Pes</translation>
 <translation id="527605982717517565">Vždy povoliť jazyk JavaScript na stránkach <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Zobraziť bočný panel</translation>
 <translation id="5278823018825269962">Identifikátor stavu</translation>
 <translation id="5280064835262749532">Aktualizujte prihlasovacie údaje pre <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Vymazať súbory cookie a údaje webov pri zavretí všetkých okien</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 07f5c72..afcfe84 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -685,6 +685,7 @@
 <translation id="1706625117072057435">Ravni povečave/pomanjšave</translation>
 <translation id="1708338024780164500">(Neaktivno)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Preizkusni brskalnik. Morda se bodo izgubili podatki ali bo ogrožena zasebnost ali varnost. Težave prijavite v Pomoč &gt; »Prijava težave …«.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (izvorna)</translation>
 <translation id="1709217939274742847">Izberite kartonček za preverjanje pristnosti. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Ni mogoče deliti</translation>
@@ -1103,6 +1104,7 @@
 <translation id="2144557304298909478">Razvoj aplikacij za Android v Linuxu</translation>
 <translation id="2146263598007866206">Spletna mesta lahko skupaj samodejno prenesejo sorodne datoteke in vam tako prihranijo čas.</translation>
 <translation id="2147151613919729065">Če želite izbrisati zgodovino načina za goste, zaprite vsa okna načina za goste.</translation>
+<translation id="2147218225094845757">Skrij stransko podokno</translation>
 <translation id="2148219725039824548">Napaka pri vpenjanju datotečnega sredstva v skupni rabi. Določeno datotečno sredstvo v skupni rabi ni bilo najdeno v omrežju.</translation>
 <translation id="2148756636027685713">Formatiranje je končano</translation>
 <translation id="2148892889047469596">Predvajanje zavihka</translation>
@@ -3955,6 +3957,7 @@
 <translation id="5269977353971873915">Tiskanje ni uspelo</translation>
 <translation id="5275352920323889391">Pes</translation>
 <translation id="527605982717517565">Vedno dovoli JavaScript na mestu <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Pokaži stransko podokno</translation>
 <translation id="5278823018825269962">ID stanja</translation>
 <translation id="5280064835262749532">Posodobitev poverilnic za <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Izbriši piškotke in podatke spletnih mest, ko zaprete vsa okna</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index bf6e830..4b6c339 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -668,6 +668,7 @@
 <translation id="1706625117072057435">Nivelet e zmadhimit</translation>
 <translation id="1708338024780164500">(Joaktive)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Shfletues eksperimental! Mund të humbasë të dhëna ose të cenojë privatësinë ose sigurinë. Raporto problemet me: Ndihma &gt; "Raporto një problem...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (origjinal)</translation>
 <translation id="1709217939274742847">Zgjidh një biletë për ta përdorur për vërtetim. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Nuk mund të ndahet</translation>
@@ -1085,6 +1086,7 @@
 <translation id="2144557304298909478">Zhvillimi i aplikacionit Android për Linux</translation>
 <translation id="2146263598007866206">Sajtet mund të shkarkojnë automatikisht skedarë përkatës së bashku për të të kursyer kohë</translation>
 <translation id="2147151613919729065">Për të pastruar historikun e "Modalitetit "Vizitor"", mbyll të gjitha dritaret e vizitorit.</translation>
+<translation id="2147218225094845757">Fshihe panelin anësor</translation>
 <translation id="2148219725039824548">Gabim gjatë montimit të ndarjes. Ndarja e specifikuar nuk u gjend në rrjet.</translation>
 <translation id="2148756636027685713">Formatimi përfundoi</translation>
 <translation id="2148892889047469596">Transmeto skedën</translation>
@@ -3933,6 +3935,7 @@
 <translation id="5269977353971873915">Printimi dështoi</translation>
 <translation id="5275352920323889391">Qen</translation>
 <translation id="527605982717517565">Lejo gjithmonë JavaScript në <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Shfaq panelin anësor</translation>
 <translation id="5278823018825269962">ID-ja e statusit</translation>
 <translation id="5280064835262749532">Përditëso kredencialet për <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Pastro kukit dhe të dhënat e sajteve kur të mbyllësh të gjitha dritaret</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index cb53520..116e7de5 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -670,6 +670,7 @@
 <translation id="1706625117072057435">Nivoi zumiranja</translation>
 <translation id="1708338024780164500">(Neaktivno)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Ekspermentalni pregledač! Možete da izgubite podatke ili ugrozite privatnost ili bezbednost. Prijavite probleme preko opcije: Pomoć &gt; „Prijavite problem…“.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Osnovna)</translation>
 <translation id="1709217939274742847">Odaberite tiket koji ćete koristiti za potvrdu identiteta. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Deljenje nije uspelo</translation>
@@ -1087,6 +1088,7 @@
 <translation id="2144557304298909478">Programiranje Android aplikacija za Linux</translation>
 <translation id="2146263598007866206">Sajtovi mogu automatski da preuzimaju srodne fajlove zajedno da bi vam štedeli vreme</translation>
 <translation id="2147151613919729065">Da biste obrisali istoriju režima gosta, zatvorite sve prozore režima gosta.</translation>
+<translation id="2147218225094845757">Sakrij bočnu tablu</translation>
 <translation id="2148219725039824548">Greška pri učitavanju deljene datoteke. Navedena deljena datoteka nije pronađena na mreži.</translation>
 <translation id="2148756636027685713">Formatiranje je završeno</translation>
 <translation id="2148892889047469596">Prebacite karticu</translation>
@@ -3935,6 +3937,7 @@
 <translation id="5269977353971873915">Štampanje nije uspelo</translation>
 <translation id="5275352920323889391">Pas</translation>
 <translation id="527605982717517565">Uvek dozvoli JavaScript na sajtu <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Prikaži bočnu tablu</translation>
 <translation id="5278823018825269962">ID statusa</translation>
 <translation id="5280064835262749532">Ažurirajte akreditive za: <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Brišite kolačiće i podatke o sajtovima kada zatvorite sve prozore</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 87b45f4..071ffc3 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -670,6 +670,7 @@
 <translation id="1706625117072057435">Нивои зумирања</translation>
 <translation id="1708338024780164500">(Неактивно)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ИД: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Експерментални прегледач! Можете да изгубите податке или угрозите приватност или безбедност. Пријавите проблеме преко опције: Помоћ &gt; „Пријавите проблем…“.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Основна)</translation>
 <translation id="1709217939274742847">Одаберите тикет који ћете користити за потврду идентитета. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Дељење није успело</translation>
@@ -1087,6 +1088,7 @@
 <translation id="2144557304298909478">Програмирање Android апликација за Linux</translation>
 <translation id="2146263598007866206">Сајтови могу аутоматски да преузимају сродне фајлове заједно да би вам штедели време</translation>
 <translation id="2147151613919729065">Да бисте обрисали историју режима госта, затворите све прозоре режима госта.</translation>
+<translation id="2147218225094845757">Сакриј бочну таблу</translation>
 <translation id="2148219725039824548">Грешка при учитавању дељене датотеке. Наведена дељена датотека није пронађена на мрежи.</translation>
 <translation id="2148756636027685713">Форматирање је завршено</translation>
 <translation id="2148892889047469596">Пребаците картицу</translation>
@@ -3935,6 +3937,7 @@
 <translation id="5269977353971873915">Штампање није успело</translation>
 <translation id="5275352920323889391">Пас</translation>
 <translation id="527605982717517565">Увек дозволи JavaScript на сајту <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Прикажи бочну таблу</translation>
 <translation id="5278823018825269962">ИД статуса</translation>
 <translation id="5280064835262749532">Ажурирајте акредитиве за: <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Бришите колачиће и податке о сајтовима када затворите све прозоре</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index f8b5bb87..ae6f0348 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -682,6 +682,7 @@
 <translation id="1706625117072057435">Zoomnivåer</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (id: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Detta är en experimentell webbläsare. Data kan gå förlorad, och det kan innebära en integritets- och säkerhetsrisk. Rapportera problem via Hjälp &gt; Rapportera ett problem …</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (standard)</translation>
 <translation id="1709217939274742847">Välj vilken biljett som ska användas till autentisering. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Det går inte att dela</translation>
@@ -1100,6 +1101,7 @@
 <translation id="2144557304298909478">Android-apputveckling i Linux</translation>
 <translation id="2146263598007866206">Webbplatser kan automatiskt ladda ned relaterade filer samtidigt så att du sparar tid</translation>
 <translation id="2147151613919729065">Stäng alla gästfönster för att rensa gästlägets historik.</translation>
+<translation id="2147218225094845757">Dölj sidopanel</translation>
 <translation id="2148219725039824548">Det gick inte att montera den delade resursen. Den angivna resursen hittades inte i nätverket.</translation>
 <translation id="2148756636027685713">Formateringen är klar</translation>
 <translation id="2148892889047469596">Casta fliken</translation>
@@ -3952,6 +3954,7 @@
 <translation id="5269977353971873915">Det gick inte att skriva ut dokumentet</translation>
 <translation id="5275352920323889391">Hund</translation>
 <translation id="527605982717517565">Tillåt alltid JavaScript på <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Visa sidopanel</translation>
 <translation id="5278823018825269962">Status-id</translation>
 <translation id="5280064835262749532">Uppdatera användaruppgifterna för <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Rensa cookies och webbplatsdata när du stänger alla fönster</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index bd8c9ba0..c17965b 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -679,6 +679,7 @@
 <translation id="1706625117072057435">Viwango vya kukuza</translation>
 <translation id="1708338024780164500">(Sio amilifu)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (Kitambulisho: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Kivinjari kinachofanyiwa majaribio! Huenda ukapoteza data au kuathiri faragha au usalama. Tafadhali ripoti matatizo kupitia sehemu ya: Usaidizi &gt; "Ripoti tatizo...".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Asili)</translation>
 <translation id="1709217939274742847">Chagua tiketi ili uitumie kwenye uthibitishaji. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Imeshindwa kushiriki</translation>
@@ -1096,6 +1097,7 @@
 <translation id="2144557304298909478">Usanidi wa programu ya Android kwenye Linux</translation>
 <translation id="2146263598007866206">Tovuti zinaweza kupakua kiotomatiki faili zinazohusiana kwa pamoja ili kuokoa muda wako</translation>
 <translation id="2147151613919729065">Ili ufute historia ya hali ya matumizi ya Wageni, funga madirisha yote ya Wageni.</translation>
+<translation id="2147218225094845757">Ficha kidirisha cha pembeni</translation>
 <translation id="2148219725039824548">Hitilafu imetokea wakati wa kupachika faili ya kushiriki. Imeshindwa kupata faili iliyobainishwa ya kushiriki katika mtandao.</translation>
 <translation id="2148756636027685713">Uumbizaji umekamilika</translation>
 <translation id="2148892889047469596">Tuma kichupo</translation>
@@ -3946,6 +3948,7 @@
 <translation id="5269977353971873915">Uchapishaji Haukufanikiwa</translation>
 <translation id="5275352920323889391">Mbwa</translation>
 <translation id="527605982717517565">Ruhusu <ph name="HOST" /> iendeshe JavaScript kila wakati</translation>
+<translation id="5277127016695466621">Onyesha kidirisha cha pembeni</translation>
 <translation id="5278823018825269962">Kitambulisho cha Hali</translation>
 <translation id="5280064835262749532">Sasisha kitambulisho cha <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Futa vidakuzi na data ya tovuti unapofunga madirisha yote</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index d44f062e..065ad23 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">ระดับการซูม</translation>
 <translation id="1708338024780164500">(ไม่ใช้งาน)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">เบราว์เซอร์ทดลอง! คุณอาจสูญเสียข้อมูลหรือถูกละเมิดความเป็นส่วนตัวหรือความปลอดภัย โปรดรายงานปัญหาโดยไปที่ความช่วยเหลือ &gt; "รายงานปัญหา..."</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ดั้งเดิม)</translation>
 <translation id="1709217939274742847">เลือกตั๋วที่จะใช้สำหรับการตรวจสอบสิทธิ์ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">แชร์ไม่สำเร็จ</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">การพัฒนาแอป Android ใน Linux</translation>
 <translation id="2146263598007866206">เว็บไซต์อาจดาวน์โหลดไฟล์ที่เกี่ยวข้องพร้อมกันโดยอัตโนมัติเพื่อช่วยคุณประหยัดเวลา</translation>
 <translation id="2147151613919729065">หากต้องการล้างประวัติการเข้าชมในโหมดผู้มาเยือน ให้ปิดหน้าต่างผู้มาเยือนทั้งหมด</translation>
+<translation id="2147218225094845757">ซ่อนแผงด้านข้าง</translation>
 <translation id="2148219725039824548">เกิดข้อผิดพลาดขณะต่อเชื่อมพื้นที่แชร์ ไม่พบพื้นที่แชร์ที่ระบุในเครือข่าย</translation>
 <translation id="2148756636027685713">ฟอร์แมตเสร็จแล้ว</translation>
 <translation id="2148892889047469596">แคสต์แท็บ</translation>
@@ -3936,6 +3938,7 @@
 <translation id="5269977353971873915">การพิมพ์ล้มเหลว</translation>
 <translation id="5275352920323889391">สุนัข</translation>
 <translation id="527605982717517565">อนุญาตให้เรียกใช้ JavaScript บน <ph name="HOST" /> เสมอ</translation>
+<translation id="5277127016695466621">แสดงแผงด้านข้าง</translation>
 <translation id="5278823018825269962">รหัสสถานะ</translation>
 <translation id="5280064835262749532">อัปเดตข้อมูลเข้าสู่ระบบสำหรับ <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">ล้างคุกกี้และข้อมูลเว็บไซต์เมื่อคุณปิดหน้าต่างทั้งหมด</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 06d7a051..1c0885b 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">Yakınlaştırma seviyeleri</translation>
 <translation id="1708338024780164500">(Etkin değil)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (Kimlik: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Deneysel tarayıcı. Veri kaybına veya gizlilik ya da güvenlik ihlaline neden olabilir. Lütfen sorunları Yardım &gt; "Sorun bildir..." bölümünden bildirin.</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Yerel)</translation>
 <translation id="1709217939274742847">Kimlik doğrulama için kullanılacak bir bilet seçin <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Paylaşılamıyor</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Linux Android uygulaması geliştirme</translation>
 <translation id="2146263598007866206">Zamandan tasarruf etmeniz için siteler ilgili dosyaları otomatik olarak indirebilir</translation>
 <translation id="2147151613919729065">Misafir modu geçmişini temizlemek için tüm Misafir pencerelerini kapatın.</translation>
+<translation id="2147218225094845757">Yan paneli gizle</translation>
 <translation id="2148219725039824548">Paylaşım eklenirken hata oluştu. Belirtilen paylaşım ağda bulunamadı.</translation>
 <translation id="2148756636027685713">Biçimlendirme tamamlandı</translation>
 <translation id="2148892889047469596">Sekmeyi yayınla</translation>
@@ -3935,6 +3937,7 @@
 <translation id="5269977353971873915">Yazdırma Başarısız</translation>
 <translation id="5275352920323889391">Köpek</translation>
 <translation id="527605982717517565"><ph name="HOST" /> sitesinde JavaScript'e her zaman izin ver</translation>
+<translation id="5277127016695466621">Yan paneli göster</translation>
 <translation id="5278823018825269962">Durum kimliği</translation>
 <translation id="5280064835262749532"><ph name="SHARE_PATH" /> ile ilgili kimlik bilgilerini güncelleyin</translation>
 <translation id="5280243692621919988">Tüm pencereler kapatıldığında çerezleri ve site verilerini temizleme</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 20f717a..30013b92 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -685,6 +685,7 @@
 <translation id="1706625117072057435">Рівні масштабування</translation>
 <translation id="1708338024780164500">(Неактивне)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ідентифікатор: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">Експериментальний веб-переглядач! Ви можете втратити дані або піддати небезпеці себе чи свою конфіденційність. Щоб повідомити про проблему, натисніть "Довідка" &gt; "Повідомити про проблему…".</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" />x<ph name="HEIGHT" /> (оригінальна)</translation>
 <translation id="1709217939274742847">Виберіть квиток для автентифікації. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Не вдалося надіслати</translation>
@@ -1103,6 +1104,7 @@
 <translation id="2144557304298909478">Розробка додатків для Android у Linux</translation>
 <translation id="2146263598007866206">Сайти можуть автоматично завантажувати пов'язані файли разом, щоб заощадити ваш час</translation>
 <translation id="2147151613919729065">Щоб очистити історію режиму гостя, закрийте всі відповідні вікна.</translation>
+<translation id="2147218225094845757">Сховати бічну панель</translation>
 <translation id="2148219725039824548">Помилка підключення спільного доступу. Указаний пристрій не знайдено в мережі.</translation>
 <translation id="2148756636027685713">Форматування закінчено</translation>
 <translation id="2148892889047469596">Транслювати вкладку</translation>
@@ -3955,6 +3957,7 @@
 <translation id="5269977353971873915">Помилка друку</translation>
 <translation id="5275352920323889391">Собака</translation>
 <translation id="527605982717517565">Завжди дозволяти JavaScript на хості <ph name="HOST" /></translation>
+<translation id="5277127016695466621">Показати бічну панель</translation>
 <translation id="5278823018825269962">Ідентифікатор статусу</translation>
 <translation id="5280064835262749532">Оновіть облікові дані для <ph name="SHARE_PATH" /></translation>
 <translation id="5280243692621919988">Видаляти файли cookie й дані сайтів, коли закриваються всі вікна</translation>
@@ -4000,7 +4003,7 @@
 <translation id="532247166573571973">Можливо, сервер недоступний. Спробуйте пізніше.</translation>
 <translation id="5324300749339591280">Список додатків</translation>
 <translation id="5324780743567488672">Автоматично визначати часовий пояс на основі ваших геоданих</translation>
-<translation id="5327248766486351172">Назва</translation>
+<translation id="5327248766486351172">Ім’я</translation>
 <translation id="5327570636534774768">Пристрій зареєстровано в іншому домені. Перед налаштуванням демо-режиму деініціалізуйте пристрій у цьому домені.</translation>
 <translation id="5327912693242073631">Функції, яким потрібні сповіщення, не працюватимуть</translation>
 <translation id="532943162177641444">Торкніться сповіщення на пристрої <ph name="PHONE_NAME" />, щоб налаштувати для нього мобільну точку доступу.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index e6d0ad1..ec4c975 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -668,6 +668,7 @@
 <translation id="1706625117072057435">缩放级别</translation>
 <translation id="1708338024780164500">(无效)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" />(ID:<ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">实验性浏览器!可能会丢失数据或有损私密性/安全性。若要报告问题,请使用“帮助”&gt;“报告问题…”。</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" />(原生)</translation>
 <translation id="1709217939274742847">选择用于进行身份验证的票据。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">无法分享</translation>
@@ -1085,6 +1086,7 @@
 <translation id="2144557304298909478">Linux Android 应用开发</translation>
 <translation id="2146263598007866206">网站可能会自动将相关文件一起下载,从而为您节省时间</translation>
 <translation id="2147151613919729065">如需清除访客模式历史记录,请关闭所有访客窗口。</translation>
+<translation id="2147218225094845757">隐藏侧边栏</translation>
 <translation id="2148219725039824548">装载共享资源时出错。在网络上找不到所指定的共享资源。</translation>
 <translation id="2148756636027685713">格式化已完成</translation>
 <translation id="2148892889047469596">投射标签页</translation>
@@ -3931,6 +3933,7 @@
 <translation id="5269977353971873915">打印失败</translation>
 <translation id="5275352920323889391">狗</translation>
 <translation id="527605982717517565">始终允许使用 <ph name="HOST" /> 上的 JavaScript</translation>
+<translation id="5277127016695466621">显示侧边栏</translation>
 <translation id="5278823018825269962">状态 ID</translation>
 <translation id="5280064835262749532">更新 <ph name="SHARE_PATH" /> 的访问凭据</translation>
 <translation id="5280243692621919988">关闭所有窗口时清除 Cookie 及网站数据</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 13d39c31..574d267 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -681,6 +681,7 @@
 <translation id="1706625117072057435">縮放等級</translation>
 <translation id="1708338024780164500">(無法使用)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (識別碼:<ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">實驗版瀏覽器!此功能可能會令您失去資料,或導致您的私隱或安全受到威脅。請按一下 [說明] &gt; [報告問題…] 以報告問題。</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (原生)</translation>
 <translation id="1709217939274742847">選擇用作驗證的票證。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">無法分享</translation>
@@ -1099,6 +1100,7 @@
 <translation id="2144557304298909478">Linux 的 Android 應用程式開發</translation>
 <translation id="2146263598007866206">網站可能會自動同時下載相關檔案,以便節省時間</translation>
 <translation id="2147151613919729065">如要清除訪客模式記錄,請關閉所有訪客視窗。</translation>
+<translation id="2147218225094845757">隱藏側面板</translation>
 <translation id="2148219725039824548">連接共用裝置時發生錯誤。在網絡上找不到指定的共用裝置。</translation>
 <translation id="2148756636027685713">格式化完成</translation>
 <translation id="2148892889047469596">投放分頁</translation>
@@ -3951,6 +3953,7 @@
 <translation id="5269977353971873915">列印失敗</translation>
 <translation id="5275352920323889391">狗</translation>
 <translation id="527605982717517565">永遠允許在 <ph name="HOST" /> 執行 JavaScript</translation>
+<translation id="5277127016695466621">顯示側面板</translation>
 <translation id="5278823018825269962">狀態 ID</translation>
 <translation id="5280064835262749532">更新 <ph name="SHARE_PATH" /> 的憑證</translation>
 <translation id="5280243692621919988">當您關閉所有視窗時,清除 Cookie 和網站資料</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 25653720..465905c 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -671,6 +671,7 @@
 <translation id="1706625117072057435">縮放等級</translation>
 <translation id="1708338024780164500">(無法使用)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID:<ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">歡迎使用實驗性瀏覽器!請注意,使用這個瀏覽器有遺失資料的風險,也可能對安全性或隱私權產生不良影響。如有問題,請依序按一下 [說明] &gt; [回報問題…] 進行回報。</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (原生)</translation>
 <translation id="1709217939274742847">選擇要用於驗證的票證。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">無法分享</translation>
@@ -1088,6 +1089,7 @@
 <translation id="2144557304298909478">Linux Android 應用程式開發</translation>
 <translation id="2146263598007866206">網站可能會自動一併下載相關檔案,為你節省時間</translation>
 <translation id="2147151613919729065">如要清除訪客模式的歷史記錄,請關閉所有訪客模式視窗。</translation>
+<translation id="2147218225094845757">隱藏側邊面板</translation>
 <translation id="2148219725039824548">掛接共用裝置時發生錯誤。在網路上找不到指定的共用裝置。</translation>
 <translation id="2148756636027685713">格式化完成</translation>
 <translation id="2148892889047469596">投放分頁</translation>
@@ -3935,6 +3937,7 @@
 <translation id="5269977353971873915">列印失敗</translation>
 <translation id="5275352920323889391">狗</translation>
 <translation id="527605982717517565">永遠允許在 <ph name="HOST" /> 執行 JavaScript</translation>
+<translation id="5277127016695466621">顯示側邊面板</translation>
 <translation id="5278823018825269962">狀態 ID</translation>
 <translation id="5280064835262749532">更新 <ph name="SHARE_PATH" /> 的憑證</translation>
 <translation id="5280243692621919988">關閉所有視窗時清除 Cookie 和網站資料</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 10d785b..a7eca31 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -681,6 +681,7 @@
 <translation id="1706625117072057435">Amaleveli okusondeza</translation>
 <translation id="1708338024780164500">(Akusebenzi)</translation>
 <translation id="1708713382908678956">I-<ph name="NAME_PH" /> (I-ID: <ph name="ID_PH" />)</translation>
+<translation id="1708860176443612387">I-browser yokuhlola! Ingase ilahlekelwe idatha noma ifake engcupheni ubumfihlo nokuvikeleka. Sicela ubike izinkinga ngokuthi: Usizo &gt; "Bika inkinga..."</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Okomdabu)</translation>
 <translation id="1709217939274742847">Khetha ithikithi ozolisebenzisela ukufakazela ubuqiniso. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation>
 <translation id="1709972045049031556">Ayikwazi ukwaba</translation>
@@ -1099,6 +1100,7 @@
 <translation id="2144557304298909478">Ukuthuthukiswa kohlelo lokusebenza le-Linux Android</translation>
 <translation id="2146263598007866206">Amasayithi angalanda ngokuzenzakalela amafayela ahambisanayo ndawonye ukuze akulondolozele isikhathi</translation>
 <translation id="2147151613919729065">Ukuze usule umlando Wemodi Yesivakashi, vala wonke amawindi Wesivakashi.</translation>
+<translation id="2147218225094845757">Fihla iphaneli eseceleni</translation>
 <translation id="2148219725039824548">Iphutha ukukhweza ukwabelana. Ukwabelane okucacisiwe akutholakele kunethiwekhi.</translation>
 <translation id="2148756636027685713">Ukufometha kuqediwe</translation>
 <translation id="2148892889047469596">Ithebhu yokusakaza</translation>
@@ -3950,6 +3952,7 @@
 <translation id="5269977353971873915">Ukuphrinta kuhlulekile</translation>
 <translation id="5275352920323889391">Inja</translation>
 <translation id="527605982717517565">Hlala uvumela i-JavaScript ku-<ph name="HOST" /></translation>
+<translation id="5277127016695466621">Bonisa iphaneli eseceleni</translation>
 <translation id="5278823018825269962">I-Id Yesimo</translation>
 <translation id="5280064835262749532">Buyekeza ukuqinisekisa kwe-<ph name="SHARE_PATH" />.</translation>
 <translation id="5280243692621919988">Sula idatha yamakhukhi neyesayithi lapho uvala wonke amawindi</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb
index a766d95..c1170b65 100644
--- a/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -167,7 +167,7 @@
 <translation id="5193136243808726294">Google Chrome OS हे पृष्ठ उघडू शकत नाही.</translation>
 <translation id="521447420733633466">तुम्ही डिव्हाइस शेअर केल्यास, मित्रमैत्रिणी आणि कुटुंब स्वतंत्रपणे ब्राउझ करू शकतात आणि त्यांना हवे तसे Chrome सेट करू शकतात</translation>
 <translation id="5251420635869119124">अतिथी कोणतीही गोष्ट मागे न सोडता Chrome वापरू शकतात.</translation>
-<translation id="5386244825306882791">तुम्ही Chrome सुरू करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
+<translation id="5386244825306882791">तुम्ही Chrome सुरू करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
 <translation id="5394833366792865639">Chrome टॅब शेअर करा</translation>
 <translation id="5430073640787465221">तुमची प्राधान्ये फाइल दूषित किंवा चुकीचे आहेत.
 
@@ -280,7 +280,7 @@
 <translation id="8625237574518804553">{0,plural, =1{Chrome एका मिनिटामध्ये पुन्हा लॉंच होईल}other{Chrome # मिनिटांमध्ये पुन्हा लॉंच होईल}}</translation>
 <translation id="8641606876632989680">तुम्ही धोक्यात असलेल्या पासवर्डने साइन इन केल्यावर Chrome तुम्हाला सूचित करेल</translation>
 <translation id="8669527147644353129">Google Chrome मदतनीस</translation>
-<translation id="8679801911857917785">तुम्ही Chrome सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
+<translation id="8679801911857917785">तुम्ही Chrome सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
 <translation id="8686817260976772516">Chrome प्रोफाइल वापरून तुम्ही तुमच्या सर्व गोष्टी Chrome वर वेगवेगळ्या ठेवू शकता. मित्रमैत्रिणी आणि कुटुंबासाठी प्रोफाइल तयार करा किंवा त्यांची काम व मनोरंजन यामध्ये विभागणी करा.</translation>
 <translation id="870251953148363156">&amp;Google Chrome अपडेट करा</translation>
 <translation id="873133009373065397">Google Chrome डीफॉल्ट ब्राउझर निर्धारित करू शकत नाही किंवा सेट करू शकत नाही</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 6034ac6..c4f4c5e 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5139,10 +5139,6 @@
      flag_descriptions::kEnableArcUnifiedAudioFocusName,
      flag_descriptions::kEnableArcUnifiedAudioFocusDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(arc::kEnableUnifiedAudioFocusFeature)},
-    {"enable-kerberos-settings-section",
-     flag_descriptions::kKerberosSettingsSectionName,
-     flag_descriptions::kKerberosSettingsSectionDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::features::kKerberosSettingsSection)},
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if defined(OS_WIN)
diff --git a/chrome/browser/accessibility/live_caption_speech_recognition_host_browsertest.cc b/chrome/browser/accessibility/live_caption_speech_recognition_host_browsertest.cc
index 3ed4faf..1798fadb 100644
--- a/chrome/browser/accessibility/live_caption_speech_recognition_host_browsertest.cc
+++ b/chrome/browser/accessibility/live_caption_speech_recognition_host_browsertest.cc
@@ -114,8 +114,9 @@
       remotes_;
 };
 
+// Disabled due to flaky crashes; https://crbug.com/1216304.
 IN_PROC_BROWSER_TEST_F(LiveCaptionSpeechRecognitionHostTest,
-                       DestroysWithoutCrashing) {
+                       DISABLED_DestroysWithoutCrashing) {
   content::RenderFrameHost* frame_host =
       browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame();
   CreateLiveCaptionSpeechRecognitionHost(frame_host);
diff --git a/chrome/browser/apps/app_service/app_service_proxy_base.cc b/chrome/browser/apps/app_service/app_service_proxy_base.cc
index 3f5ced87..0bce161 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_base.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_base.cc
@@ -217,11 +217,14 @@
 
           RecordAppPlatformMetrics(profile_, update, launch_source, container);
 
-          // TODO(crbug/1117655): Presently, app launch metrics are recorded in
-          // the caller. We should record them here, with the same SWA logic as
-          // AppServiceProxy::Launch. There is an if statement to detect
-          // launches from the file manager in LaunchSystemWebApp that should be
-          // removed at the same time.
+          // TODO(crbug/1117655): File manager records metrics for apps it
+          // launched. So we only record launches from other places. We should
+          // eventually move those metrics here, after AppService supports all
+          // app types launched by file manager.
+          if (launch_source != apps::mojom::LaunchSource::kFromFileManager) {
+            RecordAppLaunch(update.AppId(), launch_source);
+          }
+
           app_service_->LaunchAppWithFiles(
               update.AppType(), update.AppId(), container, event_flags,
               launch_source, std::move(file_paths));
@@ -443,6 +446,14 @@
   }
 }
 
+void AppServiceProxyBase::SetWindowMode(const std::string& app_id,
+                                        apps::mojom::WindowMode window_mode) {
+  if (app_service_.is_connected()) {
+    app_service_->SetWindowMode(app_registry_cache_.GetAppType(app_id), app_id,
+                                window_mode);
+  }
+}
+
 void AppServiceProxyBase::AddAppIconSource(Profile* profile) {
   // Make the chrome://app-icon/ resource available.
   content::URLDataSource::Add(profile,
diff --git a/chrome/browser/apps/app_service/app_service_proxy_base.h b/chrome/browser/apps/app_service/app_service_proxy_base.h
index 114d540..a5ca5408 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_base.h
+++ b/chrome/browser/apps/app_service/app_service_proxy_base.h
@@ -205,6 +205,9 @@
   void AddPreferredApp(const std::string& app_id,
                        const apps::mojom::IntentPtr& intent);
 
+  void SetWindowMode(const std::string& app_id,
+                     apps::mojom::WindowMode window_mode);
+
  protected:
   // An adapter, presenting an IconLoader interface based on the underlying
   // Mojo service (or on a fake implementation for testing).
diff --git a/chrome/browser/apps/app_service/webapk/webapk_install_task.cc b/chrome/browser/apps/app_service/webapk/webapk_install_task.cc
index 2ca40aa..1d695d5 100644
--- a/chrome/browser/apps/app_service/webapk/webapk_install_task.cc
+++ b/chrome/browser/apps/app_service/webapk/webapk_install_task.cc
@@ -135,7 +135,8 @@
                                      const std::string& app_id)
     : profile_(profile),
       web_app_provider_(web_app::WebAppProviderBase::GetProviderBase(profile_)),
-      app_id_(app_id) {
+      app_id_(app_id),
+      webapk_(std::make_unique<webapk::WebApk>()) {
   DCHECK(web_app_provider_);
 }
 
@@ -154,19 +155,17 @@
     return;
   }
 
-  std::unique_ptr<webapk::WebApk> webapk = std::make_unique<webapk::WebApk>();
-  webapk->set_manifest_url(registrar.GetAppManifestUrl(app_id_).spec());
-  webapk->set_requester_application_package(kRequesterPackageName);
-  webapk->set_requester_application_version(version_info::GetVersionNumber());
-  webapk->add_update_reasons(webapk::WebApk::NONE);
+  webapk_->set_manifest_url(registrar.GetAppManifestUrl(app_id_).spec());
+  webapk_->set_requester_application_package(kRequesterPackageName);
+  webapk_->set_requester_application_version(version_info::GetVersionNumber());
+  webapk_->add_update_reasons(webapk::WebApk::NONE);
 
-  arc::ArcFeaturesParser::GetArcFeatures(base::BindOnce(
-      &WebApkInstallTask::OnArcFeaturesLoaded, weak_ptr_factory_.GetWeakPtr(),
-      std::move(webapk), std::move(callback)));
+  arc::ArcFeaturesParser::GetArcFeatures(
+      base::BindOnce(&WebApkInstallTask::OnArcFeaturesLoaded,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
 void WebApkInstallTask::OnArcFeaturesLoaded(
-    std::unique_ptr<webapk::WebApk> webapk,
     ResultCallback callback,
     absl::optional<arc::ArcFeatures> arc_features) {
   if (!arc_features) {
@@ -174,7 +173,7 @@
     std::move(callback).Run(false);
     return;
   }
-  webapk->set_android_abi(GetArcAbi(arc_features.value()));
+  webapk_->set_android_abi(GetArcAbi(arc_features.value()));
 
   auto& icon_manager = web_app_provider_->icon_manager();
   absl::optional<web_app::AppIconManager::IconSizeAndPurpose>
@@ -206,7 +205,7 @@
   }
   std::string icon_url = it->url.spec();
 
-  webapk::WebAppManifest* web_app_manifest = webapk->mutable_manifest();
+  webapk::WebAppManifest* web_app_manifest = webapk_->mutable_manifest();
   web_app_manifest->set_short_name(registrar.GetAppShortName(app_id_));
   web_app_manifest->set_start_url(registrar.GetAppStartUrl(app_id_).spec());
   web_app_manifest->add_scopes(registrar.GetAppScope(app_id_).spec());
@@ -250,17 +249,15 @@
   icon_manager.ReadSmallestCompressedIcon(
       app_id_, {icon_size_and_purpose->purpose}, icon_size_and_purpose->size_px,
       base::BindOnce(&WebApkInstallTask::OnLoadedIcon,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(webapk),
-                     std::move(callback)));
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
-void WebApkInstallTask::OnLoadedIcon(std::unique_ptr<webapk::WebApk> webapk,
-                                     ResultCallback callback,
+void WebApkInstallTask::OnLoadedIcon(ResultCallback callback,
                                      IconPurpose purpose,
                                      std::vector<uint8_t> data) {
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::TaskPriority::BEST_EFFORT},
-      base::BindOnce(AddIconDataAndSerializeProto, std::move(webapk),
+      base::BindOnce(AddIconDataAndSerializeProto, std::move(webapk_),
                      std::move(data)),
       base::BindOnce(&WebApkInstallTask::OnProtoSerialized,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
diff --git a/chrome/browser/apps/app_service/webapk/webapk_install_task.h b/chrome/browser/apps/app_service/webapk/webapk_install_task.h
index 256b5d02..26a99aa 100644
--- a/chrome/browser/apps/app_service/webapk/webapk_install_task.h
+++ b/chrome/browser/apps/app_service/webapk/webapk_install_task.h
@@ -47,11 +47,9 @@
   const std::string& app_id() { return app_id_; }
 
  private:
-  void OnArcFeaturesLoaded(std::unique_ptr<webapk::WebApk> webapk,
-                           ResultCallback callback,
+  void OnArcFeaturesLoaded(ResultCallback callback,
                            absl::optional<arc::ArcFeatures> arc_features);
-  void OnLoadedIcon(std::unique_ptr<webapk::WebApk> webapk,
-                    ResultCallback callback,
+  void OnLoadedIcon(ResultCallback callback,
                     IconPurpose purpose,
                     std::vector<uint8_t> data);
   void OnProtoSerialized(ResultCallback callback, std::string serialized_proto);
@@ -65,6 +63,7 @@
   web_app::WebAppProviderBase* web_app_provider_;
 
   const std::string app_id_;
+  std::unique_ptr<webapk::WebApk> webapk_;
   std::unique_ptr<network::SimpleURLLoader> url_loader_;
 
   base::WeakPtrFactory<WebApkInstallTask> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/accessibility/switch_access_browsertest.cc b/chrome/browser/ash/accessibility/switch_access_browsertest.cc
index 9438f648..4d1836d 100644
--- a/chrome/browser/ash/accessibility/switch_access_browsertest.cc
+++ b/chrome/browser/ash/accessibility/switch_access_browsertest.cc
@@ -363,7 +363,9 @@
   // js-based tests that have the ability to ask the text field for its value.
 }
 
-IN_PROC_BROWSER_TEST_F(SwitchAccessTest, PointScanClickWhenMouseEventsEnabled) {
+// Disabled due to high flake rate; https://crbug.com/1216246.
+IN_PROC_BROWSER_TEST_F(SwitchAccessTest,
+                       DISABLED_PointScanClickWhenMouseEventsEnabled) {
   EnableSwitchAccess({'1', 'A'} /* select */, {'2', 'B'} /* next */,
                      {'3', 'C'} /* previous */);
 
diff --git a/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc b/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc
index a7ac11b4..0f574532 100644
--- a/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc
+++ b/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc
@@ -56,8 +56,8 @@
     auto* identity_test_env =
         identity_test_environment_adaptor_->identity_test_env();
     const AccountInfo primary_account_info =
-        identity_test_env->MakeUnconsentedPrimaryAccountAvailable(
-            kFakePrimaryUsername);
+        identity_test_env->MakePrimaryAccountAvailable(
+            kFakePrimaryUsername, signin::ConsentLevel::kSignin);
     auto user_manager = std::make_unique<FakeChromeUserManager>();
     primary_account_id_ = AccountId::FromUserEmailGaiaId(
         primary_account_info.email, primary_account_info.gaia);
diff --git a/chrome/browser/ash/arc/arc_support_host_unittest.cc b/chrome/browser/ash/arc/arc_support_host_unittest.cc
index 7674dfc2..977e4437 100644
--- a/chrome/browser/ash/arc/arc_support_host_unittest.cc
+++ b/chrome/browser/ash/arc/arc_support_host_unittest.cc
@@ -79,7 +79,8 @@
         std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile());
     // The code under test should not be tied to browser sync consent.
     identity_test_env_adaptor_->identity_test_env()
-        ->MakeUnconsentedPrimaryAccountAvailable("testing@account.com");
+        ->MakePrimaryAccountAvailable("testing@account.com",
+                                      signin::ConsentLevel::kSignin);
 
     support_host_ = std::make_unique<ArcSupportHost>(profile());
     fake_arc_support_ = std::make_unique<FakeArcSupport>(support_host_.get());
diff --git a/chrome/browser/ash/arc/auth/arc_auth_service_browsertest.cc b/chrome/browser/ash/arc/auth/arc_auth_service_browsertest.cc
index 1d25b49..6054e66 100644
--- a/chrome/browser/ash/arc/auth/arc_auth_service_browsertest.cc
+++ b/chrome/browser/ash/arc/auth/arc_auth_service_browsertest.cc
@@ -313,9 +313,10 @@
     identity_test_env->SetAutomaticIssueOfAccessTokens(true);
     if (user_type != user_manager::USER_TYPE_ACTIVE_DIRECTORY) {
       // IdentityManager doesn't have a primary account for Active Directory
-      // sessions. Use "unconsented" because ARC doesn't care about browser
-      // sync consent.
-      identity_test_env->MakeUnconsentedPrimaryAccountAvailable(kFakeUserName);
+      // sessions. Use ConsentLevel::kSignin because ARC doesn't care about
+      // browser sync consent.
+      identity_test_env->MakePrimaryAccountAvailable(
+          kFakeUserName, signin::ConsentLevel::kSignin);
     }
 
     profile()->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true);
diff --git a/chrome/browser/ash/arc/policy/arc_android_management_checker.h b/chrome/browser/ash/arc/policy/arc_android_management_checker.h
index 5f5f14e..fe86246 100644
--- a/chrome/browser/ash/arc/policy/arc_android_management_checker.h
+++ b/chrome/browser/ash/arc/policy/arc_android_management_checker.h
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
-#include "chrome/browser/chromeos/policy/android_management_client.h"
+#include "chrome/browser/chromeos/policy/arc/android_management_client.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 
 class Profile;
diff --git a/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc b/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
index f5fb575..58b9cc4 100644
--- a/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
+++ b/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
@@ -91,7 +91,8 @@
     GetFakeUserManager()->LoginUser(account_id);
 
     identity_test_env_profile_adaptor_->identity_test_env()
-        ->MakeUnconsentedPrimaryAccountAvailable(kTestEmail);
+        ->MakePrimaryAccountAvailable(kTestEmail,
+                                      signin::ConsentLevel::kSignin);
   }
 
   void TearDown() override {
diff --git a/chrome/browser/ash/arc/session/arc_session_manager.h b/chrome/browser/ash/arc/session/arc_session_manager.h
index 3bf15d0..e1b33ca 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager.h
+++ b/chrome/browser/ash/arc/session/arc_session_manager.h
@@ -18,7 +18,7 @@
 #include "chrome/browser/ash/arc/session/adb_sideloading_availability_delegate_impl.h"
 #include "chrome/browser/ash/arc/session/arc_app_id_provider_impl.h"
 #include "chrome/browser/ash/arc/session/arc_session_manager_observer.h"
-#include "chrome/browser/chromeos/policy/android_management_client.h"
+#include "chrome/browser/chromeos/policy/arc/android_management_client.h"
 #include "chromeos/dbus/concierge/concierge_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "components/arc/session/arc_session_runner.h"
diff --git a/chrome/browser/ash/arc/session/arc_session_manager_browsertest.cc b/chrome/browser/ash/arc/session/arc_session_manager_browsertest.cc
index 60d5773..651a5dd 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager_browsertest.cc
+++ b/chrome/browser/ash/arc/session/arc_session_manager_browsertest.cc
@@ -152,7 +152,8 @@
         std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile_.get());
 
     // Seed account info properly.
-    identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kFakeUserName);
+    identity_test_env()->MakePrimaryAccountAvailable(
+        kFakeUserName, signin::ConsentLevel::kSignin);
 
     profile()->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true);
     profile()->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, true);
diff --git a/chrome/browser/ash/assistant/assistant_util_unittest.cc b/chrome/browser/ash/assistant/assistant_util_unittest.cc
index ef99097b..d8d75b5 100644
--- a/chrome/browser/ash/assistant/assistant_util_unittest.cc
+++ b/chrome/browser/ash/assistant/assistant_util_unittest.cc
@@ -105,8 +105,8 @@
 
     if (!identity_test_env_->identity_manager()->HasPrimaryAccount(
             signin::ConsentLevel::kSignin)) {
-      identity_test_env_->MakeUnconsentedPrimaryAccountAvailable(
-          account_id_.GetUserEmail());
+      identity_test_env_->MakePrimaryAccountAvailable(
+          account_id_.GetUserEmail(), signin::ConsentLevel::kSignin);
     }
   }
 
diff --git a/chrome/browser/ash/child_accounts/secondary_account_consent_logger_unittest.cc b/chrome/browser/ash/child_accounts/secondary_account_consent_logger_unittest.cc
index 5f2c4a85..c8fcc0e 100644
--- a/chrome/browser/ash/child_accounts/secondary_account_consent_logger_unittest.cc
+++ b/chrome/browser/ash/child_accounts/secondary_account_consent_logger_unittest.cc
@@ -100,7 +100,8 @@
   }
 
   void IssueRefreshTokenForPrimaryAccount() {
-    identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(kAccountEmail);
+    identity_test_env_.MakePrimaryAccountAvailable(
+        kAccountEmail, signin::ConsentLevel::kSignin);
   }
 
   void SendResponse(int net_error, int response_code) {
diff --git a/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc b/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc
index 1d1637b..56ec1cb 100644
--- a/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc
+++ b/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc
@@ -432,7 +432,7 @@
 // Replaces settings urls for KioskSettingsNavigationThrottle.
 class ScopedSettingsPages {
  public:
-  ScopedSettingsPages(
+  explicit ScopedSettingsPages(
       std::vector<KioskSettingsNavigationThrottle::SettingsPage>* pages) {
     KioskSettingsNavigationThrottle::SetSettingPagesForTesting(pages);
   }
@@ -654,8 +654,9 @@
 
     // Check that the app had been informed that it is running in a kiosk
     // session.
-    if (check_launch_data)
-      EXPECT_TRUE(launch_data_check_listener.was_satisfied());
+    if (check_launch_data) {
+      EXPECT_TRUE(launch_data_check_listener.WaitUntilSatisfied());
+    }
   }
 
   void WaitForAppLaunchSuccess() {
@@ -1136,8 +1137,7 @@
   EXPECT_FALSE(KioskAppManager::Get()->IsAutoLaunchEnabled());
 }
 
-// TODO(crbug.com/1201207): Fix flakiness.
-IN_PROC_BROWSER_TEST_F(KioskTest, DISABLED_AutolaunchWarningConfirm) {
+IN_PROC_BROWSER_TEST_F(KioskTest, AutolaunchWarningConfirm) {
   EnableConsumerKioskMode();
 
   WizardController::SkipPostLoginScreensForTesting();
diff --git a/chrome/browser/ash/login/enrollment/auto_enrollment_controller.cc b/chrome/browser/ash/login/enrollment/auto_enrollment_controller.cc
index d8ab7ce4..db3d9c5 100644
--- a/chrome/browser/ash/login/enrollment/auto_enrollment_controller.cc
+++ b/chrome/browser/ash/login/enrollment/auto_enrollment_controller.cc
@@ -19,7 +19,7 @@
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chromeos/policy/auto_enrollment_client_impl.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chromeos/dbus/cryptohome/rpc.pb.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc b/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc
index 2e5d7c97..9207848 100644
--- a/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc
+++ b/chrome/browser/ash/login/enrollment/enrollment_local_policy_server_browsertest.cc
@@ -34,7 +34,7 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
diff --git a/chrome/browser/ash/login/existing_user_controller.cc b/chrome/browser/ash/login/existing_user_controller.cc
index ac30902..405c6f3 100644
--- a/chrome/browser/ash/login/existing_user_controller.cc
+++ b/chrome/browser/ash/login/existing_user_controller.cc
@@ -552,6 +552,7 @@
 // ExistingUserController, private:
 
 ExistingUserController::~ExistingUserController() {
+  CHECK(UserSessionManager::GetInstance());
   UserSessionManager::GetInstance()->DelegateDeleted(this);
 }
 
diff --git a/chrome/browser/ash/login/marketing_backend_connector.h b/chrome/browser/ash/login/marketing_backend_connector.h
index bc73248..beccfff1 100644
--- a/chrome/browser/ash/login/marketing_backend_connector.h
+++ b/chrome/browser/ash/login/marketing_backend_connector.h
@@ -95,7 +95,7 @@
 // Scoped callback setter for the MarketingBackendConnector
 class ScopedRequestCallbackSetter {
  public:
-  ScopedRequestCallbackSetter(
+  explicit ScopedRequestCallbackSetter(
       std::unique_ptr<base::RepeatingCallback<void(std::string)>> callback);
   ~ScopedRequestCallbackSetter();
 
diff --git a/chrome/browser/ash/login/oobe_interactive_ui_test.cc b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
index be81a880f..77ebb270 100644
--- a/chrome/browser/ash/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
@@ -477,7 +477,7 @@
 class NativeWindowVisibilityBrowserMainExtraParts
     : public ChromeBrowserMainExtraParts {
  public:
-  NativeWindowVisibilityBrowserMainExtraParts(
+  explicit NativeWindowVisibilityBrowserMainExtraParts(
       NativeWindowVisibilityObserver* observer)
       : observer_(observer) {}
   ~NativeWindowVisibilityBrowserMainExtraParts() override = default;
diff --git a/chrome/browser/ash/login/screens/packaged_license_screen_browsertest.cc b/chrome/browser/ash/login/screens/packaged_license_screen_browsertest.cc
index f7afd9c..073f603 100644
--- a/chrome/browser/ash/login/screens/packaged_license_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/packaged_license_screen_browsertest.cc
@@ -13,7 +13,7 @@
 #include "chrome/browser/ash/login/wizard_controller.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/policy/enrollment_config.h"
-#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h"
 #include "chrome/browser/ui/webui/chromeos/login/packaged_license_screen_handler.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.cc b/chrome/browser/ash/login/screens/sync_consent_screen.cc
index bac1dc9..002ad35900 100644
--- a/chrome/browser/ash/login/screens/sync_consent_screen.cc
+++ b/chrome/browser/ash/login/screens/sync_consent_screen.cc
@@ -245,7 +245,7 @@
 }
 
 void SyncConsentScreen::MaybeEnableSyncForSkip() {
-  // Prior to SplitSettingsSync, sync is autostarted during ProfileSyncService
+  // Prior to SplitSettingsSync, sync is autostarted during SyncService
   // creation, so sync is already in the right state.
   if (!features::IsSplitSettingsSyncEnabled())
     return;
diff --git a/chrome/browser/ash/login/signin/signin_error_notifier_ash_unittest.cc b/chrome/browser/ash/login/signin/signin_error_notifier_ash_unittest.cc
index 9202907c..c0220709 100644
--- a/chrome/browser/ash/login/signin/signin_error_notifier_ash_unittest.cc
+++ b/chrome/browser/ash/login/signin/signin_error_notifier_ash_unittest.cc
@@ -126,7 +126,9 @@
       display_service_->GetNotification(kPrimaryAccountErrorNotificationId));
 
   CoreAccountId account_id =
-      identity_test_env()->MakePrimaryAccountAvailable(kTestEmail).account_id;
+      identity_test_env()
+          ->MakePrimaryAccountAvailable(kTestEmail, signin::ConsentLevel::kSync)
+          .account_id;
   SetAuthError(
       account_id,
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
@@ -142,10 +144,10 @@
   EXPECT_FALSE(
       display_service_->GetNotification(kPrimaryAccountErrorNotificationId));
 
-  CoreAccountId account_id =
-      identity_test_env()
-          ->MakeUnconsentedPrimaryAccountAvailable(kTestEmail)
-          .account_id;
+  CoreAccountId account_id = identity_test_env()
+                                 ->MakePrimaryAccountAvailable(
+                                     kTestEmail, signin::ConsentLevel::kSignin)
+                                 .account_id;
   SetAuthError(
       account_id,
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
@@ -178,7 +180,9 @@
 
 TEST_F(SigninErrorNotifierTest, ErrorTransitionForPrimaryAccount) {
   CoreAccountId account_id =
-      identity_test_env()->MakePrimaryAccountAvailable(kTestEmail).account_id;
+      identity_test_env()
+          ->MakePrimaryAccountAvailable(kTestEmail, signin::ConsentLevel::kSync)
+          .account_id;
   SetAuthError(
       account_id,
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
@@ -225,7 +229,9 @@
                                GoogleServiceAuthError::kDeprecatedStateCount,
       "table size should match number of auth error types");
   CoreAccountId account_id =
-      identity_test_env()->MakePrimaryAccountAvailable(kTestEmail).account_id;
+      identity_test_env()
+          ->MakePrimaryAccountAvailable(kTestEmail, signin::ConsentLevel::kSync)
+          .account_id;
 
   for (size_t i = 0; i < base::size(table); ++i) {
     SetAuthError(account_id, GoogleServiceAuthError(table[i].error_state));
@@ -243,7 +249,9 @@
 
 TEST_F(SigninErrorNotifierTest, ChildSecondaryAccountMigrationTest) {
   CoreAccountId primary_account =
-      identity_test_env()->MakePrimaryAccountAvailable(kTestEmail).account_id;
+      identity_test_env()
+          ->MakePrimaryAccountAvailable(kTestEmail, signin::ConsentLevel::kSync)
+          .account_id;
   CoreAccountId secondary_account =
       identity_test_env()->MakeAccountAvailable(kTestSecondaryEmail).account_id;
 
diff --git a/chrome/browser/ash/login/test/active_directory_login_mixin.h b/chrome/browser/ash/login/test/active_directory_login_mixin.h
index d7d8328c..8853b90 100644
--- a/chrome/browser/ash/login/test/active_directory_login_mixin.h
+++ b/chrome/browser/ash/login/test/active_directory_login_mixin.h
@@ -9,7 +9,7 @@
 #include <string>
 
 #include "base/macros.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chrome/test/base/mixin_based_in_process_browser_test.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
 #include "components/policy/proto/device_management_backend.pb.h"
diff --git a/chrome/browser/ash/login/test/local_policy_test_server_mixin.h b/chrome/browser/ash/login/test/local_policy_test_server_mixin.h
index a32d8da..a3ecfed 100644
--- a/chrome/browser/ash/login/test/local_policy_test_server_mixin.h
+++ b/chrome/browser/ash/login/test/local_policy_test_server_mixin.h
@@ -10,7 +10,7 @@
 
 #include "base/macros.h"
 #include "base/values.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chrome/test/base/mixin_based_in_process_browser_test.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
 #include "components/policy/proto/cloud_policy.pb.h"
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
index a6930f5..27493b6a 100644
--- a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
@@ -59,14 +59,14 @@
 #include "chrome/browser/chromeos/extensions/extension_tab_util_delegate_chromeos.h"
 #include "chrome/browser/chromeos/extensions/permissions_updater_delegate_chromeos.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
-#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
 #include "chrome/browser/chromeos/policy/external_data/handlers/crostini_ansible_playbook_external_data_handler.h"
 #include "chrome/browser/chromeos/policy/external_data/handlers/print_servers_external_data_handler.h"
 #include "chrome/browser/chromeos/policy/external_data/handlers/printers_external_data_handler.h"
 #include "chrome/browser/chromeos/policy/external_data/handlers/user_avatar_image_external_data_handler.h"
 #include "chrome/browser/chromeos/policy/external_data/handlers/wallpaper_image_external_data_handler.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h"
 #include "chrome/browser/chromeos/session_length_limiter.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/permissions_updater.h"
diff --git a/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc b/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc
index 73fc774..a14773c 100644
--- a/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc
+++ b/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc
@@ -17,8 +17,8 @@
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/login/users/multi_profile_user_controller_delegate.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 #include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
diff --git a/chrome/browser/ash/login/webview_login_browsertest.cc b/chrome/browser/ash/login/webview_login_browsertest.cc
index bf18183..830e84f9 100644
--- a/chrome/browser/ash/login/webview_login_browsertest.cc
+++ b/chrome/browser/ash/login/webview_login_browsertest.cc
@@ -82,8 +82,8 @@
 #include "components/policy/policy_constants.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
 #include "components/prefs/pref_change_registrar.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/trusted_vault_client.h"
 #include "components/sync/trusted_vault/standalone_trusted_vault_client.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -622,8 +622,8 @@
   Browser* browser = ui_test_utils::WaitForBrowserToOpen();
   test::WaitForPrimaryUserSessionStart();
 
-  syncer::ProfileSyncService* sync_service =
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(browser->profile());
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(browser->profile());
   syncer::TrustedVaultClient* trusted_vault_client =
       sync_service->GetSyncClientForTest()->GetTrustedVaultClient();
 
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc
index 97124ca..2da7ff4 100644
--- a/chrome/browser/ash/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -63,7 +63,7 @@
 #include "chrome/browser/chromeos/policy/auto_enrollment_client.h"
 #include "chrome/browser/chromeos/policy/enrollment_config.h"
 #include "chrome/browser/chromeos/policy/fake_auto_enrollment_client.h"
-#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h"
 #include "chrome/browser/lifetime/browser_shutdown.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
diff --git a/chrome/browser/ash/power/auto_screen_brightness/adapter.cc b/chrome/browser/ash/power/auto_screen_brightness/adapter.cc
index acd3042..77ce29ca 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/adapter.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/adapter.cc
@@ -23,7 +23,7 @@
 #include "chromeos/dbus/power_manager/backlight.pb.h"
 #include "components/prefs/pref_service.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -844,4 +844,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/adapter.h b/chrome/browser/ash/power/auto_screen_brightness/adapter.h
index a2d7aea8f..052d534 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/adapter.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/adapter.h
@@ -28,7 +28,7 @@
 
 class Profile;
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -412,6 +412,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_ADAPTER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/adapter_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/adapter_unittest.cc
index b0bfcfe1..8e05239 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/adapter_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/adapter_unittest.cc
@@ -36,7 +36,7 @@
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -174,8 +174,8 @@
     scoped_refptr<user_prefs::PrefRegistrySyncable> registry(
         new user_prefs::PrefRegistrySyncable);
 
-    chromeos::power::auto_screen_brightness::MetricsReporter::
-        RegisterLocalStatePrefs(registry.get());
+    auto_screen_brightness::MetricsReporter::RegisterLocalStatePrefs(
+        registry.get());
 
     sync_preferences::PrefServiceSyncable* regular_prefs =
         factory.CreateSyncable(registry.get()).release();
@@ -1284,4 +1284,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_file_reader.cc b/chrome/browser/ash/power/auto_screen_brightness/als_file_reader.cc
index ed51b4c..d7a0467 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_file_reader.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_file_reader.cc
@@ -17,7 +17,7 @@
 #include "chrome/browser/ash/power/auto_screen_brightness/utils.h"
 #include "content/public/browser/browser_thread.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -159,4 +159,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_file_reader.h b/chrome/browser/ash/power/auto_screen_brightness/als_file_reader.h
index 61d7ca6..e513238 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_file_reader.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_file_reader.h
@@ -15,7 +15,7 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/ash/power/auto_screen_brightness/als_reader.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -92,6 +92,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_ALS_FILE_READER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_file_reader_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/als_file_reader_unittest.cc
index 992c84be..33c9ad2 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_file_reader_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_file_reader_unittest.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/ash/power/auto_screen_brightness/fake_observer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -108,4 +108,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_reader.cc b/chrome/browser/ash/power/auto_screen_brightness/als_reader.cc
index e57dfda..a4872cb9 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_reader.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_reader.cc
@@ -23,7 +23,7 @@
 #endif  // BUILDFLAG(USE_IIOSERVICE)
 #include "content/public/browser/browser_thread.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -132,4 +132,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_reader.h b/chrome/browser/ash/power/auto_screen_brightness/als_reader.h
index dc1c36f..b82aabe 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_reader.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_reader.h
@@ -12,7 +12,7 @@
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -103,6 +103,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_ALS_READER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_reader_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/als_reader_unittest.cc
index 064969f..06ff956 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_reader_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_reader_unittest.cc
@@ -7,7 +7,7 @@
 #include "chrome/browser/ash/power/auto_screen_brightness/fake_observer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -81,4 +81,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_samples.cc b/chrome/browser/ash/power/auto_screen_brightness/als_samples.cc
index 097074a..cf8519e 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_samples.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_samples.cc
@@ -8,7 +8,7 @@
 
 #include "base/check.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -68,4 +68,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_samples.h b/chrome/browser/ash/power/auto_screen_brightness/als_samples.h
index 7baf61d..2c157d4 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_samples.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_samples.h
@@ -11,7 +11,7 @@
 #include "base/time/time.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -65,6 +65,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_ALS_SAMPLES_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/als_samples_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/als_samples_unittest.cc
index f903418a..a879a8a 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/als_samples_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/als_samples_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -162,4 +162,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor.h b/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor.h
index f32a066d..079ff2c 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor.h
@@ -7,7 +7,7 @@
 
 #include "base/observer_list_types.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -56,6 +56,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_BRIGHTNESS_MONITOR_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl.cc b/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl.cc
index 49441f12..ca3a99c 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl.cc
@@ -19,7 +19,7 @@
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/dbus/power_manager/backlight.pb.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -171,4 +171,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl.h b/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl.h
index 0c84270..59114198 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl.h
@@ -17,7 +17,7 @@
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -108,6 +108,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_BRIGHTNESS_MONITOR_IMPL_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl_unittest.cc
index 7b90e4f..90f6a6e1 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/brightness_monitor_impl_unittest.cc
@@ -15,7 +15,7 @@
 #include "chromeos/dbus/power_manager/backlight.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -316,4 +316,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/controller.cc b/chrome/browser/ash/power/auto_screen_brightness/controller.cc
index 7a97099..70b095b 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/controller.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/controller.cc
@@ -18,7 +18,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/session_manager/core/session_manager.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -96,4 +96,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/controller.h b/chrome/browser/ash/power/auto_screen_brightness/controller.h
index fecad6b..6261d1ed 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/controller.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/controller.h
@@ -12,7 +12,7 @@
 #include "base/sequenced_task_runner.h"
 #include "components/session_manager/core/session_manager_observer.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -59,6 +59,16 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
+}  // namespace ash
+
+// TODO(https://crbug.com/1164001): remove when Chrome OS code migration is
+// done.
+namespace chromeos {
+namespace power {
+namespace auto_screen_brightness {
+using ::ash::power::auto_screen_brightness::Controller;
+}  // namespace auto_screen_brightness
+}  // namespace power
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_CONTROLLER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.cc b/chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.cc
index 411455a..f940f7db 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -48,4 +48,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.h b/chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.h
index 559df87..22630a0 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/fake_brightness_monitor.h
@@ -9,7 +9,7 @@
 #include "base/observer_list.h"
 #include "chrome/browser/ash/power/auto_screen_brightness/brightness_monitor.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -50,6 +50,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_FAKE_BRIGHTNESS_MONITOR_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.cc b/chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.cc
index 0620fbb..3d112f64 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -25,4 +25,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.h b/chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.h
index 99a71f2..20b19a5 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/fake_light_provider.h
@@ -8,14 +8,14 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/ash/power/auto_screen_brightness/als_reader.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
 // This is a fake implementation of LightProviderInterface for testing only.
 class FakeLightProvider : public LightProviderInterface {
  public:
-  FakeLightProvider(AlsReader* als_reader);
+  explicit FakeLightProvider(AlsReader* als_reader);
   FakeLightProvider(const FakeLightProvider&) = delete;
   FakeLightProvider& operator=(const FakeLightProvider&) = delete;
   ~FakeLightProvider() override;
@@ -36,6 +36,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_FAKE_LIGHT_PROVIDER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.cc b/chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.cc
index 77b77739..2cf41a2c1 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -41,4 +41,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.h b/chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.h
index 4b2f8fc0..c193d21b 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/fake_model_config_loader.h
@@ -9,7 +9,7 @@
 #include "base/observer_list.h"
 #include "chrome/browser/ash/power/auto_screen_brightness/model_config_loader.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -51,6 +51,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_FAKE_MODEL_CONFIG_LOADER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/fake_observer.cc b/chrome/browser/ash/power/auto_screen_brightness/fake_observer.cc
index a22218c5..3d67c7fde 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/fake_observer.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/fake_observer.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ash/power/auto_screen_brightness/fake_observer.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -22,4 +22,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/fake_observer.h b/chrome/browser/ash/power/auto_screen_brightness/fake_observer.h
index e1d6c293..995289b 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/fake_observer.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/fake_observer.h
@@ -9,7 +9,7 @@
 
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -43,6 +43,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_FAKE_OBSERVER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc
index 764806b..2707366 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc
@@ -16,7 +16,7 @@
 #include "base/numerics/ranges.h"
 #include "chrome/browser/ash/power/auto_screen_brightness/utils.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -549,4 +549,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.h b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.h
index f0cdded7..3138b76 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.h
@@ -9,7 +9,7 @@
 
 #include "chrome/browser/ash/power/auto_screen_brightness/trainer.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -136,6 +136,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_GAUSSIAN_TRAINER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer_unittest.cc
index 69dd0aa..6663a1f 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer_unittest.cc
@@ -13,7 +13,7 @@
 #include "chrome/browser/ash/power/auto_screen_brightness/utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -616,4 +616,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo.cc b/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo.cc
index 538b5ed..407d896 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo.cc
@@ -28,7 +28,7 @@
 
 }  // namespace
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -388,4 +388,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo.h b/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo.h
index a6cffa9..c10585e7 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo.h
@@ -19,7 +19,7 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -137,6 +137,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_LIGHT_PROVIDER_MOJO_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo_unittest.cc
index e4504fe..3ff3a503 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/light_provider_mojo_unittest.cc
@@ -16,7 +16,7 @@
 #include "chromeos/components/sensors/sensor_hal_dispatcher.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -280,4 +280,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer.cc b/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer.cc
index 85e5773..6e9b268 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer.cc
@@ -9,7 +9,7 @@
 #include "base/bind.h"
 #include "chrome/browser/ash/power/auto_screen_brightness/utils.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -199,4 +199,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer.h b/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer.h
index 9db4796..98f99e9 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer.h
@@ -13,7 +13,7 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -68,6 +68,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_LIGHT_SAMPLES_OBSERVER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer_unittest.cc
index fdb4882d..ba21b6a1 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/light_samples_observer_unittest.cc
@@ -17,7 +17,7 @@
 #include "chromeos/components/sensors/fake_sensor_device.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -178,4 +178,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.cc b/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.cc
index 3d95a70..d68c408 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.cc
@@ -11,7 +11,7 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -151,4 +151,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.h b/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.h
index 1c82165..7c6ba0e 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.h
@@ -17,7 +17,7 @@
 class PrefRegistrySimple;
 class PrefService;
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -113,6 +113,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_METRICS_REPORTER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter_unittest.cc
index 75ec0be..c5f5946 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/metrics_reporter_unittest.cc
@@ -15,7 +15,7 @@
 #include "components/prefs/testing_pref_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -219,4 +219,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/model_config.cc b/chrome/browser/ash/power/auto_screen_brightness/model_config.cc
index 7c04e11d..39f94e1 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/model_config.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/model_config.cc
@@ -6,7 +6,7 @@
 
 #include "chrome/browser/ash/power/auto_screen_brightness/model_config.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -70,4 +70,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/model_config.h b/chrome/browser/ash/power/auto_screen_brightness/model_config.h
index 380cae0..85f28b8 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/model_config.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/model_config.h
@@ -9,7 +9,7 @@
 #include <string>
 #include <vector>
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -33,6 +33,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_MODEL_CONFIG_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/model_config_loader.h b/chrome/browser/ash/power/auto_screen_brightness/model_config_loader.h
index 2c20cd1d..871f478 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/model_config_loader.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/model_config_loader.h
@@ -9,7 +9,7 @@
 #include "chrome/browser/ash/power/auto_screen_brightness/model_config.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -44,6 +44,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_MODEL_CONFIG_LOADER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl.cc b/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl.cc
index 07c4c13f..15b5b70 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl.cc
@@ -23,7 +23,7 @@
 #include "base/values.h"
 #include "content/public/browser/browser_thread.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -298,4 +298,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl.h b/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl.h
index b0e6744..4f07a18 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl.h
@@ -18,7 +18,7 @@
 #include "chrome/browser/ash/power/auto_screen_brightness/model_config_loader.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -78,6 +78,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_MODEL_CONFIG_LOADER_IMPL_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl_unittest.cc
index 9d346ebb..2e0dbbe 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/model_config_loader_impl_unittest.cc
@@ -21,7 +21,7 @@
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -347,4 +347,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/modeller.h b/chrome/browser/ash/power/auto_screen_brightness/modeller.h
index f3fc0d0..7886dc3d 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/modeller.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/modeller.h
@@ -9,7 +9,7 @@
 #include "chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -46,6 +46,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_MODELLER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/modeller_impl.cc b/chrome/browser/ash/power/auto_screen_brightness/modeller_impl.cc
index 75aa6876..7c098cf 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/modeller_impl.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/modeller_impl.cc
@@ -29,7 +29,7 @@
 #include "ui/events/event.h"
 #include "ui/events/event_constants.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -677,4 +677,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/modeller_impl.h b/chrome/browser/ash/power/auto_screen_brightness/modeller_impl.h
index 1516fe1..606f483 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/modeller_impl.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/modeller_impl.h
@@ -30,7 +30,7 @@
 #include "ui/base/user_activity/user_activity_detector.h"
 #include "ui/base/user_activity/user_activity_observer.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -303,6 +303,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_MODELLER_IMPL_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/modeller_impl_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/modeller_impl_unittest.cc
index 1c728f0..6bbf7ca 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/modeller_impl_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/modeller_impl_unittest.cc
@@ -29,7 +29,7 @@
 #include "ui/events/event.h"
 #include "ui/events/types/event_type.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -729,4 +729,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.cc b/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.cc
index 0cfb759a..fe07f49 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.cc
@@ -13,7 +13,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -254,4 +254,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.h b/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.h
index 05fb4e9be..7e618e3 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.h
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -71,6 +71,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_MONOTONE_CUBIC_SPLINE_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline_unittest.cc
index afbab2e..91f9fea 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline_unittest.cc
@@ -11,7 +11,7 @@
 
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -139,4 +139,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/trainer.h b/chrome/browser/ash/power/auto_screen_brightness/trainer.h
index a77097d..31cce7e 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/trainer.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/trainer.h
@@ -8,7 +8,7 @@
 #include "base/time/time.h"
 #include "chrome/browser/ash/power/auto_screen_brightness/monotone_cubic_spline.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -61,6 +61,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_TRAINER_H_
diff --git a/chrome/browser/ash/power/auto_screen_brightness/utils.cc b/chrome/browser/ash/power/auto_screen_brightness/utils.cc
index 08087325..180e1e6 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/utils.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/utils.cc
@@ -6,7 +6,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/stringprintf.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -28,4 +28,4 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/power/auto_screen_brightness/utils.h b/chrome/browser/ash/power/auto_screen_brightness/utils.h
index 1cf5609..6d96740 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/utils.h
+++ b/chrome/browser/ash/power/auto_screen_brightness/utils.h
@@ -10,7 +10,7 @@
 
 #include "base/containers/ring_buffer.h"
 
-namespace chromeos {
+namespace ash {
 namespace power {
 namespace auto_screen_brightness {
 
@@ -47,6 +47,6 @@
 
 }  // namespace auto_screen_brightness
 }  // namespace power
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_POWER_AUTO_SCREEN_BRIGHTNESS_UTILS_H_
diff --git a/chrome/browser/ash/settings/device_settings_provider.cc b/chrome/browser/ash/settings/device_settings_provider.cc
index df940ac..8b5057f 100644
--- a/chrome/browser/ash/settings/device_settings_provider.cc
+++ b/chrome/browser/ash/settings/device_settings_provider.cc
@@ -97,6 +97,7 @@
     kDevicePowerwashAllowed,
     kDeviceQuirksDownloadEnabled,
     kDeviceRebootOnUserSignout,
+    kDeviceScheduledReboot,
     kDeviceScheduledUpdateCheck,
     kDeviceSecondFactorAuthenticationMode,
     kDeviceUnaffiliatedCrostiniAllowed,
@@ -1076,6 +1077,17 @@
     new_values_cache->SetValue(kDeviceAllowedBluetoothServices,
                                std::move(list));
   }
+
+  if (policy.has_device_scheduled_reboot()) {
+    const em::DeviceScheduledRebootProto& scheduled_reboot_policy =
+        policy.device_scheduled_reboot();
+    if (scheduled_reboot_policy.has_device_scheduled_reboot_settings()) {
+      SetJsonDeviceSetting(
+          kDeviceScheduledReboot, policy::key::kDeviceScheduledReboot,
+          scheduled_reboot_policy.device_scheduled_reboot_settings(),
+          new_values_cache);
+    }
+  }
 }
 
 void DecodeLogUploadPolicies(const em::ChromeDeviceSettingsProto& policy,
diff --git a/chrome/browser/ash/settings/device_settings_provider_unittest.cc b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
index c23ab44..77f2441f 100644
--- a/chrome/browser/ash/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
@@ -393,6 +393,14 @@
     }
   }
 
+  // Helper routine that sets the DeviceScheduledReboot policy.
+  void SetDeviceScheduledReboot(const std::string& json_string) {
+    em::DeviceScheduledRebootProto* proto =
+        device_policy_->payload().mutable_device_scheduled_reboot();
+    proto->set_device_scheduled_reboot_settings(json_string);
+    BuildAndInstallDevicePolicy();
+  }
+
   void VerifyDevicePrinterList(const char* policy_key,
                                std::vector<std::string>& values) {
     base::Value list(base::Value::Type::LIST);
@@ -1258,4 +1266,21 @@
   allowlist.Append(base::Value("0x1124"));
   EXPECT_EQ(allowlist, *provider_->Get(kDeviceAllowedBluetoothServices));
 }
+
+// Check valid JSON for DeviceScheduledReboot.
+TEST_F(DeviceSettingsProviderTest, DeviceScheduledReboot) {
+  const std::string json_string =
+      "{\"reboot_time\": {\"hour\": 22, \"minute\": 30}, "
+      "\"frequency\": \"MONTHLY\", \"day_of_week\": \"MONDAY\", "
+      "\"day_of_month\": 15}";
+  base::DictionaryValue expected_val;
+  expected_val.SetPath({"reboot_time", "hour"}, base::Value(22));
+  expected_val.SetPath({"reboot_time", "minute"}, base::Value(30));
+  expected_val.Set("frequency", std::make_unique<base::Value>("MONTHLY"));
+  expected_val.Set("day_of_week", std::make_unique<base::Value>("MONDAY"));
+  expected_val.Set("day_of_month", std::make_unique<base::Value>(15));
+  SetDeviceScheduledReboot(json_string);
+  VerifyPolicyValue(kDeviceScheduledReboot, &expected_val);
+}
+
 }  // namespace ash
diff --git a/chrome/browser/ash/sync/turn_sync_on_helper_unittest.cc b/chrome/browser/ash/sync/turn_sync_on_helper_unittest.cc
index 2193330..b5da7c4b 100644
--- a/chrome/browser/ash/sync/turn_sync_on_helper_unittest.cc
+++ b/chrome/browser/ash/sync/turn_sync_on_helper_unittest.cc
@@ -97,7 +97,8 @@
 };
 
 TEST_F(TurnSyncOnHelperTest, UserAcceptsDefaults) {
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "user@gmail.com", signin::ConsentLevel::kSignin);
 
   auto test_delegate = std::make_unique<TestDelegate>();
   TestDelegate* delegate = test_delegate.get();
@@ -120,7 +121,8 @@
 }
 
 TEST_F(TurnSyncOnHelperTest, UserClicksSettings) {
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "user@gmail.com", signin::ConsentLevel::kSignin);
 
   auto test_delegate = std::make_unique<TestDelegate>();
   TestDelegate* delegate = test_delegate.get();
@@ -139,7 +141,8 @@
 }
 
 TEST_F(TurnSyncOnHelperTest, UserClicksCancel) {
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "user@gmail.com", signin::ConsentLevel::kSignin);
 
   auto test_delegate = std::make_unique<TestDelegate>();
   TestDelegate* delegate = test_delegate.get();
@@ -158,7 +161,8 @@
 }
 
 TEST_F(TurnSyncOnHelperTest, UserClosesUI) {
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "user@gmail.com", signin::ConsentLevel::kSignin);
 
   auto test_delegate = std::make_unique<TestDelegate>();
   TestDelegate* delegate = test_delegate.get();
@@ -177,7 +181,8 @@
 }
 
 TEST_F(TurnSyncOnHelperTest, UserPreviouslyDeclinedSync) {
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "user@gmail.com", signin::ConsentLevel::kSignin);
   ASSERT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
 
   // Simulate a user who previously completed the first-run flow.
@@ -195,7 +200,8 @@
 }
 
 TEST_F(TurnSyncOnHelperTest, UserPreviouslyAcceptedSync) {
-  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com",
+                                                   ConsentLevel::kSync);
   ASSERT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
 
   auto test_delegate = std::make_unique<TestDelegate>();
@@ -210,7 +216,8 @@
 }
 
 TEST_F(TurnSyncOnHelperTest, UrlKeyedMetricsConsent) {
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "user@gmail.com", signin::ConsentLevel::kSignin);
 
   // User is not consented by default.
   std::unique_ptr<UrlKeyedDataCollectionConsentHelper> consent_helper =
diff --git a/chrome/browser/ash/system/device_disabling_manager.cc b/chrome/browser/ash/system/device_disabling_manager.cc
index f83242f6..2c84fc3 100644
--- a/chrome/browser/ash/system/device_disabling_manager.cc
+++ b/chrome/browser/ash/system/device_disabling_manager.cc
@@ -13,7 +13,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
-#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "chromeos/settings/cros_settings_provider.h"
diff --git a/chrome/browser/ash/system/device_disabling_manager_unittest.cc b/chrome/browser/ash/system/device_disabling_manager_unittest.cc
index 320b30b8..38e02bd 100644
--- a/chrome/browser/ash/system/device_disabling_manager_unittest.cc
+++ b/chrome/browser/ash/system/device_disabling_manager_unittest.cc
@@ -20,7 +20,7 @@
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
-#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
diff --git a/chrome/browser/ash/web_applications/help_app/help_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/help_app/help_app_integration_browsertest.cc
index f382959..d8579ac 100644
--- a/chrome/browser/ash/web_applications/help_app/help_app_integration_browsertest.cc
+++ b/chrome/browser/ash/web_applications/help_app/help_app_integration_browsertest.cc
@@ -38,6 +38,7 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "chromeos/components/help_app_ui/buildflags.h"
 #include "chromeos/components/help_app_ui/help_app_manager.h"
 #include "chromeos/components/help_app_ui/help_app_manager_factory.h"
 #include "chromeos/components/help_app_ui/search/search.mojom.h"
@@ -175,7 +176,7 @@
 
   chrome::ShowHelp(browser(), chrome::HELP_SOURCE_KEYBOARD);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(ENABLE_CROS_HELP_APP)
   EXPECT_NO_FATAL_FAILURE(WaitForAppToOpen(GURL("chrome://help-app/")));
 #else
   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
@@ -199,7 +200,7 @@
 
   chrome::LaunchReleaseNotes(profile(),
                              apps::mojom::LaunchSource::kFromOtherApp);
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(ENABLE_CROS_HELP_APP)
   // If no navigation happens, then this test will time out due to the wait.
   navigation_observer.Wait();
 
@@ -225,7 +226,7 @@
   base::UserActionTester user_action_tester;
   chrome::LaunchReleaseNotes(profile(),
                              apps::mojom::LaunchSource::kFromOtherApp);
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(ENABLE_CROS_HELP_APP)
   EXPECT_EQ(1,
             user_action_tester.GetActionCount("ReleaseNotes.ShowReleaseNotes"));
 #else
@@ -263,7 +264,7 @@
       1, user_action_tester.GetActionCount("ReleaseNotes.NotificationShown"));
   EXPECT_EQ(1, user_action_tester.GetActionCount(
                    "ReleaseNotes.LaunchedNotification"));
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(ENABLE_CROS_HELP_APP)
   EXPECT_NO_FATAL_FAILURE(WaitForAppToOpen(GURL("chrome://help-app/updates")));
   EXPECT_EQ(1,
             user_action_tester.GetActionCount("ReleaseNotes.ShowReleaseNotes"));
@@ -341,7 +342,7 @@
       chromeos::kShowHelpAppDiscoverTabNotificationId, absl::nullopt,
       absl::nullopt);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(ENABLE_CROS_HELP_APP)
   EXPECT_NO_FATAL_FAILURE(WaitForAppToOpen(GURL("chrome://help-app/discover")));
 #else
   // We just have the original browser. No new app opens.
@@ -620,8 +621,7 @@
 
   EXPECT_EQ(help_task->get()->opened_count_for_testing(), 1u);
 
-// TODO(b/187231134): Replace this with a single build flag.
-#if !BUILDFLAG(IS_CHROMEOS_ASH) || !BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if !BUILDFLAG(ENABLE_CROS_HELP_APP)
   // This part only works in non-branded builds because it uses fake data added
   // by the mock app.
   // Search using the search handler to confirm that the update happened.
@@ -673,7 +673,7 @@
       browser(), ui::VKEY_OEM_2, /*control=*/true,
       /*shift=*/false, /*alt=*/false, /*command=*/false));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(ENABLE_CROS_HELP_APP)
   // Default browser tab and Help app are open.
   EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
   EXPECT_EQ("chrome://help-app/", GetActiveWebContents()->GetVisibleURL());
diff --git a/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
index 131648b..763681a 100644
--- a/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
+++ b/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
@@ -645,6 +645,8 @@
 // handler for a given file.
 IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppAllProfilesTest,
                        FileOpenUsesMediaApp) {
+  base::HistogramTester histograms;
+
   WaitForTestSystemAppInstall();
   Browser* test_browser = chrome::FindBrowserWithActiveWindow();
 
@@ -666,6 +668,9 @@
   EXPECT_EQ(web_app::GetAppIdFromApplicationName(app_browser->app_name()),
             *GetManager().GetAppIdForSystemApp(web_app::SystemAppType::MEDIA));
   EXPECT_EQ("800x600", WaitForImageAlt(web_ui, kFilePng800x600));
+
+  // Check the metric is recorded.
+  histograms.ExpectTotalCount("Apps.DefaultAppLaunch.FromFileManager", 1);
 }
 
 // Test that the MediaApp can navigate other files in the directory of a file
diff --git a/chrome/browser/browsing_data/counters/browsing_data_counter_utils_browsertest.cc b/chrome/browser/browsing_data/counters/browsing_data_counter_utils_browsertest.cc
index 43a5af7..a1943d4a 100644
--- a/chrome/browser/browsing_data/counters/browsing_data_counter_utils_browsertest.cc
+++ b/chrome/browser/browsing_data/counters/browsing_data_counter_utils_browsertest.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/unified_consent/unified_consent_service_factory.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/signin/public/base/signin_buildflags.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/test/fake_server/fake_server_network_resources.h"
 #include "content/public/test/browser_test.h"
 
@@ -36,8 +36,8 @@
                        ShouldShowCookieException) {
   Profile* profile = browser()->profile();
 
-  syncer::ProfileSyncService* sync_service =
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile);
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(profile);
 
   sync_service->OverrideNetworkForTest(
       fake_server::CreateFakeServerHttpPostProviderFactory(
diff --git a/chrome/browser/browsing_data/counters/sync_aware_counter_browsertest.cc b/chrome/browser/browsing_data/counters/sync_aware_counter_browsertest.cc
index ab385354..800c05f 100644
--- a/chrome/browser/browsing_data/counters/sync_aware_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/counters/sync_aware_counter_browsertest.cc
@@ -26,7 +26,7 @@
 #include "components/history/core/browser/web_history_service.h"
 #include "components/history/core/test/fake_web_history_service.h"
 #include "components/prefs/pref_service.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/browser_test.h"
 
diff --git a/chrome/browser/certificate_manager_model.cc b/chrome/browser/certificate_manager_model.cc
index e955761..183b84d 100644
--- a/chrome/browser/certificate_manager_model.cc
+++ b/chrome/browser/certificate_manager_model.cc
@@ -35,8 +35,8 @@
 #include "chrome/browser/ash/certificate_provider/certificate_provider.h"
 #include "chrome/browser/ash/certificate_provider/certificate_provider_service.h"
 #include "chrome/browser/ash/certificate_provider/certificate_provider_service_factory.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h"
 #include "chromeos/network/onc/certificate_scope.h"
 #include "chromeos/network/policy_certificate_provider.h"
 #endif
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 23b50c4..3a67e5b 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -437,7 +437,7 @@
 #include "chrome/browser/chromeos/fileapi/mtp_file_system_backend_delegate.h"
 #include "chrome/browser/chromeos/net/system_proxy_manager.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 #include "chrome/browser/chromeos/policy/system_features_disable_list_policy_handler.h"
 #include "chrome/browser/chromeos/smb_client/fileapi/smbfs_file_system_backend_delegate.h"
 #include "chrome/browser/speech/tts_chromeos.h"
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc
index 3947647..1aebb58 100644
--- a/chrome/browser/chrome_content_browser_client_unittest.cc
+++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -65,8 +65,8 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/content/scanning/url_constants.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 #include "chrome/browser/chromeos/policy/system_features_disable_list_policy_handler.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index d43fff1..86e4886 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -2574,8 +2574,8 @@
     "policy/affiliated_invalidation_service_provider.h",
     "policy/affiliated_invalidation_service_provider_impl.cc",
     "policy/affiliated_invalidation_service_provider_impl.h",
-    "policy/android_management_client.cc",
-    "policy/android_management_client.h",
+    "policy/arc/android_management_client.cc",
+    "policy/arc/android_management_client.h",
     "policy/auto_enrollment_client.h",
     "policy/auto_enrollment_client_impl.cc",
     "policy/auto_enrollment_client_impl.h",
@@ -2599,8 +2599,6 @@
     "policy/device_cloud_policy_store_chromeos.h",
     "policy/device_cloud_policy_validator.cc",
     "policy/device_cloud_policy_validator.h",
-    "policy/device_cloud_state_keys_uploader.cc",
-    "policy/device_cloud_state_keys_uploader.h",
     "policy/device_dock_mac_address_source_handler.cc",
     "policy/device_dock_mac_address_source_handler.h",
     "policy/device_local_account.cc",
@@ -2613,19 +2611,17 @@
     "policy/device_local_account_policy_service.h",
     "policy/device_local_account_policy_store.cc",
     "policy/device_local_account_policy_store.h",
-    "policy/device_network_configuration_updater.cc",
-    "policy/device_network_configuration_updater.h",
     "policy/device_policy_decoder_chromeos.cc",
     "policy/device_policy_decoder_chromeos.h",
     "policy/device_policy_remover.h",
     "policy/device_wifi_allowed_handler.cc",
     "policy/device_wifi_allowed_handler.h",
-    "policy/display_resolution_handler.cc",
-    "policy/display_resolution_handler.h",
-    "policy/display_rotation_default_handler.cc",
-    "policy/display_rotation_default_handler.h",
-    "policy/display_settings_handler.cc",
-    "policy/display_settings_handler.h",
+    "policy/display/display_resolution_handler.cc",
+    "policy/display/display_resolution_handler.h",
+    "policy/display/display_rotation_default_handler.cc",
+    "policy/display/display_rotation_default_handler.h",
+    "policy/display/display_settings_handler.cc",
+    "policy/display/display_settings_handler.h",
     "policy/dlp/clipboard_bubble.cc",
     "policy/dlp/clipboard_bubble.h",
     "policy/dlp/data_transfer_dlp_controller.cc",
@@ -2717,18 +2713,24 @@
     "policy/minimum_version_policy_handler.h",
     "policy/minimum_version_policy_handler_delegate_impl.cc",
     "policy/minimum_version_policy_handler_delegate_impl.h",
-    "policy/network_configuration_updater.cc",
-    "policy/network_configuration_updater.h",
+    "policy/networking/device_network_configuration_updater.cc",
+    "policy/networking/device_network_configuration_updater.h",
+    "policy/networking/network_configuration_updater.cc",
+    "policy/networking/network_configuration_updater.h",
+    "policy/networking/policy_cert_service.cc",
+    "policy/networking/policy_cert_service.h",
+    "policy/networking/policy_cert_service_factory.cc",
+    "policy/networking/policy_cert_service_factory.h",
+    "policy/networking/user_network_configuration_updater.cc",
+    "policy/networking/user_network_configuration_updater.h",
+    "policy/networking/user_network_configuration_updater_factory.cc",
+    "policy/networking/user_network_configuration_updater_factory.h",
     "policy/off_hours/device_off_hours_controller.cc",
     "policy/off_hours/device_off_hours_controller.h",
     "policy/off_hours/off_hours_policy_applier.cc",
     "policy/off_hours/off_hours_policy_applier.h",
     "policy/off_hours/off_hours_proto_parser.cc",
     "policy/off_hours/off_hours_proto_parser.h",
-    "policy/policy_cert_service.cc",
-    "policy/policy_cert_service.h",
-    "policy/policy_cert_service_factory.cc",
-    "policy/policy_cert_service_factory.h",
     "policy/policy_oauth2_token_fetcher.cc",
     "policy/policy_oauth2_token_fetcher.h",
     "policy/policy_pref_names.cc",
@@ -2820,10 +2822,12 @@
     "policy/scheduled_update_checker/task_executor_with_retries.h",
     "policy/secondary_google_account_signin_policy_handler.cc",
     "policy/secondary_google_account_signin_policy_handler.h",
-    "policy/server_backed_device_state.cc",
-    "policy/server_backed_device_state.h",
-    "policy/server_backed_state_keys_broker.cc",
-    "policy/server_backed_state_keys_broker.h",
+    "policy/server_backed_state/device_cloud_state_keys_uploader.cc",
+    "policy/server_backed_state/device_cloud_state_keys_uploader.h",
+    "policy/server_backed_state/server_backed_device_state.cc",
+    "policy/server_backed_state/server_backed_device_state.h",
+    "policy/server_backed_state/server_backed_state_keys_broker.cc",
+    "policy/server_backed_state/server_backed_state_keys_broker.h",
     "policy/status_collector/activity_storage.cc",
     "policy/status_collector/activity_storage.h",
     "policy/status_collector/affiliated_session_service.cc",
@@ -2866,10 +2870,6 @@
     "policy/user_cloud_policy_token_forwarder.h",
     "policy/user_cloud_policy_token_forwarder_factory.cc",
     "policy/user_cloud_policy_token_forwarder_factory.h",
-    "policy/user_network_configuration_updater.cc",
-    "policy/user_network_configuration_updater.h",
-    "policy/user_network_configuration_updater_factory.cc",
-    "policy/user_network_configuration_updater_factory.h",
     "policy/user_policy_manager_builder_chromeos.cc",
     "policy/user_policy_manager_builder_chromeos.h",
     "policy/value_validation/onc_device_policy_value_validator.cc",
@@ -4072,7 +4072,7 @@
     "policy/adb_sideloading_allowance_mode_policy_handler_unittest.cc",
     "policy/affiliated_cloud_policy_invalidator_unittest.cc",
     "policy/affiliated_invalidation_service_provider_impl_unittest.cc",
-    "policy/android_management_client_unittest.cc",
+    "policy/arc/android_management_client_unittest.cc",
     "policy/auto_enrollment_client_impl_unittest.cc",
     "policy/bluetooth_policy_handler_unittest.cc",
     "policy/cached_policy_key_loader_chromeos_unittest.cc",
@@ -4082,7 +4082,6 @@
     "policy/device_cloud_policy_initializer_unittest.cc",
     "policy/device_cloud_policy_manager_chromeos_unittest.cc",
     "policy/device_cloud_policy_store_chromeos_unittest.cc",
-    "policy/device_cloud_state_keys_uploader_unittest.cc",
     "policy/device_dock_mac_address_source_handler_unittest.cc",
     "policy/device_local_account_policy_service_unittest.cc",
     "policy/device_policy_decoder_chromeos_unittest.cc",
@@ -4114,7 +4113,7 @@
     "policy/hostname_handler_unittest.cc",
     "policy/lock_to_single_user_manager_unittest.cc",
     "policy/minimum_version_policy_handler_unittest.cc",
-    "policy/network_configuration_updater_unittest.cc",
+    "policy/networking/network_configuration_updater_unittest.cc",
     "policy/off_hours/device_off_hours_controller_unittest.cc",
     "policy/off_hours/off_hours_policy_applier_unittest.cc",
     "policy/off_hours/off_hours_proto_parser_unittest.cc",
@@ -4146,7 +4145,8 @@
     "policy/rsu/lookup_key_uploader_unittest.cc",
     "policy/scheduled_update_checker/device_scheduled_update_checker_unittest.cc",
     "policy/secondary_google_account_signin_policy_handler_unittest.cc",
-    "policy/server_backed_state_keys_broker_unittest.cc",
+    "policy/server_backed_state/device_cloud_state_keys_uploader_unittest.cc",
+    "policy/server_backed_state/server_backed_state_keys_broker_unittest.cc",
     "policy/status_collector/activity_storage_unittest.cc",
     "policy/status_collector/affiliated_session_service_unittest.cc",
     "policy/status_collector/app_info_generator_unittest.cc",
diff --git a/chrome/browser/chromeos/browser_context_keyed_service_factories.cc b/chrome/browser/chromeos/browser_context_keyed_service_factories.cc
index f4b0a00e..6621f0d7 100644
--- a/chrome/browser/chromeos/browser_context_keyed_service_factories.cc
+++ b/chrome/browser/chromeos/browser_context_keyed_service_factories.cc
@@ -34,9 +34,9 @@
 #include "chrome/browser/chromeos/platform_keys/key_permissions/key_permissions_service_factory.h"
 #include "chrome/browser/chromeos/platform_keys/key_permissions/user_private_token_kpm_service_factory.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_factory.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h"
 #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h"
 #include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h"
 #include "chrome/browser/chromeos/printing/history/print_job_history_service_factory.h"
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index f65afd4..6d44253c 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -9,31 +9,25 @@
 
 #include "base/macros.h"
 #include "base/task/cancelable_task_tracker.h"
-// TODO(https://crbug.com/1164001): forward declare when moved to
-// chrome/browser/ash/.
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
 #include "chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h"
-// TODO(https://crbug.com/1164001): forward declare when moved to
-// chrome/browser/ash/.
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
 #include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h"
-// TODO(https://crbug.com/1164001): move to forward declaration.
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
 #include "chrome/browser/ash/login/demo_mode/demo_mode_resources_remover.h"
-// TODO(https://crbug.com/1164001): forward declare when moved to
-// chrome/browser/ash/.
-#include "chrome/browser/ash/notifications/low_disk_notification.h"
-// TODO(https://crbug.com/1164001): forward declare when moved to
-// chrome/browser/ash/.
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
 #include "chrome/browser/ash/notifications/gnubby_notification.h"
-// TODO(https://crbug.com/1164001): forward declare when moved to
-// chrome/browser/ash/.
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
+#include "chrome/browser/ash/notifications/low_disk_notification.h"
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
+#include "chrome/browser/ash/power/auto_screen_brightness/controller.h"
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
 #include "chrome/browser/ash/settings/shutdown_policy_forwarder.h"
-// TODO(https://crbug.com/1164001): forward declare when moved to
-// chrome/browser/ash/.
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
 #include "chrome/browser/ash/system/breakpad_consent_watcher.h"
-// TODO(https://crbug.com/1164001): forward declare when moved to
-// chrome/browser/ash/.
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
 #include "chrome/browser/ash/usb/cros_usb_detector.h"
-// TODO(https://crbug.com/1164001): forward declare when moved to
-// chrome/browser/ash/.
+// TODO(https://crbug.com/1164001): remove and use forward declaration.
 #include "chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_manager.h"
 #include "chrome/browser/chrome_browser_main_linux.h"
 #include "chrome/browser/chromeos/external_metrics.h"
@@ -108,10 +102,6 @@
 namespace ml {
 class AdaptiveScreenBrightnessManager;
 }  // namespace ml
-
-namespace auto_screen_brightness {
-class Controller;
-}  // namespace auto_screen_brightness
 }  // namespace power
 
 namespace system {
diff --git a/chrome/browser/chromeos/phonehub/phone_hub_manager_factory.cc b/chrome/browser/chromeos/phonehub/phone_hub_manager_factory.cc
index 8f49d770..2f6c4b48 100644
--- a/chrome/browser/chromeos/phonehub/phone_hub_manager_factory.cc
+++ b/chrome/browser/chromeos/phonehub/phone_hub_manager_factory.cc
@@ -124,7 +124,7 @@
 bool PhoneHubManagerFactory::ServiceIsCreatedWithBrowserContext() const {
   // We do want the service to be created with the BrowserContext, but returning
   // true here causes issues when opting into Chrome Sync in OOBE because it
-  // causes ProfileSyncService to be created before SyncConsentScreen. Instead,
+  // causes SyncService to be created before SyncConsentScreen. Instead,
   // we return false here and initialize PhoneHubManager within
   // UserSessionInitializer.
   return false;
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys.cc b/chrome/browser/chromeos/platform_keys/platform_keys.cc
index 962ced6..f92bbb7 100644
--- a/chrome/browser/chromeos/platform_keys/platform_keys.cc
+++ b/chrome/browser/chromeos/platform_keys/platform_keys.cc
@@ -250,15 +250,16 @@
   key_info.public_key_spki_der =
       chromeos::platform_keys::GetSubjectPublicKeyInfo(cert_x509);
   if (!chromeos::platform_keys::GetPublicKey(cert_x509, &key_info.key_type,
-                                             &key_info.key_size_bits) ||
-      (key_info.key_type != net::X509Certificate::kPublicKeyTypeRSA &&
-       key_info.key_type != net::X509Certificate::kPublicKeyTypeECDSA)) {
+                                             &key_info.key_size_bits)) {
     output.status = Status::kErrorAlgorithmNotSupported;
     return output;
   }
 
-  if (GetKeyTypeForAlgorithm(algorithm_name) != key_info.key_type) {
-    output.status = Status::kErrorAlgorithmNotPermittedByCertificate;
+  chromeos::platform_keys::Status check_result =
+      chromeos::platform_keys::CheckKeyTypeAndAlgorithm(key_info.key_type,
+                                                        algorithm_name);
+  if (check_result != chromeos::platform_keys::Status::kSuccess) {
+    output.status = check_result;
     return output;
   }
 
diff --git a/chrome/browser/chromeos/policy/arc/README.md b/chrome/browser/chromeos/policy/arc/README.md
new file mode 100644
index 0000000..e75cf0b
--- /dev/null
+++ b/chrome/browser/chromeos/policy/arc/README.md
@@ -0,0 +1,5 @@
+chrome/browser/chromeos/policy/arc
+==================================
+
+This directory should contain policy code related to ARC++, the Android Runtime
+for Chrome OS.
diff --git a/chrome/browser/chromeos/policy/android_management_client.cc b/chrome/browser/chromeos/policy/arc/android_management_client.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/android_management_client.cc
rename to chrome/browser/chromeos/policy/arc/android_management_client.cc
index 844cdf8..02c8e2e1 100644
--- a/chrome/browser/chromeos/policy/android_management_client.cc
+++ b/chrome/browser/chromeos/policy/arc/android_management_client.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/android_management_client.h"
+#include "chrome/browser/chromeos/policy/arc/android_management_client.h"
 
 #include <utility>
 
diff --git a/chrome/browser/chromeos/policy/android_management_client.h b/chrome/browser/chromeos/policy/arc/android_management_client.h
similarity index 93%
rename from chrome/browser/chromeos/policy/android_management_client.h
rename to chrome/browser/chromeos/policy/arc/android_management_client.h
index 54f3e0b..a74be24 100644
--- a/chrome/browser/chromeos/policy/android_management_client.h
+++ b/chrome/browser/chromeos/policy/arc/android_management_client.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_ANDROID_MANAGEMENT_CLIENT_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_ANDROID_MANAGEMENT_CLIENT_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_ARC_ANDROID_MANAGEMENT_CLIENT_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_ARC_ANDROID_MANAGEMENT_CLIENT_H_
 
 #include <memory>
 #include <ostream>
@@ -107,4 +107,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_ANDROID_MANAGEMENT_CLIENT_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_ARC_ANDROID_MANAGEMENT_CLIENT_H_
diff --git a/chrome/browser/chromeos/policy/android_management_client_unittest.cc b/chrome/browser/chromeos/policy/arc/android_management_client_unittest.cc
similarity index 97%
rename from chrome/browser/chromeos/policy/android_management_client_unittest.cc
rename to chrome/browser/chromeos/policy/arc/android_management_client_unittest.cc
index f6bc319..564e966 100644
--- a/chrome/browser/chromeos/policy/android_management_client_unittest.cc
+++ b/chrome/browser/chromeos/policy/arc/android_management_client_unittest.cc
@@ -13,7 +13,7 @@
 #include "base/test/mock_callback.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
-#include "chrome/browser/chromeos/policy/android_management_client.h"
+#include "chrome/browser/chromeos/policy/arc/android_management_client.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/policy/core/common/cloud/mock_device_management_service.h"
 #include "components/policy/proto/device_management_backend.pb.h"
diff --git a/chrome/browser/chromeos/policy/unaffiliated_arc_allowed_browsertest.cc b/chrome/browser/chromeos/policy/arc/unaffiliated_arc_allowed_browsertest.cc
similarity index 100%
rename from chrome/browser/chromeos/policy/unaffiliated_arc_allowed_browsertest.cc
rename to chrome/browser/chromeos/policy/arc/unaffiliated_arc_allowed_browsertest.cc
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
index e1edc3d..bf163193 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
@@ -16,7 +16,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/ash/login/enrollment/auto_enrollment_controller.h"
-#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h"
 #include "chrome/common/chrome_content_client.h"
 #include "chrome/common/pref_names.h"
 #include "components/policy/core/common/cloud/device_management_service.h"
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client_impl_unittest.cc b/chrome/browser/chromeos/policy/auto_enrollment_client_impl_unittest.cc
index 8fe2f2d..8e5b30e 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client_impl_unittest.cc
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client_impl_unittest.cc
@@ -25,7 +25,7 @@
 #include "base/values.h"
 #include "chrome/browser/ash/login/enrollment/auto_enrollment_controller.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.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/browser_policy_connector_chromeos.cc b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
index 7a1c24d0..02d404cd 100644
--- a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
+++ b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
@@ -37,11 +37,9 @@
 #include "chrome/browser/chromeos/policy/bluetooth_policy_handler.h"
 #include "chrome/browser/chromeos/policy/device_cloud_policy_initializer.h"
 #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
-#include "chrome/browser/chromeos/policy/device_cloud_state_keys_uploader.h"
 #include "chrome/browser/chromeos/policy/device_dock_mac_address_source_handler.h"
 #include "chrome/browser/chromeos/policy/device_local_account.h"
 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
-#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
 #include "chrome/browser/chromeos/policy/device_wifi_allowed_handler.h"
 #include "chrome/browser/chromeos/policy/dm_token_storage.h"
 #include "chrome/browser/chromeos/policy/enrollment_config.h"
@@ -54,9 +52,11 @@
 #include "chrome/browser/chromeos/policy/hostname_handler.h"
 #include "chrome/browser/chromeos/policy/minimum_version_policy_handler.h"
 #include "chrome/browser/chromeos/policy/minimum_version_policy_handler_delegate_impl.h"
+#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h"
 #include "chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h"
 #include "chrome/browser/chromeos/policy/scheduled_update_checker/device_scheduled_update_checker.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chrome/browser/chromeos/policy/system_proxy_handler.h"
 #include "chrome/browser/chromeos/policy/tpm_auto_update_mode_policy_handler.h"
 #include "chrome/browser/chromeos/printing/bulk_printers_calculator_factory.h"
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_initializer.cc b/chrome/browser/chromeos/policy/device_cloud_policy_initializer.cc
index 42d070a..6a30ccbf 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_initializer.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_initializer.cc
@@ -23,7 +23,7 @@
 #include "chrome/browser/chromeos/policy/enrollment_config.h"
 #include "chrome/browser/chromeos/policy/enrollment_handler_chromeos.h"
 #include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h"
-#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h"
 #include "chrome/browser/chromeos/policy/status_collector/device_status_collector.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/policy/enrollment_status.h"
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_initializer.h b/chrome/browser/chromeos/policy/device_cloud_policy_initializer.h
index cf78f3b..2fb1182c 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_initializer.h
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_initializer.h
@@ -14,7 +14,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chromeos/dbus/attestation/interface.pb.h"
 #include "components/policy/core/common/cloud/cloud_policy_client.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_initializer_unittest.cc b/chrome/browser/chromeos/policy/device_cloud_policy_initializer_unittest.cc
index 5ed70ab..bd1499e 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_initializer_unittest.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_initializer_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/values.h"
 #include "chrome/browser/ash/login/login_pref_names.h"
 #include "chrome/browser/chromeos/policy/enrollment_config.h"
-#include "chrome/browser/chromeos/policy/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h"
 #include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/attestation/attestation_flow_utils.h"
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
index 26350d0..5a79d43 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
@@ -32,7 +32,7 @@
 #include "chrome/browser/chromeos/policy/policy_pref_names.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_keys_broker.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"
 #include "chrome/browser/chromeos/policy/status_uploader.h"
 #include "chrome/browser/chromeos/policy/system_log_uploader.h"
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h
index 899a11cd..eff3f5b4 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h
@@ -15,7 +15,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/observer_list.h"
 #include "chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "components/policy/core/common/cloud/cloud_policy_client.h"
 #include "components/policy/core/common/cloud/cloud_policy_manager.h"
 
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
index 3051b55..5463958c 100644
--- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -76,9 +76,9 @@
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/device_local_account.h"
 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
-#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
 #include "chrome/browser/chromeos/policy/external_data/cloud_external_data_manager_base_test_util.h"
+#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h"
 #include "chrome/browser/extensions/crx_installer.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h"
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index d9d5585..92519699 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -1951,6 +1951,16 @@
                   POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
                   std::move(allowlist), nullptr);
   }
+
+  if (policy.has_device_scheduled_reboot()) {
+    const em::DeviceScheduledRebootProto& container(
+        policy.device_scheduled_reboot());
+    if (container.has_device_scheduled_reboot_settings()) {
+      SetJsonDevicePolicy(key::kDeviceScheduledReboot,
+                          container.device_scheduled_reboot_settings(),
+                          policies);
+    }
+  }
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/policy/display/README.md b/chrome/browser/chromeos/policy/display/README.md
new file mode 100644
index 0000000..30e8d42
--- /dev/null
+++ b/chrome/browser/chromeos/policy/display/README.md
@@ -0,0 +1,5 @@
+chrome/browser/chromeos/policy/display
+======================================
+
+This directory should contain code that handles display-related policies on
+Chrome OS.
diff --git a/chrome/browser/chromeos/policy/device_display_cros_browser_test.cc b/chrome/browser/chromeos/policy/display/device_display_cros_browser_test.cc
similarity index 97%
rename from chrome/browser/chromeos/policy/device_display_cros_browser_test.cc
rename to chrome/browser/chromeos/policy/display/device_display_cros_browser_test.cc
index f0a6b243..979a1d53 100644
--- a/chrome/browser/chromeos/policy/device_display_cros_browser_test.cc
+++ b/chrome/browser/chromeos/policy/display/device_display_cros_browser_test.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/device_display_cros_browser_test.h"
+#include "chrome/browser/chromeos/policy/display/device_display_cros_browser_test.h"
 
 #include "ash/display/display_configuration_controller.h"
 #include "ash/shell.h"
diff --git a/chrome/browser/chromeos/policy/device_display_cros_browser_test.h b/chrome/browser/chromeos/policy/display/device_display_cros_browser_test.h
similarity index 89%
rename from chrome/browser/chromeos/policy/device_display_cros_browser_test.h
rename to chrome/browser/chromeos/policy/display/device_display_cros_browser_test.h
index caa7bca..759426e 100644
--- a/chrome/browser/chromeos/policy/device_display_cros_browser_test.h
+++ b/chrome/browser/chromeos/policy/display/device_display_cros_browser_test.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_DEVICE_DISPLAY_CROS_BROWSER_TEST_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_DISPLAY_CROS_BROWSER_TEST_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DEVICE_DISPLAY_CROS_BROWSER_TEST_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DEVICE_DISPLAY_CROS_BROWSER_TEST_H_
 
 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
 #include "ui/display/display.h"
@@ -63,4 +63,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_DISPLAY_CROS_BROWSER_TEST_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DEVICE_DISPLAY_CROS_BROWSER_TEST_H_
diff --git a/chrome/browser/chromeos/policy/display_resolution_handler.cc b/chrome/browser/chromeos/policy/display/display_resolution_handler.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/display_resolution_handler.cc
rename to chrome/browser/chromeos/policy/display/display_resolution_handler.cc
index b23f3223..3565f4b1 100644
--- a/chrome/browser/chromeos/policy/display_resolution_handler.cc
+++ b/chrome/browser/chromeos/policy/display/display_resolution_handler.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/display_resolution_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_resolution_handler.h"
 
 #include <utility>
 #include <vector>
diff --git a/chrome/browser/chromeos/policy/display_resolution_handler.h b/chrome/browser/chromeos/policy/display/display_resolution_handler.h
similarity index 85%
rename from chrome/browser/chromeos/policy/display_resolution_handler.h
rename to chrome/browser/chromeos/policy/display/display_resolution_handler.h
index c68a950..83e9ac7 100644
--- a/chrome/browser/chromeos/policy/display_resolution_handler.h
+++ b/chrome/browser/chromeos/policy/display/display_resolution_handler.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_RESOLUTION_HANDLER_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_RESOLUTION_HANDLER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_RESOLUTION_HANDLER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_RESOLUTION_HANDLER_H_
 
 #include <memory>
 #include <set>
@@ -11,7 +11,7 @@
 #include <vector>
 
 #include "ash/public/mojom/cros_display_config.mojom-forward.h"
-#include "chrome/browser/chromeos/policy/display_settings_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_settings_handler.h"
 
 namespace policy {
 
@@ -58,4 +58,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_RESOLUTION_HANDLER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_RESOLUTION_HANDLER_H_
diff --git a/chrome/browser/chromeos/policy/display_resolution_handler_browsertest.cc b/chrome/browser/chromeos/policy/display/display_resolution_handler_browsertest.cc
similarity index 99%
rename from chrome/browser/chromeos/policy/display_resolution_handler_browsertest.cc
rename to chrome/browser/chromeos/policy/display/display_resolution_handler_browsertest.cc
index e8210699..5c081aa 100644
--- a/chrome/browser/chromeos/policy/display_resolution_handler_browsertest.cc
+++ b/chrome/browser/chromeos/policy/display/display_resolution_handler_browsertest.cc
@@ -17,8 +17,8 @@
 #include "chrome/browser/ash/login/test/device_state_mixin.h"
 #include "chrome/browser/ash/login/ui/login_display_host.h"
 #include "chrome/browser/ash/settings/cros_settings.h"
-#include "chrome/browser/chromeos/policy/device_display_cros_browser_test.h"
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
+#include "chrome/browser/chromeos/policy/display/device_display_cros_browser_test.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/test/base/mixin_based_in_process_browser_test.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
diff --git a/chrome/browser/chromeos/policy/display_rotation_default_handler.cc b/chrome/browser/chromeos/policy/display/display_rotation_default_handler.cc
similarity index 97%
rename from chrome/browser/chromeos/policy/display_rotation_default_handler.cc
rename to chrome/browser/chromeos/policy/display/display_rotation_default_handler.cc
index 187f7de..3e93abc4 100644
--- a/chrome/browser/chromeos/policy/display_rotation_default_handler.cc
+++ b/chrome/browser/chromeos/policy/display/display_rotation_default_handler.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/display_rotation_default_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_rotation_default_handler.h"
 #include "base/callback_helpers.h"
 
 #include <utility>
diff --git a/chrome/browser/chromeos/policy/display_rotation_default_handler.h b/chrome/browser/chromeos/policy/display/display_rotation_default_handler.h
similarity index 82%
rename from chrome/browser/chromeos/policy/display_rotation_default_handler.h
rename to chrome/browser/chromeos/policy/display/display_rotation_default_handler.h
index 3fa7b19b..01bac81 100644
--- a/chrome/browser/chromeos/policy/display_rotation_default_handler.h
+++ b/chrome/browser/chromeos/policy/display/display_rotation_default_handler.h
@@ -2,16 +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_DISPLAY_ROTATION_DEFAULT_HANDLER_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_ROTATION_DEFAULT_HANDLER_H_
-
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_ROTATION_DEFAULT_HANDLER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_ROTATION_DEFAULT_HANDLER_H_
 
 #include <set>
 #include <string>
 #include <vector>
 
 #include "ash/public/mojom/cros_display_config.mojom-forward.h"
-#include "chrome/browser/chromeos/policy/display_settings_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_settings_handler.h"
 #include "ui/display/display.h"
 
 namespace policy {
@@ -51,4 +50,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_ROTATION_DEFAULT_HANDLER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_ROTATION_DEFAULT_HANDLER_H_
diff --git a/chrome/browser/chromeos/policy/display_rotation_default_handler_browsertest.cc b/chrome/browser/chromeos/policy/display/display_rotation_default_handler_browsertest.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/display_rotation_default_handler_browsertest.cc
rename to chrome/browser/chromeos/policy/display/display_rotation_default_handler_browsertest.cc
index f0088cd..a92cc30 100644
--- a/chrome/browser/chromeos/policy/display_rotation_default_handler_browsertest.cc
+++ b/chrome/browser/chromeos/policy/display/display_rotation_default_handler_browsertest.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/display_rotation_default_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_rotation_default_handler.h"
 
 #include <memory>
 
@@ -17,8 +17,8 @@
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/ash/login/test/device_state_mixin.h"
-#include "chrome/browser/chromeos/policy/device_display_cros_browser_test.h"
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
+#include "chrome/browser/chromeos/policy/display/device_display_cros_browser_test.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/chromeos/policy/display_settings_handler.cc b/chrome/browser/chromeos/policy/display/display_settings_handler.cc
similarity index 97%
rename from chrome/browser/chromeos/policy/display_settings_handler.cc
rename to chrome/browser/chromeos/policy/display/display_settings_handler.cc
index 5c0ced3b..29c1cf1 100644
--- a/chrome/browser/chromeos/policy/display_settings_handler.cc
+++ b/chrome/browser/chromeos/policy/display/display_settings_handler.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/display_settings_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_settings_handler.h"
 
 #include <utility>
 
diff --git a/chrome/browser/chromeos/policy/display_settings_handler.h b/chrome/browser/chromeos/policy/display/display_settings_handler.h
similarity index 94%
rename from chrome/browser/chromeos/policy/display_settings_handler.h
rename to chrome/browser/chromeos/policy/display/display_settings_handler.h
index f8081ef..fb7f626 100644
--- a/chrome/browser/chromeos/policy/display_settings_handler.h
+++ b/chrome/browser/chromeos/policy/display/display_settings_handler.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_SETTINGS_HANDLER_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_SETTINGS_HANDLER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_SETTINGS_HANDLER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_SETTINGS_HANDLER_H_
 
 #include <memory>
 #include <vector>
@@ -110,4 +110,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_SETTINGS_HANDLER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DISPLAY_DISPLAY_SETTINGS_HANDLER_H_
diff --git a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
index 4a04b1a2..dca6777 100644
--- a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
+++ b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
@@ -24,7 +24,7 @@
 #include "chrome/browser/chromeos/policy/active_directory_join_delegate.h"
 #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
 #include "chrome/browser/chromeos/policy/dm_token_storage.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chrome/browser/policy/enrollment_status.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chromeos/attestation/attestation_flow.h"
diff --git a/chrome/browser/chromeos/policy/fuzzer/policy_fuzzer.cc b/chrome/browser/chromeos/policy/fuzzer/policy_fuzzer.cc
index 28a04ebf..a08d799 100644
--- a/chrome/browser/chromeos/policy/fuzzer/policy_fuzzer.cc
+++ b/chrome/browser/chromeos/policy/fuzzer/policy_fuzzer.cc
@@ -140,7 +140,8 @@
     PolicyMap policy_map;
     DecodeProtoFields(cloud_policy_settings, cloud_data_manager,
                       PolicySource::POLICY_SOURCE_CLOUD,
-                      PolicyScope::POLICY_SCOPE_USER, &policy_map);
+                      PolicyScope::POLICY_SCOPE_USER, &policy_map,
+                      PolicyPerProfileFilter::kAny);
 
     for (const auto& it : policy_map) {
       const std::string& policy_name = it.first;
diff --git a/chrome/browser/chromeos/policy/device_network_configuration_updater.cc b/chrome/browser/chromeos/policy/networking/device_network_configuration_updater.cc
similarity index 94%
rename from chrome/browser/chromeos/policy/device_network_configuration_updater.cc
rename to chrome/browser/chromeos/policy/networking/device_network_configuration_updater.cc
index 9afacba..fc5241a 100644
--- a/chrome/browser/chromeos/policy/device_network_configuration_updater.cc
+++ b/chrome/browser/chromeos/policy/networking/device_network_configuration_updater.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/device_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h"
 
 #include <map>
 
@@ -130,10 +130,9 @@
   chromeos::onc::ExpandStringsInNetworks(variable_expander,
                                          network_configs_onc);
 
-  network_config_handler_->SetPolicy(onc_source_,
-                                     std::string() /* no username hash */,
-                                     *network_configs_onc,
-                                     *global_network_config);
+  network_config_handler_->SetPolicy(
+      onc_source_, std::string() /* no username hash */, *network_configs_onc,
+      *global_network_config);
 }
 
 void DeviceNetworkConfigurationUpdater::OnDataRoamingSettingChanged() {
diff --git a/chrome/browser/chromeos/policy/device_network_configuration_updater.h b/chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h
similarity index 87%
rename from chrome/browser/chromeos/policy/device_network_configuration_updater.h
rename to chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h
index 71b71974..6bcf97d 100644
--- a/chrome/browser/chromeos/policy/device_network_configuration_updater.h
+++ b/chrome/browser/chromeos/policy/networking/device_network_configuration_updater.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_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_
 
 #include <memory>
 #include <string>
@@ -12,7 +12,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/chromeos/policy/network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/network_configuration_updater.h"
 #include "components/onc/onc_constants.h"
 #include "net/cert/x509_certificate.h"
 
@@ -23,12 +23,12 @@
 namespace base {
 class DictionaryValue;
 class ListValue;
-}
+}  // namespace base
 
 namespace chromeos {
 class ManagedNetworkConfigurationHandler;
 class NetworkDeviceHandler;
-}
+}  // namespace chromeos
 
 namespace policy {
 
@@ -88,5 +88,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_
-
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_DEVICE_NETWORK_CONFIGURATION_UPDATER_H_
diff --git a/chrome/browser/chromeos/policy/network_configuration_updater.cc b/chrome/browser/chromeos/policy/networking/network_configuration_updater.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/network_configuration_updater.cc
rename to chrome/browser/chromeos/policy/networking/network_configuration_updater.cc
index f8860d1b78..4bb0ef72 100644
--- a/chrome/browser/chromeos/policy/network_configuration_updater.cc
+++ b/chrome/browser/chromeos/policy/networking/network_configuration_updater.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/network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/network_configuration_updater.h"
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
diff --git a/chrome/browser/chromeos/policy/network_configuration_updater.h b/chrome/browser/chromeos/policy/networking/network_configuration_updater.h
similarity index 96%
rename from chrome/browser/chromeos/policy/network_configuration_updater.h
rename to chrome/browser/chromeos/policy/networking/network_configuration_updater.h
index 27b25ac..507d440 100644
--- a/chrome/browser/chromeos/policy/network_configuration_updater.h
+++ b/chrome/browser/chromeos/policy/networking/network_configuration_updater.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_NETWORK_CONFIGURATION_UPDATER_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORK_CONFIGURATION_UPDATER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_
 
 #include <memory>
 #include <set>
@@ -170,4 +170,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_NETWORK_CONFIGURATION_UPDATER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_
diff --git a/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc b/chrome/browser/chromeos/policy/networking/network_configuration_updater_unittest.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
rename to chrome/browser/chromeos/policy/networking/network_configuration_updater_unittest.cc
index e7830752..685978d6 100644
--- a/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
+++ b/chrome/browser/chromeos/policy/networking/network_configuration_updater_unittest.cc
@@ -18,8 +18,8 @@
 #include "chrome/browser/ash/settings/cros_settings.h"
 #include "chrome/browser/ash/settings/device_settings_service.h"
 #include "chrome/browser/ash/settings/scoped_testing_cros_settings.h"
-#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "chromeos/network/fake_network_device_handler.h"
@@ -51,13 +51,13 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using testing::_;
 using testing::AnyNumber;
 using testing::AtLeast;
 using testing::Mock;
 using testing::Ne;
 using testing::Return;
 using testing::StrictMock;
-using testing::_;
 
 namespace policy {
 
@@ -427,10 +427,9 @@
       bool set_client_cert_importer) {
     UserNetworkConfigurationUpdater* updater =
         UserNetworkConfigurationUpdater::CreateForUserPolicy(
-            &profile_,
-            fake_user_,
-            policy_service_.get(),
-            &network_config_handler_).release();
+            &profile_, fake_user_, policy_service_.get(),
+            &network_config_handler_)
+            .release();
     if (set_client_cert_importer) {
       EXPECT_TRUE(client_certificate_importer_owned_);
       updater->SetClientCertificateImporterForTest(
@@ -544,8 +543,7 @@
   UpdateProviderPolicy(policy);
 
   EXPECT_CALL(network_config_handler_,
-              SetPolicy(onc::ONC_SOURCE_USER_POLICY,
-                        _,
+              SetPolicy(onc::ONC_SOURCE_USER_POLICY, _,
                         IsEqualTo(network_configs_repaired),
                         IsEqualTo(global_config_repaired)));
 
diff --git a/chrome/browser/chromeos/policy/network_policy_application_browsertest.cc b/chrome/browser/chromeos/policy/networking/network_policy_application_browsertest.cc
similarity index 100%
rename from chrome/browser/chromeos/policy/network_policy_application_browsertest.cc
rename to chrome/browser/chromeos/policy/networking/network_policy_application_browsertest.cc
diff --git a/chrome/browser/chromeos/policy/policy_cert_service.cc b/chrome/browser/chromeos/policy/networking/policy_cert_service.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/policy_cert_service.cc
rename to chrome/browser/chromeos/policy/networking/policy_cert_service.cc
index 70f38c8..78175ee 100644
--- a/chrome/browser/chromeos/policy/policy_cert_service.cc
+++ b/chrome/browser/chromeos/policy/networking/policy_cert_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 "chrome/browser/chromeos/policy/policy_cert_service.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h"
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
@@ -10,9 +10,9 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/task/post_task.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h"
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/net/profile_network_context_service.h"
 #include "chrome/browser/net/profile_network_context_service_factory.h"
diff --git a/chrome/browser/chromeos/policy/policy_cert_service.h b/chrome/browser/chromeos/policy/networking/policy_cert_service.h
similarity index 94%
rename from chrome/browser/chromeos/policy/policy_cert_service.h
rename to chrome/browser/chromeos/policy/networking/policy_cert_service.h
index 5deaf5ec..f2d5d5a2 100644
--- a/chrome/browser/chromeos/policy/policy_cert_service.h
+++ b/chrome/browser/chromeos/policy/networking/policy_cert_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 CHROME_BROWSER_CHROMEOS_POLICY_POLICY_CERT_SERVICE_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_POLICY_CERT_SERVICE_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_
 
 #include <memory>
 #include <string>
@@ -28,8 +28,8 @@
 
 namespace net {
 class X509Certificate;
-typedef std::vector<scoped_refptr<X509Certificate> > CertificateList;
-}
+typedef std::vector<scoped_refptr<X509Certificate>> CertificateList;
+}  // namespace net
 
 namespace network {
 class NSSTempCertsCacheChromeOS;
@@ -136,4 +136,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_POLICY_CERT_SERVICE_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_H_
diff --git a/chrome/browser/chromeos/policy/policy_cert_service_factory.cc b/chrome/browser/chromeos/policy/networking/policy_cert_service_factory.cc
similarity index 91%
rename from chrome/browser/chromeos/policy/policy_cert_service_factory.cc
rename to chrome/browser/chromeos/policy/networking/policy_cert_service_factory.cc
index 2d9237b..3698ad1 100644
--- a/chrome/browser/chromeos/policy/policy_cert_service_factory.cc
+++ b/chrome/browser/chromeos/policy/networking/policy_cert_service_factory.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/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 
 #include "base/containers/contains.h"
 #include "base/memory/singleton.h"
@@ -10,10 +10,10 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
-#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h"
+#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/policy/policy_cert_service_factory.h b/chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h
similarity index 90%
rename from chrome/browser/chromeos/policy/policy_cert_service_factory.h
rename to chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h
index d69a434..9ff64dc 100644
--- a/chrome/browser/chromeos/policy/policy_cert_service_factory.h
+++ b/chrome/browser/chromeos/policy/networking/policy_cert_service_factory.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_POLICY_CERT_SERVICE_FACTORY_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_POLICY_CERT_SERVICE_FACTORY_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_
 
 #include <memory>
 #include <string>
@@ -69,4 +69,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_POLICY_CERT_SERVICE_FACTORY_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_POLICY_CERT_SERVICE_FACTORY_H_
diff --git a/chrome/browser/chromeos/policy/policy_certs_browsertest.cc b/chrome/browser/chromeos/policy/networking/policy_certs_browsertest.cc
similarity index 99%
rename from chrome/browser/chromeos/policy/policy_certs_browsertest.cc
rename to chrome/browser/chromeos/policy/networking/policy_certs_browsertest.cc
index 9ca3dd4..9a0018a5 100644
--- a/chrome/browser/chromeos/policy/policy_certs_browsertest.cc
+++ b/chrome/browser/chromeos/policy/networking/policy_certs_browsertest.cc
@@ -32,9 +32,9 @@
 #include "chrome/browser/chromeos/policy/device_local_account.h"
 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
 #include "chrome/browser/chromeos/policy/login_policy_test_base.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h"
 #include "chrome/browser/chromeos/policy/signin_profile_extensions_policy_test_base.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h"
 #include "chrome/browser/net/nss_context.h"
 #include "chrome/browser/policy/profile_policy_connector_builder.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater.cc b/chrome/browser/chromeos/policy/networking/user_network_configuration_updater.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/user_network_configuration_updater.cc
rename to chrome/browser/chromeos/policy/networking/user_network_configuration_updater.cc
index 5f2997f4a..5eaea1dc 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater.cc
+++ b/chrome/browser/chromeos/policy/networking/user_network_configuration_updater.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/user_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h"
 
 #include <utility>
 
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater.h b/chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h
similarity index 91%
rename from chrome/browser/chromeos/policy/user_network_configuration_updater.h
rename to chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h
index 2ab80890..176e422 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater.h
+++ b/chrome/browser/chromeos/policy/networking/user_network_configuration_updater.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_USER_NETWORK_CONFIGURATION_UPDATER_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_USER_NETWORK_CONFIGURATION_UPDATER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_
 
 #include <memory>
 #include <vector>
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/chromeos/policy/network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/network_configuration_updater.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
@@ -39,7 +39,7 @@
 namespace onc {
 class CertificateImporter;
 }
-}
+}  // namespace chromeos
 
 namespace policy {
 
@@ -125,4 +125,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_USER_NETWORK_CONFIGURATION_UPDATER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_H_
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.cc b/chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.cc
similarity index 91%
rename from chrome/browser/chromeos/policy/user_network_configuration_updater_factory.cc
rename to chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.cc
index f18ddc19..4e8ecb7 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.cc
+++ b/chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.cc
@@ -2,11 +2,11 @@
 // 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/user_network_configuration_updater_factory.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h"
 
 #include "base/memory/singleton.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/policy/user_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/user_network_configuration_updater.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
@@ -46,9 +46,8 @@
   return chrome::GetBrowserContextRedirectedInIncognito(context);
 }
 
-bool
-UserNetworkConfigurationUpdaterFactory::ServiceIsCreatedWithBrowserContext()
-    const {
+bool UserNetworkConfigurationUpdaterFactory::
+    ServiceIsCreatedWithBrowserContext() const {
   return true;
 }
 
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h b/chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h
similarity index 85%
rename from chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h
rename to chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.h
index e250989..a4802fe 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h
+++ b/chrome/browser/chromeos/policy/networking/user_network_configuration_updater_factory.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_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
@@ -55,4 +55,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_NETWORKING_USER_NETWORK_CONFIGURATION_UPDATER_FACTORY_H_
diff --git a/chrome/browser/chromeos/policy/device_cloud_state_keys_uploader.cc b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/device_cloud_state_keys_uploader.cc
rename to chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.cc
index eccdafca..132517c 100644
--- a/chrome/browser/chromeos/policy/device_cloud_state_keys_uploader.cc
+++ b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.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/device_cloud_state_keys_uploader.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h"
 
 #include <string>
 #include <utility>
 
 #include "base/logging.h"
 #include "chrome/browser/chromeos/policy/dm_token_storage.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chromeos/dbus/login_manager/policy_descriptor.pb.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
diff --git a/chrome/browser/chromeos/policy/device_cloud_state_keys_uploader.h b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h
similarity index 92%
rename from chrome/browser/chromeos/policy/device_cloud_state_keys_uploader.h
rename to chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h
index 76efc79..7d08613d 100644
--- a/chrome/browser/chromeos/policy/device_cloud_state_keys_uploader.h
+++ b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.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_DEVICE_CLOUD_STATE_KEYS_UPLOADER_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_CLOUD_STATE_KEYS_UPLOADER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_DEVICE_CLOUD_STATE_KEYS_UPLOADER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_DEVICE_CLOUD_STATE_KEYS_UPLOADER_H_
 
 #include <memory>
 #include <string>
@@ -120,4 +120,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_CLOUD_STATE_KEYS_UPLOADER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_DEVICE_CLOUD_STATE_KEYS_UPLOADER_H_
diff --git a/chrome/browser/chromeos/policy/device_cloud_state_keys_uploader_unittest.cc b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader_unittest.cc
similarity index 97%
rename from chrome/browser/chromeos/policy/device_cloud_state_keys_uploader_unittest.cc
rename to chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader_unittest.cc
index a5a31ccbe..820fcbb3 100644
--- a/chrome/browser/chromeos/policy/device_cloud_state_keys_uploader_unittest.cc
+++ b/chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader_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/device_cloud_state_keys_uploader.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/device_cloud_state_keys_uploader.h"
 
 #include <string>
 #include <utility>
@@ -13,7 +13,7 @@
 #include "base/test/task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/policy/dm_token_storage.h"
-#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
 #include "components/policy/core/common/cloud/mock_device_management_service.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
diff --git a/chrome/browser/chromeos/policy/server_backed_device_state.cc b/chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/server_backed_device_state.cc
rename to chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.cc
index 94a96d1..a99393b 100644
--- a/chrome/browser/chromeos/policy/server_backed_device_state.cc
+++ b/chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.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/server_backed_device_state.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h"
 
 #include <string>
 
diff --git a/chrome/browser/chromeos/policy/server_backed_device_state.h b/chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h
similarity index 88%
rename from chrome/browser/chromeos/policy/server_backed_device_state.h
rename to chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.h
index 2da2485f..73561675 100644
--- a/chrome/browser/chromeos/policy/server_backed_device_state.h
+++ b/chrome/browser/chromeos/policy/server_backed_state/server_backed_device_state.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_SERVER_BACKED_DEVICE_STATE_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_DEVICE_STATE_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_SERVER_BACKED_DEVICE_STATE_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_SERVER_BACKED_DEVICE_STATE_H_
 
 namespace policy {
 
@@ -52,4 +52,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_DEVICE_STATE_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_SERVER_BACKED_DEVICE_STATE_H_
diff --git a/chrome/browser/chromeos/policy/server_backed_state_keys_broker.cc b/chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.cc
similarity index 94%
rename from chrome/browser/chromeos/policy/server_backed_state_keys_broker.cc
rename to chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.cc
index fb85309..fb634aa 100644
--- a/chrome/browser/chromeos/policy/server_backed_state_keys_broker.cc
+++ b/chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.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/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 
 #include "base/bind.h"
 #include "base/containers/contains.h"
@@ -27,8 +27,7 @@
     chromeos::SessionManagerClient* session_manager_client)
     : session_manager_client_(session_manager_client), requested_(false) {}
 
-ServerBackedStateKeysBroker::~ServerBackedStateKeysBroker() {
-}
+ServerBackedStateKeysBroker::~ServerBackedStateKeysBroker() {}
 
 base::CallbackListSubscription
 ServerBackedStateKeysBroker::RegisterUpdateCallback(
diff --git a/chrome/browser/chromeos/policy/server_backed_state_keys_broker.h b/chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h
similarity index 92%
rename from chrome/browser/chromeos/policy/server_backed_state_keys_broker.h
rename to chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h
index d7d4d76..c0e5776 100644
--- a/chrome/browser/chromeos/policy/server_backed_state_keys_broker.h
+++ b/chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.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_SERVER_BACKED_STATE_KEYS_BROKER_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_KEYS_BROKER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_SERVER_BACKED_STATE_KEYS_BROKER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_SERVER_BACKED_STATE_KEYS_BROKER_H_
 
 #include <memory>
 #include <string>
@@ -94,4 +94,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_KEYS_BROKER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_SERVER_BACKED_STATE_SERVER_BACKED_STATE_KEYS_BROKER_H_
diff --git a/chrome/browser/chromeos/policy/server_backed_state_keys_broker_unittest.cc b/chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker_unittest.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/server_backed_state_keys_broker_unittest.cc
rename to chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker_unittest.cc
index 52ba011..d577f05 100644
--- a/chrome/browser/chromeos/policy/server_backed_state_keys_broker_unittest.cc
+++ b/chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker_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/server_backed_state_keys_broker.h"
+#include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
@@ -28,9 +28,7 @@
   }
   ~ServerBackedStateKeysBrokerTest() override {}
 
-  void StateKeysUpdated() {
-    updated_ = true;
-  }
+  void StateKeysUpdated() { updated_ = true; }
 
   void ExpectGood() {
     EXPECT_TRUE(broker_.available());
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
index 7f8227c9..7f876430 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
@@ -768,8 +768,8 @@
   EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
   EXPECT_FALSE(manager_->core()->client()->is_registered());
 
-  AccountInfo account_info =
-      identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kEmail);
+  AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+      kEmail, signin::ConsentLevel::kSignin);
   EXPECT_TRUE(
       identity_test_env()->identity_manager()->HasAccountWithRefreshToken(
           account_info.account_id));
@@ -1182,7 +1182,8 @@
   // UserCloudPolicyManagerChromeOSTest:
   void SetUp() override {
     UserCloudPolicyManagerChromeOSTest::SetUp();
-    identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kEmail);
+    identity_test_env()->MakePrimaryAccountAvailable(
+        kEmail, signin::ConsentLevel::kSignin);
   }
 
   // Sets the initially cached data and initializes the CloudPolicyService.
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_unittest.cc b/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_unittest.cc
index 9fd59b5..063d5dc7 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_unittest.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_unittest.cc
@@ -140,7 +140,7 @@
     identity_test_env_profile_adaptor_ =
         std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile);
     identity_test_env_profile_adaptor_->identity_test_env()
-        ->MakeUnconsentedPrimaryAccountAvailable(kEmail);
+        ->MakePrimaryAccountAvailable(kEmail, signin::ConsentLevel::kSignin);
 
     auto* user_manager = GetFakeUserManager();
     user_manager->AddUser(account_id);
diff --git a/chrome/browser/chromeos/printing/doc/cups_printers_settings_page.md b/chrome/browser/chromeos/printing/doc/cups_printers_settings_page.md
index 78100cef..d168c51 100644
--- a/chrome/browser/chromeos/printing/doc/cups_printers_settings_page.md
+++ b/chrome/browser/chromeos/printing/doc/cups_printers_settings_page.md
@@ -87,7 +87,8 @@
 
 Message Name                        | Function
 :---------------------------------- | :-------
-`getCupsPrintersList`               | `HandleGetCupsPrintersList`
+`getCupsSavedPrintersList`          | `HandleGetCupsSavedPrintersList`
+`getCupsEnterprisePrintersList`     | `HandleGetCupsEnterprisePrintersList`
 `updateCupsPrinter`                 | `HandleUpdateCupsPrinter`
 `removeCupsPrinter`                 | `HandleRemoveCupsPrinter`
 `addCupsPrinter`                    | `HandleAddCupsPrinter`
diff --git a/chrome/browser/endpoint_fetcher/endpoint_fetcher_unittest.cc b/chrome/browser/endpoint_fetcher/endpoint_fetcher_unittest.cc
index 416707f..5f971b0 100644
--- a/chrome/browser/endpoint_fetcher/endpoint_fetcher_unittest.cc
+++ b/chrome/browser/endpoint_fetcher/endpoint_fetcher_unittest.cc
@@ -67,7 +67,8 @@
   }
 
   void SignIn() {
-    identity_test_env_.MakePrimaryAccountAvailable(kEmail);
+    identity_test_env_.MakePrimaryAccountAvailable(kEmail,
+                                                   signin::ConsentLevel::kSync);
     identity_test_env_.SetAutomaticIssueOfAccessTokens(true);
   }
 
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
index b9d03cb..4da6e54 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
@@ -265,7 +265,8 @@
     }
     identity_test_environment_ =
         std::make_unique<signin::IdentityTestEnvironment>();
-    identity_test_environment_->MakePrimaryAccountAvailable(kUserName);
+    identity_test_environment_->MakePrimaryAccountAvailable(
+        kUserName, signin::ConsentLevel::kSync);
     extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(
         browser()->profile())
         ->SetIdentityManagerForTesting(
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader.cc b/chrome/browser/enterprise/connectors/file_system/box_uploader.cc
index bd01328..e1f4a6ca 100644
--- a/chrome/browser/enterprise/connectors/file_system/box_uploader.cc
+++ b/chrome/browser/enterprise/connectors/file_system/box_uploader.cc
@@ -5,6 +5,10 @@
 #include "chrome/browser/enterprise/connectors/file_system/box_uploader.h"
 
 #include "base/files/file_util.h"
+#include "base/i18n/time_formatting.h"
+#include "base/i18n/unicodestring.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/strings/stringprintf.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
 #include "chrome/browser/enterprise/connectors/connectors_prefs.h"
@@ -12,6 +16,8 @@
 #include "chrome/browser/enterprise/connectors/file_system/box_upload_file_chunks_handler.h"
 #include "components/prefs/pref_service.h"
 #include "net/http/http_status_code.h"
+#include "third_party/icu/source/common/unicode/utypes.h"
+#include "third_party/icu/source/i18n/unicode/calendar.h"
 
 namespace {
 
@@ -31,6 +37,8 @@
 
 namespace enterprise_connectors {
 
+const char kUniquifierUmaLabel[] = "Enterprise.FileSystem.Uniquifier";
+
 ////////////////////////////////////////////////////////////////////////////////
 // BoxUploader
 ////////////////////////////////////////////////////////////////////////////////
@@ -48,7 +56,9 @@
 
 BoxUploader::BoxUploader(download::DownloadItem* download_item)
     : local_file_path_(download_item->GetFullPath()),
-      target_file_name_(download_item->GetTargetFilePath().BaseName()) {}
+      target_file_name_(download_item->GetTargetFilePath().BaseName()),
+      download_start_time_(download_item->GetStartTime()),
+      uniquifier_(0) {}
 
 BoxUploader::~BoxUploader() = default;
 // TODO(https://crbug.com/1213761) May need to TerminateTask() to resume later.
@@ -166,18 +176,38 @@
   TryCurrentApiCall();
 }
 
+void BoxUploader::LogUniquifierCountToUma() {
+  base::UmaHistogramSparse(kUniquifierUmaLabel, uniquifier_);
+}
+
 void BoxUploader::OnPreflightCheckResponse(bool success, int response_code) {
   if (success) {
     // Create an upload session with the same folder_id and name and continue
     CHECK_EQ(response_code, net::HTTP_OK);
+    LogUniquifierCountToUma();
     SetCurrentApiCall(MakeFileUploadApiCall());
     TryCurrentApiCall();
     return;
   }
   switch (response_code) {
     case net::HTTP_CONFLICT:
-      // TODO(https://crbug.com/1198617) Deal with filename conflict.
-      OnApiCallFlowFailure();
+      if (uniquifier_ < UploadAttemptCount::kMaxRenamedWithSuffix) {
+        ++uniquifier_;
+      } else if (uniquifier_ == UploadAttemptCount::kMaxRenamedWithSuffix) {
+        uniquifier_ = UploadAttemptCount::kTimestampBasedName;
+      } else {
+        uniquifier_ = UploadAttemptCount::kAbandonedUpload;
+      }
+
+      if (uniquifier_ < UploadAttemptCount::kAbandonedUpload) {
+        SetCurrentApiCall(MakePreflightCheckApiCall());
+        TryCurrentApiCall();
+      } else {
+        // TODO(https://crbug.com/1168815): Surface this error to user.
+        DLOG(WARNING) << "Box upload failed for file " << GetTargetFileName();
+        LogUniquifierCountToUma();
+        OnApiCallFlowFailure();
+      }
       break;
     case net::HTTP_UNAUTHORIZED:
       // Authentication failure, we need to reauth and redo the preflight check.
@@ -232,7 +262,44 @@
 }
 
 const base::FilePath BoxUploader::GetTargetFileName() const {
-  return target_file_name_;
+  if (uniquifier_ == UploadAttemptCount::kNotRenamed) {
+    return target_file_name_;
+  } else if (uniquifier_ <= UploadAttemptCount::kMaxRenamedWithSuffix) {
+    return target_file_name_.InsertBeforeExtensionASCII(
+        base::StringPrintf(" (%d)", uniquifier_));
+  } else if (uniquifier_ == UploadAttemptCount::kTimestampBasedName) {
+    // Generate an ISO8601 compliant local timestamp suffix that avoids
+    // reserved characters that are forbidden on some OSes like Windows.
+    base::Time::Exploded exploded;
+    download_start_time_.LocalExplode(&exploded);
+
+    // Instead of using the raw_offset, use the offset in effect now.
+    // For instance, US Pacific Time, the offset shown will be -7 in summer
+    // while it'll be -8 in winter. Time zone information appended to the format
+    // generated by CreateUniqueFilename in
+    // components/download/internal/common/download_path_reservation_tracker.cc
+    int raw_offset, dst_offset;
+    UDate now = icu::Calendar::getNow();
+    std::unique_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault());
+    UErrorCode status = U_ZERO_ERROR;
+    zone.get()->getOffset(now, false, raw_offset, dst_offset, status);
+    DCHECK(U_SUCCESS(status));
+    int offset = raw_offset + dst_offset;
+    // |offset| is in msec.
+    int minute_offset = offset / 60000;
+    int hour_offset = minute_offset / 60;
+    int min_remainder = std::abs(minute_offset) % 60;
+    // Some timezones have a non-integral hour offset. So, we need to use hh:mm
+    // form.
+    std::string suffix = base::StringPrintf(
+        " - %04d-%02d-%02dT%02d%02d%02d.%03d UTC%+dh%02d", exploded.year,
+        exploded.month, exploded.day_of_month, exploded.hour, exploded.minute,
+        exploded.second, exploded.millisecond, hour_offset, min_remainder);
+    return target_file_name_.InsertBeforeExtensionASCII(suffix);
+  } else {
+    DCHECK_EQ(uniquifier_, UploadAttemptCount::kAbandonedUpload);
+    return target_file_name_.InsertBeforeExtensionASCII(".abandoned");
+  }
 }
 
 const std::string BoxUploader::GetFolderId() {
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader.h b/chrome/browser/enterprise/connectors/file_system/box_uploader.h
index 788e116..9af9a83 100644
--- a/chrome/browser/enterprise/connectors/file_system/box_uploader.h
+++ b/chrome/browser/enterprise/connectors/file_system/box_uploader.h
@@ -12,6 +12,10 @@
 
 namespace enterprise_connectors {
 
+// The UMA label used to log the number of renames to avoid a collision when
+// uploading to Box
+extern const char kUniquifierUmaLabel[];
+
 // Task Manager for downloaded items used by FileSystemRenamdHandler that
 // connects between the Chrome client and Box. Once given a download item and
 // authentication, internally it manages the entire API call flow required to
@@ -53,6 +57,14 @@
 
   class FileChunksHandler;  // To be moved into BoxChunkedFileUploader.
 
+  // The largest number of retries attempted in OnPreflightCheckResponse.
+  enum UploadAttemptCount {
+    kNotRenamed = 0,
+    kMaxRenamedWithSuffix = 9,
+    kTimestampBasedName = 1000,
+    kAbandonedUpload = 2000,
+  };
+
  protected:
   // Constructor with download::DownloadItem* to access download_item fields but
   // does not store the pointer internally and the ownership of download_item
@@ -93,6 +105,7 @@
                                       int response_code,
                                       const std::string& folder_id);
   void OnPreflightCheckResponse(bool success, int response_code);
+  void LogUniquifierCountToUma();
 
   // The followings are not necessarily specific to Box:
   // Post a task to ThreadPool to delete the local file, after the entire file
@@ -105,6 +118,9 @@
   // File details.
   const base::FilePath local_file_path_;   // Path of the local temporary file.
   const base::FilePath target_file_name_;  // File name to be used finally.
+  const base::Time download_start_time_;   // Start time of the download.
+  uint32_t
+      uniquifier_;  // Number to be appended to the filename to make it unique.
   // Callback when API call gives Authenetication Error.
   base::RepeatingCallback<void(void)> authentication_retry_callback_;
   // Callback when the entire flow is completed to notify the download thread.
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h b/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h
index b648b2f1..58134a77 100644
--- a/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h
+++ b/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h
@@ -9,6 +9,7 @@
 #include "base/files/file_util.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
+#include "base/time/time.h"
 #include "chrome/browser/enterprise/connectors/file_system/box_api_call_flow.h"
 #include "chrome/browser/enterprise/connectors/file_system/test_helper.h"
 #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader_unittest.cc b/chrome/browser/enterprise/connectors/file_system/box_uploader_unittest.cc
index 2d4af34..2078519 100644
--- a/chrome/browser/enterprise/connectors/file_system/box_uploader_unittest.cc
+++ b/chrome/browser/enterprise/connectors/file_system/box_uploader_unittest.cc
@@ -5,8 +5,12 @@
 // A complete set of unit tests for BoxUploader.
 
 #include "chrome/browser/enterprise/connectors/file_system/box_uploader.h"
-
+#include "base/i18n/rtl.h"
 #include "base/json/json_writer.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/icu_test_util.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/time/time.h"
 #include "chrome/browser/enterprise/connectors/file_system/box_api_call_test_helper.h"
 #include "chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h"
 
@@ -65,6 +69,8 @@
                               base::OnceCallback<void(void)> preupload_cb)
       : BoxUploader(download_item), preupload_cb_(std::move(preupload_cb)) {}
 
+  using BoxUploader::GetTargetFileName;
+
  protected:
   // These 2 methods are overridden to intercept the upload API call to test the
   // pre-upload steps specifically.
@@ -242,19 +248,92 @@
   EXPECT_FALSE(download_thread_cb_called_);  // InterceptedPreUpload() above.
 }
 
-TEST_F(BoxUploader_PreflightCheckTest, Conflict) {
-  // Preflight check implies a conflict (dummy body since not reading from it):
+TEST_F(BoxUploader_PreflightCheckTest, ConflictAndSuccessAfterkMaxUniqueTries) {
+  // Preflight check implies a conflict until retries time out.
+  base::HistogramTester histogram_tester;
+
+  for (int i = 0; i < 10; i++) {
+    AddSequentialFetchResult(kFileSystemBoxPreflightCheckUrl,
+                             net::HTTP_CONFLICT);
+  }
+  AddSequentialFetchResult(kFileSystemBoxPreflightCheckUrl, net::HTTP_OK);
+  base::test::ScopedRestoreICUDefaultLocale restore_locale;
+  base::i18n::SetICUDefaultLocale("en_ZA");
+  base::test::ScopedRestoreDefaultTimezone sast_time("Africa/Johannesburg");
+
+  uploader_->TryTask(url_factory_, "test_token");
+  RunWithQuitClosure();
+  ASSERT_EQ(authentication_retry_, 0);
+  EXPECT_EQ(uploader_->GetFolderIdForTesting(), kFileSystemBoxFolderIdInPref);
+  ASSERT_TRUE(upload_initiated_);
+
+  // TODO(http://crbug.com/1215562): Remove this hack once this bug is resolved.
+  base::Time expected_start;
+  DCHECK(base::Time::FromLocalExploded(kTestDateTime, &expected_start));
+  base::Time::Exploded exploded;
+  expected_start.LocalExplode(&exploded);
+  std::string expected_name = base::StringPrintf(
+      "box_uploader_test - %04d-%02d-%02dT%02d%02d%02d.%03d UTC+2h00.txt",
+      exploded.year, exploded.month, exploded.day_of_month, exploded.hour,
+      exploded.minute, exploded.second, exploded.millisecond);
+  // ---------------------------------------------------------------------------
+
+  EXPECT_EQ(uploader_->GetTargetFileName().MaybeAsASCII(), expected_name);
+  histogram_tester.ExpectUniqueSample(
+      kUniquifierUmaLabel, BoxUploader::UploadAttemptCount::kTimestampBasedName,
+      1);
+  EXPECT_FALSE(download_thread_cb_called_);  // InterceptedPreUpload() above.
+}
+
+TEST_F(BoxUploader_PreflightCheckTest, ConflictEvenWithTimestamp) {
+  // Preflight check implies a conflict  including even for the timestamp based
+  // filename. The upload should finally fail.
+  base::HistogramTester histogram_tester;
+
   AddFetchResult(kFileSystemBoxPreflightCheckUrl, net::HTTP_CONFLICT);
+  base::test::ScopedRestoreICUDefaultLocale restore_locale;
+  base::i18n::SetICUDefaultLocale("en_ZA");
+  base::test::ScopedRestoreDefaultTimezone sast_time("Africa/Johannesburg");
+
+  uploader_->TryTask(url_factory_, "test_token");
+  RunWithQuitClosure();
+  ASSERT_EQ(authentication_retry_, 0);
+  EXPECT_EQ(uploader_->GetFolderIdForTesting(), kFileSystemBoxFolderIdInPref);
+  ASSERT_FALSE(upload_initiated_);
+
+  // The last tried filename is timestamp based even though it also fails.
+  EXPECT_EQ(uploader_->GetTargetFileName().MaybeAsASCII(),
+            "box_uploader_test.abandoned.txt");
+  histogram_tester.ExpectUniqueSample(
+      kUniquifierUmaLabel, BoxUploader::UploadAttemptCount::kAbandonedUpload,
+      1);
+  EXPECT_TRUE(download_thread_cb_called_)
+      << "Conflict, including with timestamp, should terminate flow.";
+}
+
+TEST_F(BoxUploader_PreflightCheckTest, ConflictThenSuccess) {
+  // Preflight check results for successive filenames:
+  base::HistogramTester histogram_tester;
+
+  // box_uploader_test.txt
+  AddSequentialFetchResult(kFileSystemBoxPreflightCheckUrl, net::HTTP_CONFLICT);
+
+  // box_uploader_test (1).txt
+  AddSequentialFetchResult(kFileSystemBoxPreflightCheckUrl, net::HTTP_CONFLICT);
+
+  // box_uploader_test (2).txt
+  AddSequentialFetchResult(kFileSystemBoxPreflightCheckUrl, net::HTTP_OK);
 
   uploader_->TryTask(url_factory_, "test_token");
   RunWithQuitClosure();
 
   ASSERT_EQ(authentication_retry_, 0);
   EXPECT_EQ(uploader_->GetFolderIdForTesting(), kFileSystemBoxFolderIdInPref);
-  ASSERT_FALSE(upload_initiated_);
-  EXPECT_TRUE(download_thread_cb_called_) << "Conflict should terminate flow.";
-  // Currently the upload is abandoned.
-  // TODO(https://crbug.com/1198617): Update once the conflict is handled.
+  ASSERT_TRUE(upload_initiated_);
+  EXPECT_EQ(uploader_->GetTargetFileName().MaybeAsASCII(),
+            "box_uploader_test (2).txt");
+  histogram_tester.ExpectUniqueSample(kUniquifierUmaLabel, 2, 1);
+  EXPECT_FALSE(download_thread_cb_called_);  // InterceptedPreUpload() above.
 }
 
 TEST_F(BoxUploader_PreflightCheckTest, CachedFolder404_ButFound) {
diff --git a/chrome/browser/enterprise/connectors/file_system/test_helper.cc b/chrome/browser/enterprise/connectors/file_system/test_helper.cc
index e4ad1d7..e477713 100644
--- a/chrome/browser/enterprise/connectors/file_system/test_helper.cc
+++ b/chrome/browser/enterprise/connectors/file_system/test_helper.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/enterprise/connectors/file_system/test_helper.h"
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
 
 namespace enterprise_connectors {
 
@@ -11,7 +13,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 DownloadItemForTest::DownloadItemForTest(
-    base::FilePath::StringPieceType file_name) {
+    base::FilePath::StringPieceType file_name,
+    base::Time::Exploded start_time_exploded) {
   CHECK(file_name.size());
   CHECK(tmp_dir_.CreateUniqueTempDir());
   file_path_ = tmp_dir_.GetPath().Append(file_name);
@@ -19,6 +22,19 @@
   SetTargetFilePath(file_path_);
   file_path_ = file_path_.AddExtension(FILE_PATH_LITERAL(".crdownload"));
   CHECK(file_path_.FinalExtension() == FILE_PATH_LITERAL(".crdownload"));
+  base::Time start_time;
+  DCHECK(base::Time::FromLocalExploded(start_time_exploded, &start_time));
+  SetStartTime(start_time);
+  DLOG(INFO) << "Set start_time for DownloadItemForTest to " << start_time
+             << "(" << start_time.ToDeltaSinceWindowsEpoch().InMicroseconds()
+             << ")"
+             << " from "
+             << base::StringPrintf(
+                    " - %04d-%02d-%02dT%02d%02d%02d.%03d",
+                    start_time_exploded.year, start_time_exploded.month,
+                    start_time_exploded.day_of_month, start_time_exploded.hour,
+                    start_time_exploded.minute, start_time_exploded.second,
+                    start_time_exploded.millisecond);
 }
 
 const base::FilePath& DownloadItemForTest::GetFullPath() const {
diff --git a/chrome/browser/enterprise/connectors/file_system/test_helper.h b/chrome/browser/enterprise/connectors/file_system/test_helper.h
index da78dce..e07b0a7b 100644
--- a/chrome/browser/enterprise/connectors/file_system/test_helper.h
+++ b/chrome/browser/enterprise/connectors/file_system/test_helper.h
@@ -10,9 +10,13 @@
 
 namespace enterprise_connectors {
 
+// 1994-04-27 00:00:00.001 GMT+2 (South Africa Standard Time)
+const base::Time::Exploded kTestDateTime = {1994, 4, 2, 27, 0, 0, 0, 1};
+
 class DownloadItemForTest : public content::FakeDownloadItem {
  public:
-  explicit DownloadItemForTest(base::FilePath::StringPieceType file_name);
+  explicit DownloadItemForTest(base::FilePath::StringPieceType file_name,
+                               base::Time::Exploded start_time = kTestDateTime);
   const base::FilePath& GetFullPath() const override;
 
  protected:
diff --git a/chrome/browser/extensions/active_tab_unittest.cc b/chrome/browser/extensions/active_tab_unittest.cc
index a999047..ff525270 100644
--- a/chrome/browser/extensions/active_tab_unittest.cc
+++ b/chrome/browser/extensions/active_tab_unittest.cc
@@ -526,7 +526,7 @@
   void SetUp() override {
     ActiveTabTest::SetUp();
 
-    // Necessary to prevent instantiation of ProfileSyncService, which messes
+    // Necessary to prevent instantiation of SyncService, which messes
     // with our signin state below.
     base::CommandLine::ForCurrentProcess()->AppendSwitch(
         switches::kDisableSync);
diff --git a/chrome/browser/extensions/api/autofill_assistant_private/extension_access_token_fetcher_unittest.cc b/chrome/browser/extensions/api/autofill_assistant_private/extension_access_token_fetcher_unittest.cc
index 1719cf4..ed0dfb28 100644
--- a/chrome/browser/extensions/api/autofill_assistant_private/extension_access_token_fetcher_unittest.cc
+++ b/chrome/browser/extensions/api/autofill_assistant_private/extension_access_token_fetcher_unittest.cc
@@ -18,7 +18,8 @@
   ~ExtensionAccessTokenFetcherTest() override = default;
 
   void SetUp() override {
-    identity_test_env_.MakePrimaryAccountAvailable("primary@example.com");
+    identity_test_env_.MakePrimaryAccountAvailable("primary@example.com",
+                                                   signin::ConsentLevel::kSync);
   }
 
   void TearDown() override {}
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc
index fc288a9..8f6be2e 100644
--- a/chrome/browser/extensions/api/identity/identity_apitest.cc
+++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -585,7 +585,8 @@
   // Signs in (at sync consent level) and returns the account ID of the primary
   // account.
   CoreAccountId SignIn(const std::string& email) {
-    auto account_info = identity_test_env()->MakePrimaryAccountAvailable(email);
+    auto account_info = identity_test_env()->MakePrimaryAccountAvailable(
+        email, signin::ConsentLevel::kSync);
     EXPECT_TRUE(identity_test_env()->identity_manager()->HasPrimaryAccount(
         signin::ConsentLevel::kSync));
     return account_info.account_id;
@@ -760,8 +761,8 @@
 
 IN_PROC_BROWSER_TEST_F(IdentityGetProfileUserInfoFunctionTest,
                        SignedInUnconsented) {
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
-      "test@example.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "test@example.com", signin::ConsentLevel::kSignin);
   std::unique_ptr<api::identity::ProfileUserInfo> info =
       RunGetProfileUserInfoWithEmail();
   EXPECT_TRUE(info->email.empty());
@@ -831,8 +832,8 @@
 IN_PROC_BROWSER_TEST_P(
     IdentityGetProfileUserInfoFunctionTestWithAccountStatusParam,
     SignedInUnconsented) {
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
-      "test@example.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "test@example.com", signin::ConsentLevel::kSignin);
   std::unique_ptr<api::identity::ProfileUserInfo> info =
       RunGetProfileUserInfoWithAccountStatus();
   // The unconsented (Sync off) primary account is returned conditionally,
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
index c636e9d..1e24b7df 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -912,8 +912,8 @@
   EXPECT_EQ("", captured_args.FindKey("userName")->GetString());
 
   // With an unconsented primary account, we should set the username.
-  identity_test_environment.MakeUnconsentedPrimaryAccountAvailable(
-      "profile@example.com");
+  identity_test_environment.MakePrimaryAccountAvailable(
+      "profile@example.com", signin::ConsentLevel::kSignin);
   TriggerOnSecurityInterstitialShownEvent();
   base::RunLoop().RunUntilIdle();
   captured_args = event_observer.PassEventArgs().GetList()[0].Clone();
@@ -921,7 +921,8 @@
             captured_args.FindKey("userName")->GetString());
 
   // With a consented primary account, we should set the username.
-  identity_test_environment.MakePrimaryAccountAvailable("profile@example.com");
+  identity_test_environment.MakePrimaryAccountAvailable(
+      "profile@example.com", signin::ConsentLevel::kSync);
   TriggerOnSecurityInterstitialShownEvent();
   base::RunLoop().RunUntilIdle();
   captured_args = event_observer.PassEventArgs().GetList()[0].Clone();
diff --git a/chrome/browser/extensions/external_provider_impl_chromeos_unittest.cc b/chrome/browser/extensions/external_provider_impl_chromeos_unittest.cc
index f81b3df..26816f3 100644
--- a/chrome/browser/extensions/external_provider_impl_chromeos_unittest.cc
+++ b/chrome/browser/extensions/external_provider_impl_chromeos_unittest.cc
@@ -228,7 +228,8 @@
   auto identity_test_env_profile_adaptor =
       std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile());
   identity_test_env_profile_adaptor->identity_test_env()
-      ->MakePrimaryAccountAvailable("test_user@gmail.com");
+      ->MakePrimaryAccountAvailable("test_user@gmail.com",
+                                    signin::ConsentLevel::kSync);
 
   // App sync will wait for priority sync to complete.
   service_->CheckForExternalUpdates();
diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc
index 0b0a8b2..1b59ccc1 100644
--- a/chrome/browser/extensions/updater/extension_updater_unittest.cc
+++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
@@ -377,7 +377,7 @@
       ExtensionDownloaderDelegate* delegate) {
     identity_test_env_ = std::make_unique<signin::IdentityTestEnvironment>();
     account_info_ = identity_test_env_->MakePrimaryAccountAvailable(
-        "bobloblaw@lawblog.example.com");
+        "bobloblaw@lawblog.example.com", signin::ConsentLevel::kSync);
 
     std::unique_ptr<ExtensionDownloader> downloader(
         CreateExtensionDownloader(delegate));
diff --git a/chrome/browser/federated_learning/floc_event_logger.cc b/chrome/browser/federated_learning/floc_event_logger.cc
index b95d5a0..25e6d03 100644
--- a/chrome/browser/federated_learning/floc_event_logger.cc
+++ b/chrome/browser/federated_learning/floc_event_logger.cc
@@ -7,7 +7,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/federated_learning/floc_remote_permission_service.h"
 #include "components/federated_learning/features/features.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service.h"
 #include "components/sync_user_events/user_event_service.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/federated_learning/floc_remote_permission_service_unittest.cc b/chrome/browser/federated_learning/floc_remote_permission_service_unittest.cc
index 5c3d1bd9..aab0b51 100644
--- a/chrome/browser/federated_learning/floc_remote_permission_service_unittest.cc
+++ b/chrome/browser/federated_learning/floc_remote_permission_service_unittest.cc
@@ -146,10 +146,6 @@
 }  // namespace
 
 // A test class used for testing the FlocRemotePermissionService class.
-// In order for FlocRemotePermissionService to be valid, we must have a valid
-// ProfileSyncService. Using the ProfileSyncServiceMock class allows to
-// assign specific return values as needed to make sure the floc remote
-// permission service is available.
 class FlocRemotePermissionServiceTest : public testing::Test {
  public:
   FlocRemotePermissionServiceTest()
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 5e6f2e8..b54e6b1 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1930,13 +1930,6 @@
     "expiry_milestone": 95
   },
   {
-    "name": "enable-kerberos-settings-section",
-    "owners": [ "fsandrade" ],
-    // Enables the Kerberos Section in ChromeOS settings. When disabled,
-    // Kerberos settings will stay under People Section.
-    "expiry_milestone": 91
-  },
-  {
     "name": "enable-launcher-app-paging",
     "owners": [ "//ash/app_list/OWNERS" ],
     "expiry_milestone": 95
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 48b5ce9..ceb37133 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1408,11 +1408,6 @@
     "conflict with the latest JavaScript features. This flag allows disabling "
     "support of those features for compatibility with such pages.";
 
-const char kKerberosSettingsSectionName[] = "Kerberos Settings Section";
-const char kKerberosSettingsSectionDescription[] =
-    "Enables the Kerberos Section in ChromeOS settings. When disabled, "
-    "Kerberos settings will stay under People Section.";
-
 const char kLegacyTLSEnforcedName[] =
     "Enforce deprecation of legacy TLS versions";
 const char kLegacyTLSEnforcedDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index eea1a5a..1880da9 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -822,9 +822,6 @@
 extern const char kJavascriptHarmonyShippingName[];
 extern const char kJavascriptHarmonyShippingDescription[];
 
-extern const char kKerberosSettingsSectionName[];
-extern const char kKerberosSettingsSectionDescription[];
-
 extern const char kLegacyTLSEnforcedName[];
 extern const char kLegacyTLSEnforcedDescription[];
 
diff --git a/chrome/browser/metrics/testing/sync_metrics_test_utils.cc b/chrome/browser/metrics/testing/sync_metrics_test_utils.cc
index bcc9661..cea47220 100644
--- a/chrome/browser/metrics/testing/sync_metrics_test_utils.cc
+++ b/chrome/browser/metrics/testing/sync_metrics_test_utils.cc
@@ -20,7 +20,7 @@
     base::WeakPtr<fake_server::FakeServer> fake_server) {
   DCHECK(profile);
 
-  SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile)
+  SyncServiceFactory::GetAsSyncServiceImplForProfile(profile)
       ->OverrideNetworkForTest(
           fake_server::CreateFakeServerHttpPostProviderFactory(
               fake_server->AsWeakPtr()));
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc
index f018b83..5b7505e 100644
--- a/chrome/browser/metrics/ukm_browsertest.cc
+++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -36,9 +36,9 @@
 #include "components/metrics_services_manager/metrics_services_manager.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/sync_token_status.h"
 #include "components/sync/test/fake_server/fake_server_network_resources.h"
 #include "components/ukm/content/source_url_recorder.h"
diff --git a/chrome/browser/nearby_sharing/client/nearby_share_client_impl_unittest.cc b/chrome/browser/nearby_sharing/client/nearby_share_client_impl_unittest.cc
index 4580371b..7ccae509 100644
--- a/chrome/browser/nearby_sharing/client/nearby_share_client_impl_unittest.cc
+++ b/chrome/browser/nearby_sharing/client/nearby_share_client_impl_unittest.cc
@@ -188,7 +188,8 @@
     base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
         switches::kNearbyShareHTTPHost, kTestGoogleApisUrl);
 
-    identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable(kEmail);
+    identity_test_environment_.MakePrimaryAccountAvailable(
+        kEmail, signin::ConsentLevel::kSignin);
 
     std::unique_ptr<FakeNearbyShareApiCallFlow> api_call_flow =
         std::make_unique<FakeNearbyShareApiCallFlow>();
diff --git a/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express_unittest.cc b/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express_unittest.cc
index bf0aa5c2..af4d685b 100644
--- a/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express_unittest.cc
+++ b/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express_unittest.cc
@@ -89,8 +89,8 @@
       : test_shared_loader_factory_(
             base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
                 &test_url_loader_factory_)) {
-    identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable(
-        kTestAccount);
+    identity_test_environment_.MakePrimaryAccountAvailable(
+        kTestAccount, signin::ConsentLevel::kSignin);
   }
   ~ReceiveMessagesExpressTest() override = default;
 
diff --git a/chrome/browser/nearby_sharing/instantmessaging/send_message_express_unittest.cc b/chrome/browser/nearby_sharing/instantmessaging/send_message_express_unittest.cc
index 21a7a1ab3..86e6635 100644
--- a/chrome/browser/nearby_sharing/instantmessaging/send_message_express_unittest.cc
+++ b/chrome/browser/nearby_sharing/instantmessaging/send_message_express_unittest.cc
@@ -37,8 +37,8 @@
                 &test_url_loader_factory_)),
         send_message_express_(identity_test_environment_.identity_manager(),
                               test_shared_loader_factory_) {
-    identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable(
-        kTestAccount);
+    identity_test_environment_.MakePrimaryAccountAvailable(
+        kTestAccount, signin::ConsentLevel::kSignin);
   }
   ~SendMessageExpressTest() override = default;
 
diff --git a/chrome/browser/nearby_sharing/tachyon_ice_config_fetcher_unittest.cc b/chrome/browser/nearby_sharing/tachyon_ice_config_fetcher_unittest.cc
index 63bfc3b..c7953f0 100644
--- a/chrome/browser/nearby_sharing/tachyon_ice_config_fetcher_unittest.cc
+++ b/chrome/browser/nearby_sharing/tachyon_ice_config_fetcher_unittest.cc
@@ -67,8 +67,8 @@
                 &test_url_loader_factory_)),
         ice_config_fetcher_(identity_test_environment_.identity_manager(),
                             test_shared_loader_factory_) {
-    identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable(
-        kTestAccount);
+    identity_test_environment_.MakePrimaryAccountAvailable(
+        kTestAccount, signin::ConsentLevel::kSignin);
   }
   ~TachyonIceConfigFetcherTest() override = default;
 
diff --git a/chrome/browser/nearby_sharing/webrtc_signaling_messenger_unittest.cc b/chrome/browser/nearby_sharing/webrtc_signaling_messenger_unittest.cc
index 670ee61..3470f900 100644
--- a/chrome/browser/nearby_sharing/webrtc_signaling_messenger_unittest.cc
+++ b/chrome/browser/nearby_sharing/webrtc_signaling_messenger_unittest.cc
@@ -70,8 +70,8 @@
   ~WebRtcSignalingMessengerTest() override = default;
 
   void SetUp() override {
-    identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable(
-        kTestAccount);
+    identity_test_environment_.MakePrimaryAccountAvailable(
+        kTestAccount, signin::ConsentLevel::kSignin);
   }
 
   void SetOAuthTokenSuccessful(bool success) {
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc
index 99455d0c..cf6294b28 100644
--- a/chrome/browser/net/profile_network_context_service.cc
+++ b/chrome/browser/net/profile_network_context_service.cc
@@ -69,8 +69,8 @@
 #include "chrome/browser/ash/certificate_provider/certificate_provider_service_factory.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/net/client_cert_store_chromeos.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
diff --git a/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc b/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc
index aab4f73..1e748e0 100644
--- a/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc
+++ b/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc
@@ -144,6 +144,10 @@
     model_is_lazily_loaded_ = model_is_lazily_loaded;
   }
 
+  void set_load_model_on_startup(bool load_model_on_startup) {
+    load_model_on_startup_ = load_model_on_startup;
+  }
+
   void SetUpOnMainThread() override {
     host_resolver()->AddRule("*", "127.0.0.1");
     InProcessBrowserTest::SetUpOnMainThread();
@@ -152,6 +156,12 @@
         "chrome/test/data/optimization_guide");
     ASSERT_TRUE(embedded_test_server()->Start());
 
+    if (load_model_on_startup_) {
+      LoadAndWaitForModel();
+    }
+  }
+
+  void LoadAndWaitForModel() {
     base::HistogramTester histogram_tester;
 
     proto::Any any_metadata;
@@ -240,6 +250,7 @@
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
   bool model_is_lazily_loaded_ = false;
+  bool load_model_on_startup_ = true;
 };
 
 IN_PROC_BROWSER_TEST_F(PageContentAnnotationsServiceBrowserTest,
@@ -454,6 +465,60 @@
       got_content_annotations->model_annotations.page_topics_model_version);
 }
 
+class PageContentAnnotationsServiceLoadEachExecutionNotStartupTest
+    : public PageContentAnnotationsServiceBrowserTest {
+ public:
+  PageContentAnnotationsServiceLoadEachExecutionNotStartupTest() {
+    scoped_feature_list_.InitWithFeatures(
+        /*enabled_features=*/{features::kOptimizationHints,
+                              features::kPageContentAnnotations,
+                              features::kLoadModelFileForEachExecution},
+        /*disabled_features=*/{});
+    set_model_is_lazily_loaded(true);
+    set_load_model_on_startup(false);
+  }
+  ~PageContentAnnotationsServiceLoadEachExecutionNotStartupTest() override =
+      default;
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(
+    PageContentAnnotationsServiceLoadEachExecutionNotStartupTest,
+    ModelNotAvailableForFirstNavigation) {
+  base::HistogramTester histogram_tester;
+
+  GURL url(embedded_test_server()->GetURL("a.com", "/hello.html"));
+  ui_test_utils::NavigateToURL(browser(), url);
+
+  RetryForHistogramUntilCountReached(
+      histogram_tester,
+      "OptimizationGuide.PageContentAnnotationsService.ModelAvailable", 1);
+
+  histogram_tester.ExpectUniqueSample(
+      "OptimizationGuide.PageContentAnnotationsService.ModelAvailable", false,
+      1);
+
+  LoadAndWaitForModel();
+
+  GURL url2(
+      embedded_test_server()->GetURL("a.com", "/hello.html?totally=different"));
+  ui_test_utils::NavigateToURL(browser(), url2);
+
+  RetryForHistogramUntilCountReached(
+      histogram_tester,
+      "OptimizationGuide.PageContentAnnotationsService.ModelAvailable", 2);
+
+  histogram_tester.ExpectBucketCount(
+      "OptimizationGuide.PageContentAnnotationsService.ModelAvailable", false,
+      1);
+  histogram_tester.ExpectBucketCount(
+      "OptimizationGuide.PageContentAnnotationsService.ModelAvailable", true,
+      1);
+  histogram_tester.ExpectTotalCount(
+      "OptimizationGuide.PageContentAnnotationsService.ModelAvailable", 2);
+}
 #endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 
 }  // namespace optimization_guide
diff --git a/chrome/browser/password_check/android/password_check_manager.cc b/chrome/browser/password_check/android/password_check_manager.cc
index 7f88199..4e0c7d6 100644
--- a/chrome/browser/password_check/android/password_check_manager.cc
+++ b/chrome/browser/password_check/android/password_check_manager.cc
@@ -20,7 +20,6 @@
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/url_formatter/url_formatter.h"
 #include "components/version_info/version_info.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/password_manager/android/password_infobar_utils.cc b/chrome/browser/password_manager/android/password_infobar_utils.cc
index 242dc79..b1ff2b1 100644
--- a/chrome/browser/password_manager/android/password_infobar_utils.cc
+++ b/chrome/browser/password_manager/android/password_infobar_utils.cc
@@ -27,10 +27,8 @@
       IdentityManagerFactory::GetForProfile(profile);
   CoreAccountId account_id =
       identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSync);
-  absl::optional<AccountInfo> account_info =
-      identity_manager
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id);
+  AccountInfo account_info =
+      identity_manager->FindExtendedAccountInfoByAccountId(account_id);
   bool is_single_account_user =
       identity_manager->GetAccountsWithRefreshTokens().size() == 1;
 
@@ -39,9 +37,11 @@
        base::FeatureList::IsEnabled(
            autofill::features::
                kAutofillEnableInfoBarAccountIndicationFooterForSingleAccountUsers)) &&
-      account_info.has_value();
+      !account_info.IsEmpty();
 
-  return should_show_account_footer ? account_info : absl::nullopt;
+  return should_show_account_footer
+             ? absl::make_optional<AccountInfo>(account_info)
+             : absl::nullopt;
 }
 
 absl::optional<AccountInfo> GetAccountInfoForPasswordMessages(Profile* profile,
@@ -54,9 +54,11 @@
       IdentityManagerFactory::GetForProfile(profile);
   CoreAccountId account_id =
       identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSync);
-  return identity_manager
-      ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-          account_id);
+  AccountInfo account_info =
+      identity_manager->FindExtendedAccountInfoByAccountId(account_id);
+  return account_info.IsEmpty()
+             ? absl::nullopt
+             : absl::make_optional<AccountInfo>(account_info);
 }
 
 }  // namespace password_manager
diff --git a/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc b/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc
index f9d355d0..9d11881 100644
--- a/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc
+++ b/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc
@@ -90,7 +90,8 @@
 
   // Create a sync consented account so revoking the refresh token also triggers
   // the preference updated observer.
-  identity_test_env()->MakePrimaryAccountAvailable(kTestProfileName);
+  identity_test_env()->MakePrimaryAccountAvailable(kTestProfileName,
+                                                   signin::ConsentLevel::kSync);
   EXPECT_EQ(test_observer.GetUpdatedPrefName(),
             kGeneratedPasswordLeakDetectionPref);
 
@@ -142,7 +143,8 @@
   prefs()->SetDefaultPrefValue(
       password_manager::prefs::kPasswordLeakDetectionEnabled,
       base::Value(false));
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kTestProfileName);
+  identity_test_env()->MakePrimaryAccountAvailable(
+      kTestProfileName, signin::ConsentLevel::kSignin);
 
   // Check setting the generated pref updates the underlying preference.
   EXPECT_EQ(pref.SetPref(std::make_unique<base::Value>(true).get()),
@@ -183,7 +185,8 @@
 
   // Check when signed in and Safe Browsing set to standard, both user control
   // and the pref are enabled.
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kTestProfileName);
+  identity_test_env()->MakePrimaryAccountAvailable(
+      kTestProfileName, signin::ConsentLevel::kSignin);
   prefs()->SetUserPref(prefs::kSafeBrowsingEnabled,
                        std::make_unique<base::Value>(true));
   prefs()->SetUserPref(prefs::kSafeBrowsingEnhanced,
@@ -237,7 +240,8 @@
 
   // Check that the preference cannot be changed when the backing preference is
   // managed, but the preference could otherwise be changed.
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kTestProfileName);
+  identity_test_env()->MakePrimaryAccountAvailable(
+      kTestProfileName, signin::ConsentLevel::kSignin);
   prefs()->SetUserPref(prefs::kSafeBrowsingEnabled,
                        std::make_unique<base::Value>(true));
   prefs()->SetUserPref(prefs::kSafeBrowsingEnhanced,
diff --git a/chrome/browser/password_manager/multi_profile_credentials_filter_unittest.cc b/chrome/browser/password_manager/multi_profile_credentials_filter_unittest.cc
index 072c7c4..3c6137ed 100644
--- a/chrome/browser/password_manager/multi_profile_credentials_filter_unittest.cc
+++ b/chrome/browser/password_manager/multi_profile_credentials_filter_unittest.cc
@@ -122,7 +122,8 @@
     // arbitrary primary account here, so that any follow-up signs to the Gaia
     // page aren't considered primary account sign-ins and hence trigger the
     // password save prompt.
-    identity_test_env()->MakePrimaryAccountAvailable("primary@example.org");
+    identity_test_env()->MakePrimaryAccountAvailable(
+        "primary@example.org", signin::ConsentLevel::kSync);
   }
 
   void TearDown() override {
diff --git a/chrome/browser/policy/browser_dm_token_storage_android.cc b/chrome/browser/policy/browser_dm_token_storage_android.cc
index 7261783..b7f38939 100644
--- a/chrome/browser/policy/browser_dm_token_storage_android.cc
+++ b/chrome/browser/policy/browser_dm_token_storage_android.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/policy/android/cloud_management_shared_preferences.h"
 #include "chrome/browser/policy/android/jni_headers/CloudManagementAndroidConnection_jni.h"
 #include "components/policy/core/common/policy_pref_names.h"
-#include "components/prefs/pref_service.h"
 
 namespace policy {
 
diff --git a/chrome/browser/policy/browser_dm_token_storage_android.h b/chrome/browser/policy/browser_dm_token_storage_android.h
index de38ac5..c7ce93ca 100644
--- a/chrome/browser/policy/browser_dm_token_storage_android.h
+++ b/chrome/browser/policy/browser_dm_token_storage_android.h
@@ -14,8 +14,6 @@
 #include "base/sequence_checker.h"
 #include "base/single_thread_task_runner.h"
 
-class PrefService;
-
 namespace policy {
 
 // Implementation of BrowserDMTokenStorage delegate for Android.
@@ -41,7 +39,6 @@
       const std::string& client_id) override;
   scoped_refptr<base::TaskRunner> SaveDMTokenTaskRunner() override;
 
-  PrefService* local_state_ = nullptr;
   scoped_refptr<base::TaskRunner> task_runner_;
 
   FRIEND_TEST_ALL_PREFIXES(BrowserDMTokenStorageAndroidTest, InitClientId);
diff --git a/chrome/browser/policy/device_account_initializer.h b/chrome/browser/policy/device_account_initializer.h
index 30ca1a01..9ae910e 100644
--- a/chrome/browser/policy/device_account_initializer.h
+++ b/chrome/browser/policy/device_account_initializer.h
@@ -21,7 +21,6 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace policy {
-class DMAuth;
 class EnrollmentStatus;
 
 // Implements the logic that initializes device account during enrollment.
@@ -96,9 +95,6 @@
   void OnNetworkError(int response_code) override;
 
  private:
-  // Initiates storing of robot auth token.
-  void StartStoreRobotAuth();
-
   // Handles completion of the robot token store operation.
   void HandleStoreRobotAuthTokenResult(bool result);
 
@@ -111,7 +107,6 @@
   Delegate* delegate_;
 
   std::unique_ptr<gaia::GaiaOAuthClient> gaia_oauth_client_;
-  std::unique_ptr<DMAuth> dm_auth_;
 
   // Flag that undicates if there are requests that were not completed yet.
   // It is used to ignore CloudPolicyClient errors that are not relevant to
diff --git a/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service.h b/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service.h
index 47867b5..b37461b 100644
--- a/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service.h
+++ b/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service.h
@@ -123,10 +123,6 @@
     // to upload to DmServer.
     void HandleRecords();
 
-    // Called at the end of HandleRecords determines if all records have been
-    // processed and calls Complete.
-    void OnRecordsHandled();
-
     // Complete schedules |Response| with the provided |completion_response|.
     void Complete(CompletionResponse completion_response);
 
@@ -135,24 +131,11 @@
                          const int64_t expected_generation_id,
                          const int64_t expected_sequencing_id) const;
 
-    // Helper function for tracking the highest sequencing information per
-    // generation id. Schedules ProcessSuccessfulUploadAddition.
-    void AddSuccessfulUpload(
-        base::RepeatingClosure done_cb,
-        const SequencingInformation& sequencing_information);
-
-    // Processes successful uploads on sequence.
-    void ProcessSuccessfulUploadAddition(
-        base::RepeatingClosure done_cb,
-        SequencingInformation sequencing_information);
-
     const bool need_encryption_key_;
     std::unique_ptr<std::vector<EncryptedRecord>> encrypted_records_;
     EncryptionKeyAttachedCallback encryption_key_attached_cb_;
     RecordHandler* handler_;
 
-    absl::optional<SequencingInformation> highest_successful_sequence_;
-
     SEQUENCE_CHECKER(sequence_checker_);
   };
 
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.h b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.h
index 547e4ed..669e211 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.h
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.h
@@ -47,10 +47,6 @@
   // |report_queue_|, and uploading those events with the |client_|.
   class ReportUploader;
 
-  // Processes last JSON response received from the server in case of success,
-  // or nullopt in case of failures on all attempts.
-  void ProcessResponse(const base::Value& response);
-
   scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_;
 };
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 2c0f20c..72de75a 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -331,7 +331,7 @@
 #include "chrome/browser/chromeos/policy/enrollment_requisition_manager.h"
 #include "chrome/browser/chromeos/policy/external_data/handlers/device_wallpaper_image_external_data_handler.h"
 #include "chrome/browser/chromeos/policy/minimum_version_policy_handler.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 #include "chrome/browser/chromeos/policy/reporting/app_install_event_log_manager_wrapper.h"
 #include "chrome/browser/chromeos/policy/reporting/arc_app_install_event_logger.h"
 #include "chrome/browser/chromeos/policy/reporting/extension_install_event_log_manager_wrapper.h"
@@ -857,8 +857,8 @@
   chromeos::PowerMetricsReporter::RegisterLocalStatePrefs(registry);
   chromeos::platform_keys::KeyPermissionsManagerImpl::RegisterLocalStatePrefs(
       registry);
-  chromeos::power::auto_screen_brightness::MetricsReporter::
-      RegisterLocalStatePrefs(registry);
+  ash::power::auto_screen_brightness::MetricsReporter::RegisterLocalStatePrefs(
+      registry);
   chromeos::Preferences::RegisterPrefs(registry);
   ash::ResetScreen::RegisterPrefs(registry);
   chromeos::SchedulerConfigurationManager::RegisterLocalStatePrefs(registry);
diff --git a/chrome/browser/printing/cloud_print/gcd_api_flow_unittest.cc b/chrome/browser/printing/cloud_print/gcd_api_flow_unittest.cc
index 0fefd954..514ce56 100644
--- a/chrome/browser/printing/cloud_print/gcd_api_flow_unittest.cc
+++ b/chrome/browser/printing/cloud_print/gcd_api_flow_unittest.cc
@@ -64,7 +64,8 @@
 
  protected:
   void SetUp() override {
-    identity_test_environment_.MakePrimaryAccountAvailable(kAccountId);
+    identity_test_environment_.MakePrimaryAccountAvailable(
+        kAccountId, signin::ConsentLevel::kSync);
 
     std::unique_ptr<MockDelegate> delegate = std::make_unique<MockDelegate>();
     mock_delegate_ = delegate.get();
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_unittest.cc
index 877bb11..4fe091c 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_unittest.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_unittest.cc
@@ -1487,7 +1487,8 @@
       prefs::kPrivacySandboxPreferencesReconciled));
 
   // An account becoming available should not result in reconciliation.
-  identity_test_env()->MakePrimaryAccountAvailable("test@test.com");
+  identity_test_env()->MakePrimaryAccountAvailable("test@test.com",
+                                                   signin::ConsentLevel::kSync);
 
   EXPECT_FALSE(profile()->GetTestingPrefService()->GetBoolean(
       prefs::kPrivacySandboxPreferencesReconciled));
diff --git a/chrome/browser/profiles/gaia_info_update_service_unittest.cc b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
index 73ff9e6d..7ace7cb 100644
--- a/chrome/browser/profiles/gaia_info_update_service_unittest.cc
+++ b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
@@ -230,8 +230,8 @@
 
 TEST_F(GAIAInfoUpdateServiceTest, LogInLogOut) {
   std::string email = "pat@example.com";
-  AccountInfo info =
-      identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(email);
+  AccountInfo info = identity_test_env()->MakePrimaryAccountAvailable(
+      email, signin::ConsentLevel::kSignin);
   EXPECT_TRUE(identity_test_env()->identity_manager()->HasPrimaryAccount(
       signin::ConsentLevel::kSignin));
   EXPECT_FALSE(identity_test_env()->identity_manager()->HasPrimaryAccount(
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index cdcb880..0f411f76 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -1630,7 +1630,7 @@
   AccountReconcilorFactory::GetForProfile(profile);
 
   // Initialization needs to happen after the browser context is available
-  // because ProfileSyncService needs the URL context getter.
+  // because SyncService needs the URL context getter.
   UnifiedConsentServiceFactory::GetForProfile(profile);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
index 118ff64b..1eaa750 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -2430,7 +2430,7 @@
   `,
           function(root) {
             const contentEditable =
-                root.find({attributes: {contentEditableRoot: true}});
+                root.find({attributes: {nonAtomicTextFieldRoot: true}});
             mockFeedback.call(contentEditable.focus.bind(contentEditable))
                 .expectSpeech(/Testing testing\s+one two three/)
                 .call(doCmd('nextLine'))
@@ -3491,3 +3491,28 @@
         .replay();
   });
 });
+
+TEST_F('ChromeVoxBackgroundTest', 'DetailsChanged', function() {
+  const mockFeedback = this.createMockFeedback();
+
+  // Make sure we're not testing reading of the hint from the button's output
+  // below.
+  localStorage['useVerboseMode'] = false;
+  const site = `
+    <button id="click">ok</button>
+    <p id="details">hello</p>
+    <script>
+      const button = document.getElementById('click');
+      button.addEventListener('click', () => {
+        button.setAttribute('aria-details', 'details');
+      });
+    </script>
+  `;
+  this.runWithLoadedTree(site, function(root) {
+    const button = root.find({role: RoleType.BUTTON});
+    mockFeedback.expectSpeech('ok')
+        .call(button.doDefault.bind(button))
+        .expectSpeech('Press Search+A, J to jump to details')
+        .replay();
+  });
+});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
index 5a7eb75..bad09d0 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
@@ -1195,7 +1195,7 @@
     </div>
   `,
       function(root) {
-        const input = root.find({attributes: {contentEditableRoot: true}});
+        const input = root.find({attributes: {nonAtomicTextFieldRoot: true}});
         this.listenOnce(input, 'focus', function() {
           mockFeedback.call(this.press(KeyCode.END, {ctrl: true}))
               .expectSpeech('test')
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js
index 48ef4fd..fe2d5dd 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js
@@ -48,6 +48,7 @@
     this.node_ = evt.target;
     this.addListener_(
         EventType.ACTIVE_DESCENDANT_CHANGED, this.onActiveDescendantChanged);
+    this.addListener_(EventType.DETAILS_CHANGED, this.onDetailsChanged);
     this.addListener_(
         EventType.MENU_LIST_ITEM_SELECTED, this.onEventIfSelected);
     this.addListener_(
@@ -91,6 +92,30 @@
   }
 
   /**
+   * Informs users that details are now available.
+   * @param {!ChromeVoxEvent} evt
+   */
+  onDetailsChanged(evt) {
+    const range = ChromeVoxState.instance.currentRange;
+    let node = range.start ? range.start.node : null;
+    while (node && (!node.details || !node.details.length)) {
+      node = node.parent;
+    }
+    if (!node) {
+      return;
+    }
+
+    // Note that we only output speech. Braille output shows the entire line, so
+    // details output should not be based on an announcement like this. Don't
+    // allow interruption of this announcement which can occur in a slew of
+    // events (e.g. typing).
+    new Output()
+        .withInitialSpeechProperties({doNotInterrupt: true})
+        .formatForSpeech('@hint_details')
+        .go();
+  }
+
+  /**
    * @param {!ChromeVoxEvent} evt
    */
   onEventIfSelected(evt) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js
index b74e3fd..b44472b 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js
@@ -130,7 +130,7 @@
     }
 
     let editable = this.getEditableOrRelatedEditable_(range.start.node);
-    while (editable && !editable.contentEditableRoot) {
+    while (editable && !editable.nonAtomicTextFieldRoot) {
       if (!editable.parent ||
           editable.parent.state[chrome.automation.StateType.EDITABLE]) {
         // Not all editables from all trees (e.g. Android, views) set the
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb
index c47168e..ab316f1 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb
@@ -1065,7 +1065,7 @@
 <translation id="867187640362843212">Վերնագիր 5</translation>
 <translation id="8693391540059827073">Տարվա իմ սիրած եղանակը</translation>
 <translation id="8696284982970258155">Նեկտարագույն</translation>
-<translation id="8697111817566059991">{COUNT,plural, =1{ցից}one{# ուղղաձիգ ցից}other{# ուղղաձիգ ցից}}</translation>
+<translation id="8697111817566059991">{COUNT,plural, =1{գծիկ}one{# ուղղաձիգ գծիկ}other{# ուղղաձիգ գծիկ}}</translation>
 <translation id="8741370088760768424">Հուշում․ սեղմեք «Որոնում» + բացատ՝ ընթացիկ տարրն ակտիվացնելու համար։</translation>
 <translation id="8743786158317878347">մուտքագրել կառուցվածքավորված բովանդակություն, օրինակ՝ աղյուսակ</translation>
 <translation id="8747966237988593539">Համարակալված ցուցակ</translation>
diff --git a/chrome/browser/resources/extensions/BUILD.gn b/chrome/browser/resources/extensions/BUILD.gn
index eafc30c..bae9844 100644
--- a/chrome/browser/resources/extensions/BUILD.gn
+++ b/chrome/browser/resources/extensions/BUILD.gn
@@ -63,7 +63,7 @@
   in_files = [
     "drag_and_drop_handler.ts",
     "extensions.ts",
-    "item_behavior.js",
+    "item_mixin.ts",
     "item_util.ts",
     "keyboard_shortcut_delegate.ts",
     "navigation_helper.ts",
@@ -82,7 +82,7 @@
   out_folder = "$target_gen_dir/$preprocess_folder"
   out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
   in_files = [
-    "checkup.js",
+    "checkup.ts",
     "code_section.js",
     "activity_log/activity_log_history_item.js",
     "activity_log/activity_log_history.js",
@@ -90,31 +90,31 @@
     "activity_log/activity_log_stream_item.js",
     "activity_log/activity_log_stream.js",
     "detail_view.js",
-    "drop_overlay.js",
+    "drop_overlay.ts",
     "error_page.js",
     "host_permissions_toggle_list.js",
     "icons.ts",
-    "install_warnings_dialog.js",
+    "install_warnings_dialog.ts",
     "item.js",
     "item_list.js",
-    "keyboard_shortcuts.js",
+    "keyboard_shortcuts.ts",
     "load_error.js",
     "manager.js",
-    "options_dialog.js",
-    "pack_dialog_alert.js",
-    "pack_dialog.js",
+    "options_dialog.ts",
+    "pack_dialog_alert.ts",
+    "pack_dialog.ts",
     "runtime_host_permissions.js",
-    "runtime_hosts_dialog.js",
+    "runtime_hosts_dialog.ts",
     "shared_style.ts",
     "shared_vars.ts",
     "shortcut_input.js",
-    "sidebar.js",
-    "toggle_row.js",
+    "sidebar.ts",
+    "toggle_row.ts",
     "toolbar.js",
   ]
 
   if (is_chromeos_ash) {
-    in_files += [ "kiosk_dialog.js" ]
+    in_files += [ "kiosk_dialog.ts" ]
   }
 }
 
@@ -127,34 +127,34 @@
 
 html_to_js("web_components_local") {
   js_files = [
-    "checkup.js",
+    "checkup.ts",
     "code_section.js",
     "detail_view.js",
-    "drop_overlay.js",
+    "drop_overlay.ts",
     "error_page.js",
     "host_permissions_toggle_list.js",
     "icons.ts",
-    "install_warnings_dialog.js",
+    "install_warnings_dialog.ts",
     "item.js",
     "item_list.js",
-    "keyboard_shortcuts.js",
+    "keyboard_shortcuts.ts",
     "load_error.js",
     "manager.js",
-    "options_dialog.js",
-    "pack_dialog.js",
-    "pack_dialog_alert.js",
+    "options_dialog.ts",
+    "pack_dialog.ts",
+    "pack_dialog_alert.ts",
     "runtime_host_permissions.js",
-    "runtime_hosts_dialog.js",
+    "runtime_hosts_dialog.ts",
     "shared_style.ts",
     "shared_vars.ts",
     "shortcut_input.js",
-    "sidebar.js",
-    "toggle_row.js",
+    "sidebar.ts",
+    "toggle_row.ts",
     "toolbar.js",
   ]
 
   if (is_chromeos_ash) {
-    js_files += [ "kiosk_dialog.js" ]
+    js_files += [ "kiosk_dialog.ts" ]
   }
 }
 
@@ -185,37 +185,37 @@
     "activity_log/activity_log.js",
     "activity_log/activity_log_stream_item.js",
     "activity_log/activity_log_stream.js",
-    "checkup.js",
+    "checkup.ts",
     "code_section.js",
     "detail_view.js",
     "drag_and_drop_handler.ts",
-    "drop_overlay.js",
+    "drop_overlay.ts",
     "error_page.js",
     "extensions.ts",
     "host_permissions_toggle_list.js",
     "icons.ts",
-    "install_warnings_dialog.js",
-    "item_behavior.js",
+    "install_warnings_dialog.ts",
+    "item_mixin.ts",
     "item.js",
     "item_list.js",
     "item_util.ts",
     "keyboard_shortcut_delegate.ts",
-    "keyboard_shortcuts.js",
+    "keyboard_shortcuts.ts",
     "load_error.js",
     "manager.js",
     "navigation_helper.ts",
-    "options_dialog.js",
-    "pack_dialog_alert.js",
-    "pack_dialog.js",
+    "options_dialog.ts",
+    "pack_dialog_alert.ts",
+    "pack_dialog.ts",
     "runtime_host_permissions.js",
-    "runtime_hosts_dialog.js",
+    "runtime_hosts_dialog.ts",
     "service.ts",
     "shared_style.ts",
     "shared_vars.ts",
     "shortcut_input.js",
     "shortcut_util.ts",
-    "sidebar.js",
-    "toggle_row.js",
+    "sidebar.ts",
+    "toggle_row.ts",
     "toolbar.js",
   ]
   definitions = [
@@ -229,7 +229,7 @@
   if (is_chromeos_ash) {
     in_files += [
       "kiosk_browser_proxy.ts",
-      "kiosk_dialog.js",
+      "kiosk_dialog.ts",
     ]
     definitions += [ "//tools/typescript/definitions/chrome_send.d.ts" ]
   }
diff --git a/chrome/browser/resources/extensions/checkup.js b/chrome/browser/resources/extensions/checkup.ts
similarity index 97%
rename from chrome/browser/resources/extensions/checkup.js
rename to chrome/browser/resources/extensions/checkup.ts
index b0266c7..82cb764 100644
--- a/chrome/browser/resources/extensions/checkup.js
+++ b/chrome/browser/resources/extensions/checkup.ts
@@ -8,7 +8,6 @@
 
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-/** @polymer */
 class ExtensionsCheckupElement extends PolymerElement {
   static get is() {
     return 'extensions-checkup';
diff --git a/chrome/browser/resources/extensions/detail_view.js b/chrome/browser/resources/extensions/detail_view.js
index 6a1497e..f30ce10 100644
--- a/chrome/browser/resources/extensions/detail_view.js
+++ b/chrome/browser/resources/extensions/detail_view.js
@@ -30,7 +30,7 @@
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ItemDelegate} from './item.js';
-import {ItemBehavior} from './item_behavior.js';
+import {ItemMixin} from './item_mixin.js';
 import {computeInspectableViewLabel, EnableControl, getEnableControl, getItemSource, getItemSourceString, isEnabled, userCanChangeEnablement} from './item_util.js';
 import {navigation, Page} from './navigation_helper.js';
 
@@ -39,7 +39,7 @@
  * @extends {PolymerElement}
  */
 const ExtensionsDetailViewElementBase =
-    mixinBehaviors([CrContainerShadowBehavior, ItemBehavior], PolymerElement);
+    mixinBehaviors([CrContainerShadowBehavior], ItemMixin(PolymerElement));
 
 /** @polymer */
 class ExtensionsDetailViewElement extends ExtensionsDetailViewElementBase {
diff --git a/chrome/browser/resources/extensions/drag_and_drop_handler.ts b/chrome/browser/resources/extensions/drag_and_drop_handler.ts
index 76d9ce64..558c255d 100644
--- a/chrome/browser/resources/extensions/drag_and_drop_handler.ts
+++ b/chrome/browser/resources/extensions/drag_and_drop_handler.ts
@@ -7,6 +7,12 @@
 import {Service} from './service.js';
 
 
+declare global {
+  interface HTMLElementEventMap {
+    'drag-and-drop-load-error': CustomEvent<chrome.developerPrivate.LoadError>;
+  }
+}
+
 export class DragAndDropHandler implements DragWrapperDelegate {
   dragEnabled: boolean;
   private eventTarget_: EventTarget;
diff --git a/chrome/browser/resources/extensions/drop_overlay.js b/chrome/browser/resources/extensions/drop_overlay.ts
similarity index 92%
rename from chrome/browser/resources/extensions/drop_overlay.js
rename to chrome/browser/resources/extensions/drop_overlay.ts
index c11ea22..8f6eb8b 100644
--- a/chrome/browser/resources/extensions/drop_overlay.js
+++ b/chrome/browser/resources/extensions/drop_overlay.ts
@@ -12,7 +12,6 @@
 
 import {DragAndDropHandler} from './drag_and_drop_handler.js';
 
-/** @polymer */
 class ExtensionsDropOverlayElement extends PolymerElement {
   static get is() {
     return 'extensions-drop-overlay';
@@ -32,6 +31,9 @@
     };
   }
 
+  private dragWrapperHandler_: DragAndDropHandler;
+  private dragWrapper_: DragWrapper;
+
   constructor() {
     super();
 
@@ -54,11 +56,7 @@
     this.dragWrapper_ = new DragWrapper(dragTarget, this.dragWrapperHandler_);
   }
 
-  /**
-   * @param {boolean} dragEnabled
-   * @private
-   */
-  dragEnabledChanged_(dragEnabled) {
+  private dragEnabledChanged_(dragEnabled: boolean) {
     this.dragWrapperHandler_.dragEnabled = dragEnabled;
   }
 }
diff --git a/chrome/browser/resources/extensions/install_warnings_dialog.js b/chrome/browser/resources/extensions/install_warnings_dialog.ts
similarity index 81%
rename from chrome/browser/resources/extensions/install_warnings_dialog.js
rename to chrome/browser/resources/extensions/install_warnings_dialog.ts
index 4d6ccdcb..2873d041 100644
--- a/chrome/browser/resources/extensions/install_warnings_dialog.js
+++ b/chrome/browser/resources/extensions/install_warnings_dialog.ts
@@ -8,9 +8,15 @@
 import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
 import './code_section.js';
 
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-/** @polymer */
+interface ExtensionsInstallWarningsDialogElement {
+  $: {
+    dialog: CrDialogElement,
+  };
+}
+
 class ExtensionsInstallWarningsDialogElement extends PolymerElement {
   static get is() {
     return 'extensions-install-warnings-dialog';
@@ -22,19 +28,18 @@
 
   static get properties() {
     return {
-      /** @type {!Array<string>} */
       installWarnings: Array,
     };
   }
 
-  /** @override */
+  installWarnings: Array<string>;
+
   connectedCallback() {
     super.connectedCallback();
     this.$.dialog.showModal();
   }
 
-  /** @private */
-  onOkTap_() {
+  private onOkTap_() {
     this.$.dialog.close();
   }
 }
diff --git a/chrome/browser/resources/extensions/item.js b/chrome/browser/resources/extensions/item.js
index 03eb82b..dceb845 100644
--- a/chrome/browser/resources/extensions/item.js
+++ b/chrome/browser/resources/extensions/item.js
@@ -25,7 +25,7 @@
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js';
 import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {ItemBehavior} from './item_behavior.js';
+import {ItemMixin} from './item_mixin.js';
 import {computeInspectableViewLabel, EnableControl, getEnableControl, getItemSource, getItemSourceString, isEnabled, SourceType, userCanChangeEnablement} from './item_util.js';
 import {navigation, Page} from './navigation_helper.js';
 
@@ -122,7 +122,7 @@
  * @implements {I18nBehaviorInterface}
  */
 const ExtensionsItemElementBase =
-    mixinBehaviors([I18nBehavior, ItemBehavior], PolymerElement);
+    mixinBehaviors([I18nBehavior], ItemMixin(PolymerElement));
 
 /** @polymer */
 class ExtensionsItemElement extends ExtensionsItemElementBase {
diff --git a/chrome/browser/resources/extensions/item_behavior.js b/chrome/browser/resources/extensions/item_behavior.js
deleted file mode 100644
index bbe73808..0000000
--- a/chrome/browser/resources/extensions/item_behavior.js
+++ /dev/null
@@ -1,42 +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 {assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-
-/** @polymerBehavior */
-export const ItemBehavior = {
-  /**
-   * @param {chrome.developerPrivate.ExtensionType} type
-   * @param {string} appLabel
-   * @param {string} extensionLabel
-   * @return {string} The app or extension label depending on |type|.
-   */
-  appOrExtension(type, appLabel, extensionLabel) {
-    const ExtensionType = chrome.developerPrivate.ExtensionType;
-    switch (type) {
-      case ExtensionType.HOSTED_APP:
-      case ExtensionType.LEGACY_PACKAGED_APP:
-      case ExtensionType.PLATFORM_APP:
-        return appLabel;
-      case ExtensionType.EXTENSION:
-      case ExtensionType.SHARED_MODULE:
-        return extensionLabel;
-    }
-    assertNotReached('Item type is not App or Extension.');
-  },
-
-  /**
-   * @param {string} name
-   * @return {string} The a11y association descriptor, e.g. "Related to <ext>".
-   */
-  a11yAssociation(name) {
-    // Don't use I18nBehavior.i18n because of additional checks it performs.
-    // Polymer ensures that this string is not stamped into arbitrary HTML.
-    // `name` can contain any data including html tags, e.g.
-    // "My <video> download extension!"
-    return loadTimeData.getStringF('extensionA11yAssociation', name);
-  },
-
-};
diff --git a/chrome/browser/resources/extensions/item_mixin.ts b/chrome/browser/resources/extensions/item_mixin.ts
new file mode 100644
index 0000000..bf46a535
--- /dev/null
+++ b/chrome/browser/resources/extensions/item_mixin.ts
@@ -0,0 +1,56 @@
+// 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 {assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+type Constructor<T> = new (...args: any[]) => T;
+
+export const ItemMixin = dedupingMixin(
+    <T extends Constructor<PolymerElement>>(superClass: T): T&
+    Constructor<ItemMixinInterface> => {
+      class ItemMixin extends superClass {
+        /**
+         * @return The app or extension label depending on |type|.
+         */
+        appOrExtension(
+            type: chrome.developerPrivate.ExtensionType, appLabel: string,
+            extensionLabel: string): string {
+          const ExtensionType = chrome.developerPrivate.ExtensionType;
+          switch (type) {
+            case ExtensionType.HOSTED_APP:
+            case ExtensionType.LEGACY_PACKAGED_APP:
+            case ExtensionType.PLATFORM_APP:
+              return appLabel;
+            case ExtensionType.EXTENSION:
+            case ExtensionType.SHARED_MODULE:
+              return extensionLabel;
+          }
+          assertNotReached('Item type is not App or Extension.');
+          // Unreachable return to satisfy TS compiler.
+          return ExtensionType.EXTENSION;
+        }
+
+        /**
+         * @return The a11y association descriptor, e.g. "Related to <ext>".
+         */
+        a11yAssociation(name: string): string {
+          // Don't use I18nBehavior.i18n because of additional checks it
+          // performs. Polymer ensures that this string is not stamped into
+          // arbitrary HTML. `name` can contain any data including html tags,
+          // e.g. "My <video> download extension!"
+          return loadTimeData.getStringF('extensionA11yAssociation', name);
+        }
+      }
+
+      return ItemMixin;
+    });
+
+interface ItemMixinInterface {
+  appOrExtension(
+      type: chrome.developerPrivate.ExtensionType, appLabel: string,
+      extensionLabel: string): string;
+  a11yAssociation(name: string): string;
+}
diff --git a/chrome/browser/resources/extensions/keyboard_shortcuts.js b/chrome/browser/resources/extensions/keyboard_shortcuts.ts
similarity index 72%
rename from chrome/browser/resources/extensions/keyboard_shortcuts.js
rename to chrome/browser/resources/extensions/keyboard_shortcuts.ts
index d3a2bd93..5dc87d2 100644
--- a/chrome/browser/resources/extensions/keyboard_shortcuts.js
+++ b/chrome/browser/resources/extensions/keyboard_shortcuts.ts
@@ -13,15 +13,20 @@
 
 import {KeyboardShortcutDelegate} from './keyboard_shortcut_delegate.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- */
+/** Event interface for dom-repeat. */
+interface RepeaterEvent<T> extends CustomEvent {
+  model: {
+    get: (name: string) => T,
+    set: (name: string, val: T) => void,
+    index: number,
+  };
+}
+
 const ExtensionsKeyboardShortcutsElementBase =
-    mixinBehaviors([CrContainerShadowBehavior], PolymerElement);
+    mixinBehaviors([CrContainerShadowBehavior], PolymerElement) as
+    {new (): PolymerElement};
 
 // The UI to display and manage keyboard shortcuts set for extension commands.
-/** @polymer */
 class ExtensionsKeyboardShortcutsElement extends
     ExtensionsKeyboardShortcutsElementBase {
   static get is() {
@@ -34,15 +39,12 @@
 
   static get properties() {
     return {
-      /** @type {!KeyboardShortcutDelegate} */
       delegate: Object,
 
-      /** @type {Array<!chrome.developerPrivate.ExtensionInfo>} */
       items: Array,
 
       /**
        * Proxying the enum to be used easily by the html template.
-       * @private
        */
       CommandScope_: {
         type: Object,
@@ -51,22 +53,20 @@
     };
   }
 
+  delegate: KeyboardShortcutDelegate;
+  items: Array<chrome.developerPrivate.ExtensionInfo>;
+
   /** @override */
   ready() {
     super.ready();
     this.addEventListener('view-enter-start', this.onViewEnter_);
   }
 
-  /** @private */
-  onViewEnter_() {
+  private onViewEnter_() {
     chrome.metricsPrivate.recordUserAction('Options_ExtensionCommands');
   }
 
-  /**
-   * @return {!Array<!chrome.developerPrivate.ExtensionInfo>}
-   * @private
-   */
-  calculateShownItems_() {
+  private calculateShownItems_(): Array<chrome.developerPrivate.ExtensionInfo> {
     return this.items.filter(function(item) {
       return item.commands.length > 0;
     });
@@ -76,49 +76,37 @@
    * A polymer bug doesn't allow for databinding of a string property as a
    * boolean, but it is correctly interpreted from a function.
    * Bug: https://github.com/Polymer/polymer/issues/3669
-   * @param {string} keybinding
-   * @return {boolean}
-   * @private
    */
-  hasKeybinding_(keybinding) {
+  private hasKeybinding_(keybinding: string): boolean {
     return !!keybinding;
   }
 
   /**
    * Determines whether to disable the dropdown menu for the command's scope.
-   * @param {!chrome.developerPrivate.Command} command
-   * @return {boolean}
-   * @private
    */
-  computeScopeDisabled_(command) {
+  private computeScopeDisabled_(command: chrome.developerPrivate.Command):
+      boolean {
     return command.isExtensionAction || !command.isActive;
   }
 
   /**
    * This function exists to force trigger an update when CommandScope_
    * becomes available.
-   * @param {string} scope
-   * @return {string}
    */
-  triggerScopeChange_(scope) {
+  private triggerScopeChange_(scope: chrome.developerPrivate.CommandScope) {
     return scope;
   }
 
-  /** @private */
-  onCloseButtonClick_() {
+  private onCloseButtonClick_() {
     this.dispatchEvent(
         new CustomEvent('close', {bubbles: true, composed: true}));
   }
 
-  /**
-   * @param {!{target: HTMLSelectElement, model: Object}} event
-   * @private
-   */
-  onScopeChanged_(event) {
+  private onScopeChanged_(event: RepeaterEvent<string>) {
     this.delegate.updateExtensionCommandScope(
         event.model.get('item.id'), event.model.get('command.name'),
-        /** @type {chrome.developerPrivate.CommandScope} */
-        (event.target.value));
+        ((event.target as HTMLSelectElement).value as
+         chrome.developerPrivate.CommandScope));
   }
 }
 
diff --git a/chrome/browser/resources/extensions/kiosk_dialog.js b/chrome/browser/resources/extensions/kiosk_dialog.ts
similarity index 67%
rename from chrome/browser/resources/extensions/kiosk_dialog.js
rename to chrome/browser/resources/extensions/kiosk_dialog.ts
index c16366a..1f13f306 100644
--- a/chrome/browser/resources/extensions/kiosk_dialog.js
+++ b/chrome/browser/resources/extensions/kiosk_dialog.ts
@@ -10,22 +10,33 @@
 import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
 import 'chrome://resources/cr_elements/shared_style_css.m.js';
 
+import {CrCheckboxElement} from 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js';
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {KioskApp, KioskAppSettings, KioskBrowserProxy, KioskBrowserProxyImpl} from './kiosk_browser_proxy.js';
 
+interface ExtensionsKioskDialogElement {
+  $: {
+    bailout: CrCheckboxElement,
+    'confirm-dialog': CrDialogElement,
+    dialog: CrDialogElement,
+  };
+}
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {WebUIListenerBehaviorInterface}
- */
+/** Event interface for dom-repeat. */
+interface RepeaterEvent extends CustomEvent {
+  model: {
+    item: KioskApp,
+  };
+}
+
 const ExtensionsKioskDialogElementBase =
-    mixinBehaviors([WebUIListenerBehavior], PolymerElement);
+    mixinBehaviors([WebUIListenerBehavior], PolymerElement) as
+    {new (): PolymerElement & WebUIListenerBehavior};
 
-/** @polymer */
 class ExtensionsKioskDialogElement extends ExtensionsKioskDialogElementBase {
   static get is() {
     return 'extensions-kiosk-dialog';
@@ -37,38 +48,29 @@
 
   static get properties() {
     return {
-      /** @private {?string} */
       addAppInput_: {
         type: String,
         value: null,
       },
 
-      /** @private {!Array<!KioskApp>} */
       apps_: Array,
-
-      /** @private */
       bailoutDisabled_: Boolean,
-
-      /** @private */
       canEditAutoLaunch_: Boolean,
-
-      /** @private */
       canEditBailout_: Boolean,
-
-      /** @private {?string} */
       errorAppId_: String,
     };
   }
 
-  /** @override */
-  constructor() {
-    super();
+  private kioskBrowserProxy_: KioskBrowserProxy =
+      KioskBrowserProxyImpl.getInstance();
 
-    /** @private {!KioskBrowserProxy} */
-    this.kioskBrowserProxy_ = KioskBrowserProxyImpl.getInstance();
-  }
+  private addAppInput_: string|null;
+  private apps_: Array<KioskApp>;
+  private bailoutDisabled_: boolean;
+  private canEditAutoLaunch_: boolean;
+  private canEditBailout_: boolean;
+  private errorAppId_: string|null;
 
-  /** @override */
   connectedCallback() {
     super.connectedCallback();
 
@@ -87,60 +89,37 @@
     this.$.dialog.showModal();
   }
 
-  /**
-   * @param {!KioskAppSettings} settings
-   * @private
-   */
-  setSettings_(settings) {
+  private setSettings_(settings: KioskAppSettings) {
     this.apps_ = settings.apps;
     this.bailoutDisabled_ = settings.disableBailout;
     this.canEditBailout_ = settings.hasAutoLaunchApp;
   }
 
-  /**
-   * @param {!KioskApp} app
-   * @private
-   */
-  updateApp_(app) {
+  private updateApp_(app: KioskApp) {
     const index = this.apps_.findIndex(a => a.id === app.id);
     assert(index < this.apps_.length);
     this.set('apps_.' + index, app);
   }
 
-  /**
-   * @param {string} appId
-   * @private
-   */
-  showError_(appId) {
+  private showError_(appId: string) {
     this.errorAppId_ = appId;
   }
 
-  /**
-   * @param {string} errorMessage
-   * @return {string}
-   * @private
-   */
-  getErrorMessage_(errorMessage) {
+  private getErrorMessage_(errorMessage: string): string {
     return this.errorAppId_ + ' ' + errorMessage;
   }
 
-  /** @private */
-  onAddAppTap_() {
+  private onAddAppTap_() {
     assert(this.addAppInput_);
-    this.kioskBrowserProxy_.addKioskApp(this.addAppInput_);
+    this.kioskBrowserProxy_.addKioskApp(this.addAppInput_!);
     this.addAppInput_ = null;
   }
 
-  /** @private */
-  clearInputInvalid_() {
+  private clearInputInvalid_() {
     this.errorAppId_ = null;
   }
 
-  /**
-   * @param {{model: {item: !KioskApp}}} event
-   * @private
-   */
-  onAutoLaunchButtonTap_(event) {
+  private onAutoLaunchButtonTap_(event: RepeaterEvent) {
     const app = event.model.item;
     if (app.autoLaunch) {  // If the app is originally set to
                            // auto-launch.
@@ -150,11 +129,7 @@
     }
   }
 
-  /**
-   * @param {!Event} event
-   * @private
-   */
-  onBailoutChanged_(event) {
+  private onBailoutChanged_(event: Event) {
     event.preventDefault();
     if (this.$.bailout.checked) {
       this.$['confirm-dialog'].showModal();
@@ -164,47 +139,30 @@
     }
   }
 
-  /** @private */
-  onBailoutDialogCancelTap_() {
+  private onBailoutDialogCancelTap_() {
     this.$.bailout.checked = false;
     this.$['confirm-dialog'].cancel();
   }
 
-  /** @private */
-  onBailoutDialogConfirmTap_() {
+  private onBailoutDialogConfirmTap_() {
     this.kioskBrowserProxy_.setDisableBailoutShortcut(true);
     this.$['confirm-dialog'].close();
   }
 
-  /** @private */
-  onDoneTap_() {
+  private onDoneTap_() {
     this.$.dialog.close();
   }
 
-  /**
-   * @param {{model: {item: !KioskApp}}} event
-   * @private
-   */
-  onDeleteAppTap_(event) {
+  private onDeleteAppTap_(event: RepeaterEvent) {
     this.kioskBrowserProxy_.removeKioskApp(event.model.item.id);
   }
 
-  /**
-   * @param {boolean} autoLaunched
-   * @param {string} disableStr
-   * @param {string} enableStr
-   * @return {string}
-   * @private
-   */
-  getAutoLaunchButtonLabel_(autoLaunched, disableStr, enableStr) {
+  private getAutoLaunchButtonLabel_(
+      autoLaunched: boolean, disableStr: string, enableStr: string): string {
     return autoLaunched ? disableStr : enableStr;
   }
 
-  /**
-   * @param {!Event} e
-   * @private
-   */
-  stopPropagation_(e) {
+  private stopPropagation_(e: Event) {
     e.stopPropagation();
   }
 }
diff --git a/chrome/browser/resources/extensions/options_dialog.js b/chrome/browser/resources/extensions/options_dialog.ts
similarity index 67%
rename from chrome/browser/resources/extensions/options_dialog.js
rename to chrome/browser/resources/extensions/options_dialog.ts
index a0d1aa2..3d08a8e 100644
--- a/chrome/browser/resources/extensions/options_dialog.js
+++ b/chrome/browser/resources/extensions/options_dialog.ts
@@ -4,21 +4,22 @@
 
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
 import {Debouncer, html, PolymerElement, timeOut} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {navigation, Page} from './navigation_helper.js';
 
 /**
- * @return {!Promise} A signal that the document is ready. Need to wait for
- *     this, otherwise the custom ExtensionOptions element might not have been
- *     registered yet.
+ * @return A signal that the document is ready. Need to wait for this, otherwise
+ *     the custom ExtensionOptions element might not have been registered yet.
  */
-function whenDocumentReady() {
+function whenDocumentReady(): Promise<void> {
   if (document.readyState === 'complete') {
     return Promise.resolve();
   }
 
-  return new Promise(function(resolve) {
+  return new Promise<void>(function(resolve) {
     document.addEventListener('readystatechange', function f() {
       if (document.readyState === 'complete') {
         document.removeEventListener('readystatechange', f);
@@ -34,6 +35,13 @@
 // The maximum height in pixels for the options dialog.
 export const OptionsDialogMaxHeight = 640;
 
+interface ExtensionsOptionsDialogElement {
+  $: {
+    body: HTMLElement,
+    dialog: CrDialogElement,
+  };
+}
+
 /** @polymer */
 class ExtensionsOptionsDialogElement extends PolymerElement {
   static get is() {
@@ -46,26 +54,16 @@
 
   static get properties() {
     return {
-      /** @private {Object} */
       extensionOptions_: Object,
-
-      /** @private {chrome.developerPrivate.ExtensionInfo} */
       data_: Object,
     };
   }
 
-  constructor() {
-    super();
-
-    /** @private {?Function} */
-    this.boundUpdateDialogSize_ = null;
-
-    /** @private {?{height: number, width: number}} */
-    this.preferredSize_ = null;
-
-    /** @private {Debouncer} */
-    this.debouncer_;
-  }
+  private extensionOptions_: any;
+  private data_: chrome.developerPrivate.ExtensionInfo;
+  private preferredSize_: {height: number, width: number}|null = null;
+  private debouncer_: Debouncer|null = null;
+  private eventTracker_: EventTracker = new EventTracker();
 
   get open() {
     return this.$.dialog.open;
@@ -74,24 +72,22 @@
   /**
    * Resizes the dialog to the width/height stored in |preferredSize_|, taking
    * into account the window width/height.
-   * @private
    */
-  updateDialogSize_() {
+  private updateDialogSize_() {
     const headerHeight = this.$.body.offsetTop;
     const maxHeight =
         Math.min(0.9 * window.innerHeight, OptionsDialogMaxHeight);
     const effectiveHeight =
-        Math.min(maxHeight, headerHeight + this.preferredSize_.height);
+        Math.min(maxHeight, headerHeight + this.preferredSize_!.height);
     const effectiveWidth =
-        Math.max(OptionsDialogMinWidth, this.preferredSize_.width);
+        Math.max(OptionsDialogMinWidth, this.preferredSize_!.width);
 
     this.$.dialog.style.setProperty('--dialog-height', `${effectiveHeight}px`);
     this.$.dialog.style.setProperty('--dialog-width', `${effectiveWidth}px`);
     this.$.dialog.style.setProperty('--dialog-opacity', '1');
   }
 
-  /** @param {chrome.developerPrivate.ExtensionInfo} data */
-  show(data) {
+  show(data: chrome.developerPrivate.ExtensionInfo) {
     this.data_ = data;
     whenDocumentReady().then(() => {
       if (!this.extensionOptions_) {
@@ -101,31 +97,26 @@
       this.extensionOptions_.onclose = () => this.$.dialog.close();
 
       const boundUpdateDialogSize = this.updateDialogSize_.bind(this);
-      this.boundUpdateDialogSize_ = boundUpdateDialogSize;
-      this.extensionOptions_.onpreferredsizechanged = e => {
-        if (!this.$.dialog.open) {
-          this.$.dialog.showModal();
-        }
-        this.preferredSize_ = e;
-        this.debouncer_ = Debouncer.debounce(
-            this.debouncer_, timeOut.after(50), boundUpdateDialogSize);
-      };
+      this.extensionOptions_.onpreferredsizechanged =
+          (e: {height: number, width: number}) => {
+            if (!this.$.dialog.open) {
+              this.$.dialog.showModal();
+            }
+            this.preferredSize_ = e;
+            this.debouncer_ = Debouncer.debounce(
+                this.debouncer_, timeOut.after(50), boundUpdateDialogSize);
+          };
 
       // Add a 'resize' such that the dialog is resized when window size
       // changes.
-      window.addEventListener('resize', this.boundUpdateDialogSize_);
+      this.eventTracker_.add(window, 'resize', boundUpdateDialogSize);
       this.$.body.appendChild(/** @type {Node} */ (this.extensionOptions_));
     });
   }
 
-  /** @private */
-  onClose_() {
+  private onClose_() {
     this.extensionOptions_.onpreferredsizechanged = null;
-
-    if (this.boundUpdateDialogSize_) {
-      window.removeEventListener('resize', this.boundUpdateDialogSize_);
-      this.boundUpdateDialogSize_ = null;
-    }
+    this.eventTracker_.removeAll();
 
     const currentPage = navigation.getCurrentPage();
     // We update the page when the options dialog closes, but only if we're
diff --git a/chrome/browser/resources/extensions/pack_dialog.js b/chrome/browser/resources/extensions/pack_dialog.ts
similarity index 62%
rename from chrome/browser/resources/extensions/pack_dialog.js
rename to chrome/browser/resources/extensions/pack_dialog.ts
index 34030506..8f547a8e 100644
--- a/chrome/browser/resources/extensions/pack_dialog.js
+++ b/chrome/browser/resources/extensions/pack_dialog.ts
@@ -10,36 +10,36 @@
 import './pack_dialog_alert.js';
 import './strings.m.js';
 
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-/** @interface */
-export class PackDialogDelegate {
+export interface PackDialogDelegate {
   /**
    * Opens a file browser for the user to select the root directory.
-   * @return {Promise<string>} A promise that is resolved with the path the
-   *     user selected.
+   * @return A promise that is resolved with the path the user selected.
    */
-  choosePackRootDirectory() {}
+  choosePackRootDirectory(): Promise<string>;
 
   /**
    * Opens a file browser for the user to select the private key file.
-   * @return {Promise<string>} A promise that is resolved with the path the
-   *     user selected.
+   * @return A promise that is resolved with the path the user selected.
    */
-  choosePrivateKeyPath() {}
+  choosePrivateKeyPath(): Promise<string>;
 
-  /**
-   * Packs the extension into a .crx.
-   * @param {string} rootPath
-   * @param {string} keyPath
-   * @param {number=} flag
-   * @param {function(chrome.developerPrivate.PackDirectoryResponse)=}
-   *     callback
-   */
-  packExtension(rootPath, keyPath, flag, callback) {}
+  /** Packs the extension into a .crx. */
+  packExtension(
+      rootPath: string, keyPath: string, flag?: number,
+      callback?:
+          (response: chrome.developerPrivate.PackDirectoryResponse) => void):
+      void;
 }
 
-/** @polymer */
+interface ExtensionsPackDialogElement {
+  $: {
+    dialog: CrDialogElement,
+  };
+}
+
 class ExtensionsPackDialogElement extends PolymerElement {
   static get is() {
     return 'extensions-pack-dialog';
@@ -51,31 +51,30 @@
 
   static get properties() {
     return {
-      /** @type {PackDialogDelegate} */
       delegate: Object,
 
-      /** @private */
       packDirectory_: {
         type: String,
         value: '',  // Initialized to trigger binding when attached.
       },
 
-      /** @private */
       keyFile_: String,
-
-      /** @private {?chrome.developerPrivate.PackDirectoryResponse} */
       lastResponse_: Object,
     };
   }
 
+  delegate: PackDialogDelegate;
+  private packDirectory_: string;
+  private keyFile_: string;
+  private lastResponse_: chrome.developerPrivate.PackDirectoryResponse|null;
+
   /** @override */
   connectedCallback() {
     super.connectedCallback();
     this.$.dialog.showModal();
   }
 
-  /** @private */
-  onRootBrowse_() {
+  private onRootBrowse_() {
     this.delegate.choosePackRootDirectory().then(path => {
       if (path) {
         this.set('packDirectory_', path);
@@ -83,8 +82,7 @@
     });
   }
 
-  /** @private */
-  onKeyBrowse_() {
+  private onKeyBrowse_() {
     this.delegate.choosePrivateKeyPath().then(path => {
       if (path) {
         this.set('keyFile_', path);
@@ -92,23 +90,20 @@
     });
   }
 
-  /** @private */
-  onCancelTap_() {
+  private onCancelTap_() {
     this.$.dialog.cancel();
   }
 
-  /** @private */
-  onConfirmTap_() {
+  private onConfirmTap_() {
     this.delegate.packExtension(
         this.packDirectory_, this.keyFile_, 0, this.onPackResponse_.bind(this));
   }
 
   /**
-   * @param {chrome.developerPrivate.PackDirectoryResponse} response the
-   *    response from request to pack an extension.
-   * @private
+   * @param response The response from request to pack an extension.
    */
-  onPackResponse_(response) {
+  private onPackResponse_(response:
+                              chrome.developerPrivate.PackDirectoryResponse) {
     this.lastResponse_ = response;
   }
 
@@ -117,24 +112,23 @@
    * pack-dialog should close. Otherwise, we detach the alert by setting
    * lastResponse_ null. Additionally, if the user selected "proceed anyway"
    * in the dialog, we pack the extension again with override flags.
-   * @param {!Event} e
-   * @private
    */
-  onAlertClose_(e) {
+  private onAlertClose_(e: Event) {
     e.stopPropagation();
 
-    if (this.lastResponse_.status ===
+    if (this.lastResponse_!.status ===
         chrome.developerPrivate.PackStatus.SUCCESS) {
       this.$.dialog.close();
       return;
     }
 
     // This is only possible for a warning dialog.
-    if (this.shadowRoot.querySelector('extensions-pack-dialog-alert')
-            .returnValue === 'success') {
+    if (this.shadowRoot!.querySelector(
+                            'extensions-pack-dialog-alert')!.returnValue ===
+        'success') {
       this.delegate.packExtension(
-          this.lastResponse_.item_path, this.lastResponse_.pem_path,
-          this.lastResponse_.override_flags, this.onPackResponse_.bind(this));
+          this.lastResponse_!.item_path, this.lastResponse_!.pem_path,
+          this.lastResponse_!.override_flags, this.onPackResponse_.bind(this));
     }
 
     this.lastResponse_ = null;
diff --git a/chrome/browser/resources/extensions/pack_dialog_alert.js b/chrome/browser/resources/extensions/pack_dialog_alert.ts
similarity index 75%
rename from chrome/browser/resources/extensions/pack_dialog_alert.js
rename to chrome/browser/resources/extensions/pack_dialog_alert.ts
index bb73b52..50e17f7 100644
--- a/chrome/browser/resources/extensions/pack_dialog_alert.js
+++ b/chrome/browser/resources/extensions/pack_dialog_alert.ts
@@ -5,11 +5,18 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 import 'chrome://resources/cr_elements/shared_style_css.m.js';
+
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-/** @polymer */
+interface ExtensionsPackDialogAlertElement {
+  $: {
+    dialog: CrDialogElement,
+  };
+}
+
 class ExtensionsPackDialogAlertElement extends PolymerElement {
   static get is() {
     return 'extensions-pack-dialog-alert';
@@ -21,34 +28,23 @@
 
   static get properties() {
     return {
-      /** @private {chrome.developerPrivate.PackDirectoryResponse} */
       model: Object,
-
-      /** @private */
       title_: String,
-
-      /** @private */
       message_: String,
-
-      /** @private {?string} */
       cancelLabel_: String,
-
-      /**
-       * This needs to be initialized to trigger data-binding.
-       * @private {?string}
-       */
-      confirmLabel_: {
-        type: String,
-        value: '',
-      }
+      confirmLabel_: String,
     };
   }
 
-  /** @return {string} */
-  get returnValue() {
-    return /** @type {!CrDialogElement} */ (this.$.dialog)
-        .getNative()
-        .returnValue;
+  private title_: string;
+  private message_: string;
+  private cancelLabel_: string|null = null;
+  /** This needs to be initialized to trigger data-binding. */
+  private confirmLabel_: string|null = '';
+  model: chrome.developerPrivate.PackDirectoryResponse;
+
+  get returnValue(): string {
+    return this.$.dialog.getNative().returnValue;
   }
 
   /** @override */
@@ -85,26 +81,26 @@
     this.$.dialog.showModal();
   }
 
-  /**
-   * @return {string}
-   * @private
-   */
-  getCancelButtonClass_() {
+  private getCancelButtonClass_(): string {
     return this.confirmLabel_ ? 'cancel-button' : 'action-button';
   }
 
-  /** @private */
-  onCancelTap_() {
+  private onCancelTap_() {
     this.$.dialog.cancel();
   }
 
-  /** @private */
-  onConfirmTap_() {
+  private onConfirmTap_() {
     // The confirm button should only be available in WARNING state.
     assert(this.model.status === chrome.developerPrivate.PackStatus.WARNING);
     this.$.dialog.close();
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'extensions-pack-dialog-alert': ExtensionsPackDialogAlertElement;
+  }
+}
+
 customElements.define(
     ExtensionsPackDialogAlertElement.is, ExtensionsPackDialogAlertElement);
diff --git a/chrome/browser/resources/extensions/runtime_hosts_dialog.js b/chrome/browser/resources/extensions/runtime_hosts_dialog.ts
similarity index 85%
rename from chrome/browser/resources/extensions/runtime_hosts_dialog.js
rename to chrome/browser/resources/extensions/runtime_hosts_dialog.ts
index 23fcf10..611441f 100644
--- a/chrome/browser/resources/extensions/runtime_hosts_dialog.js
+++ b/chrome/browser/resources/extensions/runtime_hosts_dialog.ts
@@ -8,6 +8,7 @@
 import 'chrome://resources/cr_elements/shared_style_css.m.js';
 import './strings.m.js';
 
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -37,8 +38,8 @@
     '(\\/\\*|\\/)?' +
     '$');
 
-export function getPatternFromSite(site) {
-  const res = patternRegExp.exec(site);
+export function getPatternFromSite(site: string): string {
+  const res = patternRegExp.exec(site)!;
   assert(res);
   const scheme = res[1] || '*://';
   const host = (res[3] || '') + res[4];
@@ -47,7 +48,12 @@
   return scheme + host + port + path;
 }
 
-/** @polymer */
+interface ExtensionsRuntimeHostsDialogElement {
+  $: {
+    dialog: CrDialogElement,
+  };
+}
+
 class ExtensionsRuntimeHostsDialogElement extends PolymerElement {
   static get is() {
     return 'extensions-runtime-hosts-dialog';
@@ -59,16 +65,13 @@
 
   static get properties() {
     return {
-      /** @type {!ItemDelegate} */
       delegate: Object,
 
-      /** @type {string} */
       itemId: String,
 
       /**
        * The site that this entry is currently managing. Only non-empty if this
        * is for editing an existing entry.
-       * @type {?string}
        */
       currentSite: {
         type: String,
@@ -84,16 +87,10 @@
         value: false,
       },
 
-      /**
-       * The site to add an exception for.
-       * @private
-       */
+      /** The site to add an exception for. */
       site_: String,
 
-      /**
-       * Whether the currently-entered input is valid.
-       * @private
-       */
+      /** Whether the currently-entered input is valid. */
       inputInvalid_: {
         type: Boolean,
         value: false,
@@ -101,6 +98,13 @@
     };
   }
 
+  delegate: ItemDelegate;
+  itemId: string;
+  currentSite: string|null;
+  updateHostAccess: boolean;
+  private site_: string;
+  private inputInvalid_: boolean;
+
   /** @override */
   connectedCallback() {
     super.connectedCallback();
@@ -112,16 +116,14 @@
     this.$.dialog.showModal();
   }
 
-  /** @return {boolean} */
-  isOpen() {
+  isOpen(): boolean {
     return this.$.dialog.open;
   }
 
   /**
    * Validates that the pattern entered is valid.
-   * @private
    */
-  validate_() {
+  private validate_() {
     // If input is empty, disable the action button, but don't show the red
     // invalid message.
     if (this.site_.trim().length === 0) {
@@ -133,45 +135,31 @@
     this.inputInvalid_ = !valid;
   }
 
-  /**
-   * @return {string}
-   * @private
-   */
-  computeDialogTitle_() {
+  private computeDialogTitle_(): string {
     const stringId = this.currentSite === null ? 'runtimeHostsDialogTitle' :
                                                  'hostPermissionsEdit';
     return loadTimeData.getString(stringId);
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  computeSubmitButtonDisabled_() {
+  private computeSubmitButtonDisabled_(): boolean {
     return this.inputInvalid_ || this.site_ === undefined ||
         this.site_.trim().length === 0;
   }
 
-  /**
-   * @return {string}
-   * @private
-   */
-  computeSubmitButtonLabel_() {
+  private computeSubmitButtonLabel_(): string {
     const stringId = this.currentSite === null ? 'add' : 'save';
     return loadTimeData.getString(stringId);
   }
 
-  /** @private */
-  onCancelTap_() {
+  private onCancelTap_() {
     this.$.dialog.cancel();
   }
 
   /**
    * The tap handler for the submit button (adds the pattern and closes
    * the dialog).
-   * @private
    */
-  onSubmitTap_() {
+  private onSubmitTap_() {
     chrome.metricsPrivate.recordUserAction(
         'Extensions.Settings.Hosts.AddHostDialogSubmitted');
     if (this.currentSite !== null) {
@@ -183,9 +171,8 @@
 
   /**
    * Handles adding a new site entry.
-   * @private
    */
-  handleAdd_() {
+  private handleAdd_() {
     assert(!this.currentSite);
 
     if (this.updateHostAccess) {
@@ -198,9 +185,8 @@
 
   /**
    * Handles editing an existing site entry.
-   * @private
    */
-  handleEdit_() {
+  private handleEdit_() {
     assert(this.currentSite);
     assert(
         !this.updateHostAccess,
@@ -215,7 +201,7 @@
 
     // Editing an existing entry is done by removing the current site entry,
     // and then adding the new one.
-    this.delegate.removeRuntimeHostPermission(this.itemId, this.currentSite)
+    this.delegate.removeRuntimeHostPermission(this.itemId, this.currentSite!)
         .then(() => {
           this.addPermission_();
         });
@@ -224,9 +210,8 @@
   /**
    * Adds the runtime host permission through the delegate. If successful,
    * closes the dialog; otherwise displays the invalid input message.
-   * @private
    */
-  addPermission_() {
+  private addPermission_() {
     const pattern = getPatternFromSite(this.site_);
     this.delegate.addRuntimeHostPermission(this.itemId, pattern)
         .then(
diff --git a/chrome/browser/resources/extensions/service.ts b/chrome/browser/resources/extensions/service.ts
index 85438ac..3db2c6d 100644
--- a/chrome/browser/resources/extensions/service.ts
+++ b/chrome/browser/resources/extensions/service.ts
@@ -21,10 +21,9 @@
  * @implements {ErrorPageDelegate}
  * @implements {ItemDelegate}
  * @implements {LoadErrorDelegate}
- * @implements {PackDialogDelegate}
  * @implements {ToolbarDelegate}
  */
-export class Service implements KeyboardShortcutDelegate {
+export class Service implements KeyboardShortcutDelegate, PackDialogDelegate {
   private isDeleting_: boolean = false;
   private eventsToIgnoreOnce_: Set<string> = new Set();
 
diff --git a/chrome/browser/resources/extensions/sidebar.js b/chrome/browser/resources/extensions/sidebar.ts
similarity index 79%
rename from chrome/browser/resources/extensions/sidebar.js
rename to chrome/browser/resources/extensions/sidebar.ts
index 6a1b15e..33ff16a 100644
--- a/chrome/browser/resources/extensions/sidebar.js
+++ b/chrome/browser/resources/extensions/sidebar.ts
@@ -7,11 +7,17 @@
 import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
 
 import {assert} from 'chrome://resources/js/assert.m.js';
+import {IronSelectorElement} from 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {navigation, Page} from './navigation_helper.js';
 
-/** @polymer */
+interface ExtensionsSidebarElement {
+  $: {
+    sectionMenu: IronSelectorElement,
+  };
+}
+
 class ExtensionsSidebarElement extends PolymerElement {
   static get is() {
     return 'extensions-sidebar';
@@ -21,13 +27,11 @@
     return html`{__html_template__}`;
   }
 
-  /** @override */
   ready() {
     super.ready();
     this.setAttribute('role', 'navigation');
   }
 
-  /** @override */
   connectedCallback() {
     super.connectedCallback();
 
@@ -35,19 +39,15 @@
         navigation.getCurrentPage().page === Page.SHORTCUTS ? 1 : 0);
   }
 
-  /**
-   * @param {!Event} e
-   * @private
-   */
-  onLinkTap_(e) {
+  private onLinkTap_(e: Event) {
     e.preventDefault();
-    navigation.navigateTo({page: e.target.dataset.path});
+    navigation.navigateTo(
+        {page: ((e.target as HTMLElement).dataset['path'] as Page)});
     this.dispatchEvent(
         new CustomEvent('close-drawer', {bubbles: true, composed: true}));
   }
 
-  /** @private */
-  onMoreExtensionsTap_() {
+  private onMoreExtensionsTap_() {
     chrome.metricsPrivate.recordUserAction('Options_GetMoreExtensions');
   }
 }
diff --git a/chrome/browser/resources/extensions/toggle_row.js b/chrome/browser/resources/extensions/toggle_row.ts
similarity index 79%
rename from chrome/browser/resources/extensions/toggle_row.js
rename to chrome/browser/resources/extensions/toggle_row.ts
index f8f5476..c44f000 100644
--- a/chrome/browser/resources/extensions/toggle_row.js
+++ b/chrome/browser/resources/extensions/toggle_row.ts
@@ -5,6 +5,7 @@
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
 import 'chrome://resources/cr_elements/shared_style_css.m.js';
 
+import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 
@@ -14,7 +15,14 @@
  * a hidden native <input type="checkbox"> to achieve this.
  */
 
-/** @polymer */
+interface ExtensionsToggleRowElement {
+  $: {
+    crToggle: CrToggleElement,
+    label: HTMLLabelElement,
+    native: HTMLInputElement,
+  };
+}
+
 class ExtensionsToggleRowElement extends PolymerElement {
   static get is() {
     return 'extensions-toggle-row';
@@ -32,12 +40,10 @@
     };
   }
 
-  /**
-   * @param {string} eventName
-   * @param {*=} detail
-   * @private
-   */
-  fire_(eventName, detail) {
+  checked: boolean;
+  disabled: boolean;
+
+  private fire_(eventName: string, detail?: any) {
     this.dispatchEvent(
         new CustomEvent(eventName, {bubbles: true, composed: true, detail}));
   }
@@ -45,17 +51,12 @@
   /**
    * Exposing the clickable part of extensions-toggle-row for testing
    * purposes.
-   * @return {!HTMLElement}
    */
-  getLabel() {
-    return /** @type {!HTMLElement} */ (this.$.label);
+  getLabel(): HTMLElement {
+    return this.$.label;
   }
 
-  /**
-   * @param {!Event} e
-   * @private
-   */
-  onNativeClick_(e) {
+  private onNativeClick_(e: Event) {
     // Even though the native checkbox is hidden and can't be actually
     // cilcked/tapped by the user, because it resides within the <label> the
     // browser emits an extraneous event when the label is clicked. Stop
@@ -66,10 +67,8 @@
   /**
    * Fires when the native checkbox changes value. This happens when the user
    * clicks directly on the <label>.
-   * @param {!Event} e
-   * @private
    */
-  onNativeChange_(e) {
+  private onNativeChange_(e: Event) {
     e.stopPropagation();
 
     // Sync value of native checkbox and cr-toggle and |checked|.
@@ -79,11 +78,7 @@
     this.fire_('change', this.checked);
   }
 
-  /**
-   * @param {!CustomEvent<boolean>} e
-   * @private
-   */
-  onCrToggleChange_(e) {
+  private onCrToggleChange_(e: CustomEvent<boolean>) {
     e.stopPropagation();
 
     // Sync value of native checkbox and cr-toggle.
diff --git a/chrome/browser/resources/read_later/app.html b/chrome/browser/resources/read_later/app.html
index bcaade63..c4ba3d6 100644
--- a/chrome/browser/resources/read_later/app.html
+++ b/chrome/browser/resources/read_later/app.html
@@ -63,12 +63,12 @@
   :host([side-panel]) .sub-heading {
     border: none;
     font-weight: 600;
-    height: 20px;
+    height: 28px;
     margin: 0;
     padding: 8px 16px;
   }
 
-  :host([side-panel]) #ureadItemsList + .sub-heading {
+  :host([side-panel]) .hr {
     border-top: 1px solid #dbdbdb;
     margin-block-start: 8px;
   }
@@ -111,6 +111,8 @@
           data="[[item]]" button-ripples="[[buttonRipples]]" tabindex="0">
       </read-later-item>
     </template>
+    <div class="hr" hidden$="[[!shouldShowHr_(unreadItems_, readItems_)]]">
+    </div>
     <div hidden="[[!readItems_.length]]" class="sub-heading">
       $i18n{readHeader}
     </div>
diff --git a/chrome/browser/resources/read_later/app.js b/chrome/browser/resources/read_later/app.js
index d3632c8..69050a6 100644
--- a/chrome/browser/resources/read_later/app.js
+++ b/chrome/browser/resources/read_later/app.js
@@ -196,6 +196,14 @@
     e.stopPropagation();
     this.apiProxy_.closeUI();
   }
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  shouldShowHr_() {
+    return this.unreadItems_.length > 0 && this.readItems_.length > 0;
+  }
 }
 
 customElements.define(ReadLaterAppElement.is, ReadLaterAppElement);
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 415f02bd..fb799f4 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -442,6 +442,7 @@
     "chromeos/os_printing_page/cups_printers.js",
     "chromeos/os_printing_page/cups_printers_entry.js",
     "chromeos/os_printing_page/cups_saved_printers.js",
+    "chromeos/os_printing_page/cups_enterprise_printers.js",
     "chromeos/os_printing_page/cups_settings_add_printer_dialog.js",
     "chromeos/os_printing_page/os_printing_page.js",
     "chromeos/os_privacy_page/os_privacy_page.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_page_visibility.js b/chrome/browser/resources/settings/chromeos/os_page_visibility.js
index ab2b5d4..5353110 100644
--- a/chrome/browser/resources/settings/chromeos/os_page_visibility.js
+++ b/chrome/browser/resources/settings/chromeos/os_page_visibility.js
@@ -86,9 +86,6 @@
       loadTimeData.getBoolean('isAccountManagerEnabled');
   const isKerberosEnabled = loadTimeData.valueExists('isKerberosEnabled') &&
       loadTimeData.getBoolean('isKerberosEnabled');
-  const isKerberosSettingsSectionEnabled =
-      loadTimeData.valueExists('isKerberosSettingsSectionEnabled') &&
-      loadTimeData.getBoolean('isKerberosSettingsSectionEnabled');
 
   if (loadTimeData.getBoolean('isGuest')) {
     osPageVisibility = {
@@ -97,7 +94,7 @@
       multidevice: false,
       autofill: false,
       people: false,
-      kerberos: isKerberosEnabled && isKerberosSettingsSectionEnabled,
+      kerberos: isKerberosEnabled,
       onStartup: false,
       reset: false,
       appearance: {
@@ -139,7 +136,7 @@
         googleAccounts: isAccountManagerEnabled,
         manageUsers: true,
       },
-      kerberos: isKerberosEnabled && isKerberosSettingsSectionEnabled,
+      kerberos: isKerberosEnabled,
       onStartup: true,
       reset: true,
       appearance: {
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
index af19b7c..8b272dae 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
@@ -15,6 +15,7 @@
     ":cups_add_printer_manually_dialog",
     ":cups_add_printer_manufacturer_model_dialog",
     ":cups_edit_printer_dialog",
+    ":cups_enterprise_printers",
     ":cups_nearby_printers",
     ":cups_printer_dialog_error",
     ":cups_printer_dialog_util",
@@ -70,13 +71,20 @@
 }
 
 js_library("cups_edit_printer_dialog") {
-  deps = [ ":cups_printer_dialog_util" ]
+  deps = [
+    ":cups_printer_dialog_util",
+    "//ui/webui/resources/js:i18n_behavior.m",
+  ]
 }
 
 js_library("cups_nearby_printers") {
   deps = [ ":cups_printer_dialog_util" ]
 }
 
+js_library("cups_enterprise_printers") {
+  deps = [ ":cups_printer_dialog_util" ]
+}
+
 js_library("cups_printer_dialog_util") {
   deps = [
     ":cups_printer_types",
@@ -167,6 +175,7 @@
     "cups_printers.js",
     "cups_printers_entry.js",
     "cups_saved_printers.js",
+    "cups_enterprise_printers.js",
     "os_printing_page.js",
     "cups_printer_shared_css.js",
   ]
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.html
index 1ead9890..2ff34442 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.html
@@ -1,6 +1,11 @@
 <style include="cr-shared-style cups-printer-shared"></style>
 <add-printer-dialog>
-  <div slot="dialog-title">$i18n{editPrinterDialogTitle}
+  <div slot="dialog-title">
+    <iron-icon
+      hidden="[[!pendingPrinter_.isManaged]]"
+      icon="cr20:domain">
+    </iron-icon>
+    [[getDialogTitle_(pendingPrinter_.isManaged)]]
     <printer-dialog-error error-text="[[errorText_]]">
     </printer-dialog-error>
   </div>
@@ -12,6 +17,7 @@
           on-input="onPrinterInfoChange_"
           label="$i18n{printerName}"
           aria-label="$i18n{printerName}"
+          readonly="[[pendingPrinter_.isManaged]]"
           maxlength=64>
       </cr-input>
     </div>
@@ -24,7 +30,8 @@
           disabled="[[!isInputFieldEnabled_(networkProtocolActive_,
               pendingPrinter_.printServerUri)]]"
           maxlength=63
-          readonly="[[!isOnline_]]">
+          readonly="[[isInputFieldReadonly_(pendingPrinter_.isManaged,
+              isOnline_)]]">
       </cr-input>
     </div>
     <div class="settings-box two-line">
@@ -39,7 +46,9 @@
               on-change="onProtocolChange_"
               disabled="[[!protocolSelectEnabled_(
                   networkProtocolActive_,
-                  pendingPrinter_.printServerUri)]]">
+                  pendingPrinter_.printServerUri,
+                  pendingPrinter_.isManaged,
+                  isOnline_)]]">
             <option value="ipp">
               $i18n{printerProtocolIpp}
             </option>
@@ -80,7 +89,8 @@
           maxlength=64
           disabled="[[!isInputFieldEnabled_(networkProtocolActive_,
               pendingPrinter_.printServerUri)]]"
-          readonly="[[!isOnline_]]">
+          readonly="[[isInputFieldReadonly_(pendingPrinter_.isManaged,
+              isOnline_)]]">
       </cr-input>
     </div>
     <div class="settings-box two-line">
@@ -88,7 +98,8 @@
           aria-label="$i18n{printerURI}"
           value="[[getPrinterURI_(pendingPrinter_)]]"
           disabled="[[!isInputFieldEnabled_(networkProtocolActive_,
-              pendingPrinter_.printServerUri)]]">
+              pendingPrinter_.printServerUri)]]"
+          readonly="[[pendingPrinter_.isManaged]]">
       </cr-input>
     </div>
     <template id="makeAndModelSection" is="dom-if"
@@ -99,7 +110,8 @@
             label="$i18n{printerManufacturer}"
             aria-label="$i18n{printerManufacturer}"
             value="{{pendingPrinter_.ppdManufacturer}}"
-            readonly="[[!isOnline_]]"
+            readonly="[[isInputFieldReadonly_(pendingPrinter_.isManaged,
+                isOnline_)]]"
             invalid="{{isManufacturerInvalid_}}">
         </cr-searchable-drop-down>
       </div>
@@ -108,16 +120,19 @@
             id="printerPPDModel"
             label="$i18n{printerModel}"
             value="{{pendingPrinter_.ppdModel}}"
-            readonly="[[!isOnline_]]"
+            readonly="[[isInputFieldReadonly_(pendingPrinter_.isManaged,
+                isOnline_)]]"
             invalid="{{isModelInvalid_}}">
         </cr-searchable-drop-down>
       </div>
-      <div id="ppdLabel" class="cr-form-field-label">
+      <div id="ppdLabel" class="cr-form-field-label"
+           hidden="[[pendingPrinter_.isManaged]]">
         <settings-localized-link localized-string="$i18n{selectDriver}"
             link-url="$i18n{printingCUPSPrintPpdLearnMoreUrl}">
         </settings-localized-link>
       </div>
-      <div class="settings-box two-line">
+      <div class="settings-box two-line"
+           hidden="[[pendingPrinter_.isManaged]]">
         <cr-input class="browse-file-input" readonly tabindex="-1"
             value="[[userPPD_]]" aria-labelledby="ppdLabel"
             error-message="$i18n{selectDriverErrorMessage}"
@@ -138,15 +153,21 @@
       </div>
     </div>
     <div>
-      <cr-button class="cancel-button" on-click="onCancelTap_">
+      <cr-button class="cancel-button" on-click="onCancelTap_"
+          hidden="[[pendingPrinter_.isManaged]]">
         $i18n{cancel}
       </cr-button>
       <cr-button class="action-button" on-click="onSaveTap_"
           disabled="[[!canSavePrinter_(pendingPrinter_.*,
               printerInfoChanged_,
-              isOnline_, isManufacturerInvalid_, isModelInvalid_)]]">
+              isOnline_, isManufacturerInvalid_, isModelInvalid_)]]"
+              hidden="[[pendingPrinter_.isManaged]]">
         $i18n{editPrinterButtonText}
       </cr-button>
+      <cr-button class="close-button" on-click="onCancelTap_"
+       hidden="[[!pendingPrinter_.isManaged]]">
+       $i18n{close}
+      </cr-button>
     </div>
   </div>
 </add-printer-dialog>
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
index 90fe23f..ad76885 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
@@ -11,6 +11,7 @@
 import '//resources/cr_elements/cr_input/cr_input.m.js';
 import '//resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.m.js';
 import '//resources/cr_elements/shared_style_css.m.js';
+import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 import '../localized_link/localized_link.js';
 import './cups_add_printer_dialog.js';
 import './cups_printer_dialog_error.js';
@@ -22,6 +23,8 @@
 import {CrScrollableBehavior} from '//resources/cr_elements/cr_scrollable_behavior.m.js';
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
+
 import {loadTimeData} from '../../i18n_setup.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 
@@ -33,6 +36,7 @@
   is: 'settings-cups-edit-printer-dialog',
 
   behaviors: [
+    I18nBehavior,
     NetworkListenerBehavior,
   ],
 
@@ -280,6 +284,16 @@
   },
 
   /**
+   * @return {string} The i18n string for the dialog title.
+   * @private
+   */
+  getDialogTitle_() {
+    return this.pendingPrinter_.isManaged ?
+        this.i18n('viewPrinterDialogTitle') :
+        this.i18n('editPrinterDialogTitle');
+  },
+
+  /**
    * @param {!CupsPrinterInfo} printer
    * @return {string} The printer's URI that displays in the UI
    * @private
@@ -500,10 +514,17 @@
    * @private
    */
   protocolSelectEnabled_() {
-    // Print server printer's protocol should not be editable; disable the
-    // drop down if the printer is from a print server.
-    if (this.pendingPrinter_.printServerUri) {
-      return false;
+    if (this.pendingPrinter_) {
+      // Print server printer's protocol should not be editable; disable the
+      // drop down if the printer is from a print server.
+      if (this.pendingPrinter_.printServerUri) {
+        return false;
+      }
+
+      // Managed printers are not editable.
+      if (this.pendingPrinter_.isManaged) {
+        return false;
+      }
     }
 
     return this.isOnline_ && this.networkProtocolActive_;
@@ -541,4 +562,13 @@
     return this.networkProtocolActive_;
   },
 
+  /**
+   * @return {boolean} True if the printer is managed or not online.
+   * @private
+   */
+  isInputFieldReadonly_() {
+    return !this.isOnline_ ||
+        (this.pendingPrinter_ && this.pendingPrinter_.isManaged);
+  },
+
 });
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html
new file mode 100644
index 0000000..acdab94e
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html
@@ -0,0 +1,72 @@
+<style include="cups-printer-shared iron-flex iron-flex-alignment
+    iron-flex-factors">
+  :host {
+    display: flex;
+    flex-direction: column;
+  }
+
+  #no-search-results {
+    margin-top: 20px;
+  }
+
+  /** Height of iron list row entry. */
+  #show-more-container {
+    align-items: center;
+    min-height: var(--settings-row-min-height);
+  }
+
+  /** Border line that is the same size as a list entry's border. */
+  #show-more-line-separator {
+    border-bottom: var(--cr-separator-line);
+    margin-inline-end: 20px;
+    margin-inline-start: 60px;
+    position: relative;
+    width: 596px;
+  }
+
+  #show-more-icon {
+    --cr-icon-button-margin-end: 0;
+  }
+
+  #show-more-text {
+    flex: 1;
+  }
+</style>
+
+<cr-action-menu role-description="$i18n{menu}">
+  <button id="viewButton" class="dropdown-item" on-click="onViewTap_">
+    $i18n{viewPrinter}
+  </button>
+  <button id="removeButton" class="dropdown-item" disabled>
+    $i18n{removePrinter}
+  </button>
+</cr-action-menu>
+
+<iron-list class="list-frame vertical-list flex-auto" id="printerEntryList"
+    items="[[filteredPrinters_]]">
+  <template>
+    <settings-cups-printers-entry printer-entry="[[item]]"
+        tabindex$="[[tabIndex]]" last-focused="{{lastFocused_}}"
+        list-blurred="{{listBlurred_}}" focus-row-index="[[index]]"
+        iron-list-tab-index="[[tabIndex]]">
+    </settings-cups-printers-entry>
+  </template>
+</iron-list>
+<template is="dom-if" id="show-more-button-section"
+    if="[[shouldPrinterListBeCollapsed_(searchTerm, enterprisePrinters.*,
+    hasShowMoreBeenTapped_)]]" restamp>
+  <div id="show-more-line-separator"></div>
+  <div class="list-frame layout horizontal" id="show-more-container">
+    <div id="show-more-text">$i18n{showMorePrinters}</div>
+    <cr-icon-button class="action-button" id="show-more-icon"
+        iron-icon="cr:expand-more"
+        on-click="onShowMoreTap_"
+        title=$i18n{showMorePrinters}>
+    </cr-icon-button>
+  </div>
+</template>
+<div id="no-search-results"
+    hidden="[[!showNoSearchResultsMessage_(searchTerm,
+        filteredPrinters_.*)]]">
+  $i18n{noSearchResults}
+</div>
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js
new file mode 100644
index 0000000..ed54879
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js
@@ -0,0 +1,247 @@
+// 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 '//resources/cr_elements/cr_action_menu/cr_action_menu.m.js';
+import '//resources/cr_elements/icons.m.js';
+import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
+import '//resources/polymer/v3_0/iron-list/iron-list.js';
+import './cups_printers_entry.js';
+import '../../settings_shared_css.js';
+
+import {ListPropertyUpdateBehavior} from '//resources/js/list_property_update_behavior.m.js';
+import {WebUIListenerBehavior} from '//resources/js/web_ui_listener_behavior.m.js';
+import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {matchesSearchTerm, sortPrinters} from './cups_printer_dialog_util.js';
+import {PrinterListEntry} from './cups_printer_types.js';
+import {CupsPrinterInfo, CupsPrintersBrowserProxy, CupsPrintersBrowserProxyImpl} from './cups_printers_browser_proxy.js';
+import {CupsPrintersEntryListBehavior} from './cups_printers_entry_list_behavior.js';
+
+// If the Show more button is visible, the minimum number of printers we show
+// is 3.
+const kMinVisiblePrinters = 3;
+
+/**
+ * Move a printer's position in |printerArr| from |fromIndex| to |toIndex|.
+ * @param {!Array<!PrinterListEntry>} printerArr
+ * @param {number} fromIndex
+ * @param {number} toIndex
+ */
+function moveEntryInPrinters(printerArr, fromIndex, toIndex) {
+  const element = printerArr[fromIndex];
+  printerArr.splice(fromIndex, 1);
+  printerArr.splice(toIndex, 0, element);
+}
+
+/**
+ * @fileoverview 'settings-cups-enterprise-printers' is a list container for
+ * Enterprise Printers.
+ */
+Polymer({
+  _template: html`{__html_template__}`,
+  is: 'settings-cups-enterprise-printers',
+
+  // ListPropertyUpdateBehavior is used in CupsPrintersEntryListBehavior.
+  behaviors: [
+    CupsPrintersEntryListBehavior,
+    ListPropertyUpdateBehavior,
+    WebUIListenerBehavior,
+  ],
+
+  properties: {
+    /**
+     * Search term for filtering |enterprisePrinters|.
+     * @type {string}
+     */
+    searchTerm: {
+      type: String,
+      value: '',
+    },
+
+    /** @type {?CupsPrinterInfo} */
+    activePrinter: {
+      type: Object,
+      notify: true,
+    },
+
+    /**
+     * @type {number}
+     * @private
+     */
+    activePrinterListEntryIndex_: {
+      type: Number,
+      value: -1,
+    },
+
+    printersCount: {
+      type: Number,
+      computed: 'getFilteredPrintersLength_(filteredPrinters_.*)',
+      notify: true,
+    },
+
+    /**
+     * List of printers filtered through a search term.
+     * @type {!Array<!PrinterListEntry>}
+     * @private
+     */
+    filteredPrinters_: {
+      type: Array,
+      value: () => [],
+    },
+
+    /**
+     * Keeps track of whether the user has tapped the Show more button. A search
+     * term will expand the collapsed list, so we need to keep track of whether
+     * the list expanded because of a search term or because the user tapped on
+     * the Show more button.
+     * @private
+     */
+    hasShowMoreBeenTapped_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /**
+     * Used by FocusRowBehavior to track the last focused element on a row.
+     * @private
+     */
+    lastFocused_: Object,
+
+    /**
+     * Used by FocusRowBehavior to track if the list has been blurred.
+     * @private
+     */
+    listBlurred_: Boolean,
+  },
+
+  listeners: {
+    'open-action-menu': 'onOpenActionMenu_',
+  },
+
+  observers: [
+    'onSearchOrPrintersChanged_(enterprisePrinters.*, searchTerm, ' +
+        'hasShowMoreBeenTapped_)',
+  ],
+
+  /** @private {CupsPrintersBrowserProxy} */
+  browserProxy_: null,
+
+  /**
+   * The number of printers we display if hidden printers are allowed.
+   * kMinVisiblePrinters is the default value and we never show fewer printers
+   * if the Show more button is visible.
+   */
+  visiblePrinterCounter_: kMinVisiblePrinters,
+
+  /** @override */
+  created() {
+    this.browserProxy_ = CupsPrintersBrowserProxyImpl.getInstance();
+  },
+
+  /**
+   * Redoes the search whenever |searchTerm| or |enterprisePrinters| changes.
+   * @private
+   */
+  onSearchOrPrintersChanged_() {
+    if (!this.enterprisePrinters) {
+      return;
+    }
+    // Filter printers through |searchTerm|. If |searchTerm| is empty,
+    // |filteredPrinters_| is just |enterprisePrinters|.
+    let updatedPrinters = this.searchTerm ?
+        this.enterprisePrinters.filter(
+            item => matchesSearchTerm(item.printerInfo, this.searchTerm)) :
+        this.enterprisePrinters.slice();
+    updatedPrinters.sort(sortPrinters);
+
+    if (this.shouldPrinterListBeCollapsed_()) {
+      // If the Show more button is visible, we only display the first
+      // N < |visiblePrinterCounter_| printers and the rest are hidden.
+      updatedPrinters = updatedPrinters.filter(
+          (printer, idx) => idx < this.visiblePrinterCounter_);
+    }
+
+    this.updateList(
+        'filteredPrinters_', printer => printer.printerInfo.printerId,
+        updatedPrinters);
+  },
+
+  /** @private */
+  onShowMoreTap_() {
+    this.hasShowMoreBeenTapped_ = true;
+  },
+
+  /**
+   * Keeps track of whether the Show more button should be visible which means
+   * that the printer list is collapsed. There are two ways a collapsed list
+   * may be expanded: the Show more button is tapped or if there is a search
+   * term.
+   * @return {boolean} True if the printer list should be collapsed.
+   * @private
+   */
+  shouldPrinterListBeCollapsed_() {
+    // If |searchTerm| is set, never collapse the list.
+    if (this.searchTerm) {
+      return false;
+    }
+
+    // If |hasShowMoreBeenTapped_| is set to true, never collapse the list.
+    if (this.hasShowMoreBeenTapped_) {
+      return false;
+    }
+
+    // If the total number of enterprise printers does not exceed the number of
+    // visible printers, there is no need for the list to be collapsed.
+    if (this.enterprisePrinters.length - this.visiblePrinterCounter_ < 1) {
+      return false;
+    }
+
+    return true;
+  },
+
+  /**
+   * @return {boolean} Returns true if the no search message should be visible.
+   * @private
+   */
+  showNoSearchResultsMessage_() {
+    return !!this.searchTerm && !this.filteredPrinters_.length;
+  },
+
+  /**
+   * @return {number} Length of |filteredPrinters_|.
+   * @private
+   */
+  getFilteredPrintersLength_() {
+    return this.filteredPrinters_.length;
+  },
+
+  /**
+   * @param {!CustomEvent<{target: !HTMLElement, item: !PrinterListEntry}>} e
+   * @private
+   */
+  onOpenActionMenu_(e) {
+    const item = /** @type {!PrinterListEntry} */ (e.detail.item);
+    this.activePrinterListEntryIndex_ = this.enterprisePrinters.findIndex(
+        printer =>
+            printer.printerInfo.printerId === item.printerInfo.printerId);
+    this.activePrinter =
+        this.get(['enterprisePrinters', this.activePrinterListEntryIndex_])
+            .printerInfo;
+
+    const target = /** @type {!HTMLElement} */ (e.detail.target);
+    this.$$('cr-action-menu').showAt(target);
+  },
+
+  /** @private */
+  onViewTap_() {
+    // Event is caught by 'settings-cups-printers'.
+    this.fire('edit-cups-printer-details');
+    this.closeActionMenu_();
+  },
+
+  /** @private */
+  closeActionMenu_() {
+    this.$$('cr-action-menu').close();
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_types.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_types.js
index e0e6e56..3e4bcf94 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_types.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_types.js
@@ -25,4 +25,5 @@
   PRINTSERVER: 1,
   AUTOMATIC: 2,
   DISCOVERED: 3,
+  ENTERPRISE: 4,
 };
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.html
index 4ff1fa6..298ea683 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.html
@@ -44,6 +44,10 @@
     border-bottom: var(--cr-separator-line);
   }
 
+  #enterprisePrintersContainer {
+    border-top: var(--cr-separator-line);
+  }
+
   :host(:not([can-add-printer])) #addPrinterSection,
   :host(:not([can-add-printer])) #nearbyPrinters {
     opacity: var(--cr-disabled-opacity);
@@ -122,6 +126,26 @@
   </template>
 </template>
 
+<template is="dom-if"
+    if="[[doesAccountHaveEnterprisePrinters_(enterprisePrinters_)]]"
+    restamp>
+  <div id="enterprisePrintersContainer">
+    <div class="settings-box first">
+      <div class="start">
+        <span aria-label$="[[enterprisePrintersAriaLabel_]]">
+          $i18n{enterprisePrintersTitle}
+        </span>
+      </div>
+    </div>
+    <settings-cups-enterprise-printers
+        id="enterprisePrinters"
+        active-printer="{{activePrinter}}"
+        search-term="[[searchTerm]]"
+        printers-count="{{enterprisePrinterCount_}}">
+    </settings-cups-enterprise-printers>
+  </div>
+</template>
+
 <settings-cups-add-printer-dialog id="addPrinterDialog"
     on-close="onAddPrinterDialogClose_">
 </settings-cups-add-printer-dialog>
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
index 8b36e58..a5dc06e 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
@@ -19,6 +19,7 @@
 import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './cups_settings_add_printer_dialog.js';
 import './cups_edit_printer_dialog.js';
+import './cups_enterprise_printers.js';
 import './cups_printer_shared_css.js';
 import './cups_saved_printers.js';
 import './cups_nearby_printers.js';
@@ -75,6 +76,12 @@
       value: null,
     },
 
+    /** @private {?WebUIListener} */
+    onEnterprisePrintersChangedListener_: {
+      type: Object,
+      value: null,
+    },
+
     searchTerm: {
       type: String,
     },
@@ -94,6 +101,15 @@
       value: () => [],
     },
 
+    /**
+     * @type {!Array<!PrinterListEntry>}
+     * @private
+     */
+    enterprisePrinters_: {
+      type: Array,
+      value: () => [],
+    },
+
     /** @private */
     attemptedLoadingPrinters_: {
       type: Boolean,
@@ -118,16 +134,30 @@
       computed: 'getSavedPrintersAriaLabel_(savedPrinterCount_)',
     },
 
+    /**@private */
+    enterprisePrintersAriaLabel_: {
+      type: String,
+      computed: 'getEnterprisePrintersAriaLabel_(enterprisePrinterCount_)',
+    },
+
+    /**@private */
     nearbyPrinterCount_: {
       type: Number,
       value: 0,
     },
 
+    /**@private */
     savedPrinterCount_: {
       type: Number,
       value: 0,
     },
 
+    /** @private */
+    enterprisePrinterCount_: {
+      type: Number,
+      value: 0,
+    },
+
     /**
      * Used by DeepLinkingBehavior to focus this page's deep links.
      * @type {!Set<!chromeos.settings.mojom.Setting>}
@@ -225,7 +255,10 @@
 
     this.entryManager_.addWebUIListeners();
     this.onPrintersChangedListener_ = addWebUIListener(
-        'on-printers-changed', this.onPrintersChanged_.bind(this));
+        'on-saved-printers-changed', this.onSavedPrintersChanged_.bind(this));
+    this.onEnterprisePrintersChangedListener_ = addWebUIListener(
+        'on-enterprise-printers-changed',
+        this.onEnterprisePrintersChanged_.bind(this));
     this.updateCupsPrintersList_();
     this.attemptDeepLink();
   },
@@ -309,15 +342,19 @@
 
   /** @private */
   updateCupsPrintersList_() {
-    CupsPrintersBrowserProxyImpl.getInstance().getCupsPrintersList().then(
-        this.onPrintersChanged_.bind(this));
+    CupsPrintersBrowserProxyImpl.getInstance().getCupsSavedPrintersList().then(
+        this.onSavedPrintersChanged_.bind(this));
+
+    CupsPrintersBrowserProxyImpl.getInstance()
+        .getCupsEnterprisePrintersList()
+        .then(this.onEnterprisePrintersChanged_.bind(this));
   },
 
   /**
    * @param {!CupsPrintersList} cupsPrintersList
    * @private
    */
-  onPrintersChanged_(cupsPrintersList) {
+  onSavedPrintersChanged_(cupsPrintersList) {
     this.savedPrinters_ = cupsPrintersList.printerList.map(
         printer => /** @type {!PrinterListEntry} */ (
             {printerInfo: printer, printerType: PrinterType.SAVED}));
@@ -327,6 +364,17 @@
     this.attemptedLoadingPrinters_ = true;
   },
 
+  /**
+   * @param {!CupsPrintersList} cupsPrintersList
+   * @private
+   */
+  onEnterprisePrintersChanged_(cupsPrintersList) {
+    this.enterprisePrinters_ = cupsPrintersList.printerList.map(
+        printer => /** @type {!PrinterListEntry} */ (
+            {printerInfo: printer, printerType: PrinterType.ENTERPRISE}));
+    this.entryManager_.setEnterprisePrintersList(this.enterprisePrinters_);
+  },
+
   /** @private */
   onAddPrinterTap_() {
     this.$.addPrinterDialog.open();
@@ -382,23 +430,50 @@
     return !!this.savedPrinters_.length;
   },
 
+  /**
+   * @return {boolean} Whether |enterprisePrinters_| is empty.
+   * @private
+   */
+  doesAccountHaveEnterprisePrinters_() {
+    return !!this.enterprisePrinters_.length;
+  },
+
   /** @private */
   getSavedPrintersAriaLabel_() {
-    const printerLabel = this.savedPrinterCount_ === 0 ?
-        'savedPrintersCountNone' :
-        this.savedPrinterCount_ === 1 ? 'savedPrintersCountOne' :
-                                        'savedPrintersCountMany';
-
+    let printerLabel = '';
+    if (this.savedPrinterCount_ === 0) {
+      printerLabel = 'savedPrintersCountNone';
+    } else if (this.savedPrinterCount_ === 1) {
+      printerLabel = 'savedPrintersCountOne';
+    } else {
+      printerLabel = 'savedPrintersCountMany';
+    }
     return loadTimeData.getStringF(printerLabel, this.savedPrinterCount_);
   },
 
   /** @private */
   getNearbyPrintersAriaLabel_() {
-    const printerLabel = this.nearbyPrinterCount_ === 0 ?
-        'nearbyPrintersCountNone' :
-        this.nearbyPrinterCount_ === 1 ? 'nearbyPrintersCountOne' :
-                                         'nearbyPrintersCountMany';
-
+    let printerLabel = '';
+    if (this.nearbyPrinterCount_ === 0) {
+      printerLabel = 'nearbyPrintersCountNone';
+    } else if (this.nearbyPrinterCount_ === 1) {
+      printerLabel = 'nearbyPrintersCountOne';
+    } else {
+      printerLabel = 'nearbyPrintersCountMany';
+    }
     return loadTimeData.getStringF(printerLabel, this.nearbyPrinterCount_);
   },
+
+  /** @private */
+  getEnterprisePrintersAriaLabel_() {
+    let printerLabel = '';
+    if (this.enterprisePrinterCount_ === 0) {
+      printerLabel = 'enterprisePrintersCountNone';
+    } else if (this.enterprisePrinterCount_ === 1) {
+      printerLabel = 'enterprisePrintersCountOne';
+    } else {
+      printerLabel = 'enterprisePrintersCountMany';
+    }
+    return loadTimeData.getStringF(printerLabel, this.enterprisePrinterCount_);
+  },
 });
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_browser_proxy.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_browser_proxy.js
index e4fadc7..4038f80 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_browser_proxy.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_browser_proxy.js
@@ -11,6 +11,7 @@
 
 /**
  * @typedef {{
+ *   isManaged: boolean,
  *   ppdManufacturer: string,
  *   ppdModel: string,
  *   printerAddress: string,
@@ -125,7 +126,12 @@
   /**
    * @return {!Promise<!CupsPrintersList>}
    */
-  getCupsPrintersList() {}
+  getCupsSavedPrintersList() {}
+
+  /**
+   * @return {!Promise<!CupsPrintersList>}
+   */
+  getCupsEnterprisePrintersList() {}
 
   /**
    * @param {string} printerId
@@ -226,8 +232,13 @@
  */
 export class CupsPrintersBrowserProxyImpl {
   /** @override */
-  getCupsPrintersList() {
-    return sendWithPromise('getCupsPrintersList');
+  getCupsSavedPrintersList() {
+    return sendWithPromise('getCupsSavedPrintersList');
+  }
+
+  /** @override */
+  getCupsEnterprisePrintersList() {
+    return sendWithPromise('getCupsEnterprisePrintersList');
   }
 
   /** @override */
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.html
index be0773e..9839d73 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.html
@@ -16,6 +16,10 @@
   <div id="entry" class="list-item" focus-row-control focus-type="entry">
     <div class="printer-name text-elide">
       <span id="printerName" aria-hidden="true">
+          <iron-icon
+            hidden="[[!printerEntry.printerInfo.isManaged]]"
+            icon="cr20:domain">
+          </iron-icon>
           [[printerEntry.printerInfo.printerName]]
       </span>
       <div id="printerSubtext" hidden="[[!subtext]]" class="secondary"
@@ -24,7 +28,7 @@
       </div>
     </div>
     <template is="dom-if"
-        if="[[isSavedPrinter_(printerEntry.printerType)]]">
+        if="[[showActionsMenu_(printerEntry.printerType)]]">
       <cr-icon-button id="moreActions" class="icon-more-vert"
           on-click="onOpenActionMenuTap_" title="$i18n{moreActions}"
           aria-labelledby="printerName" focus-row-control
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.js
index e7fecaf8..53b51e3 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry.js
@@ -7,6 +7,7 @@
  * printer.
  */
 import '//resources/cr_elements/cr_button/cr_button.m.js';
+import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 import '../../settings_shared_css.js';
 
 import {FocusRowBehavior} from '//resources/js/cr/ui/focus_row_behavior.m.js';
@@ -69,8 +70,9 @@
    * @return {boolean}
    * @private
    */
-  isSavedPrinter_() {
-    return this.printerEntry.printerType === PrinterType.SAVED;
+  showActionsMenu_() {
+    return this.printerEntry.printerType === PrinterType.SAVED ||
+        this.printerEntry.printerType === PrinterType.ENTERPRISE;
   },
 
   /**
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_list_behavior.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_list_behavior.js
index 38564f1..6b7d484 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_list_behavior.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_list_behavior.js
@@ -31,6 +31,12 @@
       type: Array,
       value: () => [],
     },
+
+    /** @type {!Array<!PrinterListEntry>} */
+    enterprisePrinters: {
+      type: Array,
+      value: () => [],
+    },
   },
 
   /** @override */
@@ -44,12 +50,15 @@
         this.onSavedPrintersChanged_.bind(this));
     this.entryManager_.addOnNearbyPrintersChangedListener(
         this.onNearbyPrintersChanged_.bind(this));
+    this.entryManager_.addOnEnterprisePrintersChangedListener(
+        this.onEnterprisePrintersChanged_.bind(this));
 
     // Initialize saved and nearby printers list.
     this.onSavedPrintersChanged_(
         this.entryManager_.savedPrinters, [] /* printerAdded */,
         [] /* printerRemoved */);
     this.onNearbyPrintersChanged_(this.entryManager_.nearbyPrinters);
+    this.onEnterprisePrintersChanged_(this.entryManager_.enterprisePrinters);
   },
 
   /** @override */
@@ -58,6 +67,8 @@
         this.onSavedPrintersChanged_.bind(this));
     this.entryManager_.removeOnNearbyPrintersChangedListener(
         this.onNearbyPrintersChanged_.bind(this));
+    this.entryManager_.removeOnEnterprisePrintersChangedListener(
+        this.onEnterprisePrintersChanged_.bind(this));
   },
 
   /**
@@ -98,6 +109,16 @@
         printerList);
   },
 
+  /**
+   * @param {!Array<!PrinterListEntry>} enterprisePrinters
+   * @private
+   */
+  onEnterprisePrintersChanged_(enterprisePrinters) {
+    this.updateList(
+        'enterprisePrinters', printer => printer.printerInfo.printerId,
+        enterprisePrinters);
+  },
+
   // CupsPrintersEntryListBehavior methods. Override these in the
   // implementations.
 
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_manager.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_manager.js
index 3447c5e5..bef4ace 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_manager.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_manager.js
@@ -28,11 +28,11 @@
  */
 let PrintersListCallback;
 
-  /**
-   * Class for managing printer entries. Holds both Saved, Nearby, Print Server
-   * printers and notifies observers of any applicable changes to either printer
-   * lists.
-   */
+/**
+ * Class for managing printer entries. Holds Saved, Nearby, Enterprise, Print
+ * Server printers and notifies observers of any applicable changes to either
+ * printer lists.
+ */
 export class CupsPrintersEntryManager {
   constructor() {
     /** @private {!Array<!PrinterListEntry>} */
@@ -41,6 +41,9 @@
     /** @private {!Array<!PrinterListEntry>} */
     this.nearbyPrinters_ = [];
 
+    /** @private {!Array<!PrinterListEntry>} */
+    this.enterprisePrinters_ = [];
+
     /** @private {!Array<PrintersListWithDeltasCallback>} */
     this.onSavedPrintersChangedListeners_ = [];
 
@@ -52,14 +55,24 @@
 
     /** @private {?WebUIListener} */
     this.onNearbyPrintersChangedListener_ = null;
+
+    /** @private {!Array<PrintersListCallback>} */
+    this.onEnterprisePrintersChangedListeners_ = [];
+
+    /** @private {?WebUIListener} */
+    this.onEnterprisePrintersChangedListener_ = null;
   }
 
   addWebUIListeners() {
-    // TODO(1005905): Add on-printers-changed listener here once legacy code
-    // is removed.
+    // TODO(1005905): Add on-saved-printers-changed listener here once legacy
+    // code is removed.
     this.onNearbyPrintersChangedListener_ = addWebUIListener(
         'on-nearby-printers-changed', this.setNearbyPrintersList.bind(this));
 
+    this.onEnterprisePrintersChangedListener_ = addWebUIListener(
+        'on-enterprise-printers-changed',
+        this.setEnterprisePrintersList.bind(this));
+
     CupsPrintersBrowserProxyImpl.getInstance().startDiscoveringPrinters();
   }
 
@@ -69,6 +82,12 @@
           /** @type {WebUIListener} */ (this.onNearbyPrintersChangedListener_));
       this.onNearbyPrintersChangedListener_ = null;
     }
+    if (this.onEnterprisePrintersChangedListener_) {
+      removeWebUIListener(
+          /** @type {WebUIListener} */ (
+              this.onEnterprisePrintersChangedListener_));
+      this.onEnterprisePrintersChangedListener_ = null;
+    }
   }
 
   /** @return {!Array<!PrinterListEntry>} */
@@ -81,6 +100,11 @@
     return this.nearbyPrinters_;
   }
 
+  /** @return {!Array<!PrinterListEntry>} */
+  get enterprisePrinters() {
+    return this.enterprisePrinters_;
+  }
+
   /** @param {PrintersListWithDeltasCallback} listener */
   addOnSavedPrintersChangedListener(listener) {
     this.onSavedPrintersChangedListeners_.push(listener);
@@ -103,6 +127,18 @@
         this.onNearbyPrintersChangedListeners_.filter(lis => lis !== listener);
   }
 
+  /** @param {PrintersListCallback} listener */
+  addOnEnterprisePrintersChangedListener(listener) {
+    this.onEnterprisePrintersChangedListeners_.push(listener);
+  }
+
+  /** @param {PrintersListCallback} listener */
+  removeOnEnterprisePrintersChangedListener(listener) {
+    this.onEnterprisePrintersChangedListeners_ =
+        this.onEnterprisePrintersChangedListeners_.filter(
+            lis => lis !== listener);
+  }
+
   /**
    * Sets the saved printers list and notifies observers of any applicable
    * changes.
@@ -157,6 +193,15 @@
   }
 
   /**
+   * Sets the enterprise printers list and notifies observers.
+   * @param {!Array<!PrinterListEntry>} enterprisePrinters
+   */
+  setEnterprisePrintersList(enterprisePrinters) {
+    this.enterprisePrinters_ = enterprisePrinters;
+    this.notifyOnEnterprisePrintersChangedListeners_();
+  }
+
+  /**
    * Adds the found print server printers to |printServerPrinters|.
    * |foundPrinters| consist of print server printers that have not been saved
    * and will appear in the nearby printers list.
@@ -197,6 +242,12 @@
     this.onNearbyPrintersChangedListeners_.forEach(
         listener => listener(this.nearbyPrinters_));
   }
+
+  /** @private */
+  notifyOnEnterprisePrintersChangedListeners_() {
+    this.onEnterprisePrintersChangedListeners_.forEach(
+        listener => listener(this.enterprisePrinters_));
+  }
 }
 
 addSingletonGetter(CupsPrintersEntryManager);
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html
index 8484434..bc4d59c 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html
@@ -18,9 +18,9 @@
   /** Border line that is the same size as a list entry's border. */
   #show-more-line-separator {
     border-bottom: var(--cr-separator-line);
-    left: 60px;
+    margin-inline-end: 20px;
+    margin-inline-start: 60px;
     position: relative;
-    right: 20px;
     width: 596px;
   }
 
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_settings_add_printer_dialog.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_settings_add_printer_dialog.js
index 0900469..cb262f4 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_settings_add_printer_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_settings_add_printer_dialog.js
@@ -30,6 +30,7 @@
  */
 function getEmptyPrinter_() {
   return {
+    isManaged: false,
     ppdManufacturer: '',
     ppdModel: '',
     printerAddress: '',
diff --git a/chrome/browser/resources/settings/chromeos/os_route.js b/chrome/browser/resources/settings/chromeos/os_route.js
index 761d5a2..5dc0d64f 100644
--- a/chrome/browser/resources/settings/chromeos/os_route.js
+++ b/chrome/browser/resources/settings/chromeos/os_route.js
@@ -119,14 +119,9 @@
       }
     }
 
-    const isKerberosEnabled = loadTimeData.valueExists('isKerberosEnabled') &&
-        loadTimeData.getBoolean('isKerberosEnabled');
-    const isKerberosSettingsSectionEnabled =
-        loadTimeData.valueExists('isKerberosSettingsSectionEnabled') &&
-        loadTimeData.getBoolean('isKerberosSettingsSectionEnabled');
-
     // Kerberos section.
-    if (isKerberosEnabled && isKerberosSettingsSectionEnabled) {
+    if (loadTimeData.valueExists('isKerberosEnabled') &&
+        loadTimeData.getBoolean('isKerberosEnabled')) {
       r.KERBEROS = createSection(
           r.BASIC, mojom.KERBEROS_SECTION_PATH, Section.kKerberos);
       r.KERBEROS_ACCOUNTS_V2 = createSubpage(
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni
index 90425fe6..609784f 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -328,6 +328,7 @@
   "chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_list_behavior.html",
   "chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers_entry_manager.html",
   "chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html",
+  "chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html",
   "chrome/browser/resources/settings/chromeos/os_printing_page/cups_settings_add_printer_dialog.html",
   "chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.html",
   "chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.html",
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
index e6beb59..f764b75b 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
@@ -183,9 +183,7 @@
 
       this.showKerberosSection_ =
           loadTimeData.valueExists('isKerberosEnabled') &&
-          loadTimeData.getBoolean('isKerberosEnabled') &&
-          loadTimeData.valueExists('isKerberosSettingsSectionEnabled') &&
-          loadTimeData.getBoolean('isKerberosSettingsSectionEnabled');
+          loadTimeData.getBoolean('isKerberosEnabled');
 
       this.addEventListener('show-container', () => {
         this.$.container.style.visibility = 'visible';
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
index 98242cc9..a1e0ccb5 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
@@ -619,6 +619,7 @@
    */
   computeIsSyncPaused_() {
     return !!this.syncStatus.hasError &&
+        !this.syncStatus.hasUnrecoverableError &&
         this.syncStatus.statusAction === StatusAction.REAUTHENTICATE;
   },
 
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn
index b6b3584..f62c4c8 100644
--- a/chrome/browser/safe_browsing/BUILD.gn
+++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -37,7 +37,7 @@
     "//components/pref_registry",
     "//components/resources:components_resources_grit",
     "//components/safe_browsing:buildflags",
-    "//components/safe_browsing/content",
+    "//components/safe_browsing/content/browser",
     "//components/safe_browsing/content/browser:client_side_detection",
     "//components/safe_browsing/content/triggers:suspicious_site_trigger",
     "//components/safe_browsing/content/web_ui",
@@ -151,7 +151,6 @@
       "//components/omnibox/browser",
       "//components/password_manager/core/browser/form_parsing",
       "//components/permissions",
-      "//components/safe_browsing/content",
       "//components/safe_browsing/content/browser",
       "//components/safe_browsing/content/browser:client_side_detection",
       "//components/safe_browsing/content/browser:client_side_model_loader",
diff --git a/chrome/browser/safe_browsing/advanced_protection_status_manager_unittest.cc b/chrome/browser/safe_browsing/advanced_protection_status_manager_unittest.cc
index 3857d833..efc42aa 100644
--- a/chrome/browser/safe_browsing/advanced_protection_status_manager_unittest.cc
+++ b/chrome/browser/safe_browsing/advanced_protection_status_manager_unittest.cc
@@ -405,9 +405,8 @@
   ASSERT_TRUE(aps_manager.GetUnconsentedPrimaryAccountId().empty());
 
   // Sign in, but don't set this as the primary account.
-  AccountInfo account_info =
-      identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(
-          "test@test.com");
+  AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
+      "test@test.com", signin::ConsentLevel::kSignin);
   account_info.is_under_advanced_protection = true;
   identity_test_env_.UpdateAccountInfoForAccount(account_info);
 
diff --git a/chrome/browser/safe_browsing/chrome_controller_client.h b/chrome/browser/safe_browsing/chrome_controller_client.h
index 642d75c..abf81bcd 100644
--- a/chrome/browser/safe_browsing/chrome_controller_client.h
+++ b/chrome/browser/safe_browsing/chrome_controller_client.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_SAFE_BROWSING_CHROME_CONTROLLER_CLIENT_H_
 
 #include "base/macros.h"
-#include "components/safe_browsing/content/safe_browsing_controller_client.h"
+#include "components/safe_browsing/content/browser/safe_browsing_controller_client.h"
 
 namespace content {
 class WebContents;
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
index dab8e2f..90e39b4a 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
@@ -140,7 +140,7 @@
 
     CoreAccountInfo account_info =
         identity_test_env()->MakePrimaryAccountAvailable(
-            user_manager::kStubUserEmail);
+            user_manager::kStubUserEmail, signin::ConsentLevel::kSync);
 
     ASSERT_EQ(account_info.email, user_manager::kStubUserEmail);
 
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_sync_browsertest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_sync_browsertest.cc
index 14808fe..ddaaae2 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_sync_browsertest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_sync_browsertest.cc
@@ -66,8 +66,8 @@
 
     ASSERT_TRUE(embedded_test_server()->Start());
 
-    syncer::ProfileSyncService* sync_service =
-        SyncServiceFactory::GetAsProfileSyncServiceForProfile(
+    syncer::SyncServiceImpl* sync_service =
+        SyncServiceFactory::GetAsSyncServiceImplForProfile(
             browser()->profile());
 
     sync_service->OverrideNetworkForTest(
diff --git a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
index d728a724..dfd5bf5 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
@@ -298,7 +298,8 @@
         static_cast<safe_browsing::SafeBrowsingService*>(
             SafeBrowsingService::CreateSafeBrowsingService()));
 
-    identity_test_env_.MakePrimaryAccountAvailable("user@gmail.com");
+    identity_test_env_.MakePrimaryAccountAvailable("user@gmail.com",
+                                                   signin::ConsentLevel::kSync);
 
     csd_host_ = ClientSideDetectionHostDelegate::CreateHost(web_contents());
     csd_host_->set_client_side_detection_service(csd_service_.get());
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
index a176177..8e046c39 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
@@ -151,7 +151,8 @@
 #endif
     identity_test_environment_ =
         std::make_unique<signin::IdentityTestEnvironment>();
-    identity_test_environment_->MakePrimaryAccountAvailable(kUserName);
+    identity_test_environment_->MakePrimaryAccountAvailable(
+        kUserName, signin::ConsentLevel::kSync);
     extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(
         browser()->profile())
         ->SetIdentityManagerForTesting(
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
index 4380aaf..5f2b225e 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
@@ -439,7 +439,8 @@
             base::BindRepeating(&BuildSafeBrowsingPrivateEventRouter));
     extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_)
         ->SetBrowserCloudPolicyClientForTesting(client_.get());
-    identity_test_environment_.MakePrimaryAccountAvailable(kUserName);
+    identity_test_environment_.MakePrimaryAccountAvailable(
+        kUserName, signin::ConsentLevel::kSync);
     extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_)
         ->SetIdentityManagerForTesting(
             identity_test_environment_.identity_manager());
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
index 2dd72c1..f4a571f 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
@@ -3717,7 +3717,7 @@
   PrepareResponse(ClientDownloadResponse::SAFE, net::HTTP_OK, net::OK);
 
   identity_test_env_adaptor_->identity_test_env()->MakePrimaryAccountAvailable(
-      "test@example.com");
+      "test@example.com", signin::ConsentLevel::kSync);
   identity_test_env_adaptor_->identity_test_env()
       ->SetAutomaticIssueOfAccessTokens(/*grant=*/true);
 
@@ -3834,7 +3834,7 @@
   }
 
   identity_test_env_adaptor_->identity_test_env()->MakePrimaryAccountAvailable(
-      "test@example.com");
+      "test@example.com", signin::ConsentLevel::kSync);
 
   {
     NiceMockDownloadItem item;
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h b/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
index 671fa7b..2ec235c 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
@@ -33,8 +33,8 @@
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
-#include "components/safe_browsing/content/base_blocking_page.h"
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_blocking_page.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 
 namespace network {
 class SharedURLLoaderFactory;
diff --git a/chrome/browser/safe_browsing/test_safe_browsing_blocking_page_quiet.h b/chrome/browser/safe_browsing/test_safe_browsing_blocking_page_quiet.h
index 3b8fce9..ff6e10f 100644
--- a/chrome/browser/safe_browsing/test_safe_browsing_blocking_page_quiet.h
+++ b/chrome/browser/safe_browsing/test_safe_browsing_blocking_page_quiet.h
@@ -5,8 +5,8 @@
 #ifndef CHROME_BROWSER_SAFE_BROWSING_TEST_SAFE_BROWSING_BLOCKING_PAGE_QUIET_H_
 #define CHROME_BROWSER_SAFE_BROWSING_TEST_SAFE_BROWSING_BLOCKING_PAGE_QUIET_H_
 
-#include "components/safe_browsing/content/base_blocking_page.h"
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_blocking_page.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
 #include "components/security_interstitials/core/safe_browsing_quiet_error_ui.h"
 
diff --git a/chrome/browser/safe_browsing/ui_manager.h b/chrome/browser/safe_browsing/ui_manager.h
index 3dc9189..fc19b3c1 100644
--- a/chrome/browser/safe_browsing/ui_manager.h
+++ b/chrome/browser/safe_browsing/ui_manager.h
@@ -15,7 +15,7 @@
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/security_interstitials/core/unsafe_resource.h"
 
 class GURL;
diff --git a/chrome/browser/search/drive/drive_service_unittest.cc b/chrome/browser/search/drive/drive_service_unittest.cc
index 733cef6..956c009 100644
--- a/chrome/browser/search/drive/drive_service_unittest.cc
+++ b/chrome/browser/search/drive/drive_service_unittest.cc
@@ -31,7 +31,8 @@
         base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
             &test_url_loader_factory_),
         identity_test_env.identity_manager(), "en-US", &prefs_);
-    identity_test_env.MakePrimaryAccountAvailable("example@google.com");
+    identity_test_env.MakePrimaryAccountAvailable("example@google.com",
+                                                  signin::ConsentLevel::kSync);
     service_->RegisterProfilePrefs(prefs_.registry());
   }
 
diff --git a/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc b/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
index ef69bcd..79f8dc8 100644
--- a/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
+++ b/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
@@ -74,7 +74,8 @@
     service_ = std::make_unique<SearchSuggestService>(
         profile(), identity_env_->identity_manager(), std::move(loader));
 
-    identity_env_->MakePrimaryAccountAvailable("example@gmail.com");
+    identity_env_->MakePrimaryAccountAvailable("example@gmail.com",
+                                               signin::ConsentLevel::kSync);
     identity_env_->SetAutomaticIssueOfAccessTokens(true);
   }
 
diff --git a/chrome/browser/sharesheet/sharesheet_metrics.cc b/chrome/browser/sharesheet/sharesheet_metrics.cc
index a8e220f..5c6c2f3 100644
--- a/chrome/browser/sharesheet/sharesheet_metrics.cc
+++ b/chrome/browser/sharesheet/sharesheet_metrics.cc
@@ -6,12 +6,6 @@
 
 #include "base/metrics/histogram_functions.h"
 
-namespace {
-// Should be comfortably larger than any max number of apps
-// a user could have installed.
-constexpr size_t kMaxAppCount = 1000;
-}  // namespace
-
 namespace sharesheet {
 
 SharesheetMetrics::SharesheetMetrics() = default;
@@ -21,18 +15,15 @@
 }
 
 void SharesheetMetrics::RecordSharesheetAppCount(const int app_count) {
-  base::UmaHistogramExactLinear("ChromeOS.Sharesheet.AppCount.All", app_count,
-                                kMaxAppCount);
+  base::UmaHistogramCounts100("ChromeOS.Sharesheet.AppCount2.All", app_count);
 }
 
 void SharesheetMetrics::RecordSharesheetArcAppCount(const int app_count) {
-  base::UmaHistogramExactLinear("ChromeOS.Sharesheet.AppCount.Arc", app_count,
-                                kMaxAppCount);
+  base::UmaHistogramCounts100("ChromeOS.Sharesheet.AppCount2.Arc", app_count);
 }
 
 void SharesheetMetrics::RecordSharesheetWebAppCount(const int app_count) {
-  base::UmaHistogramExactLinear("ChromeOS.Sharesheet.AppCount.Web", app_count,
-                                kMaxAppCount);
+  base::UmaHistogramCounts100("ChromeOS.Sharesheet.AppCount2.Web", app_count);
 }
 
 void SharesheetMetrics::RecordSharesheetShareAction(const UserAction action) {
@@ -51,4 +42,20 @@
   base::UmaHistogramEnumeration("ChromeOS.Sharesheet.LaunchSource", source);
 }
 
+void SharesheetMetrics::RecordSharesheetFilesSharedCount(const int file_count) {
+  base::UmaHistogramCounts100("ChromeOS.Sharesheet.FileCount", file_count);
+}
+
+void SharesheetMetrics::RecordSharesheetIsDriveFolder(
+    const bool is_drive_folder) {
+  base::UmaHistogramBoolean("ChromeOS.Sharesheet.IsDriveFolder",
+                            is_drive_folder);
+}
+
+void SharesheetMetrics::RecordSharesheetImagePreviewPressed(
+    const bool is_pressed) {
+  base::UmaHistogramBoolean("ChromeOS.Sharesheet.IsImagePreviewPressed",
+                            is_pressed);
+}
+
 }  // namespace sharesheet
diff --git a/chrome/browser/sharesheet/sharesheet_metrics.h b/chrome/browser/sharesheet/sharesheet_metrics.h
index 56f5ae64..ea6f302 100644
--- a/chrome/browser/sharesheet/sharesheet_metrics.h
+++ b/chrome/browser/sharesheet/sharesheet_metrics.h
@@ -57,6 +57,13 @@
   static void RecordSharesheetFormFactor(const FormFactor form_factor);
 
   static void RecordSharesheetLaunchSource(const LaunchSource source);
+
+  static void RecordSharesheetFilesSharedCount(const int file_count);
+  // Records true if the data being shared is a drive folder. False otherwise.
+  static void RecordSharesheetIsDriveFolder(const bool is_drive_folder);
+  // Records true if the image preview was pressed in the current invocation.
+  // False otherwise.
+  static void RecordSharesheetImagePreviewPressed(const bool is_pressed);
 };
 
 }  // namespace sharesheet
diff --git a/chrome/browser/sharesheet/sharesheet_service.cc b/chrome/browser/sharesheet/sharesheet_service.cc
index 72e5f117..f318523 100644
--- a/chrome/browser/sharesheet/sharesheet_service.cc
+++ b/chrome/browser/sharesheet/sharesheet_service.cc
@@ -275,6 +275,7 @@
                                          DeliveredCallback delivered_callback,
                                          std::vector<TargetInfo> targets) {
   RecordTargetCountMetrics(targets);
+  RecordShareDataMetrics(intent);
 
   // If SetSelectedAppForTesting() has been called, immediately launch the app.
   const std::u16string selected_app = GetSelectedApp();
@@ -412,4 +413,21 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
+void SharesheetService::RecordShareDataMetrics(
+    const apps::mojom::IntentPtr& intent) {
+  // Record whether or not we're sharing a drive folder.
+
+  // If |intent| has a |drive_share_url| but does not contain |share_text|,
+  // it is a Drive Folder.
+  const bool is_drive_folder = intent->drive_share_url.has_value() &&
+                               intent->drive_share_url.value().is_valid() &&
+                               intent->share_text.value_or("").empty();
+  SharesheetMetrics::RecordSharesheetIsDriveFolder(is_drive_folder);
+
+  // Record file count.
+  const size_t file_count =
+      intent->file_urls.value_or(std::vector<GURL>()).size();
+  SharesheetMetrics::RecordSharesheetFilesSharedCount(file_count);
+}
+
 }  // namespace sharesheet
diff --git a/chrome/browser/sharesheet/sharesheet_service.h b/chrome/browser/sharesheet/sharesheet_service.h
index 3dc8224..49c9a5b 100644
--- a/chrome/browser/sharesheet/sharesheet_service.h
+++ b/chrome/browser/sharesheet/sharesheet_service.h
@@ -130,6 +130,8 @@
   void RecordUserActionMetrics(const std::u16string& target_name);
   void RecordTargetCountMetrics(const std::vector<TargetInfo>& targets);
   void RecordShareActionMetrics(const std::u16string& target_name);
+  // Makes |intent| related UMA recordings.
+  void RecordShareDataMetrics(const apps::mojom::IntentPtr& intent);
 
   Profile* profile_;
   std::unique_ptr<SharesheetActionCache> sharesheet_action_cache_;
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index 5e4a406..531033b 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -296,15 +296,14 @@
     // invalid, so that if/when this account is re-authenticated, we can force a
     // reconciliation for this account instead of treating it as a no-op.
     // See https://crbug.com/1012649 for details.
-    absl::optional<AccountInfo> maybe_account_info =
-        identity_manager
-            ->FindExtendedAccountInfoForAccountWithRefreshTokenByEmailAddress(
-                manage_accounts_params.email);
-    if (maybe_account_info.has_value()) {
+    AccountInfo maybe_account_info =
+        identity_manager->FindExtendedAccountInfoByEmailAddress(
+            manage_accounts_params.email);
+    if (!maybe_account_info.IsEmpty()) {
       CookieReminter* const cookie_reminter =
           CookieReminterFactory::GetForProfile(profile);
       cookie_reminter->ForceCookieRemintingOnNextTokenUpdate(
-          maybe_account_info.value());
+          maybe_account_info);
     }
 
     // Display a re-authentication dialog.
diff --git a/chrome/browser/signin/dice_response_handler.cc b/chrome/browser/signin/dice_response_handler.cc
index 69478a1..a2f0bb3 100644
--- a/chrome/browser/signin/dice_response_handler.cc
+++ b/chrome/browser/signin/dice_response_handler.cc
@@ -394,11 +394,11 @@
   const std::string& gaia_id = token_fetcher->gaia_id();
   VLOG(1) << "[Dice] OAuth success for email " << email;
   bool should_enable_sync = token_fetcher->should_enable_sync();
+  CoreAccountId account_id =
+      identity_manager_->PickAccountIdForAccount(gaia_id, email);
   bool is_new_account =
-      !identity_manager_
-           ->FindExtendedAccountInfoForAccountWithRefreshTokenByGaiaId(gaia_id);
-  auto* accounts_mutator = identity_manager_->GetAccountsMutator();
-  CoreAccountId account_id = accounts_mutator->AddOrUpdateAccount(
+      !identity_manager_->HasAccountWithRefreshToken(account_id);
+  identity_manager_->GetAccountsMutator()->AddOrUpdateAccount(
       gaia_id, email, refresh_token, is_under_advanced_protection,
       signin_metrics::SourceForRefreshTokenOperation::
           kDiceResponseHandler_Signin);
diff --git a/chrome/browser/signin/dice_response_handler_unittest.cc b/chrome/browser/signin/dice_response_handler_unittest.cc
index 36ead96..5b070a1 100644
--- a/chrome/browser/signin/dice_response_handler_unittest.cc
+++ b/chrome/browser/signin/dice_response_handler_unittest.cc
@@ -256,12 +256,9 @@
   EXPECT_EQ(1, reconcilor_blocked_count_);
   EXPECT_EQ(1, reconcilor_unblocked_count_);
   // Check that the AccountInfo::is_under_advanced_protection is set.
-  EXPECT_TRUE(
-      identity_manager()
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id)
-          .value()
-          .is_under_advanced_protection);
+  EXPECT_TRUE(identity_manager()
+                  ->FindExtendedAccountInfoByAccountId(account_id)
+                  .is_under_advanced_protection);
 }
 
 // Checks that the account reconcilor is blocked when where was OAuth
@@ -360,12 +357,9 @@
   EXPECT_EQ(1, reconcilor_blocked_count_);
   EXPECT_EQ(0, reconcilor_unblocked_count_);
   // Check that the AccountInfo::is_under_advanced_protection is set.
-  EXPECT_TRUE(
-      identity_manager()
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id_2)
-          .value()
-          .is_under_advanced_protection);
+  EXPECT_TRUE(identity_manager()
+                  ->FindExtendedAccountInfoByAccountId(account_id_2)
+                  .is_under_advanced_protection);
   task_environment_.FastForwardBy(
       base::TimeDelta::FromHours(kLockAccountReconcilorTimeoutHours + 1));
   // Check that the reconcilor was unblocked.
@@ -378,7 +372,7 @@
 TEST_F(DiceResponseHandlerTest, Reauth) {
   DiceResponseParams dice_params = MakeDiceParams(DiceAction::SIGNIN);
   AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
-      dice_params.signin_info->account_info.email);
+      dice_params.signin_info->account_info.email, signin::ConsentLevel::kSync);
   dice_params.signin_info->account_info.gaia_id = account_info.gaia;
   CoreAccountId account_id = account_info.account_id;
   identity_test_env_.UpdatePersistentErrorOfRefreshTokenForAccount(
@@ -460,12 +454,9 @@
       false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(account_id));
-  EXPECT_FALSE(
-      identity_manager()
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id)
-          .value()
-          .is_under_advanced_protection);
+  EXPECT_FALSE(identity_manager()
+                   ->FindExtendedAccountInfoByAccountId(account_id)
+                   .is_under_advanced_protection);
 }
 
 // Checks that two SIGNIN requests can happen concurrently.
@@ -501,24 +492,18 @@
       true /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(account_id_1));
-  EXPECT_TRUE(
-      identity_manager()
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id_1)
-          .value()
-          .is_under_advanced_protection);
+  EXPECT_TRUE(identity_manager()
+                  ->FindExtendedAccountInfoByAccountId(account_id_1)
+                  .is_under_advanced_protection);
   // Simulate GaiaAuthFetcher success for the second request.
   consumer_2->OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
       "refresh_token", "access_token", 10, false /* is_child_account */,
       false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(account_id_2));
-  EXPECT_FALSE(
-      identity_manager()
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id_2)
-          .value()
-          .is_under_advanced_protection);
+  EXPECT_FALSE(identity_manager()
+                   ->FindExtendedAccountInfoByAccountId(account_id_2)
+                   .is_under_advanced_protection);
   // Check that the reconcilor was blocked and unblocked exactly once.
   EXPECT_EQ(1, reconcilor_blocked_count_);
   EXPECT_EQ(1, reconcilor_unblocked_count_);
@@ -623,8 +608,8 @@
   const auto& dice_account_info = dice_params.signout_info->account_infos[0];
   // User is signed in to Chrome, and has some refresh token for a secondary
   // account.
-  AccountInfo account_info =
-      identity_test_env_.MakePrimaryAccountAvailable(dice_account_info.email);
+  AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
+      dice_account_info.email, signin::ConsentLevel::kSync);
   AccountInfo secondary_account_info =
       identity_test_env_.MakeAccountAvailable(kSecondaryEmail);
   EXPECT_TRUE(
@@ -672,7 +657,8 @@
   // User is signed in to Chrome, and has some refresh token for a secondary
   // account.
   AccountInfo main_account_info =
-      identity_test_env_.MakePrimaryAccountAvailable(kMainEmail);
+      identity_test_env_.MakePrimaryAccountAvailable(
+          kMainEmail, signin::ConsentLevel::kSync);
   AccountInfo secondary_account_info = identity_test_env_.MakeAccountAvailable(
       secondary_dice_account_info.email);
   EXPECT_TRUE(identity_manager()->HasAccountWithRefreshToken(
@@ -729,8 +715,8 @@
   const auto& dice_account_info = dice_params.signout_info->account_infos[0];
 
   // User is signed in to Chrome.
-  AccountInfo account_info =
-      identity_test_env_.MakePrimaryAccountAvailable(dice_account_info.email);
+  AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
+      dice_account_info.email, signin::ConsentLevel::kSync);
   EXPECT_TRUE(
       identity_manager()->HasAccountWithRefreshToken(account_info.account_id));
   EXPECT_FALSE(
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.cc b/chrome/browser/signin/dice_web_signin_interceptor.cc
index 22f7d14f..cd764fd 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor.cc
@@ -70,12 +70,11 @@
   if (primary_core_account_info.IsEmpty())
     return AccountInfo();
 
-  absl::optional<AccountInfo> primary_account_info =
-      manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          primary_core_account_info);
+  AccountInfo primary_account_info =
+      manager->FindExtendedAccountInfo(primary_core_account_info);
 
-  if (primary_account_info)
-    return *primary_account_info;
+  if (!primary_account_info.IsEmpty())
+    return primary_account_info;
 
   // Return an AccountInfo without extended fields, based on the core info.
   AccountInfo account_info;
@@ -260,14 +259,12 @@
     return;
   }
 
-  absl::optional<AccountInfo> account_info =
-      identity_manager_
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id);
-  DCHECK(account_info) << "Intercepting unknown account.";
+  AccountInfo account_info =
+      identity_manager_->FindExtendedAccountInfoByAccountId(account_id);
+  DCHECK(!account_info.IsEmpty()) << "Intercepting unknown account.";
   const ProfileAttributesEntry* entry = nullptr;
   absl::optional<SigninInterceptionHeuristicOutcome> heuristic_outcome =
-      GetHeuristicOutcome(is_new_account, is_sync_signin, account_info->email,
+      GetHeuristicOutcome(is_new_account, is_sync_signin, account_info.email,
                           &entry);
   account_id_ = account_id;
   is_interception_in_progress_ = true;
@@ -279,14 +276,14 @@
         SigninInterceptionHeuristicOutcome::kInterceptProfileSwitch) {
       DCHECK(entry);
       Delegate::BubbleParameters bubble_parameters{
-          SigninInterceptionType::kProfileSwitch, *account_info,
+          SigninInterceptionType::kProfileSwitch, account_info,
           GetPrimaryAccountInfo(identity_manager_),
           entry->GetProfileThemeColors().profile_highlight_color,
           /*show_guest_option=*/false};
       interception_bubble_handle_ = delegate_->ShowSigninInterceptionBubble(
           web_contents, bubble_parameters,
           base::BindOnce(&DiceWebSigninInterceptor::OnProfileSwitchChoice,
-                         base::Unretained(this), account_info->email,
+                         base::Unretained(this), account_info.email,
                          entry->GetPath()));
       was_interception_ui_displayed_ = true;
     } else {
@@ -298,8 +295,8 @@
   }
 
   account_info_fetch_start_time_ = base::TimeTicks::Now();
-  if (account_info->IsValid()) {
-    OnExtendedAccountInfoUpdated(*account_info);
+  if (account_info.IsValid()) {
+    OnExtendedAccountInfoUpdated(account_info);
   } else {
     on_account_info_update_timeout_.Reset(base::BindOnce(
         &DiceWebSigninInterceptor::OnExtendedAccountInfoFetchTimeout,
@@ -382,11 +379,8 @@
   if (intercepted_account_info.IsManaged())
     return true;
 
-  absl::optional<AccountInfo> primary_account_info =
-      identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
-          primary_core_account_info);
-
-  return primary_account_info && primary_account_info->IsManaged();
+  return identity_manager_->FindExtendedAccountInfo(primary_core_account_info)
+      .IsManaged();
 }
 
 bool DiceWebSigninInterceptor::ShouldShowMultiUserBubble(
diff --git a/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc b/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
index b499455a..5e5efbeb 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
@@ -247,8 +247,8 @@
   // - other enterprise account that is not primary (should be ignored)
   // - intercepted account.
   AccountInfo primary_account_info =
-      identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
-          "alice@example.com");
+      identity_test_env()->MakePrimaryAccountAvailable(
+          "alice@example.com", signin::ConsentLevel::kSignin);
   AccountInfo other_account_info =
       identity_test_env()->MakeAccountAvailable("dummy@example.com");
   MakeValidAccountInfo(&other_account_info);
@@ -265,9 +265,8 @@
   // The primary account does not have full account info (empty domain).
   ASSERT_TRUE(identity_test_env()
                   ->identity_manager()
-                  ->FindExtendedAccountInfoForAccountWithRefreshToken(
-                      primary_account_info)
-                  ->hosted_domain.empty());
+                  ->FindExtendedAccountInfo(primary_account_info)
+                  .hosted_domain.empty());
   EXPECT_FALSE(interceptor()->ShouldShowEnterpriseBubble(account_info));
   account_info.hosted_domain = "example.com";
   identity_test_env()->UpdateAccountInfoForAccount(account_info);
@@ -493,8 +492,8 @@
 TEST_F(DiceWebSigninInterceptorTest, DeclineCreationRepeatedly) {
   base::HistogramTester histogram_tester;
   AccountInfo primary_account_info =
-      identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
-          "bob@example.com");
+      identity_test_env()->MakePrimaryAccountAvailable(
+          "bob@example.com", signin::ConsentLevel::kSignin);
   AccountInfo account_info =
       identity_test_env()->MakeAccountAvailable("alice@example.com");
   MakeValidAccountInfo(&account_info);
@@ -711,12 +710,10 @@
   AccountInfo account_info =
       identity_test_env()->MakeAccountAvailable("bob@example.com");
   // Interception aborts even if the account info is not available.
-  ASSERT_FALSE(
-      identity_test_env()
-          ->identity_manager()
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_info.account_id)
-          ->IsValid());
+  ASSERT_FALSE(identity_test_env()
+                   ->identity_manager()
+                   ->FindExtendedAccountInfoByAccountId(account_info.account_id)
+                   .IsValid());
   TestSynchronousInterception(
       account_info, /*is_new_account=*/true, /*is_sync_signin=*/false,
       SigninInterceptionHeuristicOutcome::kAbortSingleAccount);
@@ -760,8 +757,8 @@
 TEST_F(DiceWebSigninInterceptorTest, WaitForAccountInfoAvailable) {
   base::HistogramTester histogram_tester;
   AccountInfo primary_account_info =
-      identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
-          "bob@example.com");
+      identity_test_env()->MakePrimaryAccountAvailable(
+          "bob@example.com", signin::ConsentLevel::kSignin);
   AccountInfo account_info =
       identity_test_env()->MakeAccountAvailable("alice@example.com");
   EXPECT_FALSE(interceptor()
@@ -792,8 +789,8 @@
 TEST_F(DiceWebSigninInterceptorTest, AccountInfoAlreadyAvailable) {
   base::HistogramTester histogram_tester;
   AccountInfo primary_account_info =
-      identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
-          "bob@example.com");
+      identity_test_env()->MakePrimaryAccountAvailable(
+          "bob@example.com", signin::ConsentLevel::kSignin);
   AccountInfo account_info =
       identity_test_env()->MakeAccountAvailable("alice@example.com");
   MakeValidAccountInfo(&account_info);
@@ -819,8 +816,8 @@
 TEST_F(DiceWebSigninInterceptorTest, MultiUserInterception) {
   base::HistogramTester histogram_tester;
   AccountInfo primary_account_info =
-      identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
-          "bob@example.com");
+      identity_test_env()->MakePrimaryAccountAvailable(
+          "bob@example.com", signin::ConsentLevel::kSignin);
   AccountInfo account_info =
       identity_test_env()->MakeAccountAvailable("alice@example.com");
   MakeValidAccountInfo(&account_info);
diff --git a/chrome/browser/signin/force_signin_verifier_unittest.cc b/chrome/browser/signin/force_signin_verifier_unittest.cc
index a58c6a21..ccc6b8d 100644
--- a/chrome/browser/signin/force_signin_verifier_unittest.cc
+++ b/chrome/browser/signin/force_signin_verifier_unittest.cc
@@ -149,7 +149,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ForceSigninVerifierWithAccessToInternalsForTesting verifier(
       identity_test_env.identity_manager());
@@ -172,7 +173,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ForceSigninVerifierWithAccessToInternalsForTesting verifier(
       identity_test_env.identity_manager());
@@ -196,7 +198,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ForceSigninVerifierWithAccessToInternalsForTesting verifier(
       identity_test_env.identity_manager());
@@ -219,7 +222,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ForceSigninVerifierWithAccessToInternalsForTesting verifier(
       identity_test_env.identity_manager());
@@ -243,7 +247,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ForceSigninVerifierWithAccessToInternalsForTesting verifier(
       identity_test_env.identity_manager());
@@ -267,7 +272,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ConfigureNetworkConnectionTracker(NetworkConnectionType::Undecided,
                                     NetworkResponseType::Asynchronous);
@@ -289,7 +295,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ConfigureNetworkConnectionTracker(NetworkConnectionType::ConnectionNone,
                                     NetworkResponseType::Asynchronous);
@@ -318,7 +325,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ConfigureNetworkConnectionTracker(NetworkConnectionType::ConnectionWifi,
                                     NetworkResponseType::Asynchronous);
@@ -349,7 +357,8 @@
   base::test::TaskEnvironment scoped_task_env;
   signin::IdentityTestEnvironment identity_test_env;
   const AccountInfo account_info =
-      identity_test_env.MakePrimaryAccountAvailable("email@test.com");
+      identity_test_env.MakePrimaryAccountAvailable(
+          "email@test.com", signin::ConsentLevel::kSync);
 
   ConfigureNetworkConnectionTracker(NetworkConnectionType::ConnectionWifi,
                                     NetworkResponseType::Asynchronous);
diff --git a/chrome/browser/signin/header_modification_delegate_impl.cc b/chrome/browser/signin/header_modification_delegate_impl.cc
index da66dc94..4b4e5c7 100644
--- a/chrome/browser/signin/header_modification_delegate_impl.cc
+++ b/chrome/browser/signin/header_modification_delegate_impl.cc
@@ -81,12 +81,11 @@
       identity_manager->GetPrimaryAccountInfo(consent_level);
   absl::optional<bool> is_child_account = absl::nullopt;
   if (!account.IsEmpty()) {
-    absl::optional<AccountInfo> extended_account_info =
-        identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-            account);
-    if (extended_account_info.has_value()) {
-      is_child_account = absl::make_optional<bool>(
-          extended_account_info.value().is_child_account);
+    AccountInfo extended_account_info =
+        identity_manager->FindExtendedAccountInfo(account);
+    if (!extended_account_info.IsEmpty()) {
+      is_child_account =
+          absl::make_optional<bool>(extended_account_info.is_child_account);
     }
   }
 
diff --git a/chrome/browser/signin/signin_global_error_unittest.cc b/chrome/browser/signin/signin_global_error_unittest.cc
index d78f402..d197182 100644
--- a/chrome/browser/signin/signin_global_error_unittest.cc
+++ b/chrome/browser/signin/signin_global_error_unittest.cc
@@ -59,7 +59,8 @@
 
     AccountInfo account_info =
         identity_test_env_profile_adaptor_->identity_test_env()
-            ->MakePrimaryAccountAvailable(kTestEmail);
+            ->MakePrimaryAccountAvailable(kTestEmail,
+                                          signin::ConsentLevel::kSync);
     ProfileAttributesEntry* entry =
         profile_manager_.profile_attributes_storage()
             ->GetProfileAttributesWithPath(profile()->GetPath());
diff --git a/chrome/browser/signin/signin_manager.cc b/chrome/browser/signin/signin_manager.cc
index 10a3188..c3b6ae2 100644
--- a/chrome/browser/signin/signin_manager.cc
+++ b/chrome/browser/signin/signin_manager.cc
@@ -70,18 +70,18 @@
       return absl::nullopt;
     }
 
-    absl::optional<AccountInfo> account_info =
-        identity_manager_
-            ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-                cookie_accounts[0].id);
+    AccountInfo account_info =
+        identity_manager_->FindExtendedAccountInfoByAccountId(
+            cookie_accounts[0].id);
 
     // Verify the first account in cookies has a refresh token that is valid.
     bool error_state =
-        !account_info.has_value() ||
+        account_info.IsEmpty() ||
         identity_manager_->HasAccountWithRefreshTokenInPersistentErrorState(
-            account_info->account_id);
+            account_info.account_id);
 
-    return error_state ? absl::nullopt : account_info;
+    return error_state ? absl::nullopt
+                       : absl::make_optional<CoreAccountInfo>(account_info);
   }
 
   if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin))
diff --git a/chrome/browser/signin/signin_manager_unittest.cc b/chrome/browser/signin/signin_manager_unittest.cc
index 45b76a4..862bbfb4 100644
--- a/chrome/browser/signin/signin_manager_unittest.cc
+++ b/chrome/browser/signin/signin_manager_unittest.cc
@@ -133,7 +133,8 @@
   }
 
   AccountInfo MakeSyncAccountAvailableWithCookies(const std::string& email) {
-    AccountInfo account = identity_test_env_.MakePrimaryAccountAvailable(email);
+    AccountInfo account = identity_test_env_.MakePrimaryAccountAvailable(
+        email, signin::ConsentLevel::kSync);
     identity_test_env_.SetCookieAccounts({{account.email, account.gaia}});
     EXPECT_EQ(account,
               identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
diff --git a/chrome/browser/signin/signin_profile_attributes_updater_unittest.cc b/chrome/browser/signin/signin_profile_attributes_updater_unittest.cc
index 535f77a..3caee7f7c 100644
--- a/chrome/browser/signin/signin_profile_attributes_updater_unittest.cc
+++ b/chrome/browser/signin/signin_profile_attributes_updater_unittest.cc
@@ -106,7 +106,8 @@
   EXPECT_FALSE(entry->IsSigninRequired());
 
   // Signin.
-  identity_test_env_.MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_.MakePrimaryAccountAvailable(kEmail,
+                                                 signin::ConsentLevel::kSync);
   EXPECT_TRUE(entry->IsAuthenticated());
   EXPECT_EQ(signin::GetTestGaiaIdForEmail(kEmail), entry->GetGAIAId());
   EXPECT_EQ(kEmail, base::UTF16ToUTF8(entry->GetUserName()));
@@ -126,7 +127,9 @@
   ASSERT_NE(entry, nullptr);
 
   CoreAccountId account_id =
-      identity_test_env_.MakePrimaryAccountAvailable(kEmail).account_id;
+      identity_test_env_
+          .MakePrimaryAccountAvailable(kEmail, signin::ConsentLevel::kSync)
+          .account_id;
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // ChromeOS only observes signin state at initial creation of the updater, so
@@ -163,9 +166,8 @@
   SetProfilePrefs(pref_service);
 
   // Set UPA should reset profile prefs.
-  AccountInfo account_info =
-      identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(
-          "email1@example.com");
+  AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
+      "email1@example.com", signin::ConsentLevel::kSignin);
   EXPECT_FALSE(entry->IsAuthenticated());
   CheckProfilePrefsReset(pref_service, false);
   SetProfilePrefs(pref_service);
@@ -176,8 +178,8 @@
 
   SetProfilePrefs(pref_service);
   // Set primary account should reset profile prefs.
-  AccountInfo primary_account =
-      identity_test_env_.MakePrimaryAccountAvailable("primary@example.com");
+  AccountInfo primary_account = identity_test_env_.MakePrimaryAccountAvailable(
+      "primary@example.com", signin::ConsentLevel::kSync);
   CheckProfilePrefsReset(pref_service, false);
   SetProfilePrefs(pref_service);
   // Disabling sync should reset profile prefs.
@@ -194,9 +196,8 @@
           ->GetProfileAttributesWithPath(profile_->GetPath());
   ASSERT_NE(entry, nullptr);
   // Set UPA.
-  AccountInfo account_info =
-      identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(
-          "email1@example.com");
+  AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
+      "email1@example.com", signin::ConsentLevel::kSignin);
   EXPECT_FALSE(entry->IsAuthenticated());
   SetProfilePrefs(pref_service);
   // Set primary account to be the same as the UPA.
@@ -216,14 +217,13 @@
       profile_manager_.profile_attributes_storage()
           ->GetProfileAttributesWithPath(profile_->GetPath());
   ASSERT_NE(entry, nullptr);
-  AccountInfo account_info =
-      identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(
-          "email1@example.com");
+  AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
+      "email1@example.com", signin::ConsentLevel::kSignin);
   EXPECT_FALSE(entry->IsAuthenticated());
   SetProfilePrefs(pref_service);
   // Set primary account to a different account than the UPA.
-  AccountInfo primary_account =
-      identity_test_env_.MakePrimaryAccountAvailable("primary@example.com");
+  AccountInfo primary_account = identity_test_env_.MakePrimaryAccountAvailable(
+      "primary@example.com", signin::ConsentLevel::kSync);
   EXPECT_TRUE(entry->IsAuthenticated());
   CheckProfilePrefsReset(pref_service, false);
 }
@@ -247,8 +247,8 @@
   EXPECT_FALSE(entry->IsAuthenticated());
   EXPECT_TRUE(entry->IsSigninRequired());
 
-  AccountInfo account_info =
-      identity_test_env_.MakePrimaryAccountAvailable(kEmail);
+  AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
+      kEmail, signin::ConsentLevel::kSync);
 
   EXPECT_TRUE(entry->IsAuthenticated());
   EXPECT_EQ(signin::GetTestGaiaIdForEmail(kEmail), entry->GetGAIAId());
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc
index afd97024..2f68f4ff 100644
--- a/chrome/browser/signin/signin_ui_util.cc
+++ b/chrome/browser/signin/signin_ui_util.cc
@@ -339,15 +339,14 @@
   if (core_info.IsEmpty())
     return profile_attributes_entry.GetName();
 
-  absl::optional<AccountInfo> extended_info =
-      identity_manager
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              core_info.account_id);
+  AccountInfo extended_info =
+      identity_manager->FindExtendedAccountInfoByAccountId(
+          core_info.account_id);
   // If there's no given name available, return the user email.
-  if (!extended_info.has_value() || extended_info->given_name.empty())
+  if (extended_info.given_name.empty())
     return base::UTF8ToUTF16(core_info.email);
 
-  return base::UTF8ToUTF16(extended_info->given_name);
+  return base::UTF8ToUTF16(extended_info.given_name);
 }
 
 std::string GetAllowedDomain(std::string signin_pattern) {
diff --git a/chrome/browser/signin/signin_ui_util_unittest.cc b/chrome/browser/signin/signin_ui_util_unittest.cc
index 323deb0e..fe3d817 100644
--- a/chrome/browser/signin/signin_ui_util_unittest.cc
+++ b/chrome/browser/signin/signin_ui_util_unittest.cc
@@ -260,10 +260,7 @@
                      "Signin_Signin_FromBookmarkBubble"));
 
     EnableSync(
-        GetIdentityManager()
-            ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-                account_id)
-            .value(),
+        GetIdentityManager()->FindExtendedAccountInfoByAccountId(account_id),
         is_default_promo_account);
     signin_metrics::PromoAction expected_promo_action =
         is_default_promo_account
@@ -320,10 +317,7 @@
                      "Signin_Signin_FromBookmarkBubble"));
 
     EnableSync(
-        GetIdentityManager()
-            ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-                account_id)
-            .value(),
+        GetIdentityManager()->FindExtendedAccountInfoByAccountId(account_id),
         is_default_promo_account);
     ASSERT_FALSE(create_dice_turn_sync_on_helper_called_);
 
diff --git a/chrome/browser/ssl/security_state_tab_helper.cc b/chrome/browser/ssl/security_state_tab_helper.cc
index 33d13d4f..f3131433 100644
--- a/chrome/browser/ssl/security_state_tab_helper.cc
+++ b/chrome/browser/ssl/security_state_tab_helper.cc
@@ -50,8 +50,8 @@
 #include "url/origin.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/chromeos/policy/policy_cert_service.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(FULL_SAFE_BROWSING)
diff --git a/chrome/browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc b/chrome/browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc
index 00ea9bbc..eb91b50 100644
--- a/chrome/browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc
+++ b/chrome/browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc
@@ -150,7 +150,7 @@
     return identity_test_env_.SetPrimaryAccount(kAccountId,
                                                 signin::ConsentLevel::kSignin);
 #elif defined(OS_ANDROID)
-    // TODO(https://crbug.com/1046746): Change to SetUnconsentedPrimaryAccount()
+    // TODO(https://crbug.com/1046746): Change to ConsentLevel::kSignin
     // when Android supports the concept of an unconsented primary account that
     // is different than the primary account.
     return identity_test_env_.SetPrimaryAccount(kAccountId,
@@ -162,9 +162,14 @@
 
   void IssueRefreshToken() {
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-    identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(kAccountId);
+    identity_test_env_.MakePrimaryAccountAvailable(
+        kAccountId, signin::ConsentLevel::kSignin);
 #elif defined(OS_ANDROID)
-    identity_test_env_.MakePrimaryAccountAvailable(kAccountId);
+    // TODO(https://crbug.com/1046746): Change to ConsentLevel::kSignin
+    // when Android supports the concept of an unconsented primary account that
+    // is different than the primary account.
+    identity_test_env_.MakePrimaryAccountAvailable(kAccountId,
+                                                   signin::ConsentLevel::kSync);
 #else
 #error Unsupported platform.
 #endif
diff --git a/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc b/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc
index fe1e3a5..7542472 100644
--- a/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc
+++ b/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc
@@ -25,6 +25,7 @@
 #include "components/signin/public/identity_manager/scope_set.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
+#include "google_apis/gaia/gaia_constants.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
@@ -38,8 +39,6 @@
 namespace {
 
 const char kPermissionRequestApiPath[] = "people/me/permissionRequests";
-const char kPermissionRequestApiScope[] =
-    "https://www.googleapis.com/auth/kid.permission";
 
 const int kNumPermissionRequestRetries = 1;
 
@@ -115,26 +114,11 @@
 }
 
 GURL PermissionRequestCreatorApiary::GetApiUrl() const {
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kPermissionRequestApiUrl)) {
-    GURL url(base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-        switches::kPermissionRequestApiUrl));
-    LOG_IF(WARNING, !url.is_valid())
-        << "Got invalid URL for " << switches::kPermissionRequestApiUrl;
-    return url;
-  }
-
   return kids_management_api::GetURL(kPermissionRequestApiPath);
 }
 
 std::string PermissionRequestCreatorApiary::GetApiScope() const {
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kPermissionRequestApiScope)) {
-    return base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-        switches::kPermissionRequestApiScope);
-  } else {
-    return kPermissionRequestApiScope;
-  }
+  return GaiaConstants::kClassifyUrlKidPermissionOAuth2Scope;
 }
 
 void PermissionRequestCreatorApiary::CreateRequest(
diff --git a/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary_unittest.cc b/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary_unittest.cc
index 6a2758a..52fba4c 100644
--- a/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary_unittest.cc
+++ b/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary_unittest.cc
@@ -44,8 +44,8 @@
       : test_shared_loader_factory_(
             base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
                 &test_url_loader_factory_)) {
-    AccountInfo account_info =
-        identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(kEmail);
+    AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable(
+        kEmail, signin::ConsentLevel::kSignin);
     account_id_ = account_info.account_id;
     permission_creator_ = std::make_unique<PermissionRequestCreatorApiary>(
         identity_test_env_.identity_manager(), test_shared_loader_factory_);
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc b/chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc
index 905cce3..f9819a8 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc
@@ -21,6 +21,7 @@
 #include "components/signin/public/identity_manager/scope_set.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
+#include "google_apis/gaia/gaia_constants.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "google_apis/google_api_keys.h"
 #include "net/base/escape.h"
@@ -49,8 +50,6 @@
 constexpr char kClassifyUrlRequestApiPath[] =
     "https://kidsmanagement-pa.googleapis.com/kidsmanagement/v1/people/"
     "me:classifyUrl";
-constexpr char kClassifyUrlKidPermissionScope[] =
-    "https://www.googleapis.com/auth/kid.permission";
 constexpr char kClassifyUrlOauthConsumerName[] = "kids_url_classifier";
 constexpr char kClassifyUrlDataFormat[] = "url=%s&region_code=%s";
 constexpr char kClassifyUrlAllowed[] = "allowed";
@@ -206,7 +205,8 @@
   auto kids_chrome_request = std::make_unique<KidsChromeManagementRequest>(
       std::move(request_proto), std::move(callback),
       CreateResourceRequestForUrlClassifier(), traffic_annotation,
-      kClassifyUrlOauthConsumerName, kClassifyUrlKidPermissionScope,
+      kClassifyUrlOauthConsumerName,
+      GaiaConstants::kClassifyUrlKidPermissionOAuth2Scope,
       RequestMethod::kClassifyUrl);
 
   MakeHTTPRequest(std::move(kids_chrome_request));
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index 9ffd2ab..efd056b 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -228,8 +228,8 @@
   // TODO(crbug.com/1113597): consider destroying/notifying
   // |trusted_vault_client_| upon IdentityManager shutdown, to avoid its usages
   // afterwards. This can be done by tranferring |trusted_vault_client_|
-  // ownership to ProfileSyncService and acting on
-  // ProfileSyncService::Shutdown() or by handling
+  // ownership to SyncServiceImpl and acting on
+  // SyncServiceImpl::Shutdown() or by handling
   // IdentityManagerFactory::Observer::IdentityManagerShutdown().
   trusted_vault_client_ =
       std::make_unique<syncer::StandaloneTrustedVaultClient>(
diff --git a/chrome/browser/sync/glue/sync_start_util.cc b/chrome/browser/sync/glue/sync_start_util.cc
index 015a80b1..f995fd10 100644
--- a/chrome/browser/sync/glue/sync_start_util.cc
+++ b/chrome/browser/sync/glue/sync_start_util.cc
@@ -33,7 +33,7 @@
 
   syncer::SyncService* service = SyncServiceFactory::GetForProfile(p);
   if (!service) {
-    DVLOG(2) << "No ProfileSyncService for profile, can't start sync.";
+    DVLOG(2) << "No SyncService for profile, can't start sync.";
     return;
   }
   service->OnDataTypeRequestsSyncStartup(type);
diff --git a/chrome/browser/sync/profile_sync_service_android.cc b/chrome/browser/sync/profile_sync_service_android.cc
index e6250272..7f2d57a5 100644
--- a/chrome/browser/sync/profile_sync_service_android.cc
+++ b/chrome/browser/sync/profile_sync_service_android.cc
@@ -28,7 +28,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/user_selectable_type.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/sync_service_utils.h"
 #include "components/sync_sessions/session_sync_service.h"
 #include "content/public/browser/browser_thread.h"
@@ -45,7 +45,7 @@
 namespace {
 
 // Native callback for the JNI GetAllNodes method. When
-// ProfileSyncService::GetAllNodes completes, this method is called and the
+// SyncServiceImpl::GetAllNodes completes, this method is called and the
 // results are sent to the Java callback.
 void NativeGetAllNodesCallback(
     JNIEnv* env,
@@ -75,7 +75,7 @@
 
 ProfileSyncServiceAndroid::ProfileSyncServiceAndroid(
     JNIEnv* env,
-    syncer::ProfileSyncService* native_sync_service,
+    syncer::SyncServiceImpl* native_sync_service,
     jobject java_sync_service)
     : native_sync_service_(native_sync_service),
       java_sync_service_(env, java_sync_service) {
@@ -95,7 +95,7 @@
   Java_ProfileSyncService_syncStateChanged(env, java_sync_service_.get(env));
 }
 
-// Pure ProfileSyncService calls.
+// Pure SyncServiceImpl calls.
 
 jboolean ProfileSyncServiceAndroid::IsSyncRequested(JNIEnv* env) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -384,7 +384,7 @@
 
 // Functionality only available for testing purposes.
 
-jlong ProfileSyncServiceAndroid::GetProfileSyncServiceForTest(JNIEnv* env) {
+jlong ProfileSyncServiceAndroid::GetSyncServiceImplForTest(JNIEnv* env) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return reinterpret_cast<intptr_t>(native_sync_service_);
 }
@@ -417,8 +417,8 @@
     const JavaParamRef<jobject>& java_sync_service) {
   DCHECK(g_browser_process && g_browser_process->profile_manager());
 
-  syncer::ProfileSyncService* sync_service =
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(
           ProfileManager::GetLastUsedProfile());
   if (!sync_service) {
     return 0;
diff --git a/chrome/browser/sync/profile_sync_service_android.h b/chrome/browser/sync/profile_sync_service_android.h
index bfba0c09..6c7ee197 100644
--- a/chrome/browser/sync/profile_sync_service_android.h
+++ b/chrome/browser/sync/profile_sync_service_android.h
@@ -12,11 +12,11 @@
 #include "components/sync/engine/net/http_post_provider_factory.h"
 
 namespace syncer {
-class ProfileSyncService;
+class SyncServiceImpl;
 class SyncSetupInProgressHandle;
 }
 
-// Android wrapper of the ProfileSyncService which provides access from the Java
+// Android wrapper of the SyncServiceImpl which provides access from the Java
 // layer. Note that on Android, there's only a single profile, and therefore
 // a single instance of this wrapper. The name of the Java class is
 // ProfileSyncService.
@@ -25,7 +25,7 @@
  public:
   // |sync_service| must not be null.
   ProfileSyncServiceAndroid(JNIEnv* env,
-                            syncer::ProfileSyncService* sync_service,
+                            syncer::SyncServiceImpl* sync_service,
                             jobject java_profile_sync_service);
   ~ProfileSyncServiceAndroid() override;
 
@@ -36,7 +36,7 @@
   // syncer::SyncServiceObserver:
   void OnStateChanged(syncer::SyncService* sync) override;
 
-  // Pure ProfileSyncService calls.
+  // Pure SyncServiceImpl calls.
   jboolean IsSyncRequested(JNIEnv* env);
   void SetSyncRequested(JNIEnv* env,
                         jboolean requested);
@@ -104,7 +104,7 @@
 
   // Functionality only available for testing purposes.
 
-  jlong GetProfileSyncServiceForTest(JNIEnv* env);
+  jlong GetSyncServiceImplForTest(JNIEnv* env);
 
   // Returns a timestamp for when a sync was last executed. The return value is
   // the internal value of base::Time.
@@ -117,7 +117,7 @@
 
  private:
   // A reference to the sync service for this profile.
-  syncer::ProfileSyncService* const native_sync_service_;
+  syncer::SyncServiceImpl* const native_sync_service_;
 
   // Java-side ProfileSyncService object.
   const JavaObjectWeakGlobalRef java_sync_service_;
diff --git a/chrome/browser/sync/sync_service_factory.cc b/chrome/browser/sync/sync_service_factory.cc
index 5d662dad..546b699 100644
--- a/chrome/browser/sync/sync_service_factory.cc
+++ b/chrome/browser/sync/sync_service_factory.cc
@@ -50,8 +50,8 @@
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/network_time/network_time_tracker.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/network_service_instance.h"
@@ -118,9 +118,9 @@
 }
 
 // static
-syncer::ProfileSyncService*
-SyncServiceFactory::GetAsProfileSyncServiceForProfile(Profile* profile) {
-  return static_cast<syncer::ProfileSyncService*>(GetForProfile(profile));
+syncer::SyncServiceImpl* SyncServiceFactory::GetAsSyncServiceImplForProfile(
+    Profile* profile) {
+  return static_cast<syncer::SyncServiceImpl*>(GetForProfile(profile));
 }
 
 content::BrowserContext* SyncServiceFactory::GetBrowserContextToUse(
@@ -136,7 +136,7 @@
     : BrowserContextKeyedServiceFactory(
           "SyncService",
           BrowserContextDependencyManager::GetInstance()) {
-  // The ProfileSyncService depends on various SyncableServices being around
+  // The SyncServiceImpl depends on various SyncableServices being around
   // when it is shut down.  Specify those dependencies here to build the proper
   // destruction order. Note that some of the dependencies are listed here but
   // actually plumbed in ChromeSyncClient, which this factory constructs.
@@ -186,7 +186,7 @@
 
 KeyedService* SyncServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
-  syncer::ProfileSyncService::InitParams init_params;
+  syncer::SyncServiceImpl::InitParams init_params;
 
   Profile* profile = Profile::FromBrowserContext(context);
 
@@ -232,7 +232,7 @@
     if (local_sync_backend_folder.empty())
       return nullptr;
 
-    init_params.start_behavior = syncer::ProfileSyncService::AUTO_START;
+    init_params.start_behavior = syncer::SyncServiceImpl::AUTO_START;
   }
 #endif  // defined(OS_WIN) || defined(OS_MAC) || (defined(OS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS_LACROS))
@@ -254,7 +254,7 @@
     // is set up and *not* a browser restart for a manual-start platform (where
     // sync has already been set up, and should be able to start without user
     // intervention). We can get rid of the browser_default eventually, but
-    // need to take care that ProfileSyncService doesn't get tripped up between
+    // need to take care that SyncServiceImpl doesn't get tripped up between
     // those two cases. Bug 88109.
     bool is_auto_start = browser_defaults::kSyncAutoStarts;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -272,20 +272,20 @@
     }
 #endif
     init_params.start_behavior = is_auto_start
-                                     ? syncer::ProfileSyncService::AUTO_START
-                                     : syncer::ProfileSyncService::MANUAL_START;
+                                     ? syncer::SyncServiceImpl::AUTO_START
+                                     : syncer::SyncServiceImpl::MANUAL_START;
   }
 
-  auto pss =
-      std::make_unique<syncer::ProfileSyncService>(std::move(init_params));
-  pss->Initialize();
+  auto sync_service =
+      std::make_unique<syncer::SyncServiceImpl>(std::move(init_params));
+  sync_service->Initialize();
 
-  // Hook PSS into PersonalDataManager (a circular dependency).
+  // Hook |sync_service| into PersonalDataManager (a circular dependency).
   autofill::PersonalDataManager* pdm =
       autofill::PersonalDataManagerFactory::GetForProfile(profile);
-  pdm->OnSyncServiceInitialized(pss.get());
+  pdm->OnSyncServiceInitialized(sync_service.get());
 
-  return pss.release();
+  return sync_service.release();
 }
 
 // static
@@ -303,7 +303,7 @@
         syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY);
   }
 
-  // No ProfileSyncService created yet - we don't want to create one, so just
+  // No SyncServiceImpl created yet - we don't want to create one, so just
   // infer the accessible state by looking at prefs/command line flags.
   syncer::SyncPrefs prefs(profile->GetPrefs());
   return switches::IsSyncAllowedByFlag() &&
diff --git a/chrome/browser/sync/sync_service_factory.h b/chrome/browser/sync/sync_service_factory.h
index 024e875..16b668c 100644
--- a/chrome/browser/sync/sync_service_factory.h
+++ b/chrome/browser/sync/sync_service_factory.h
@@ -23,7 +23,7 @@
 }  // namespace browser_sync
 
 namespace syncer {
-class ProfileSyncService;
+class SyncServiceImpl;
 class SyncService;
 }  // namespace syncer
 
@@ -35,9 +35,9 @@
 
   // Returns the SyncService for the given profile.
   static syncer::SyncService* GetForProfile(Profile* profile);
-  // Returns the ProfileSyncService for the given profile. DO NOT USE unless
+  // Returns the SyncServiceImpl for the given profile. DO NOT USE unless
   // absolutely necessary! Prefer GetForProfile instead.
-  static syncer::ProfileSyncService* GetAsProfileSyncServiceForProfile(
+  static syncer::SyncServiceImpl* GetAsSyncServiceImplForProfile(
       Profile* profile);
 
   // Returns whether a SyncService has already been created for the profile.
diff --git a/chrome/browser/sync/sync_service_factory_unittest.cc b/chrome/browser/sync/sync_service_factory_unittest.cc
index 3d40adc..d2b5ce4a 100644
--- a/chrome/browser/sync/sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/sync_service_factory_unittest.cc
@@ -21,8 +21,8 @@
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/sync_base_switches.h"
 #include "components/sync/driver/data_type_controller.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_task_environment.h"
 #include "extensions/buildflags/buildflags.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -191,46 +191,46 @@
   EXPECT_EQ(nullptr, SyncServiceFactory::GetForProfile(profile()));
 }
 
-// Verify that a normal (no command line flags) PSS can be created and
-// properly initialized.
-TEST_F(SyncServiceFactoryTest, CreatePSSDefault) {
-  syncer::ProfileSyncService* pss =
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile());
-  syncer::ModelTypeSet types = pss->GetRegisteredDataTypesForTest();
+// Verify that a normal (no command line flags) SyncServiceImpl can be created
+// and properly initialized.
+TEST_F(SyncServiceFactoryTest, CreateSyncServiceImplDefault) {
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(profile());
+  syncer::ModelTypeSet types = sync_service->GetRegisteredDataTypesForTest();
   EXPECT_EQ(DefaultDatatypesCount(), types.Size());
   CheckDefaultDatatypesInSetExcept(types, syncer::ModelTypeSet());
 
-  pss->Shutdown();
+  sync_service->Shutdown();
   RunUntilIdle();
 }
 
-// Verify that a PSS with a disabled datatype can be created and properly
-// initialized.
-TEST_F(SyncServiceFactoryTest, CreatePSSDisableOne) {
+// Verify that a SyncServiceImpl with a disabled datatype can be created and
+// properly initialized.
+TEST_F(SyncServiceFactoryTest, CreateSyncServiceImplDisableOne) {
   syncer::ModelTypeSet disabled_types(syncer::AUTOFILL);
   SetDisabledTypes(disabled_types);
-  syncer::ProfileSyncService* pss =
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile());
-  syncer::ModelTypeSet types = pss->GetRegisteredDataTypesForTest();
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(profile());
+  syncer::ModelTypeSet types = sync_service->GetRegisteredDataTypesForTest();
   EXPECT_EQ(DefaultDatatypesCount() - disabled_types.Size(), types.Size());
   CheckDefaultDatatypesInSetExcept(types, disabled_types);
 
-  pss->Shutdown();
+  sync_service->Shutdown();
   RunUntilIdle();
 }
 
-// Verify that a PSS with multiple disabled datatypes can be created and
-// properly initialized.
-TEST_F(SyncServiceFactoryTest, CreatePSSDisableMultiple) {
+// Verify that a SyncServiceImpl with multiple disabled datatypes can be created
+// and properly initialized.
+TEST_F(SyncServiceFactoryTest, CreateSyncServiceImplDisableMultiple) {
   syncer::ModelTypeSet disabled_types(syncer::AUTOFILL_PROFILE,
                                       syncer::BOOKMARKS);
   SetDisabledTypes(disabled_types);
-  syncer::ProfileSyncService* pss =
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile());
-  syncer::ModelTypeSet types = pss->GetRegisteredDataTypesForTest();
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(profile());
+  syncer::ModelTypeSet types = sync_service->GetRegisteredDataTypesForTest();
   EXPECT_EQ(DefaultDatatypesCount() - disabled_types.Size(), types.Size());
   CheckDefaultDatatypesInSetExcept(types, disabled_types);
 
-  pss->Shutdown();
+  sync_service->Shutdown();
   RunUntilIdle();
 }
diff --git a/chrome/browser/sync/sync_ui_util_unittest.cc b/chrome/browser/sync/sync_ui_util_unittest.cc
index bc3b8bd5..5bc68368 100644
--- a/chrome/browser/sync/sync_ui_util_unittest.cc
+++ b/chrome/browser/sync/sync_ui_util_unittest.cc
@@ -226,7 +226,8 @@
     signin::IdentityTestEnvironment environment;
 
     // Need a primary account signed in before calling SetUpDistinctCase().
-    environment.MakePrimaryAccountAvailable(kTestUser);
+    environment.MakePrimaryAccountAvailable(kTestUser,
+                                            signin::ConsentLevel::kSync);
 
     StatusLabels expected_labels = SetUpDistinctCase(
         &service, &environment, static_cast<DistinctState>(index));
@@ -323,7 +324,8 @@
   signin::IdentityTestEnvironment environment;
 
   const AccountInfo primary_account_info =
-      environment.MakePrimaryAccountAvailable(kTestUser);
+      environment.MakePrimaryAccountAvailable(kTestUser,
+                                              signin::ConsentLevel::kSync);
   service.SetAuthenticatedAccountInfo(primary_account_info);
   service.SetFirstSetupComplete(true);
 
diff --git a/chrome/browser/sync/test/integration/autofill_helper.cc b/chrome/browser/sync/test/integration/autofill_helper.cc
index 93ccd78..5308803 100644
--- a/chrome/browser/sync/test/integration/autofill_helper.cc
+++ b/chrome/browser/sync/test/integration/autofill_helper.cc
@@ -27,7 +27,6 @@
 #include "components/autofill/core/browser/webdata/autofill_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/autofill/core/common/form_field_data.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/webdata/common/web_database.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc
index 169d2e9..a4d19e31 100644
--- a/chrome/browser/sync/test/integration/bookmarks_helper.cc
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc
@@ -44,7 +44,7 @@
 #include "components/favicon/core/favicon_service.h"
 #include "components/favicon_base/favicon_util.h"
 #include "components/sync/base/unique_position.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/test/fake_server/entity_builder_factory.h"
 #include "content/public/test/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -1141,7 +1141,7 @@
 }
 
 ServerBookmarksEqualityChecker::ServerBookmarksEqualityChecker(
-    syncer::ProfileSyncService* service,
+    syncer::SyncServiceImpl* service,
     fake_server::FakeServer* fake_server,
     std::vector<ExpectedBookmark> expected_bookmarks,
     syncer::Cryptographer* cryptographer)
@@ -1233,7 +1233,7 @@
 
 BookmarkModelMatchesFakeServerChecker::BookmarkModelMatchesFakeServerChecker(
     int profile,
-    syncer::ProfileSyncService* service,
+    syncer::SyncServiceImpl* service,
     fake_server::FakeServer* fake_server)
     : SingleClientStatusChangeChecker(service),
       fake_server_(fake_server),
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.h b/chrome/browser/sync/test/integration/bookmarks_helper.h
index e3a3a9a3..c0bdf757 100644
--- a/chrome/browser/sync/test/integration/bookmarks_helper.h
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.h
@@ -494,7 +494,7 @@
   // will be used to decrypt the data prior to checking for equality.
   // |fake_server| must not be nullptr and must outlive this object.
   ServerBookmarksEqualityChecker(
-      syncer::ProfileSyncService* service,
+      syncer::SyncServiceImpl* service,
       fake_server::FakeServer* fake_server,
       std::vector<ExpectedBookmark> expected_bookmarks,
       syncer::Cryptographer* cryptographer);
@@ -543,7 +543,7 @@
     : public SingleClientStatusChangeChecker {
  public:
   BookmarkModelMatchesFakeServerChecker(int profile,
-                                        syncer::ProfileSyncService* service,
+                                        syncer::SyncServiceImpl* service,
                                         fake_server::FakeServer* fake_server);
 
   bool IsExitConditionSatisfied(std::ostream* os) override;
diff --git a/chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.cc b/chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.cc
index 812955a..ce14fe62 100644
--- a/chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.cc
+++ b/chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.cc
@@ -4,10 +4,10 @@
 
 #include "chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.h"
 
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 
 CommittedAllNudgedChangesChecker::CommittedAllNudgedChangesChecker(
-    syncer::ProfileSyncService* service)
+    syncer::SyncServiceImpl* service)
     : SingleClientStatusChangeChecker(service) {
   service->HasUnsyncedItemsForTest(
       base::BindOnce(&CommittedAllNudgedChangesChecker::GotHasUnsyncedItems,
diff --git a/chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.h b/chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.h
index e1446bb7..5116551 100644
--- a/chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.h
+++ b/chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.h
@@ -10,7 +10,7 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace syncer {
-class ProfileSyncService;
+class SyncServiceImpl;
 }  // namespace syncer
 
 // Checker to block until all nudged changes have been committed to the server.
@@ -19,8 +19,7 @@
 class CommittedAllNudgedChangesChecker
     : public SingleClientStatusChangeChecker {
  public:
-  explicit CommittedAllNudgedChangesChecker(
-      syncer::ProfileSyncService* service);
+  explicit CommittedAllNudgedChangesChecker(syncer::SyncServiceImpl* service);
   ~CommittedAllNudgedChangesChecker() override;
 
   // StatusChangeChecker implementation.
diff --git a/chrome/browser/sync/test/integration/enable_disable_test.cc b/chrome/browser/sync/test/integration/enable_disable_test.cc
index 76f032d..8d7784f 100644
--- a/chrome/browser/sync/test/integration/enable_disable_test.cc
+++ b/chrome/browser/sync/test/integration/enable_disable_test.cc
@@ -18,7 +18,7 @@
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/user_selectable_type.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/sync_user_settings_impl.h"
 #include "components/sync/test/fake_server/bookmark_entity_builder.h"
 #include "components/sync/test/fake_server/entity_builder_factory.h"
diff --git a/chrome/browser/sync/test/integration/encryption_helper.cc b/chrome/browser/sync/test/integration/encryption_helper.cc
index da1f902..c32a9c1 100644
--- a/chrome/browser/sync/test/integration/encryption_helper.cc
+++ b/chrome/browser/sync/test/integration/encryption_helper.cc
@@ -10,13 +10,13 @@
 #include "base/bind.h"
 #include "components/sync/base/passphrase_enums.h"
 #include "components/sync/base/sync_base_switches.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_client.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/sync_engine_switches.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 ServerNigoriChecker::ServerNigoriChecker(
-    syncer::ProfileSyncService* service,
+    syncer::SyncServiceImpl* service,
     fake_server::FakeServer* fake_server,
     syncer::PassphraseType expected_passphrase_type)
     : SingleClientStatusChangeChecker(service),
@@ -38,7 +38,7 @@
 
 ServerNigoriKeyNameChecker::ServerNigoriKeyNameChecker(
     const std::string& expected_key_name,
-    syncer::ProfileSyncService* service,
+    syncer::SyncServiceImpl* service,
     fake_server::FakeServer* fake_server)
     : SingleClientStatusChangeChecker(service),
       fake_server_(fake_server),
@@ -59,7 +59,7 @@
 }
 
 PassphraseRequiredStateChecker::PassphraseRequiredStateChecker(
-    syncer::ProfileSyncService* service,
+    syncer::SyncServiceImpl* service,
     bool desired_state)
     : SingleClientStatusChangeChecker(service), desired_state_(desired_state) {}
 
@@ -73,7 +73,7 @@
 }
 
 TrustedVaultKeyRequiredStateChecker::TrustedVaultKeyRequiredStateChecker(
-    syncer::ProfileSyncService* service,
+    syncer::SyncServiceImpl* service,
     bool desired_state)
     : SingleClientStatusChangeChecker(service), desired_state_(desired_state) {}
 
@@ -88,7 +88,7 @@
 }
 
 TrustedVaultKeysChangedStateChecker::TrustedVaultKeysChangedStateChecker(
-    syncer::ProfileSyncService* service)
+    syncer::SyncServiceImpl* service)
     : service_(service), keys_changed_(false) {
   service->GetSyncClientForTest()->GetTrustedVaultClient()->AddObserver(this);
 }
diff --git a/chrome/browser/sync/test/integration/encryption_helper.h b/chrome/browser/sync/test/integration/encryption_helper.h
index 1865432..da293d7 100644
--- a/chrome/browser/sync/test/integration/encryption_helper.h
+++ b/chrome/browser/sync/test/integration/encryption_helper.h
@@ -19,7 +19,7 @@
 // available on the server.
 class ServerNigoriChecker : public SingleClientStatusChangeChecker {
  public:
-  ServerNigoriChecker(syncer::ProfileSyncService* service,
+  ServerNigoriChecker(syncer::SyncServiceImpl* service,
                       fake_server::FakeServer* fake_server,
                       syncer::PassphraseType expected_passphrase_type);
 
@@ -35,7 +35,7 @@
 class ServerNigoriKeyNameChecker : public SingleClientStatusChangeChecker {
  public:
   ServerNigoriKeyNameChecker(const std::string& expected_key_name,
-                             syncer::ProfileSyncService* service,
+                             syncer::SyncServiceImpl* service,
                              fake_server::FakeServer* fake_server);
 
   bool IsExitConditionSatisfied(std::ostream* os) override;
@@ -48,7 +48,7 @@
 // Checker used to block until Sync requires or stops requiring a passphrase.
 class PassphraseRequiredStateChecker : public SingleClientStatusChangeChecker {
  public:
-  PassphraseRequiredStateChecker(syncer::ProfileSyncService* service,
+  PassphraseRequiredStateChecker(syncer::SyncServiceImpl* service,
                                  bool desired_state);
 
   bool IsExitConditionSatisfied(std::ostream* os) override;
@@ -62,7 +62,7 @@
 class TrustedVaultKeyRequiredStateChecker
     : public SingleClientStatusChangeChecker {
  public:
-  TrustedVaultKeyRequiredStateChecker(syncer::ProfileSyncService* service,
+  TrustedVaultKeyRequiredStateChecker(syncer::SyncServiceImpl* service,
                                       bool desired_state);
 
   bool IsExitConditionSatisfied(std::ostream* os) override;
@@ -77,7 +77,7 @@
       syncer::TrustedVaultClient::Observer {
  public:
   explicit TrustedVaultKeysChangedStateChecker(
-      syncer::ProfileSyncService* service);
+      syncer::SyncServiceImpl* service);
   ~TrustedVaultKeysChangedStateChecker() override;
 
   // StatusChangeChecker overrides.
@@ -88,7 +88,7 @@
   void OnTrustedVaultRecoverabilityChanged() override;
 
  private:
-  syncer::ProfileSyncService* const service_;
+  syncer::SyncServiceImpl* const service_;
   bool keys_changed_;
 };
 
diff --git a/chrome/browser/sync/test/integration/local_sync_test.cc b/chrome/browser/sync/test/integration/local_sync_test.cc
index bec2f9f..d8de780 100644
--- a/chrome/browser/sync/test/integration/local_sync_test.cc
+++ b/chrome/browser/sync/test/integration/local_sync_test.cc
@@ -20,18 +20,18 @@
 #include "components/browser_sync/browser_sync_switches.h"
 #include "components/reading_list/features/reading_list_switches.h"
 #include "components/sync/base/model_type.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 #include "crypto/ec_private_key.h"
 
 namespace {
 
-using syncer::ProfileSyncService;
+using syncer::SyncServiceImpl;
 
 class SyncTransportActiveChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit SyncTransportActiveChecker(ProfileSyncService* service)
+  explicit SyncTransportActiveChecker(SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   bool IsExitConditionSatisfied(std::ostream* os) override {
@@ -76,9 +76,8 @@
 #if defined(OS_WIN) || defined(OS_MAC) || \
     (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
 IN_PROC_BROWSER_TEST_F(LocalSyncTest, ShouldStart) {
-  ProfileSyncService* service =
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(
-          browser()->profile());
+  SyncServiceImpl* service =
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(browser()->profile());
 
   // Wait until the first sync cycle is completed.
   ASSERT_TRUE(SyncTransportActiveChecker(service).Wait());
diff --git a/chrome/browser/sync/test/integration/migration_test.cc b/chrome/browser/sync/test/integration/migration_test.cc
index 7fb04110..e0ed4839 100644
--- a/chrome/browser/sync/test/integration/migration_test.cc
+++ b/chrome/browser/sync/test/integration/migration_test.cc
@@ -17,7 +17,7 @@
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/scoped_user_pref_update.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/translate/core/browser/translate_prefs.h"
 #include "content/public/test/browser_test.h"
 
@@ -92,7 +92,7 @@
   }
 
   syncer::ModelTypeSet GetPreferredDataTypes() {
-    // ProfileSyncService must already have been created before we can call
+    // SyncServiceImpl must already have been created before we can call
     // GetPreferredDataTypes().
     DCHECK(GetSyncService(0));
     syncer::ModelTypeSet preferred_data_types =
diff --git a/chrome/browser/sync/test/integration/migration_watcher.cc b/chrome/browser/sync/test/integration/migration_watcher.cc
index 2234b71..63ac4d8 100644
--- a/chrome/browser/sync/test/integration/migration_watcher.cc
+++ b/chrome/browser/sync/test/integration/migration_watcher.cc
@@ -6,7 +6,7 @@
 
 #include "chrome/browser/sync/test/integration/migration_waiter.h"
 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 
 MigrationWatcher::MigrationWatcher(ProfileSyncServiceHarness* harness)
     : harness_(harness), migration_waiter_(nullptr) {
diff --git a/chrome/browser/sync/test/integration/multi_client_status_change_checker.cc b/chrome/browser/sync/test/integration/multi_client_status_change_checker.cc
index e1768543..1e1849072 100644
--- a/chrome/browser/sync/test/integration/multi_client_status_change_checker.cc
+++ b/chrome/browser/sync/test/integration/multi_client_status_change_checker.cc
@@ -4,11 +4,10 @@
 
 #include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h"
 
-
 MultiClientStatusChangeChecker::MultiClientStatusChangeChecker(
-    std::vector<syncer::ProfileSyncService*> services)
+    std::vector<syncer::SyncServiceImpl*> services)
     : services_(services) {
-  for (syncer::ProfileSyncService* service : services)
+  for (syncer::SyncServiceImpl* service : services)
     scoped_observations_.AddObservation(service);
 }
 
diff --git a/chrome/browser/sync/test/integration/multi_client_status_change_checker.h b/chrome/browser/sync/test/integration/multi_client_status_change_checker.h
index 9b40ea97..6576287 100644
--- a/chrome/browser/sync/test/integration/multi_client_status_change_checker.h
+++ b/chrome/browser/sync/test/integration/multi_client_status_change_checker.h
@@ -10,17 +10,17 @@
 #include "base/macros.h"
 #include "base/scoped_multi_source_observation.h"
 #include "chrome/browser/sync/test/integration/status_change_checker.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/sync_service_observer.h"
 
 // This class provides some common functionality for StatusChangeCheckers that
-// observe many ProfileSyncServices.  This class is abstract.  Its descendants
+// observe many SyncServiceImpls.  This class is abstract.  Its descendants
 // are expected to provide additional functionality.
 class MultiClientStatusChangeChecker : public StatusChangeChecker,
                                        public syncer::SyncServiceObserver {
  public:
   explicit MultiClientStatusChangeChecker(
-      std::vector<syncer::ProfileSyncService*> services);
+      std::vector<syncer::SyncServiceImpl*> services);
   ~MultiClientStatusChangeChecker() override;
 
  protected:
@@ -31,12 +31,10 @@
   // StatusChangeChecker implementations and stubs.
   bool IsExitConditionSatisfied(std::ostream* os) override = 0;
 
-  const std::vector<syncer::ProfileSyncService*>& services() {
-    return services_;
-  }
+  const std::vector<syncer::SyncServiceImpl*>& services() { return services_; }
 
  private:
-  std::vector<syncer::ProfileSyncService*> services_;
+  std::vector<syncer::SyncServiceImpl*> services_;
   base::ScopedMultiSourceObservation<syncer::SyncService,
                                      syncer::SyncServiceObserver>
       scoped_observations_{this};
diff --git a/chrome/browser/sync/test/integration/password_manager_sync_test.cc b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
index 6deaeb1..cca9cc3 100644
--- a/chrome/browser/sync/test/integration/password_manager_sync_test.cc
+++ b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
@@ -36,8 +36,8 @@
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/account_info.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/test/fake_server/fake_server_nigori_helper.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browsing_data_remover.h"
diff --git a/chrome/browser/sync/test/integration/passwords_helper.cc b/chrome/browser/sync/test/integration/passwords_helper.cc
index 39c0d1e..8d812e3 100644
--- a/chrome/browser/sync/test/integration/passwords_helper.cc
+++ b/chrome/browser/sync/test/integration/passwords_helper.cc
@@ -435,7 +435,7 @@
 }  // namespace passwords_helper
 
 PasswordSyncActiveChecker::PasswordSyncActiveChecker(
-    syncer::ProfileSyncService* service)
+    syncer::SyncServiceImpl* service)
     : SingleClientStatusChangeChecker(service) {}
 PasswordSyncActiveChecker::~PasswordSyncActiveChecker() = default;
 
@@ -458,7 +458,7 @@
 //
 // This function indirectly calls GetLogins(), which starts a RunLoop on the UI
 // thread.  This can be a problem, since the next task to execute could very
-// well contain a ProfileSyncService::OnStateChanged() event, which would
+// well contain a SyncServiceObserver::OnStateChanged() event, which would
 // trigger another call to this here function, and start another layer of
 // nested RunLoops.  That makes the StatusChangeChecker's Quit() method
 // ineffective.
diff --git a/chrome/browser/sync/test/integration/passwords_helper.h b/chrome/browser/sync/test/integration/passwords_helper.h
index d339067..8aa0549 100644
--- a/chrome/browser/sync/test/integration/passwords_helper.h
+++ b/chrome/browser/sync/test/integration/passwords_helper.h
@@ -149,7 +149,7 @@
 // Checker to wait until the PASSWORDS datatype becomes active.
 class PasswordSyncActiveChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit PasswordSyncActiveChecker(syncer::ProfileSyncService* service);
+  explicit PasswordSyncActiveChecker(syncer::SyncServiceImpl* service);
   ~PasswordSyncActiveChecker() override;
 
   // StatusChangeChecker implementation.
diff --git a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
index 78e05c8..4d8a2e6 100644
--- a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
+++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
@@ -41,14 +41,14 @@
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
 #include "third_party/zlib/google/compression_utils.h"
 
-using syncer::ProfileSyncService;
 using syncer::SyncCycleSnapshot;
+using syncer::SyncServiceImpl;
 
 const char* kSyncUrlClearServerDataKey = "sync-url-clear-server-data";
 
 namespace {
 
-bool HasAuthError(ProfileSyncService* service) {
+bool HasAuthError(SyncServiceImpl* service) {
   return service->GetAuthError().state() ==
              GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS ||
          service->GetAuthError().state() ==
@@ -59,7 +59,7 @@
 
 class EngineInitializeChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit EngineInitializeChecker(ProfileSyncService* service)
+  explicit EngineInitializeChecker(SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   bool IsExitConditionSatisfied(std::ostream* os) override {
@@ -86,7 +86,7 @@
  public:
   enum class State { kTransportActive, kFeatureActive };
 
-  SyncSetupChecker(ProfileSyncService* service, State wait_for_state)
+  SyncSetupChecker(SyncServiceImpl* service, State wait_for_state)
       : SingleClientStatusChangeChecker(service),
         wait_for_state_(wait_for_state) {}
 
@@ -187,7 +187,7 @@
     const std::string& password,
     SigninType signin_type)
     : profile_(profile),
-      service_(SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile)),
+      service_(SyncServiceFactory::GetAsSyncServiceImplForProfile(profile)),
       username_(username),
       password_(password),
       signin_type_(signin_type),
@@ -339,7 +339,7 @@
                     "present data.";
     }
   }
-  // Notify ProfileSyncService that we are done with configuration.
+  // Notify SyncServiceImpl that we are done with configuration.
   FinishSyncSetup();
 
   if (signin_type_ == SigninType::UI_SIGNIN)
@@ -409,7 +409,7 @@
     return true;
   }
 
-  std::vector<ProfileSyncService*> services;
+  std::vector<SyncServiceImpl*> services;
   for (const ProfileSyncServiceHarness* harness : clients) {
     services.push_back(harness->service());
   }
@@ -646,5 +646,5 @@
 bool ProfileSyncServiceHarness::IsSyncEnabledByUser() const {
   return service()->GetUserSettings()->IsFirstSetupComplete() &&
          !service()->HasDisableReason(
-             ProfileSyncService::DISABLE_REASON_USER_CHOICE);
+             SyncServiceImpl::DISABLE_REASON_USER_CHOICE);
 }
diff --git a/chrome/browser/sync/test/integration/profile_sync_service_harness.h b/chrome/browser/sync/test/integration/profile_sync_service_harness.h
index e35d30f..24d8569 100644
--- a/chrome/browser/sync/test/integration/profile_sync_service_harness.h
+++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.h
@@ -13,7 +13,7 @@
 #include "base/macros.h"
 #include "build/chromeos_buildflags.h"
 #include "components/sync/base/user_selectable_type.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/cycle/sync_cycle_snapshot.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -26,7 +26,7 @@
 class SyncSigninDelegate;
 
 // An instance of this class is basically our notion of a "sync client" for
-// automation purposes. It harnesses the ProfileSyncService member of the
+// automation purposes. It harnesses the SyncServiceImpl member of the
 // profile passed to it on construction and automates certain things like setup
 // and authentication. It provides ways to "wait" adequate periods of time for
 // several clients to get to the same state.
@@ -128,8 +128,8 @@
 
   // Blocks the caller until the sync engine is initialized or some end state
   // (e.g., auth error) is reached. Returns true only if the engine initialized
-  // successfully. See ProfileSyncService's IsEngineInitialized() method for the
-  // definition of engine initialization.
+  // successfully. See SyncService::IsEngineInitialized() for the definition
+  // of engine initialization.
   bool AwaitEngineInitialization();
 
   // Blocks the caller until sync setup is complete, and sync-the-feature is
@@ -142,8 +142,8 @@
   // successful.
   bool AwaitSyncTransportActive();
 
-  // Returns the ProfileSyncService member of the sync client.
-  syncer::ProfileSyncService* service() const { return service_; }
+  // Returns the SyncServiceImpl member of the sync client.
+  syncer::SyncServiceImpl* service() const { return service_; }
 
   // Returns the debug name for this profile. Used for logging.
   const std::string& profile_debug_name() const { return profile_debug_name_; }
@@ -203,8 +203,8 @@
   // Profile associated with this sync client.
   Profile* const profile_;
 
-  // ProfileSyncService object associated with |profile_|.
-  syncer::ProfileSyncService* const service_;
+  // SyncServiceImpl object associated with |profile_|.
+  syncer::SyncServiceImpl* const service_;
 
   // Prevents Sync from running until configuration is complete.
   std::unique_ptr<syncer::SyncSetupInProgressHandle> sync_blocker_;
diff --git a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
index 4182d53..34ce0db6 100644
--- a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
+++ b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
@@ -10,7 +10,7 @@
 #include "base/format_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/cycle/sync_cycle_snapshot.h"
 #include "components/sync/test/fake_server/fake_server.h"
 
@@ -41,8 +41,8 @@
 }
 
 // Returns true if these services have matching progress markers.
-bool ProgressMarkersMatch(const syncer::ProfileSyncService* service1,
-                          const syncer::ProfileSyncService* service2,
+bool ProgressMarkersMatch(const syncer::SyncServiceImpl* service1,
+                          const syncer::SyncServiceImpl* service2,
                           std::ostream* os) {
   // GetActiveDataTypes() is always empty during configuration, so progress
   // markers cannot be compared.
@@ -101,7 +101,7 @@
     : public UpdatedProgressMarkerChecker {
  public:
   NestedUpdatedProgressMarkerChecker(
-      syncer::ProfileSyncService* service,
+      syncer::SyncServiceImpl* service,
       const base::RepeatingClosure& check_exit_condition_cb)
       : UpdatedProgressMarkerChecker(service),
         check_exit_condition_cb_(check_exit_condition_cb) {}
@@ -116,7 +116,7 @@
 };
 
 QuiesceStatusChangeChecker::QuiesceStatusChangeChecker(
-    std::vector<syncer::ProfileSyncService*> services)
+    std::vector<syncer::SyncServiceImpl*> services)
     : MultiClientStatusChangeChecker(services) {
   DCHECK_LE(1U, services.size());
   for (size_t i = 0; i < services.size(); ++i) {
@@ -131,7 +131,7 @@
 
 bool QuiesceStatusChangeChecker::IsExitConditionSatisfied(std::ostream* os) {
   // Check that all progress markers are up to date.
-  std::vector<syncer::ProfileSyncService*> enabled_services;
+  std::vector<syncer::SyncServiceImpl*> enabled_services;
   for (const auto& checker : checkers_) {
     enabled_services.push_back(checker->service());
 
diff --git a/chrome/browser/sync/test/integration/quiesce_status_change_checker.h b/chrome/browser/sync/test/integration/quiesce_status_change_checker.h
index 2d1b01386..31bc1bb 100644
--- a/chrome/browser/sync/test/integration/quiesce_status_change_checker.h
+++ b/chrome/browser/sync/test/integration/quiesce_status_change_checker.h
@@ -13,7 +13,7 @@
 #include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h"
 
 namespace syncer {
-class ProfileSyncService;
+class SyncServiceImpl;
 }  // namespace syncer
 
 // Waits until all provided clients have finished committing any unsynced items
@@ -25,7 +25,7 @@
 class QuiesceStatusChangeChecker : public MultiClientStatusChangeChecker {
  public:
   explicit QuiesceStatusChangeChecker(
-      std::vector<syncer::ProfileSyncService*> services);
+      std::vector<syncer::SyncServiceImpl*> services);
   ~QuiesceStatusChangeChecker() override;
 
   // Implementation of StatusChangeChecker.
diff --git a/chrome/browser/sync/test/integration/session_hierarchy_match_checker.cc b/chrome/browser/sync/test/integration/session_hierarchy_match_checker.cc
index 271a8ee..a71372b 100644
--- a/chrome/browser/sync/test/integration/session_hierarchy_match_checker.cc
+++ b/chrome/browser/sync/test/integration/session_hierarchy_match_checker.cc
@@ -6,7 +6,7 @@
 
 SessionHierarchyMatchChecker::SessionHierarchyMatchChecker(
     const fake_server::SessionsHierarchy& sessions_hierarchy,
-    syncer::ProfileSyncService* service,
+    syncer::SyncServiceImpl* service,
     fake_server::FakeServer* fake_server)
     : SingleClientStatusChangeChecker(service),
       sessions_hierarchy_(sessions_hierarchy),
diff --git a/chrome/browser/sync/test/integration/session_hierarchy_match_checker.h b/chrome/browser/sync/test/integration/session_hierarchy_match_checker.h
index fb759de..e964b91 100644
--- a/chrome/browser/sync/test/integration/session_hierarchy_match_checker.h
+++ b/chrome/browser/sync/test/integration/session_hierarchy_match_checker.h
@@ -15,7 +15,7 @@
  public:
   SessionHierarchyMatchChecker(
       const fake_server::SessionsHierarchy& sessions_hierarchy,
-      syncer::ProfileSyncService* service,
+      syncer::SyncServiceImpl* service,
       fake_server::FakeServer* fake_server);
 
   // StatusChangeChecker implementation.
diff --git a/chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc b/chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc
index f02a3a46..712f8dd 100644
--- a/chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc
@@ -6,7 +6,7 @@
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/user_selectable_type.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/sync_user_settings.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -33,7 +33,7 @@
                        DisablingOsSyncFeatureDisablesDataType) {
   ASSERT_TRUE(chromeos::features::IsSplitSettingsSyncEnabled());
   ASSERT_TRUE(SetupSync());
-  syncer::ProfileSyncService* service = GetSyncService(0);
+  syncer::SyncServiceImpl* service = GetSyncService(0);
   syncer::SyncUserSettings* settings = service->GetUserSettings();
 
   EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
@@ -55,7 +55,7 @@
 
 IN_PROC_BROWSER_TEST_F(SingleClientAppSettingsSyncTest, Basics) {
   ASSERT_TRUE(SetupSync());
-  syncer::ProfileSyncService* service = GetSyncService(0);
+  syncer::SyncServiceImpl* service = GetSyncService(0);
   syncer::SyncUserSettings* settings = service->GetUserSettings();
   EXPECT_TRUE(settings->GetSelectedTypes().Has(UserSelectableType::kApps));
   EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::APP_SETTINGS));
diff --git a/chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc b/chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc
index 0a857a0..4737351 100644
--- a/chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc
@@ -14,8 +14,8 @@
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/prefs/pref_service.h"
 #include "components/sync/base/model_type.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -24,7 +24,7 @@
 
 class AutofillProfileDisabledChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit AutofillProfileDisabledChecker(syncer::ProfileSyncService* service)
+  explicit AutofillProfileDisabledChecker(syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
   ~AutofillProfileDisabledChecker() override = default;
 
diff --git a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
index fad7fa33..c3437f33 100644
--- a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
@@ -21,7 +21,7 @@
 #include "components/bookmarks/browser/url_and_title.h"
 #include "components/sync/base/client_tag_hash.h"
 #include "components/sync/base/model_type.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/bookmark_update_preprocessing.h"
 #include "components/sync/engine/loopback_server/loopback_server_entity.h"
 #include "components/sync/protocol/bookmark_specifics.pb.h"
diff --git a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
index d591c3c5..1b69808e 100644
--- a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "components/password_manager/core/browser/password_form.h"
 #include "components/sync/base/passphrase_enums.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/nigori/key_derivation_params.h"
 #include "components/sync/engine/sync_engine_switches.h"
 #include "components/sync/nigori/cryptographer_impl.h"
@@ -146,7 +146,7 @@
         .Wait();
   }
 
-  syncer::ProfileSyncService* GetSyncService() {
+  syncer::SyncServiceImpl* GetSyncService() {
     return SyncTest::GetSyncService(0);
   }
 
diff --git a/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc b/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc
index c7ac901..dfedc06a 100644
--- a/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc
@@ -6,7 +6,7 @@
 #include "chrome/browser/sync/test/integration/dictionary_helper.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
diff --git a/chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc b/chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc
index 8a82f8a..13d5aad9 100644
--- a/chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc
@@ -8,7 +8,7 @@
 #include "chrome/browser/sync/test/integration/apps_helper.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc
index ff0a0265..59b60f8 100644
--- a/chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc
@@ -8,7 +8,7 @@
 #include "chrome/browser/sync/test/integration/extensions_helper.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/test/fake_server/fake_server.h"
 #include "content/public/test/browser_test.h"
 
diff --git a/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc b/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc
index 6745dd4..cefee06 100644
--- a/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc
@@ -34,7 +34,7 @@
 class HistoryDeleteDirectivesEqualityChecker
     : public SingleClientStatusChangeChecker {
  public:
-  HistoryDeleteDirectivesEqualityChecker(syncer::ProfileSyncService* service,
+  HistoryDeleteDirectivesEqualityChecker(syncer::SyncServiceImpl* service,
                                          fake_server::FakeServer* fake_server,
                                          size_t num_expected_directives)
       : SingleClientStatusChangeChecker(service),
diff --git a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
index 62f1d1d4..2d3b8506 100644
--- a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
@@ -189,7 +189,7 @@
     : public SingleClientStatusChangeChecker {
  public:
   explicit TrustedVaultRecoverabilityNotDegradedChecker(
-      syncer::ProfileSyncService* service)
+      syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
   ~TrustedVaultRecoverabilityNotDegradedChecker() override = default;
 
diff --git a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
index 5e448f3..5fe5dbc 100644
--- a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
@@ -17,7 +17,7 @@
 #include "components/password_manager/core/browser/sync/password_sync_bridge.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/test/fake_server/fake_server_nigori_helper.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_launcher.h"
diff --git a/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc b/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
index 7b57673b..e76bb9b 100644
--- a/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
@@ -13,7 +13,7 @@
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/sync/base/sync_prefs.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/polling_constants.h"
 #include "components/sync/protocol/client_commands.pb.h"
 #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc
index 54c510e..ff8d02f1 100644
--- a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc
@@ -19,7 +19,7 @@
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/json_pref_store.h"
 #include "components/prefs/pref_service.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
diff --git a/chrome/browser/sync/test/integration/single_client_search_engines_sync_test.cc b/chrome/browser/sync/test/integration/single_client_search_engines_sync_test.cc
index 1a9710ac..f982f00 100644
--- a/chrome/browser/sync/test/integration/single_client_search_engines_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_search_engines_sync_test.cc
@@ -12,7 +12,7 @@
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_data.h"
 #include "components/search_engines/template_url_service.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/loopback_server/loopback_server_entity.h"
 #include "components/sync/engine/loopback_server/persistent_unique_client_entity.h"
 #include "components/sync/model/sync_data.h"
diff --git a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
index ecf5cd2..e80cda3 100644
--- a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
@@ -18,8 +18,8 @@
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/common/chrome_paths.h"
 #include "components/sync/base/model_type.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 
 namespace {
diff --git a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
index 5157f44..b416528 100644
--- a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
@@ -107,7 +107,7 @@
  public:
   IsHistoryURLSyncedChecker(const std::string& url,
                             fake_server::FakeServer* fake_server,
-                            syncer::ProfileSyncService* service)
+                            syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service),
         url_(url),
         fake_server_(fake_server) {}
@@ -128,7 +128,7 @@
   IsIconURLSyncedChecker(const std::string& page_url,
                          const std::string& icon_url,
                          fake_server::FakeServer* fake_server,
-                         syncer::ProfileSyncService* service)
+                         syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service),
         page_url_(page_url),
         icon_url_(icon_url),
@@ -265,7 +265,7 @@
 
   // Simulates receiving list of accounts in the cookie jar from ListAccounts
   // endpoint. Adds |account_ids| into signed in accounts, notifies
-  // ProfileSyncService and waits for change to propagate to sync engine.
+  // SyncServiceImpl and waits for change to propagate to sync engine.
   void UpdateCookieJarAccountsAndWait(std::vector<CoreAccountId> account_ids,
                                       bool expected_cookie_jar_mismatch) {
     std::vector<gaia::ListedAccount> accounts;
@@ -835,7 +835,7 @@
 
   // Avoid interferences from actual IdentityManager trying to fetch gaia
   // account information, which would exercise
-  // ProfileSyncService::OnAccountsInCookieUpdated().
+  // SyncServiceImpl::OnAccountsInCookieUpdated().
   signin::CancelAllOngoingGaiaCookieOperations(
       IdentityManagerFactory::GetForProfile(GetProfile(0)));
 
diff --git a/chrome/browser/sync/test/integration/single_client_sharing_message_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sharing_message_sync_test.cc
index 63f321e5..cc8d32e 100644
--- a/chrome/browser/sync/test/integration/single_client_sharing_message_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_sharing_message_sync_test.cc
@@ -42,7 +42,7 @@
 
 class NextCycleIterationChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit NextCycleIterationChecker(syncer::ProfileSyncService* service)
+  explicit NextCycleIterationChecker(syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {
     last_synced_time_ = SingleClientStatusChangeChecker::service()
                             ->GetLastSyncedTimeForDebugging();
@@ -64,7 +64,7 @@
 
 class DisabledSharingMessageChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit DisabledSharingMessageChecker(syncer::ProfileSyncService* service)
+  explicit DisabledSharingMessageChecker(syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   bool IsExitConditionSatisfied(std::ostream* os) override {
@@ -75,7 +75,7 @@
 
 class RetryingAccessTokenFetchChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit RetryingAccessTokenFetchChecker(syncer::ProfileSyncService* service)
+  explicit RetryingAccessTokenFetchChecker(syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   // StatusChangeChecker implementation.
@@ -90,7 +90,7 @@
 class SharingMessageEqualityChecker : public SingleClientStatusChangeChecker {
  public:
   SharingMessageEqualityChecker(
-      syncer::ProfileSyncService* service,
+      syncer::SyncServiceImpl* service,
       fake_server::FakeServer* fake_server,
       std::vector<SharingMessageSpecifics> expected_specifics)
       : SingleClientStatusChangeChecker(service),
@@ -140,7 +140,7 @@
 class SharingMessageCallbackChecker : public SingleClientStatusChangeChecker {
  public:
   SharingMessageCallbackChecker(
-      syncer::ProfileSyncService* service,
+      syncer::SyncServiceImpl* service,
       sync_pb::SharingMessageCommitError::ErrorCode expected_error_code)
       : SingleClientStatusChangeChecker(service),
         expected_error_code_(expected_error_code) {}
@@ -174,7 +174,7 @@
 // least one sharing message with the expected payload.
 class SharingMessageCommitChecker : public SingleClientStatusChangeChecker {
  public:
-  SharingMessageCommitChecker(syncer::ProfileSyncService* service,
+  SharingMessageCommitChecker(syncer::SyncServiceImpl* service,
                               fake_server::FakeServer* fake_server,
                               const std::string& expected_payload)
       : SingleClientStatusChangeChecker(service),
diff --git a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
index 7cc3ac9..7df6cdd6 100644
--- a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
@@ -17,8 +17,8 @@
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/common/chrome_paths.h"
 #include "components/sync/base/model_type.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -61,7 +61,7 @@
 
 class SyncDisabledByUserChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit SyncDisabledByUserChecker(syncer::ProfileSyncService* service)
+  explicit SyncDisabledByUserChecker(syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   bool IsExitConditionSatisfied(std::ostream* os) override {
diff --git a/chrome/browser/sync/test/integration/single_client_status_change_checker.cc b/chrome/browser/sync/test/integration/single_client_status_change_checker.cc
index 312dc99..12b1f3b 100644
--- a/chrome/browser/sync/test/integration/single_client_status_change_checker.cc
+++ b/chrome/browser/sync/test/integration/single_client_status_change_checker.cc
@@ -7,11 +7,11 @@
 #include <vector>
 
 SingleClientStatusChangeChecker::SingleClientStatusChangeChecker(
-    syncer::ProfileSyncService* service)
+    syncer::SyncServiceImpl* service)
     : MultiClientStatusChangeChecker({service}) {}
 
 SingleClientStatusChangeChecker::~SingleClientStatusChangeChecker() {}
 
-syncer::ProfileSyncService* SingleClientStatusChangeChecker::service() {
+syncer::SyncServiceImpl* SingleClientStatusChangeChecker::service() {
   return services()[0];
 }
diff --git a/chrome/browser/sync/test/integration/single_client_status_change_checker.h b/chrome/browser/sync/test/integration/single_client_status_change_checker.h
index acf01fdf..8260425 100644
--- a/chrome/browser/sync/test/integration/single_client_status_change_checker.h
+++ b/chrome/browser/sync/test/integration/single_client_status_change_checker.h
@@ -10,19 +10,19 @@
 #include "components/sync/driver/sync_service_observer.h"
 
 namespace syncer {
-class ProfileSyncService;
+class SyncServiceImpl;
 }  // namespace syncer
 
 // This class provides some common functionality for StatusChangeCheckers that
-// observe only one ProfileSyncService.  This class is abstract.  Its
+// observe only one SyncServiceImpl.  This class is abstract.  Its
 // descendants are expected to provide additional functionality.
 class SingleClientStatusChangeChecker
   : public MultiClientStatusChangeChecker {
  public:
-  explicit SingleClientStatusChangeChecker(syncer::ProfileSyncService* service);
+  explicit SingleClientStatusChangeChecker(syncer::SyncServiceImpl* service);
   ~SingleClientStatusChangeChecker() override;
 
-  syncer::ProfileSyncService* service();
+  syncer::SyncServiceImpl* service();
 };
 
 #endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SINGLE_CLIENT_STATUS_CHANGE_CHECKER_H_
diff --git a/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc b/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc
index 7fcadc0..58e839c 100644
--- a/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/sync/test/integration/themes_helper.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
 #include "chrome/browser/themes/theme_service_factory.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_utils.h"
 
diff --git a/chrome/browser/sync/test/integration/single_client_typed_urls_sync_test.cc b/chrome/browser/sync/test/integration/single_client_typed_urls_sync_test.cc
index 5850cb5..7d70220 100644
--- a/chrome/browser/sync/test/integration/single_client_typed_urls_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_typed_urls_sync_test.cc
@@ -8,7 +8,7 @@
 #include "chrome/browser/sync/test/integration/typed_urls_helper.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
 #include "components/history/core/browser/history_types.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 
 using typed_urls_helper::AddUrlToHistory;
diff --git a/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc b/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
index 1a3bf42..1dbd44a 100644
--- a/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
@@ -34,7 +34,7 @@
 class UserConsentEqualityChecker : public SingleClientStatusChangeChecker {
  public:
   UserConsentEqualityChecker(
-      syncer::ProfileSyncService* service,
+      syncer::SyncServiceImpl* service,
       FakeServer* fake_server,
       std::vector<UserConsentSpecifics> expected_specifics)
       : SingleClientStatusChangeChecker(service), fake_server_(fake_server) {
diff --git a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
index eb37f64..dd27a00 100644
--- a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
@@ -163,7 +163,7 @@
 // Waits until local changes are committed or an auth error is encountered.
 class TestForAuthError : public UpdatedProgressMarkerChecker {
  public:
-  explicit TestForAuthError(syncer::ProfileSyncService* service)
+  explicit TestForAuthError(syncer::SyncServiceImpl* service)
       : UpdatedProgressMarkerChecker(service) {}
 
   // StatusChangeChecker implementation.
diff --git a/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc b/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
index 1342e061..cfc0b3f 100644
--- a/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
@@ -14,7 +14,7 @@
 #include "chrome/common/chrome_features.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/user_selectable_type.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/sync_user_settings.h"
 #include "components/sync/test/fake_server/fake_server_verifier.h"
 #include "content/public/test/browser_test.h"
@@ -59,7 +59,7 @@
                        DisablingOsSyncFeatureDisablesDataType) {
   ASSERT_TRUE(chromeos::features::IsSplitSettingsSyncEnabled());
   ASSERT_TRUE(SetupSync());
-  syncer::ProfileSyncService* service = GetSyncService(0);
+  syncer::SyncServiceImpl* service = GetSyncService(0);
   syncer::SyncUserSettings* settings = service->GetUserSettings();
 
   EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
@@ -150,7 +150,7 @@
 IN_PROC_BROWSER_TEST_F(SingleClientWebAppsSyncTest,
                        DisablingSelectedTypeDisablesModelType) {
   ASSERT_TRUE(SetupSync());
-  syncer::ProfileSyncService* service = GetSyncService(0);
+  syncer::SyncServiceImpl* service = GetSyncService(0);
   syncer::SyncUserSettings* settings = service->GetUserSettings();
   ASSERT_TRUE(settings->GetSelectedTypes().Has(UserSelectableType::kApps));
   EXPECT_TRUE(service->GetActiveDataTypes().Has(syncer::WEB_APPS));
diff --git a/chrome/browser/sync/test/integration/sync_auth_test.cc b/chrome/browser/sync/test/integration/sync_auth_test.cc
index d52ef58e..3b5aebb4 100644
--- a/chrome/browser/sync/test/integration/sync_auth_test.cc
+++ b/chrome/browser/sync/test/integration/sync_auth_test.cc
@@ -18,7 +18,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/sync_token_status.h"
 #include "content/public/test/browser_test.h"
 #include "google_apis/gaia/google_service_auth_error.h"
@@ -62,7 +62,7 @@
 // Waits until local changes are committed or an auth error is encountered.
 class TestForAuthError : public UpdatedProgressMarkerChecker {
  public:
-  explicit TestForAuthError(syncer::ProfileSyncService* service)
+  explicit TestForAuthError(syncer::SyncServiceImpl* service)
       : UpdatedProgressMarkerChecker(service) {}
 
   // StatusChangeChecker implementation.
@@ -81,7 +81,7 @@
 
 class SyncTransportActiveChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit SyncTransportActiveChecker(syncer::ProfileSyncService* service)
+  explicit SyncTransportActiveChecker(syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   // StatusChangeChecker implementation.
@@ -117,12 +117,12 @@
   }
 
   void DisableTokenFetchRetries() {
-    // If ProfileSyncService observes a transient error like SERVICE_UNAVAILABLE
+    // If SyncServiceImpl observes a transient error like SERVICE_UNAVAILABLE
     // or CONNECTION_FAILED, this means the access token fetcher has given
     // up trying to reach Gaia. In practice, the access token fetching code
     // retries a fixed number of times, but the count is transparent to PSS.
     // Disable retries so that we instantly trigger the case where
-    // ProfileSyncService must pick up where the access token fetcher left off
+    // SyncServiceImpl must pick up where the access token fetcher left off
     // (in terms of retries).
     signin::DisableAccessTokenFetchRetries(
         IdentityManagerFactory::GetForProfile(GetProfile(0)));
@@ -147,7 +147,7 @@
   ASSERT_FALSE(AttemptToTriggerAuthError());
 }
 
-// Verify that ProfileSyncService continues trying to fetch access tokens
+// Verify that SyncServiceImpl continues trying to fetch access tokens
 // when the access token fetcher has encountered more than a fixed number of
 // HTTP_INTERNAL_SERVER_ERROR (500) errors.
 IN_PROC_BROWSER_TEST_F(SyncAuthTest, RetryOnInternalServerError500) {
@@ -161,7 +161,7 @@
   ASSERT_TRUE(GetSyncService(0)->IsRetryingAccessTokenFetchForTest());
 }
 
-// Verify that ProfileSyncService continues trying to fetch access tokens
+// Verify that SyncServiceImpl continues trying to fetch access tokens
 // when the access token fetcher has encountered more than a fixed number of
 // HTTP_FORBIDDEN (403) errors.
 IN_PROC_BROWSER_TEST_F(SyncAuthTest, RetryOnHttpForbidden403) {
@@ -174,7 +174,7 @@
   ASSERT_TRUE(GetSyncService(0)->IsRetryingAccessTokenFetchForTest());
 }
 
-// Verify that ProfileSyncService continues trying to fetch access tokens
+// Verify that SyncServiceImpl continues trying to fetch access tokens
 // when the access token fetcher has encountered a URLRequestStatus of FAILED.
 IN_PROC_BROWSER_TEST_F(SyncAuthTest, RetryOnRequestFailed) {
   ASSERT_TRUE(SetupSync());
@@ -187,7 +187,7 @@
   ASSERT_TRUE(GetSyncService(0)->IsRetryingAccessTokenFetchForTest());
 }
 
-// Verify that ProfileSyncService continues trying to fetch access tokens
+// Verify that SyncServiceImpl continues trying to fetch access tokens
 // when the access token fetcher receives a malformed token.
 IN_PROC_BROWSER_TEST_F(SyncAuthTest, RetryOnMalformedToken) {
   ASSERT_TRUE(SetupSync());
@@ -199,7 +199,7 @@
   ASSERT_TRUE(GetSyncService(0)->IsRetryingAccessTokenFetchForTest());
 }
 
-// Verify that ProfileSyncService ends up with an INVALID_GAIA_CREDENTIALS auth
+// Verify that SyncServiceImpl ends up with an INVALID_GAIA_CREDENTIALS auth
 // error when an invalid_grant error is returned by the access token fetcher
 // with an HTTP_BAD_REQUEST (400) response code.
 IN_PROC_BROWSER_TEST_F(SyncAuthTest, InvalidGrant) {
@@ -214,7 +214,7 @@
             GetSyncService(0)->GetAuthError().state());
 }
 
-// Verify that ProfileSyncService retries after SERVICE_ERROR auth error when
+// Verify that SyncServiceImpl retries after SERVICE_ERROR auth error when
 // an invalid_client error is returned by the access token fetcher with an
 // HTTP_BAD_REQUEST (400) response code.
 IN_PROC_BROWSER_TEST_F(SyncAuthTest, RetryInvalidClient) {
@@ -228,7 +228,7 @@
   ASSERT_TRUE(GetSyncService(0)->IsRetryingAccessTokenFetchForTest());
 }
 
-// Verify that ProfileSyncService retries after REQUEST_CANCELED auth error
+// Verify that SyncServiceImpl retries after REQUEST_CANCELED auth error
 // when the access token fetcher has encountered a URLRequestStatus of
 // CANCELED.
 IN_PROC_BROWSER_TEST_F(SyncAuthTest, RetryRequestCanceled) {
@@ -242,7 +242,7 @@
   ASSERT_TRUE(GetSyncService(0)->IsRetryingAccessTokenFetchForTest());
 }
 
-// Verify that ProfileSyncService fails initial sync setup during backend
+// Verify that SyncServiceImpl fails initial sync setup during backend
 // initialization and ends up with an INVALID_GAIA_CREDENTIALS auth error when
 // an invalid_grant error is returned by the access token fetcher with an
 // HTTP_BAD_REQUEST (400) response code.
@@ -258,7 +258,7 @@
             GetSyncService(0)->GetAuthError().state());
 }
 
-// Verify that ProfileSyncService fails initial sync setup during backend
+// Verify that SyncServiceImpl fails initial sync setup during backend
 // initialization, but continues trying to fetch access tokens when
 // the access token fetcher receives an HTTP_INTERNAL_SERVER_ERROR (500)
 // response code.
@@ -273,7 +273,7 @@
   ASSERT_TRUE(GetSyncService(0)->IsRetryingAccessTokenFetchForTest());
 }
 
-// Verify that ProfileSyncService fetches a new token when an old token expires.
+// Verify that SyncServiceImpl fetches a new token when an old token expires.
 IN_PROC_BROWSER_TEST_F(SyncAuthTest, TokenExpiry) {
   // Initial sync succeeds with a short lived OAuth2 Token.
   ASSERT_TRUE(SetupClients());
@@ -306,7 +306,7 @@
 
 class NoAuthErrorChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit NoAuthErrorChecker(syncer::ProfileSyncService* service)
+  explicit NoAuthErrorChecker(syncer::SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   // StatusChangeChecker implementation.
diff --git a/chrome/browser/sync/test/integration/sync_disabled_checker.cc b/chrome/browser/sync/test/integration/sync_disabled_checker.cc
index c61dc24..fe7488f 100644
--- a/chrome/browser/sync/test/integration/sync_disabled_checker.cc
+++ b/chrome/browser/sync/test/integration/sync_disabled_checker.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/sync/test/integration/sync_disabled_checker.h"
 
-SyncDisabledChecker::SyncDisabledChecker(syncer::ProfileSyncService* service)
+SyncDisabledChecker::SyncDisabledChecker(syncer::SyncServiceImpl* service)
     : SingleClientStatusChangeChecker(service) {}
 
 SyncDisabledChecker::~SyncDisabledChecker() = default;
diff --git a/chrome/browser/sync/test/integration/sync_disabled_checker.h b/chrome/browser/sync/test/integration/sync_disabled_checker.h
index a7c12a7..0f0f97a 100644
--- a/chrome/browser/sync/test/integration/sync_disabled_checker.h
+++ b/chrome/browser/sync/test/integration/sync_disabled_checker.h
@@ -12,7 +12,7 @@
 // Sync-the-transport might still run.
 class SyncDisabledChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit SyncDisabledChecker(syncer::ProfileSyncService* service);
+  explicit SyncDisabledChecker(syncer::SyncServiceImpl* service);
 
   ~SyncDisabledChecker() override;
 
diff --git a/chrome/browser/sync/test/integration/sync_errors_test.cc b/chrome/browser/sync/test/integration/sync_errors_test.cc
index f7e9cad..f46bc81b 100644
--- a/chrome/browser/sync/test/integration/sync_errors_test.cc
+++ b/chrome/browser/sync/test/integration/sync_errors_test.cc
@@ -20,7 +20,7 @@
 #include "components/history/core/common/pref_names.h"
 #include "components/prefs/pref_member.h"
 #include "components/prefs/pref_service.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/protocol/sync_protocol_error.h"
 #include "components/sync/protocol/user_event_specifics.pb.h"
 #include "components/sync_user_events/user_event_service.h"
@@ -30,7 +30,7 @@
 using bookmarks::BookmarkNode;
 using bookmarks_helper::AddFolder;
 using bookmarks_helper::SetTitle;
-using syncer::ProfileSyncService;
+using syncer::SyncServiceImpl;
 using user_events_helper::CreateTestEvent;
 
 namespace {
@@ -38,7 +38,7 @@
 constexpr int64_t kUserEventTimeUsec = 123456;
 
 syncer::ModelTypeSet GetThrottledDataTypes(
-    syncer::ProfileSyncService* sync_service) {
+    syncer::SyncServiceImpl* sync_service) {
   base::RunLoop loop;
   syncer::ModelTypeSet throttled_types;
   sync_service->GetThrottledDataTypesForTest(
@@ -52,7 +52,7 @@
 
 class SyncEngineStoppedChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit SyncEngineStoppedChecker(ProfileSyncService* service)
+  explicit SyncEngineStoppedChecker(SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   // StatusChangeChecker implementation.
@@ -64,8 +64,7 @@
 
 class TypeDisabledChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit TypeDisabledChecker(ProfileSyncService* service,
-                               syncer::ModelType type)
+  explicit TypeDisabledChecker(SyncServiceImpl* service, syncer::ModelType type)
       : SingleClientStatusChangeChecker(service), type_(type) {}
 
   // StatusChangeChecker implementation.
@@ -83,7 +82,7 @@
 // commit request fails).
 class UserEventCommitChecker : public SingleClientStatusChangeChecker {
  public:
-  UserEventCommitChecker(ProfileSyncService* service,
+  UserEventCommitChecker(SyncServiceImpl* service,
                          fake_server::FakeServer* fake_server,
                          int64_t expected_event_time_usec)
       : SingleClientStatusChangeChecker(service),
@@ -121,7 +120,7 @@
 // Helper class that waits until the sync engine has hit an actionable error.
 class ActionableErrorChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit ActionableErrorChecker(ProfileSyncService* service)
+  explicit ActionableErrorChecker(SyncServiceImpl* service)
       : SingleClientStatusChangeChecker(service) {}
 
   ~ActionableErrorChecker() override {}
diff --git a/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc b/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc
index 11d9a8c6..5328896 100644
--- a/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc
+++ b/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc
@@ -9,7 +9,7 @@
 #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/test/fake_server/fake_server_http_post_provider.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/network_connection_change_simulator.h"
@@ -40,15 +40,15 @@
 // exponential backoff after it encounters an error.
 class ExponentialBackoffChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit ExponentialBackoffChecker(syncer::ProfileSyncService* pss)
-      : SingleClientStatusChangeChecker(pss) {
+  explicit ExponentialBackoffChecker(syncer::SyncServiceImpl* sync_service)
+      : SingleClientStatusChangeChecker(sync_service) {
     const SyncCycleSnapshot& snap =
         service()->GetLastCycleSnapshotForDebugging();
     retry_verifier_.Initialize(snap);
   }
 
-  // Checks if backoff is complete. Called repeatedly each time PSS notifies
-  // observers of a state change.
+  // Checks if backoff is complete. Called repeatedly each time SyncServiceImpl
+  // notifies observers of a state change.
   bool IsExitConditionSatisfied(std::ostream* os) override {
     *os << "Verifying backoff intervals (" << retry_verifier_.retry_count()
         << "/" << RetryVerifier::kMaxRetry << ")";
diff --git a/chrome/browser/sync/test/integration/sync_integration_test_util.cc b/chrome/browser/sync/test/integration/sync_integration_test_util.cc
index e403293..fc3db3ef 100644
--- a/chrome/browser/sync/test/integration/sync_integration_test_util.cc
+++ b/chrome/browser/sync/test/integration/sync_integration_test_util.cc
@@ -8,7 +8,7 @@
 #include "chrome/browser/sync/test/integration/themes_helper.h"
 #include "chrome/browser/themes/test/theme_service_changed_waiter.h"
 #include "chrome/browser/themes/theme_service_factory.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/test_utils.h"
 
 void SetCustomTheme(Profile* profile, int theme_index) {
@@ -32,7 +32,7 @@
 }
 
 PassphraseRequiredChecker::PassphraseRequiredChecker(
-    syncer::ProfileSyncService* service)
+    syncer::SyncServiceImpl* service)
     : SingleClientStatusChangeChecker(service) {}
 
 bool PassphraseRequiredChecker::IsExitConditionSatisfied(std::ostream* os) {
@@ -41,7 +41,7 @@
 }
 
 PassphraseAcceptedChecker::PassphraseAcceptedChecker(
-    syncer::ProfileSyncService* service)
+    syncer::SyncServiceImpl* service)
     : SingleClientStatusChangeChecker(service) {}
 
 bool PassphraseAcceptedChecker::IsExitConditionSatisfied(std::ostream* os) {
diff --git a/chrome/browser/sync/test/integration/sync_integration_test_util.h b/chrome/browser/sync/test/integration/sync_integration_test_util.h
index 8c6355f..7b32a8d 100644
--- a/chrome/browser/sync/test/integration/sync_integration_test_util.h
+++ b/chrome/browser/sync/test/integration/sync_integration_test_util.h
@@ -12,7 +12,7 @@
 class Profile;
 
 namespace syncer {
-class ProfileSyncService;
+class SyncServiceImpl;
 }  // namespace syncer
 
 // Sets a custom theme and wait until the asynchronous process is done.
@@ -35,7 +35,7 @@
 // Checker to block until service is waiting for a passphrase.
 class PassphraseRequiredChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit PassphraseRequiredChecker(syncer::ProfileSyncService* service);
+  explicit PassphraseRequiredChecker(syncer::SyncServiceImpl* service);
 
   // StatusChangeChecker implementation.
   bool IsExitConditionSatisfied(std::ostream* os) override;
@@ -44,7 +44,7 @@
 // Checker to block until service has accepted a new passphrase.
 class PassphraseAcceptedChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit PassphraseAcceptedChecker(syncer::ProfileSyncService* service);
+  explicit PassphraseAcceptedChecker(syncer::SyncServiceImpl* service);
 
   // StatusChangeChecker implementation.
   bool IsExitConditionSatisfied(std::ostream* os) override;
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 705a7e40..6fee0df 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -63,8 +63,8 @@
 #include "components/signin/public/identity_manager/consent_level.h"
 #include "components/sync/base/invalidation_helper.h"
 #include "components/sync/base/sync_base_switches.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/driver/sync_user_settings.h"
 #include "components/sync/engine/sync_engine_switches.h"
 #include "components/sync/engine/sync_scheduler_impl.h"
@@ -107,7 +107,7 @@
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #endif
 
-using syncer::ProfileSyncService;
+using syncer::SyncServiceImpl;
 
 namespace {
 
@@ -587,9 +587,8 @@
   return clients;
 }
 
-ProfileSyncService* SyncTest::GetSyncService(int index) {
-  return SyncServiceFactory::GetAsProfileSyncServiceForProfile(
-      GetProfile(index));
+SyncServiceImpl* SyncTest::GetSyncService(int index) {
+  return SyncServiceFactory::GetAsSyncServiceImplForProfile(GetProfile(index));
 }
 
 syncer::UserSelectableTypeSet SyncTest::GetRegisteredSelectableTypes(
@@ -599,8 +598,8 @@
       ->GetRegisteredSelectableTypes();
 }
 
-std::vector<ProfileSyncService*> SyncTest::GetSyncServices() {
-  std::vector<ProfileSyncService*> services;
+std::vector<SyncServiceImpl*> SyncTest::GetSyncServices() {
+  std::vector<SyncServiceImpl*> services;
   for (int i = 0; i < num_clients(); ++i) {
     services.push_back(GetSyncService(i));
   }
@@ -731,14 +730,14 @@
   DCHECK_EQ(static_cast<size_t>(index), browsers_.size() - 1);
 #endif
 
-  // Make sure the ProfileSyncService has been created before creating the
-  // ProfileSyncServiceHarness - some tests expect the ProfileSyncService to
+  // Make sure the SyncServiceImpl has been created before creating the
+  // ProfileSyncServiceHarness - some tests expect the SyncServiceImpl to
   // already exist.
-  ProfileSyncService* profile_sync_service =
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(GetProfile(index));
+  SyncServiceImpl* sync_service_impl =
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(GetProfile(index));
 
   if (server_type_ == IN_PROCESS_FAKE_SERVER) {
-    profile_sync_service->OverrideNetworkForTest(
+    sync_service_impl->OverrideNetworkForTest(
         fake_server::CreateFakeServerHttpPostProviderFactory(
             GetFakeServer()->AsWeakPtr()));
   }
diff --git a/chrome/browser/sync/test/integration/sync_test.h b/chrome/browser/sync/test/integration/sync_test.h
index cff7e7a..3fdbffc 100644
--- a/chrome/browser/sync/test/integration/sync_test.h
+++ b/chrome/browser/sync/test/integration/sync_test.h
@@ -75,7 +75,7 @@
 }  // namespace fake_server
 
 namespace syncer {
-class ProfileSyncService;
+class SyncServiceImpl;
 }  // namespace syncer
 
 namespace switches {
@@ -227,14 +227,14 @@
   // Returns a list of the collection of sync clients.
   std::vector<ProfileSyncServiceHarness*> GetSyncClients();
 
-  // Returns a ProfileSyncService at the given index.
-  syncer::ProfileSyncService* GetSyncService(int index);
+  // Returns a SyncServiceImpl at the given index.
+  syncer::SyncServiceImpl* GetSyncService(int index);
 
-  // Returns the set of ProfileSyncServices.
-  std::vector<syncer::ProfileSyncService*> GetSyncServices();
+  // Returns the set of SyncServiceImpls.
+  std::vector<syncer::SyncServiceImpl*> GetSyncServices();
 
   // Returns the set of registered UserSelectableTypes.  This is retrieved from
-  // the ProfileSyncService at the given |index|.
+  // the SyncServiceImpl at the given |index|.
   syncer::UserSelectableTypeSet GetRegisteredSelectableTypes(int index);
 
   // Returns a pointer to the sync profile that is used to verify changes to
diff --git a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
index 41b2d0c..c2919ae 100644
--- a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
@@ -25,8 +25,8 @@
 #include "components/policy/core/common/policy_map.h"
 #include "components/policy/core/common/policy_types.h"
 #include "components/policy/policy_constants.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/cycle/sync_cycle_snapshot.h"
 #include "components/sync/engine/loopback_server/persistent_permanent_entity.h"
 #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc b/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc
index 8b39a510..1217c23 100644
--- a/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc
@@ -12,7 +12,7 @@
 #include "chrome/common/webui_url_constants.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/sync/base/sync_prefs.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/polling_constants.h"
 #include "components/sync/protocol/client_commands.pb.h"
 #include "components/sync/test/fake_server/sessions_hierarchy.h"
@@ -40,7 +40,7 @@
 class SessionCountMatchChecker : public SingleClientStatusChangeChecker {
  public:
   SessionCountMatchChecker(int expected_count,
-                           syncer::ProfileSyncService* service,
+                           syncer::SyncServiceImpl* service,
                            fake_server::FakeServer* fake_server)
       : SingleClientStatusChangeChecker(service),
         expected_count_(expected_count),
diff --git a/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc b/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc
index e6486941..7e43281 100644
--- a/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc
@@ -12,7 +12,7 @@
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
 #include "components/autofill/core/common/autofill_util.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/test/fake_server/fake_server_http_post_provider.h"
 #include "content/public/test/browser_test.h"
 #include "net/base/network_change_notifier.h"
diff --git a/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc b/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc
index 0264579..c92930bc 100644
--- a/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc
+++ b/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc
@@ -7,11 +7,11 @@
 #include "base/bind.h"
 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/cycle/sync_cycle_snapshot.h"
 
 UpdatedProgressMarkerChecker::UpdatedProgressMarkerChecker(
-    syncer::ProfileSyncService* service)
+    syncer::SyncServiceImpl* service)
     : SingleClientStatusChangeChecker(service) {
   DCHECK(sync_datatype_helper::test()->TestUsesSelfNotifications());
 
diff --git a/chrome/browser/sync/test/integration/updated_progress_marker_checker.h b/chrome/browser/sync/test/integration/updated_progress_marker_checker.h
index 6965c00..7d734aef 100644
--- a/chrome/browser/sync/test/integration/updated_progress_marker_checker.h
+++ b/chrome/browser/sync/test/integration/updated_progress_marker_checker.h
@@ -21,7 +21,7 @@
 // of this checker.  Please do not use it in new tests.
 class UpdatedProgressMarkerChecker : public SingleClientStatusChangeChecker {
  public:
-  explicit UpdatedProgressMarkerChecker(syncer::ProfileSyncService* service);
+  explicit UpdatedProgressMarkerChecker(syncer::SyncServiceImpl* service);
   ~UpdatedProgressMarkerChecker() override;
 
   // StatusChangeChecker implementation.
diff --git a/chrome/browser/sync/test/integration/user_events_helper.cc b/chrome/browser/sync/test/integration/user_events_helper.cc
index 7ef0898..ee98320 100644
--- a/chrome/browser/sync/test/integration/user_events_helper.cc
+++ b/chrome/browser/sync/test/integration/user_events_helper.cc
@@ -26,7 +26,7 @@
 }  // namespace user_events_helper
 
 UserEventEqualityChecker::UserEventEqualityChecker(
-    syncer::ProfileSyncService* service,
+    syncer::SyncServiceImpl* service,
     FakeServer* fake_server,
     std::vector<UserEventSpecifics> expected_specifics)
     : SingleClientStatusChangeChecker(service),
diff --git a/chrome/browser/sync/test/integration/user_events_helper.h b/chrome/browser/sync/test/integration/user_events_helper.h
index 30e75f10..9c6d4bf1 100644
--- a/chrome/browser/sync/test/integration/user_events_helper.h
+++ b/chrome/browser/sync/test/integration/user_events_helper.h
@@ -25,7 +25,7 @@
 class UserEventEqualityChecker : public SingleClientStatusChangeChecker {
  public:
   UserEventEqualityChecker(
-      syncer::ProfileSyncService* service,
+      syncer::SyncServiceImpl* service,
       fake_server::FakeServer* fake_server,
       std::vector<sync_pb::UserEventSpecifics> expected_specifics);
   ~UserEventEqualityChecker() override;
diff --git a/chrome/browser/sync_file_system/sync_file_system_service.cc b/chrome/browser/sync_file_system/sync_file_system_service.cc
index 86a6845..7ed863f9 100644
--- a/chrome/browser/sync_file_system/sync_file_system_service.cc
+++ b/chrome/browser/sync_file_system/sync_file_system_service.cc
@@ -268,10 +268,10 @@
 
   remote_service_.reset();
 
-  syncer::SyncService* profile_sync_service =
+  syncer::SyncService* sync_service =
       SyncServiceFactory::GetForProfile(profile_);
-  if (profile_sync_service)
-    profile_sync_service->RemoveObserver(this);
+  if (sync_service)
+    sync_service->RemoveObserver(this);
 
   ExtensionRegistry::Get(profile_)->RemoveObserver(this);
 
@@ -471,11 +471,11 @@
   local_sync_runners_.push_back(std::move(local_syncer));
   remote_sync_runners_.push_back(std::move(remote_syncer));
 
-  syncer::SyncService* profile_sync_service =
+  syncer::SyncService* sync_service =
       SyncServiceFactory::GetForProfile(profile_);
-  if (profile_sync_service) {
-    UpdateSyncEnabledStatus(profile_sync_service);
-    profile_sync_service->AddObserver(this);
+  if (sync_service) {
+    UpdateSyncEnabledStatus(sync_service);
+    sync_service->AddObserver(this);
   }
 
   ExtensionRegistry::Get(profile_)->AddObserver(this);
@@ -724,12 +724,11 @@
 }
 
 void SyncFileSystemService::UpdateSyncEnabledStatus(
-    syncer::SyncService* profile_sync_service) {
-  if (!profile_sync_service->GetUserSettings()->IsFirstSetupComplete())
+    syncer::SyncService* sync_service) {
+  if (!sync_service->GetUserSettings()->IsFirstSetupComplete())
     return;
   bool old_sync_enabled = sync_enabled_;
-  sync_enabled_ = profile_sync_service->GetActiveDataTypes().Has(
-      syncer::APPS);
+  sync_enabled_ = sync_service->GetActiveDataTypes().Has(syncer::APPS);
   remote_service_->SetSyncEnabled(sync_enabled_);
   if (!old_sync_enabled && sync_enabled_)
     RunForEachSyncRunners(&SyncProcessRunner::Schedule);
diff --git a/chrome/browser/sync_file_system/sync_file_system_service.h b/chrome/browser/sync_file_system/sync_file_system_service.h
index fb4a9d58..deea939 100644
--- a/chrome/browser/sync_file_system/sync_file_system_service.h
+++ b/chrome/browser/sync_file_system/sync_file_system_service.h
@@ -158,8 +158,8 @@
 
   // Check the profile's sync preference settings and call
   // remote_file_service_->SetSyncEnabled() to update the status.
-  // |profile_sync_service| must be non-null.
-  void UpdateSyncEnabledStatus(syncer::SyncService* profile_sync_service);
+  // |sync_service| must be non-null.
+  void UpdateSyncEnabledStatus(syncer::SyncService* sync_service);
 
   // Runs the SyncProcessRunner method of all sync runners (e.g. for Local sync
   // and Remote sync).
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 af27ec3..cee7f79 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
@@ -335,7 +335,7 @@
 <translation id="314939179385989105">‏الصفحة الرئيسية لمتصفّح Chrome</translation>
 <translation id="3157842584138209013">الاطّلاع على مقدار البيانات التي وفّرتها بالنقر على "مزيد من الخيارات"</translation>
 <translation id="3166827708714933426">اختصارات علامات التبويب والنوافذ</translation>
-<translation id="3169472444629675720">Discover</translation>
+<translation id="3169472444629675720">اقتراحات</translation>
 <translation id="3205824638308738187">أوشك التحديث على الانتهاء.</translation>
 <translation id="3207960819495026254">تمت إضافتها إلى الإشارات المرجعية.</translation>
 <translation id="3208584281581115441">التحقّق الآن</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
index 13135ffb..0b61f15b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -665,7 +665,7 @@
 <translation id="5317780077021120954">Зберегти</translation>
 <translation id="5319359161174645648">Google рекомендує Chrome</translation>
 <translation id="5324858694974489420">Батьківські налаштування</translation>
-<translation id="5327248766486351172">Назва</translation>
+<translation id="5327248766486351172">Ім’я</translation>
 <translation id="5342314432463739672">Запити на дозволи</translation>
 <translation id="5355191726083956201">Покращений захист увімкнено</translation>
 <translation id="5357811892247919462">Вкладку отримано</translation>
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.cc b/chrome/browser/ui/app_list/app_list_syncable_service.cc
index 33efe9fe..d9309eb 100644
--- a/chrome/browser/ui/app_list/app_list_syncable_service.cc
+++ b/chrome/browser/ui/app_list/app_list_syncable_service.cc
@@ -44,7 +44,7 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/pref_registry/pref_registry_syncable.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service.h"
 #include "components/sync/model/sync_change_processor.h"
 #include "components/sync/model/sync_data.h"
 #include "components/sync/protocol/sync.pb.h"
diff --git a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
index 23ccf8dd..a59907eb 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
@@ -41,19 +41,20 @@
   return item->contexts().Contains(extensions::MenuItem::LAUNCHER);
 }
 
-web_app::DisplayMode ConvertUseLaunchTypeCommandToDisplayMode(int command_id) {
+apps::mojom::WindowMode ConvertUseLaunchTypeCommandToWindowMode(
+    int command_id) {
   DCHECK(command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START &&
          command_id < ash::USE_LAUNCH_TYPE_COMMAND_END);
   switch (command_id) {
     case ash::USE_LAUNCH_TYPE_REGULAR:
-      return web_app::DisplayMode::kBrowser;
+      return apps::mojom::WindowMode::kBrowser;
     case ash::USE_LAUNCH_TYPE_WINDOW:
-      return web_app::DisplayMode::kStandalone;
+      return apps::mojom::WindowMode::kWindow;
     case ash::USE_LAUNCH_TYPE_PINNED:
     case ash::USE_LAUNCH_TYPE_FULLSCREEN:
     case ash::USE_LAUNCH_TYPE_TABBED_WINDOW:
     default:
-      return web_app::DisplayMode::kUndefined;
+      return apps::mojom::WindowMode::kUnknown;
   }
 }
 
@@ -186,11 +187,16 @@
           return command_id == ash::USE_LAUNCH_TYPE_TABBED_WINDOW;
         }
 
-        web_app::DisplayMode user_display_mode =
-            provider->registrar().GetAppUserDisplayMode(app_id());
-        return user_display_mode != web_app::DisplayMode::kUndefined &&
-               user_display_mode ==
-                   ConvertUseLaunchTypeCommandToDisplayMode(command_id);
+        auto user_window_mode = apps::mojom::WindowMode::kUnknown;
+        apps::AppServiceProxyFactory::GetForProfile(profile())
+            ->AppRegistryCache()
+            .ForOneApp(app_id(),
+                       [&user_window_mode](const apps::AppUpdate& update) {
+                         user_window_mode = update.WindowMode();
+                       });
+        return user_window_mode != apps::mojom::WindowMode::kUnknown &&
+               user_window_mode ==
+                   ConvertUseLaunchTypeCommandToWindowMode(command_id);
       }
       return AppContextMenu::IsCommandIdChecked(command_id);
 
@@ -311,16 +317,16 @@
 void AppServiceContextMenu::SetLaunchType(int command_id) {
   switch (app_type_) {
     case apps::mojom::AppType::kWeb: {
-      // Web apps can only toggle between kStandalone and kBrowser.
-      web_app::DisplayMode user_display_mode =
-          ConvertUseLaunchTypeCommandToDisplayMode(command_id);
-      if (user_display_mode != web_app::DisplayMode::kUndefined) {
+      // Web apps can only toggle between kWindow and kBrowser.
+      apps::mojom::WindowMode user_window_mode =
+          ConvertUseLaunchTypeCommandToWindowMode(command_id);
+      if (user_window_mode != apps::mojom::WindowMode::kUnknown) {
         auto* provider = web_app::WebAppProvider::Get(profile());
         DCHECK(provider);
         provider->registry_controller().SetExperimentalTabbedWindowMode(
             app_id(), false, /*is_user_action=*/true);
-        provider->registry_controller().SetAppUserDisplayMode(
-            app_id(), user_display_mode, /*is_user_action=*/true);
+        apps::AppServiceProxyFactory::GetForProfile(profile())->SetWindowMode(
+            app_id(), user_window_mode);
       }
       return;
     }
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
index 4eebecdf..5d6c3eb 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -84,7 +84,7 @@
 #include "components/services/app_service/public/cpp/stub_icon_loader.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 #include "components/sync/base/client_tag_hash.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/model/sync_data.h"
 #include "components/sync/protocol/sync.pb.h"
 #include "components/sync/test/model/fake_sync_change_processor.h"
@@ -3240,10 +3240,9 @@
 }
 
 TEST_P(ArcAppModelBuilderTest, PackageSyncableServiceEnabled) {
-  EXPECT_TRUE(
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile_.get())
-          ->GetRegisteredDataTypesForTest()
-          .Has(syncer::ARC_PACKAGE));
+  EXPECT_TRUE(SyncServiceFactory::GetAsSyncServiceImplForProfile(profile_.get())
+                  ->GetRegisteredDataTypesForTest()
+                  .Has(syncer::ARC_PACKAGE));
 }
 
 TEST_P(ArcAppModelBuilderTest, PackageSyncableServiceDisabled) {
@@ -3251,7 +3250,7 @@
   command_line.GetProcessCommandLine()->AppendSwitch(
       chromeos::switches::kArcDisableAppSync);
   EXPECT_FALSE(
-      SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile_.get())
+      SyncServiceFactory::GetAsSyncServiceImplForProfile(profile_.get())
           ->GetRegisteredDataTypesForTest()
           .Has(syncer::ARC_PACKAGE));
 }
diff --git a/chrome/browser/ui/app_list/search/files/item_suggest_cache_unittest.cc b/chrome/browser/ui/app_list/search/files/item_suggest_cache_unittest.cc
index a05bf82..5daabc9 100644
--- a/chrome/browser/ui/app_list/search/files/item_suggest_cache_unittest.cc
+++ b/chrome/browser/ui/app_list/search/files/item_suggest_cache_unittest.cc
@@ -254,7 +254,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCacheInsufficientResourcesError) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
 
   auto head = network::CreateURLResponseHead(net::HTTP_OK);
@@ -271,7 +272,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCacheNetError) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
 
   auto head = network::CreateURLResponseHead(net::HTTP_OK);
@@ -288,7 +290,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCache5kkError) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
 
   auto head = network::mojom::URLResponseHead::New();
@@ -309,7 +312,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCache4kkError) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
 
   auto head = network::mojom::URLResponseHead::New();
@@ -330,7 +334,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCache3kkError) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
 
   auto head = network::mojom::URLResponseHead::New();
@@ -351,7 +356,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCacheEmptyResponse) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
   url_loader_factory_.AddResponse(kRequestUrl,
                                   /* content= */ "", net::HTTP_OK);
@@ -366,7 +372,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCacheInvalidResponse) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
   url_loader_factory_.AddResponse(kRequestUrl, "invalid = json", net::HTTP_OK);
 
@@ -383,7 +390,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCacheConversionFailure) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
   url_loader_factory_.AddResponse(kRequestUrl,
                                   R"(
@@ -405,7 +413,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCacheConversionEmptyResults) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
   url_loader_factory_.AddResponse(kRequestUrl,
                                   R"(
@@ -428,7 +437,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCacheSavesResults) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
   url_loader_factory_.AddResponse(kRequestUrl, kValidJsonResponse,
                                   net::HTTP_OK);
@@ -450,7 +460,8 @@
 TEST_F(ItemSuggestCacheTest, UpdateCacheSmallTimeBetweenUpdates) {
   std::unique_ptr<ItemSuggestCache> itemSuggestCache =
       std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_);
-  identity_test_env_->MakePrimaryAccountAvailable(kEmail);
+  identity_test_env_->MakePrimaryAccountAvailable(kEmail,
+                                                  signin::ConsentLevel::kSync);
   identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
   url_loader_factory_.AddResponse(kRequestUrl,
                                   R"(
diff --git a/chrome/browser/ui/ash/ambient/ambient_client_impl_unittest.cc b/chrome/browser/ui/ash/ambient/ambient_client_impl_unittest.cc
index a15846a..a781c46 100644
--- a/chrome/browser/ui/ash/ambient/ambient_client_impl_unittest.cc
+++ b/chrome/browser/ui/ash/ambient/ambient_client_impl_unittest.cc
@@ -75,8 +75,8 @@
   void MaybeMakeAccountAsPrimaryAccount(const AccountId& account_id) {
     if (!identity_test_env()->identity_manager()->HasPrimaryAccount(
             signin::ConsentLevel::kSignin)) {
-      identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
-          account_id.GetUserEmail());
+      identity_test_env()->MakePrimaryAccountAvailable(
+          account_id.GetUserEmail(), signin::ConsentLevel::kSignin);
     }
   }
 
diff --git a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
index 2c656ed8..777b68cdd 100644
--- a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
+++ b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
@@ -21,9 +21,9 @@
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/chromeos/policy/display_resolution_handler.h"
-#include "chrome/browser/chromeos/policy/display_rotation_default_handler.h"
-#include "chrome/browser/chromeos/policy/display_settings_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_resolution_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_rotation_default_handler.h"
+#include "chrome/browser/chromeos/policy/display/display_settings_handler.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/sync_error_notifier_factory_ash.h"
 #include "chrome/browser/ui/app_list/app_list_client_impl.h"
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc
index e7c2824..439aade 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc
@@ -56,8 +56,8 @@
 
   // Add a user to the identity manager with given gaia_id and email.
   CoreAccountId AddUserAndSignIn(const std::string& email) {
-    AccountInfo account_info =
-        identity_test_env()->MakePrimaryAccountAvailable(email);
+    AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+        email, signin::ConsentLevel::kSync);
     fake_user_manager_->AddUser(
         multi_user_util::GetAccountIdFromEmail(account_info.email));
     fake_user_manager_->UserLoggedIn(
diff --git a/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc b/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc
index 2da5961f..73d2353 100644
--- a/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc
+++ b/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc
@@ -20,8 +20,8 @@
 #include "chrome/browser/ash/login/users/multi_profile_user_controller.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 #include "chrome/browser/ui/ash/assistant/assistant_client_impl.h"
 #include "chrome/browser/ui/ash/test_session_controller.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
index e10d9c2..7d0928f 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/chromeos/file_manager/app_id.h"
 #include "chrome/browser/chromeos/file_manager/fileapi_util.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sharesheet/sharesheet_metrics.h"
 #include "chrome/browser/sharesheet/sharesheet_types.h"
 #include "chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h"
 #include "chrome/browser/ui/ash/sharesheet/sharesheet_constants.h"
@@ -149,7 +150,11 @@
 
   SharesheetImagePreview(const SharesheetImagePreview&) = delete;
   SharesheetImagePreview& operator=(const SharesheetImagePreview&) = delete;
-  ~SharesheetImagePreview() override = default;
+
+  ~SharesheetImagePreview() override {
+    ::sharesheet::SharesheetMetrics::RecordSharesheetImagePreviewPressed(
+        was_pressed_);
+  }
 
   views::ImageView* GetImageViewAt(size_t index) {
     if (index >= image_views_.size()) {
@@ -168,6 +173,17 @@
   }
 
  private:
+  // views::View:
+  bool OnMousePressed(const ui::MouseEvent& event) override {
+    was_pressed_ = true;
+    return false;
+  }
+
+  void OnGestureEvent(ui::GestureEvent* event) override {
+    if (event->type() == ui::ET_GESTURE_TAP)
+      was_pressed_ = true;
+  }
+
   void AddRowToImageContainerView() {
     auto* row = AddChildView(std::make_unique<views::View>());
     row->SetLayoutManager(std::make_unique<views::BoxLayout>(
@@ -204,6 +220,10 @@
   }
 
   std::vector<views::ImageView*> image_views_;
+
+  // Used for recording UMA to indicate whether or not a user tried to interact
+  // with the image preview.
+  bool was_pressed_ = false;
 };
 
 BEGIN_METADATA(SharesheetHeaderView, SharesheetImagePreview, views::View)
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc
index c0becf6..3e75f4d 100644
--- a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc
+++ b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc
@@ -54,14 +54,14 @@
   return item->contexts().Contains(extensions::MenuItem::LAUNCHER);
 }
 
-web_app::DisplayMode ConvertLaunchTypeCommandToDisplayMode(int command_id) {
+apps::mojom::WindowMode ConvertLaunchTypeCommandToWindowMode(int command_id) {
   switch (command_id) {
     case ash::LAUNCH_TYPE_REGULAR_TAB:
-      return web_app::DisplayMode::kBrowser;
+      return apps::mojom::WindowMode::kBrowser;
     case ash::LAUNCH_TYPE_WINDOW:
-      return web_app::DisplayMode::kStandalone;
+      return apps::mojom::WindowMode::kWindow;
     default:
-      return web_app::DisplayMode::kUndefined;
+      return apps::mojom::WindowMode::kUnknown;
   }
 }
 
@@ -225,11 +225,16 @@
                 item().id.app_id)) {
           return command_id == ash::LAUNCH_TYPE_TABBED_WINDOW;
         }
-        web_app::DisplayMode user_display_mode =
-            provider->registrar().GetAppUserDisplayMode(item().id.app_id);
-        return user_display_mode != web_app::DisplayMode::kUndefined &&
-               user_display_mode ==
-                   ConvertLaunchTypeCommandToDisplayMode(command_id);
+        auto user_window_mode = apps::mojom::WindowMode::kUnknown;
+        apps::AppServiceProxyFactory::GetForProfile(controller()->profile())
+            ->AppRegistryCache()
+            .ForOneApp(item().id.app_id,
+                       [&user_window_mode](const apps::AppUpdate& update) {
+                         user_window_mode = update.WindowMode();
+                       });
+        return user_window_mode != apps::mojom::WindowMode::kUnknown &&
+               user_window_mode ==
+                   ConvertLaunchTypeCommandToWindowMode(command_id);
       }
       return ShelfContextMenu::IsCommandIdChecked(command_id);
     }
@@ -452,16 +457,16 @@
   switch (app_type_) {
     case apps::mojom::AppType::kWeb:
     case apps::mojom::AppType::kSystemWeb: {
-      // Web apps can only toggle between kStandalone and kBrowser.
-      web_app::DisplayMode user_display_mode =
-          ConvertLaunchTypeCommandToDisplayMode(command_id);
-      if (user_display_mode != web_app::DisplayMode::kUndefined) {
+      // Web apps can only toggle between kWindow and kBrowser.
+      apps::mojom::WindowMode user_window_mode =
+          ConvertLaunchTypeCommandToWindowMode(command_id);
+      if (user_window_mode != apps::mojom::WindowMode::kUnknown) {
         auto* provider = web_app::WebAppProvider::Get(controller()->profile());
         DCHECK(provider);
         provider->registry_controller().SetExperimentalTabbedWindowMode(
             item().id.app_id, false, /*is_user_action=*/true);
-        provider->registry_controller().SetAppUserDisplayMode(
-            item().id.app_id, user_display_mode, /*is_user_action=*/true);
+        apps::AppServiceProxyFactory::GetForProfile(controller()->profile())
+            ->SetWindowMode(item().id.app_id, user_window_mode);
       }
       return;
     }
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu_browsertest.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu_browsertest.cc
index 8ae011b..542a5fc 100644
--- a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu_browsertest.cc
+++ b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu_browsertest.cc
@@ -90,6 +90,11 @@
       GetContextMenuSectionForAppCommand(app_id, ash::LAUNCH_TYPE_WINDOW);
   ASSERT_TRUE(menu_section);
   menu_section->sub_model->ActivatedAt(menu_section->command_index);
+
+  // Wait for app service to set the display mode.
+  apps::AppServiceProxyFactory::GetForProfile(profile)
+      ->FlushMojoCallsForTesting();
+
   EXPECT_EQ(user_action_tester.GetActionCount("WebApp.SetWindowMode.Window"),
             1);
 
@@ -146,5 +151,9 @@
   ASSERT_TRUE(menu_section);
   menu_section->sub_model->ActivatedAt(menu_section->command_index);
 
+  // Wait for app service to set the display mode.
+  apps::AppServiceProxyFactory::GetForProfile(profile)
+      ->FlushMojoCallsForTesting();
+
   EXPECT_EQ(user_action_tester.GetActionCount("WebApp.SetWindowMode.Tab"), 1);
 }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index 99d3a90..62cf61b 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -865,12 +865,9 @@
       IdentityManagerFactory::GetForProfile(profile);
   if (!identity_manager)
     return std::u16string();
-  absl::optional<AccountInfo> primary_account_info =
-      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync));
-  return primary_account_info
-             ? base::UTF8ToUTF16(primary_account_info->full_name)
-             : std::u16string();
+  AccountInfo primary_account_info = identity_manager->FindExtendedAccountInfo(
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync));
+  return base::UTF8ToUTF16(primary_account_info.full_name);
 }
 
 WEB_CONTENTS_USER_DATA_KEY_IMPL(ChromeAutofillClient)
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
index 29c7cadc..bfca0d4f 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
@@ -529,10 +529,8 @@
       PersonalDataManagerFactory::GetForProfile(profile);
   if (!personal_data_manager)
     return;
-  absl::optional<AccountInfo> account_info =
-      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          personal_data_manager->GetAccountInfoForPaymentsServer());
-  account_info_ = account_info.value_or(AccountInfo{});
+  account_info_ = identity_manager->FindExtendedAccountInfo(
+      personal_data_manager->GetAccountInfoForPaymentsServer());
 }
 
 void SaveCardBubbleControllerImpl::ShowBubble() {
diff --git a/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc
index 3bd12f62..10231d19 100644
--- a/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc
+++ b/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc
@@ -85,13 +85,11 @@
       IdentityManagerFactory::GetForProfile(GetProfile());
   if (!identity_manager)
     return gfx::Image();
-  absl::optional<AccountInfo> primary_account_info =
-      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager->GetPrimaryAccountInfo(
-              signin::ConsentLevel::kSignin));
-  DCHECK(primary_account_info.has_value());
+  AccountInfo primary_account_info = identity_manager->FindExtendedAccountInfo(
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin));
+  DCHECK(!primary_account_info.IsEmpty());
 
-  gfx::Image account_icon = primary_account_info->account_image;
+  gfx::Image account_icon = primary_account_info.account_image;
   if (account_icon.IsEmpty()) {
     account_icon = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
         profiles::GetPlaceholderAvatarIconResourceID());
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc
index 188c614a..5403cea 100644
--- a/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc
+++ b/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc
@@ -284,12 +284,10 @@
       IdentityManagerFactory::GetForProfile(profile);
   if (!identity_manager)
     return ui::ImageModel();
-  absl::optional<AccountInfo> primary_account_info =
-      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager->GetPrimaryAccountInfo(
-              signin::ConsentLevel::kSignin));
-  DCHECK(primary_account_info.has_value());
-  gfx::Image account_icon = primary_account_info->account_image;
+  AccountInfo primary_account_info = identity_manager->FindExtendedAccountInfo(
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin));
+  DCHECK(!primary_account_info.IsEmpty());
+  gfx::Image account_icon = primary_account_info.account_image;
   if (account_icon.IsEmpty()) {
     account_icon = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
         profiles::GetPlaceholderAvatarIconResourceID());
diff --git a/chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.cc b/chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.cc
index e464bef..c2e1f79b 100644
--- a/chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.cc
+++ b/chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.cc
@@ -95,14 +95,16 @@
     SendTabToSelfMenuType menu_type,
     const GURL& link_url)
     : ui::SimpleMenuModel(this),
+      content::WebContentsObserver(tab),
       tab_(tab),
       menu_type_(menu_type),
       link_url_(link_url) {
+  DCHECK(tab_);
   Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext());
   Build(profile);
 }
 
-SendTabToSelfSubMenuModel::~SendTabToSelfSubMenuModel() {}
+SendTabToSelfSubMenuModel::~SendTabToSelfSubMenuModel() = default;
 
 bool SendTabToSelfSubMenuModel::IsCommandIdEnabled(int command_id) const {
   // Only valid device names are shown, so all items are enabled.
@@ -115,6 +117,14 @@
   if (vector_index == -1) {
     return;
   }
+
+  send_tab_to_self::RecordDeviceClicked(MenuTypeToEntryPoint(menu_type_));
+
+  if (!tab_) {
+    // The WebContents has already been destroyed, just close the menu.
+    return;
+  }
+
   const ValidDeviceItem& item = valid_device_items_[vector_index];
   if (menu_type_ == SendTabToSelfMenuType::kLink) {
     // Is sharing a link from link menu.
@@ -123,9 +133,10 @@
     // Is sharing a tab from tab menu, content menu or omnibox menu.
     CreateNewEntry(tab_, item.device_name, item.cache_guid);
   }
+}
 
-  send_tab_to_self::RecordDeviceClicked(MenuTypeToEntryPoint(menu_type_));
-  return;
+void SendTabToSelfSubMenuModel::WebContentsDestroyed() {
+  tab_ = nullptr;
 }
 
 void SendTabToSelfSubMenuModel::Build(Profile* profile) {
diff --git a/chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.h b/chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.h
index 6895859..a92c770f 100644
--- a/chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.h
+++ b/chrome/browser/ui/send_tab_to_self/send_tab_to_self_sub_menu_model.h
@@ -13,6 +13,7 @@
 
 #include "base/macros.h"
 #include "chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "ui/base/models/simple_menu_model.h"
 #include "url/gurl.h"
 
@@ -25,7 +26,8 @@
 namespace send_tab_to_self {
 
 class SendTabToSelfSubMenuModel : public ui::SimpleMenuModel,
-                                  public ui::SimpleMenuModel::Delegate {
+                                  public ui::SimpleMenuModel::Delegate,
+                                  public content::WebContentsObserver {
  public:
   static const int kMinCommandId = 2000;
   static const int kMaxCommandId = 2020;
@@ -43,15 +45,20 @@
   bool IsCommandIdEnabled(int command_id) const override;
   void ExecuteCommand(int command_id, int event_flags) override;
 
+  // Overridden from content::WebContentsObserver:
+  void WebContentsDestroyed() override;
+
  private:
   void Build(Profile* profile);
   void BuildDeviceItem(const std::string& device_name,
                        const std::string& guid,
                        int index);
 
+  // Injected on construction and set to null if the WebContents is being
+  // destroyed.
   content::WebContents* tab_;
-  SendTabToSelfMenuType menu_type_;
-  GURL link_url_;
+  const SendTabToSelfMenuType menu_type_;
+  const GURL link_url_;
   std::vector<ValidDeviceItem> valid_device_items_;
 
   DISALLOW_COPY_AND_ASSIGN(SendTabToSelfSubMenuModel);
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
index 0d005b4..8448729 100644
--- a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
@@ -168,7 +168,7 @@
         "components/test/data/autofill");
     embedded_test_server()->StartAcceptingConnections();
 
-    SyncServiceFactory::GetAsProfileSyncServiceForProfile(browser()->profile())
+    SyncServiceFactory::GetAsSyncServiceImplForProfile(browser()->profile())
         ->OverrideNetworkForTest(
             fake_server::CreateFakeServerHttpPostProviderFactory(
                 GetFakeServer()->AsWeakPtr()));
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
index 2aa5961d..b8752d5d 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -58,8 +58,8 @@
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/test/fake_server/fake_server.h"
 #include "components/sync/test/fake_server/fake_server_network_resources.h"
 #include "content/public/browser/render_process_host.h"
@@ -172,7 +172,7 @@
         "components/test/data/autofill");
     embedded_test_server()->StartAcceptingConnections();
 
-    SyncServiceFactory::GetAsProfileSyncServiceForProfile(browser()->profile())
+    SyncServiceFactory::GetAsSyncServiceImplForProfile(browser()->profile())
         ->OverrideNetworkForTest(
             fake_server::CreateFakeServerHttpPostProviderFactory(
                 GetFakeServer()->AsWeakPtr()));
@@ -2068,9 +2068,17 @@
   EXPECT_TRUE(GetSaveCardIconView()->GetVisible());
 }
 
+// Disabled on Linux due to crashes; https://crbug.com/1216300.
+#if defined(OS_LINUX)
+#define MAYBE_ClickingOnCreditCardIconInStatusChipReshowsBubble \
+    DISABLED_ClickingOnCreditCardIconInStatusChipReshowsBubble
+#else
+#define MAYBE_ClickingOnCreditCardIconInStatusChipReshowsBubble \
+    ClickingOnCreditCardIconInStatusChipReshowsBubble
+#endif
 // Ensures that the clicking on the credit card icon will reshow bubble.
 IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTestForStatusChip,
-                       ClickingOnCreditCardIconInStatusChipReshowsBubble) {
+                       MAYBE_ClickingOnCreditCardIconInStatusChipReshowsBubble) {
   FillForm();
   SubmitFormAndWaitForCardLocalSaveBubble();
   ClickOnCloseButton();
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_sync_browsertest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_sync_browsertest.cc
index 9590233..adb7b33 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view_sync_browsertest.cc
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_sync_browsertest.cc
@@ -91,8 +91,8 @@
 
  protected:
   void SetupSyncForAccount(Profile* profile) {
-    syncer::ProfileSyncService* sync_service =
-        SyncServiceFactory::GetAsProfileSyncServiceForProfile(profile);
+    syncer::SyncServiceImpl* sync_service =
+        SyncServiceFactory::GetAsSyncServiceImplForProfile(profile);
 
     sync_service->OverrideNetworkForTest(
         fake_server::CreateFakeServerHttpPostProviderFactory(
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
index acad11e..b07f788 100644
--- a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
+++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
@@ -66,6 +66,22 @@
   }
 }
 
+int HttpErrorFailureReasonToInt(
+    plugin_vm::PluginVmInstaller::FailureReason reason) {
+  using Reason = plugin_vm::PluginVmInstaller::FailureReason;
+  switch (reason) {
+    default:
+      NOTREACHED();
+      FALLTHROUGH;
+    case Reason::DOWNLOAD_FAILED_401:
+      return 401;
+    case Reason::DOWNLOAD_FAILED_403:
+      return 403;
+    case Reason::DOWNLOAD_FAILED_404:
+      return 404;
+  }
+}
+
 }  // namespace
 
 void plugin_vm::ShowPluginVmInstallerView(Profile* profile) {
@@ -401,7 +417,10 @@
         case Reason::DOWNLOAD_FAILED_401:
         case Reason::DOWNLOAD_FAILED_403:
         case Reason::DOWNLOAD_FAILED_404:
-          // TODO(b/160897236): Add a new string for this case.
+          return l10n_util::GetStringFUTF16(
+              IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_DOWNLOAD_HTTP_ERROR,
+              app_name_,
+              base::NumberToString16(HttpErrorFailureReasonToInt(*reason_)));
         case Reason::DOWNLOAD_FAILED_UNKNOWN:
         case Reason::DOWNLOAD_FAILED_NETWORK:
         case Reason::DOWNLOAD_FAILED_ABORTED:
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc
index 1358daa..18fc7bc3 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc
@@ -18,7 +18,7 @@
 #include "chrome/browser/sync/sync_ui_util.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "components/signin/public/identity_manager/consent_level.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service.h"
 #include "ui/base/resource/resource_bundle.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
index 13e275e..2069d062 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -555,8 +555,8 @@
     return IdentityManagerFactory::GetForProfile(browser()->profile());
   }
 
-  syncer::ProfileSyncService* sync_service() {
-    return SyncServiceFactory::GetAsProfileSyncServiceForProfile(
+  syncer::SyncServiceImpl* sync_service() {
+    return SyncServiceFactory::GetAsSyncServiceImplForProfile(
         browser()->profile());
   }
 
diff --git a/chrome/browser/ui/views/sharing/click_to_call_browsertest.cc b/chrome/browser/ui/views/sharing/click_to_call_browsertest.cc
index d1b1e50..b5c4c5d 100644
--- a/chrome/browser/ui/views/sharing/click_to_call_browsertest.cc
+++ b/chrome/browser/ui/views/sharing/click_to_call_browsertest.cc
@@ -31,8 +31,8 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/policy/policy_constants.h"
 #include "components/prefs/pref_service.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/test/browser_test.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
diff --git a/chrome/browser/ui/views/sharing/shared_clipboard_browsertest.cc b/chrome/browser/ui/views/sharing/shared_clipboard_browsertest.cc
index ac5a490..b81b9f6 100644
--- a/chrome/browser/ui/views/sharing/shared_clipboard_browsertest.cc
+++ b/chrome/browser/ui/views/sharing/shared_clipboard_browsertest.cc
@@ -18,8 +18,8 @@
 #include "chrome/browser/sharing/sharing_sync_preference.h"
 #include "chrome/browser/sync/test/integration/sessions_helper.h"
 #include "chrome/browser/ui/views/sharing/sharing_browsertest.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "content/public/test/browser_test.h"
 #include "url/gurl.h"
 
diff --git a/chrome/browser/ui/views/sharing/sharing_browsertest.cc b/chrome/browser/ui/views/sharing/sharing_browsertest.cc
index caeac69d..dff6b5e9 100644
--- a/chrome/browser/ui/views/sharing/sharing_browsertest.cc
+++ b/chrome/browser/ui/views/sharing/sharing_browsertest.cc
@@ -27,7 +27,6 @@
 #include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
 #include "components/gcm_driver/fake_gcm_profile_service.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/model/client_tag_based_model_type_processor.h"
 #include "components/sync_device_info/device_info.h"
 #include "content/public/test/browser_test_utils.h"
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc
index d2c61234..d968b8ac 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc
@@ -39,8 +39,8 @@
     // TODO(danan):  See if this is possible to do this instead using
     // FakeGaia.IssueOAuthToken().
     identity_test_env_ = std::make_unique<signin::IdentityTestEnvironment>();
-    identity_test_env_->MakeUnconsentedPrimaryAccountAvailable(
-        "example@gmail.com");
+    identity_test_env_->MakePrimaryAccountAvailable(
+        "example@gmail.com", signin::ConsentLevel::kSignin);
     // This makes the identity manager return the string "access_token" for the
     // access token.
     identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
diff --git a/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h
index c389126e..6865b01 100644
--- a/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h
@@ -44,7 +44,7 @@
  public:
   using TView = ActiveDirectoryPasswordChangeView;
 
-  ActiveDirectoryPasswordChangeScreenHandler(
+  explicit ActiveDirectoryPasswordChangeScreenHandler(
       JSCallsContainer* js_calls_container);
   ~ActiveDirectoryPasswordChangeScreenHandler() override;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 09144ee..faf823e 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -56,7 +56,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
-#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
+#include "chrome/browser/chromeos/policy/networking/device_network_configuration_updater.h"
 #include "chrome/browser/lifetime/browser_shutdown.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/webui/management/management_ui_handler.cc b/chrome/browser/ui/webui/management/management_ui_handler.cc
index c7bb05d..9dca5a766 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler.cc
@@ -53,8 +53,8 @@
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h"
 #include "chrome/browser/chromeos/policy/minimum_version_policy_handler.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service.h"
-#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service.h"
+#include "chrome/browser/chromeos/policy/networking/policy_cert_service_factory.h"
 #include "chrome/browser/chromeos/policy/status_collector/device_status_collector.h"
 #include "chrome/browser/chromeos/policy/status_collector/status_collector.h"
 #include "chrome/browser/chromeos/policy/status_uploader.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index f5b0963..029f651d 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -278,10 +278,15 @@
 
 void CupsPrintersHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
-      "getCupsPrintersList",
-      base::BindRepeating(&CupsPrintersHandler::HandleGetCupsPrintersList,
+      "getCupsSavedPrintersList",
+      base::BindRepeating(&CupsPrintersHandler::HandleGetCupsSavedPrintersList,
                           base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
+      "getCupsEnterprisePrintersList",
+      base::BindRepeating(
+          &CupsPrintersHandler::HandleGetCupsEnterprisePrintersList,
+          base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
       "updateCupsPrinter",
       base::BindRepeating(&CupsPrintersHandler::HandleUpdateCupsPrinter,
                           base::Unretained(this)));
@@ -365,7 +370,7 @@
   set_web_ui(web_ui);
 }
 
-void CupsPrintersHandler::HandleGetCupsPrintersList(
+void CupsPrintersHandler::HandleGetCupsSavedPrintersList(
     const base::ListValue* args) {
   AllowJavascript();
 
@@ -380,6 +385,20 @@
   ResolveJavascriptCallback(base::Value(callback_id), response);
 }
 
+void CupsPrintersHandler::HandleGetCupsEnterprisePrintersList(
+    const base::ListValue* args) {
+  AllowJavascript();
+
+  CHECK_EQ(1U, args->GetSize());
+  std::string callback_id = args->GetList()[0].GetString();
+
+  std::vector<Printer> printers =
+      printers_manager_->GetPrinters(PrinterClass::kEnterprise);
+
+  auto response = BuildCupsPrintersList(printers);
+  ResolveJavascriptCallback(base::Value(callback_id), response);
+}
+
 void CupsPrintersHandler::HandleUpdateCupsPrinter(const base::ListValue* args) {
   std::string callback_id;
   std::string printer_id;
@@ -990,12 +1009,13 @@
       break;
     case PrinterClass::kSaved: {
       auto printers_list = BuildCupsPrintersList(printers);
-      FireWebUIListener("on-printers-changed", printers_list);
+      FireWebUIListener("on-saved-printers-changed", printers_list);
       break;
     }
     case PrinterClass::kEnterprise:
-      // These classes are not shown.
-      return;
+      auto enterprise_printers_list = BuildCupsPrintersList(printers);
+      FireWebUIListener("on-enterprise-printers-changed",
+                        enterprise_printers_list);
   }
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
index ac2cd672..68a4c75 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
@@ -71,7 +71,8 @@
                       CupsPrintersManager* printers_manager);
 
   // Gets all CUPS printers and return it to WebUI.
-  void HandleGetCupsPrintersList(const base::ListValue* args);
+  void HandleGetCupsSavedPrintersList(const base::ListValue* args);
+  void HandleGetCupsEnterprisePrintersList(const base::ListValue* args);
   void HandleUpdateCupsPrinter(const base::ListValue* args);
   void HandleRemoveCupsPrinter(const base::ListValue* args);
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
index f2d1346..a757b4fd 100644
--- a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
@@ -7,7 +7,6 @@
 #include <string>
 #include <utility>
 
-#include "ash/constants/ash_features.h"
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/values.h"
@@ -50,16 +49,12 @@
   html_source->AddLocalizedStrings(kLocalizedStrings);
 }
 
-// Adds flags related to Kerberos settings visibility and its corresponding
-// settings section.
-void AddKerberosSettingsVisibilityFlags(
+// Adds load time boolean corresponding to Kerberos enable state.
+void AddKerberosEnabledFlag(
     content::WebUIDataSource* html_source,
     KerberosCredentialsManager* kerberos_credentials_manager) {
   html_source->AddBoolean("isKerberosEnabled",
                           IsKerberosEnabled(kerberos_credentials_manager));
-  html_source->AddBoolean(
-      "isKerberosSettingsSectionEnabled",
-      chromeos::features::IsKerberosSettingsSectionEnabled());
 }
 
 // Adds load time strings to Kerberos Add Accounts dialog.
@@ -189,7 +184,7 @@
 void KerberosAccountsHandler::AddLoadTimeKerberosStrings(
     content::WebUIDataSource* html_source,
     KerberosCredentialsManager* kerberos_credentials_manager) {
-  AddKerberosSettingsVisibilityFlags(html_source, kerberos_credentials_manager);
+  AddKerberosEnabledFlag(html_source, kerberos_credentials_manager);
   AddKerberosTitleStrings(html_source);
   AddKerberosAccountsPageStrings(html_source);
   AddKerberosAddAccountDialogStrings(html_source);
diff --git a/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc b/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc
index f94798c..4bda75a 100644
--- a/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/kerberos_section.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/ui/webui/settings/chromeos/kerberos_section.h"
 
-#include "ash/constants/ash_features.h"
 #include "base/no_destructor.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h"
@@ -71,10 +70,6 @@
     KerberosCredentialsManager* kerberos_credentials_manager)
     : OsSettingsSection(profile, search_tag_registry),
       kerberos_credentials_manager_(kerberos_credentials_manager) {
-  // No search tags are registered if KerberosSettingsSection flag is disabled.
-  if (!chromeos::features::IsKerberosSettingsSectionEnabled())
-    return;
-
   if (kerberos_credentials_manager_) {
     // Kerberos search tags are added/removed dynamically.
     kerberos_credentials_manager_->AddObserver(this);
@@ -83,10 +78,6 @@
 }
 
 KerberosSection::~KerberosSection() {
-  // No observer has been added if KerberosSettingsSection flag is disabled.
-  if (!chromeos::features::IsKerberosSettingsSectionEnabled())
-    return;
-
   if (kerberos_credentials_manager_)
     kerberos_credentials_manager_->RemoveObserver(this);
 }
@@ -100,10 +91,6 @@
 }
 
 void KerberosSection::AddHandlers(content::WebUI* web_ui) {
-  // No handler is created/added if KerberosSettingsSection flag is disabled.
-  if (!chromeos::features::IsKerberosSettingsSectionEnabled())
-    return;
-
   std::unique_ptr<chromeos::settings::KerberosAccountsHandler>
       kerberos_accounts_handler =
           KerberosAccountsHandler::CreateIfKerberosEnabled(profile());
diff --git a/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h b/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h
index b84e908..34f95170 100644
--- a/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h
+++ b/chrome/browser/ui/webui/settings/chromeos/kerberos_section.h
@@ -21,7 +21,7 @@
 class SearchTagRegistry;
 
 // Provides UI strings and search tags for Kerberos settings. Search tags are
-// only shown if they are allowed by policy/flags.
+// only added if the feature is enabled by policy.
 class KerberosSection : public OsSettingsSection,
                         public KerberosCredentialsManager::Observer {
  public:
diff --git a/chrome/browser/ui/webui/settings/chromeos/main_section.cc b/chrome/browser/ui/webui/settings/chromeos/main_section.cc
index f8761bc..8ce7eb9 100644
--- a/chrome/browser/ui/webui/settings/chromeos/main_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/main_section.cc
@@ -230,7 +230,7 @@
       ProfileHelper::Get()->GetUserByProfile(profile());
   const user_manager::User* primary_user =
       user_manager::UserManager::Get()->GetPrimaryUser();
-  std::string primary_user_email = primary_user->GetAccountId().GetUserEmail();
+  std::string primary_user_email = primary_user->GetDisplayEmail();
 
   html_source->AddString("primaryUserEmail", primary_user_email);
   html_source->AddBoolean("isActiveDirectoryUser",
diff --git a/chrome/browser/ui/webui/settings/chromeos/printing_section.cc b/chrome/browser/ui/webui/settings/chromeos/printing_section.cc
index fcb6da2..0ac876f 100644
--- a/chrome/browser/ui/webui/settings/chromeos/printing_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/printing_section.cc
@@ -111,6 +111,7 @@
        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_LEARN_MORE_LABEL},
       {"addCupsPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_PRINTER},
       {"editPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT},
+      {"viewPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_VIEW},
       {"removePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_REMOVE},
       {"setupPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTER_SETUP_BUTTON},
       {"setupPrinterAria",
@@ -151,6 +152,14 @@
        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE},
       {"nearbyPrintersCountNone",
        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE},
+      {"enterprisePrintersTitle",
+       IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_TITLE},
+      {"enterprisePrintersCountMany",
+       IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTERS_COUNT_MANY},
+      {"enterprisePrintersCountOne",
+       IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_ONE},
+      {"enterprisePrintersCountNone",
+       IDS_SETTINGS_PRINTING_ENTERPRISE_PRINTERS_AVAILABLE_PRINTER_COUNT_NONE},
       {"nearbyPrintersListDescription",
        IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_DETECTED_OR_NEW_PRINTER},
       {"manufacturerAndModelAdditionalInformation",
@@ -226,6 +235,8 @@
        IDS_SETTINGS_PRINTING_CUPS_PRINTER_CONNECT_TO_NETWORK_SUBTEXT},
       {"editPrinterDialogTitle",
        IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_DIALOG_TITLE},
+      {"viewPrinterDialogTitle",
+       IDS_SETTINGS_PRINTING_CUPS_VIEW_PRINTER_DIALOG_TITLE},
       {"editPrinterButtonText", IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_BUTTON},
       {"currentPpdMessage",
        IDS_SETTINGS_PRINTING_CUPS_EDIT_PRINTER_CURRENT_PPD_MESSAGE},
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index ac3fda8e..35113af 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -852,7 +852,7 @@
 void PeopleHandler::OnStateChanged(syncer::SyncService* sync_service) {
   UpdateSyncStatus();
   // TODO(crbug.com/1106764): Re-evaluate marking sync as configuring here,
-  // since this gets called whenever ProfileSyncService changes state. Inline
+  // since this gets called whenever SyncService changes state. Inline
   // MaybeMarkSyncConfiguring() then.
   MaybeMarkSyncConfiguring();
   PushSyncPrefs();
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index 0af90da..c233f4b8 100644
--- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -1302,7 +1302,8 @@
 
 TEST_F(PeopleHandlerTest, TurnOffSync) {
   // Simulate a user who previously turned on sync.
-  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com",
+                                                   ConsentLevel::kSync);
   ASSERT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
 
   CreatePeopleHandler();
@@ -1314,7 +1315,8 @@
 
 TEST_F(PeopleHandlerTest, GetStoredAccountsList) {
   // Chrome OS sets an unconsented primary account on login.
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com",
+                                                   ConsentLevel::kSignin);
   ASSERT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
 
   CreatePeopleHandler();
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
index dab0be8..281228a9 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
+++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
@@ -87,16 +87,6 @@
   DISALLOW_COPY_AND_ASSIGN(DiceTurnSyncOnHelperShutdownNotifierFactory);
 };
 
-AccountInfo GetAccountInfo(signin::IdentityManager* identity_manager,
-                           const CoreAccountId& account_id) {
-  auto maybe_account_info =
-      identity_manager
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id);
-  return maybe_account_info.has_value() ? maybe_account_info.value()
-                                        : AccountInfo();
-}
-
 // User input handler for the signin confirmation dialog.
 class SigninDialogDelegate : public ui::ProfileSigninConfirmationDelegate {
  public:
@@ -209,7 +199,8 @@
       signin_promo_action_(signin_promo_action),
       signin_reason_(signin_reason),
       signin_aborted_mode_(signin_aborted_mode),
-      account_info_(GetAccountInfo(identity_manager_, account_id)),
+      account_info_(
+          identity_manager_->FindExtendedAccountInfoByAccountId(account_id)),
       scoped_callback_runner_(std::move(callback)),
       shutdown_subscription_(
           DiceTurnSyncOnHelperShutdownNotifierFactory::GetInstance()
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
index b307b863..ace3c09 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
+++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -317,12 +317,11 @@
     user_policy_signin_service_->set_account(account_id_, kEnterpriseEmail);
 
     // Update the account info to have a consistent hosted domain field.
-    absl::optional<AccountInfo> account_info =
-        identity_manager()->FindExtendedAccountInfoForAccountWithRefreshToken(
-            core_account_info);
-    EXPECT_TRUE(account_info);
-    account_info->hosted_domain = kEnterpriseHostedDomain;
-    signin::UpdateAccountInfoForAccount(identity_manager(), *account_info);
+    AccountInfo account_info =
+        identity_manager()->FindExtendedAccountInfo(core_account_info);
+    EXPECT_FALSE(account_info.IsEmpty());
+    account_info.hosted_domain = kEnterpriseHostedDomain;
+    signin::UpdateAccountInfoForAccount(identity_manager(), account_info);
   }
 
   void UseInvalidAccount() { account_id_ = CoreAccountId("invalid_account"); }
diff --git a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
index e522b9c3d..b0811a5 100644
--- a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
+++ b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
@@ -126,16 +126,13 @@
   Profile* profile = Profile::FromWebUI(web_ui());
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
-  absl::optional<AccountInfo> updated_info =
-      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          intercepted_account());
-  if (updated_info)
-    bubble_parameters_.intercepted_account = updated_info.value();
-  updated_info =
-      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          primary_account());
-  if (updated_info)
-    bubble_parameters_.primary_account = updated_info.value();
+  AccountInfo updated_info =
+      identity_manager->FindExtendedAccountInfo(intercepted_account());
+  if (!updated_info.IsEmpty())
+    bubble_parameters_.intercepted_account = updated_info;
+  updated_info = identity_manager->FindExtendedAccountInfo(primary_account());
+  if (!updated_info.IsEmpty())
+    bubble_parameters_.primary_account = updated_info;
 
   // If there is no extended info for the primary account, populate with
   // reasonable defaults.
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
index cca421b..c6b20ce 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -239,13 +239,12 @@
   if (has_primary_account && is_force_sign_in_with_usermanager) {
     CoreAccountInfo primary_account =
         identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync);
-    absl::optional<AccountInfo> primary_account_info =
-        identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-            primary_account);
+    AccountInfo primary_account_info =
+        identity_manager->FindExtendedAccountInfo(primary_account);
     std::u16string profile_name;
-    if (primary_account_info.has_value()) {
+    if (!primary_account_info.IsEmpty()) {
       profile_name =
-          profiles::GetDefaultNameForNewSignedInProfile(*primary_account_info);
+          profiles::GetDefaultNameForNewSignedInProfile(primary_account_info);
     } else {
       profile_name =
           profiles::GetDefaultNameForNewSignedInProfileWithIncompleteInfo(
diff --git a/chrome/browser/ui/webui/signin/signin_reauth_ui.cc b/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
index 08fe36c4..575406dd 100644
--- a/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
+++ b/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
@@ -47,13 +47,11 @@
   // Sync shouldn't be enabled. Otherwise, the primary account and the first
   // cookie account may diverge.
   DCHECK(!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  absl::optional<AccountInfo> account_info =
-      identity_manager
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id);
+  AccountInfo account_info =
+      identity_manager->FindExtendedAccountInfoByAccountId(account_id);
 
-  return account_info && !account_info->account_image.IsEmpty()
-             ? webui::GetBitmapDataUrl(account_info->account_image.AsBitmap())
+  return !account_info.account_image.IsEmpty()
+             ? webui::GetBitmapDataUrl(account_info.account_image.AsBitmap())
              : profiles::GetPlaceholderAvatarIconUrl();
 }
 
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
index 87388f2..3b477f42 100644
--- a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
@@ -106,16 +106,15 @@
 void SyncConfirmationHandler::HandleAccountInfoRequest(
     const base::ListValue* args) {
   DCHECK(SyncServiceFactory::IsSyncAllowed(profile_));
-  absl::optional<AccountInfo> primary_account_info =
-      identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
+  AccountInfo primary_account_info = identity_manager_->FindExtendedAccountInfo(
+      identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
 
   // Fire the "account-info-changed" listener from |SetAccountInfo()|.
   // Note: If the account info is not available yet in the
   // IdentityManager, i.e. account_info is empty, the listener will be
   // fired again through |OnAccountUpdated()|.
-  if (primary_account_info && primary_account_info->IsValid())
-    SetAccountInfo(*primary_account_info);
+  if (primary_account_info.IsValid())
+    SetAccountInfo(primary_account_info);
 }
 
 void SyncConfirmationHandler::RecordConsent(const base::ListValue* args) {
@@ -217,19 +216,18 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  absl::optional<AccountInfo> primary_account_info =
-      identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
-  if (!primary_account_info) {
+  AccountInfo primary_account_info = identity_manager_->FindExtendedAccountInfo(
+      identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
+  if (primary_account_info.IsEmpty()) {
     // No account is signed in, so there is nothing to be displayed in the sync
     // confirmation dialog.
     return;
   }
 
-  if (!primary_account_info->IsValid()) {
+  if (!primary_account_info.IsValid()) {
     identity_manager_->AddObserver(this);
   } else {
-    SetAccountInfo(*primary_account_info);
+    SetAccountInfo(primary_account_info);
   }
 
   if (browser_)
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc b/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc
index 1dc30cc0..c4eba8a 100644
--- a/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_handler_unittest.cc
@@ -90,8 +90,8 @@
 
     identity_test_env_adaptor_ =
         std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile());
-    account_info_ =
-        identity_test_env()->MakePrimaryAccountAvailable("foo@example.com");
+    account_info_ = identity_test_env()->MakePrimaryAccountAvailable(
+        "foo@example.com", signin::ConsentLevel::kSync);
     login_ui_service_observation_.Observe(
         LoginUIServiceFactory::GetForProfile(profile()));
   }
@@ -165,13 +165,11 @@
 
     signin::IdentityManager* identity_manager =
         IdentityManagerFactory::GetForProfile(profile());
-    absl::optional<AccountInfo> primary_account =
-        identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-            identity_manager->GetPrimaryAccountInfo(
-                signin::ConsentLevel::kSync));
-    EXPECT_TRUE(primary_account);
+    AccountInfo primary_account = identity_manager->FindExtendedAccountInfo(
+        identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync));
+    EXPECT_FALSE(primary_account.IsEmpty());
 
-    std::string gaia_picture_url = primary_account->picture_url;
+    std::string gaia_picture_url = primary_account.picture_url;
     std::string expected_picture_url =
         signin::GetAvatarImageURLWithOptions(GURL(gaia_picture_url),
                                              kExpectedProfileImageSize,
@@ -184,7 +182,7 @@
     const base::Value* show_enterprise_badge =
         call_data.arg2()->FindKey("showEnterpriseBadge");
     EXPECT_NE(show_enterprise_badge, nullptr);
-    EXPECT_EQ(primary_account->IsManaged(), show_enterprise_badge->GetBool());
+    EXPECT_EQ(primary_account.IsManaged(), show_enterprise_badge->GetBool());
   }
 
  protected:
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
index 77631ed..5bc06fee0 100644
--- a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
+++ b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
@@ -100,7 +100,7 @@
   void OnGotEntityCounts(
       const std::vector<syncer::TypeEntitiesCount>& entity_counts);
 
-  // Gets the ProfileSyncService of the underlying original profile. May return
+  // Gets the SyncService of the underlying original profile. May return
   // nullptr (e.g. if sync is disabled on the command line).
   syncer::SyncService* GetSyncService();
 
@@ -112,7 +112,7 @@
   // machinery. Leaves notifications hooked into the UI alone.
   void UnregisterModelNotifications();
 
-  // A flag used to prevent double-registration with ProfileSyncService.
+  // A flag used to prevent double-registration with SyncService.
   bool is_registered_ = false;
 
   // Whether specifics should be included when converting protocol events to a
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
index 4343ab10..1400016 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_manager.h"
+#include "chrome/browser/web_applications/components/app_registry_controller.h"
 #include "chrome/browser/web_applications/components/install_finalizer.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
@@ -550,6 +551,39 @@
   chrome::ShowSiteSettings(profile(), web_app->start_url());
 }
 
+void WebAppPublisherHelper::SetWindowMode(const std::string& app_id,
+                                          apps::mojom::WindowMode window_mode) {
+  auto display_mode = blink::mojom::DisplayMode::kUndefined;
+  switch (window_mode) {
+    case apps::mojom::WindowMode::kUnknown:
+      display_mode = blink::mojom::DisplayMode::kUndefined;
+      break;
+    case apps::mojom::WindowMode::kBrowser:
+      display_mode = blink::mojom::DisplayMode::kBrowser;
+      break;
+    case apps::mojom::WindowMode::kWindow:
+      display_mode = blink::mojom::DisplayMode::kStandalone;
+      break;
+  }
+  provider_->registry_controller().SetAppUserDisplayMode(
+      app_id, display_mode, /*is_user_action=*/true);
+}
+
+apps::mojom::WindowMode WebAppPublisherHelper::ConvertDisplayModeToWindowMode(
+    blink::mojom::DisplayMode display_mode) {
+  switch (display_mode) {
+    case blink::mojom::DisplayMode::kUndefined:
+      return apps::mojom::WindowMode::kUnknown;
+    case blink::mojom::DisplayMode::kBrowser:
+      return apps::mojom::WindowMode::kBrowser;
+    case blink::mojom::DisplayMode::kMinimalUi:
+    case blink::mojom::DisplayMode::kStandalone:
+    case blink::mojom::DisplayMode::kFullscreen:
+    case blink::mojom::DisplayMode::kWindowControlsOverlay:
+      return apps::mojom::WindowMode::kWindow;
+  }
+}
+
 WebAppRegistrar& WebAppPublisherHelper::registrar() const {
   return *provider_->registrar().AsWebAppRegistrar();
 }
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
index 9d40d1df..2fe621a 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.h
@@ -148,6 +148,13 @@
 
   void OpenNativeSettings(const std::string& app_id);
 
+  void SetWindowMode(const std::string& app_id,
+                     apps::mojom::WindowMode window_mode);
+
+  // Converts |display_mode| to a |window_mode|.
+  apps::mojom::WindowMode ConvertDisplayModeToWindowMode(
+      blink::mojom::DisplayMode display_mode);
+
   Profile* profile() { return profile_; }
 
   apps::mojom::AppType app_type() const { return app_type_; }
diff --git a/chrome/browser/web_applications/app_service/web_apps_chromeos.cc b/chrome/browser/web_applications/app_service/web_apps_chromeos.cc
index b1d96d82..85c893d 100644
--- a/chrome/browser/web_applications/app_service/web_apps_chromeos.cc
+++ b/chrome/browser/web_applications/app_service/web_apps_chromeos.cc
@@ -342,6 +342,11 @@
   publisher_helper().LaunchAppWithParams(std::move(params));
 }
 
+void WebAppsChromeOs::SetWindowMode(const std::string& app_id,
+                                    apps::mojom::WindowMode window_mode) {
+  publisher_helper().SetWindowMode(app_id, window_mode);
+}
+
 void WebAppsChromeOs::OnWebAppInstalled(const AppId& app_id) {
   provider()->registry_controller().SetAppIsDisabled(
       app_id, IsWebAppInDisabledList(app_id));
@@ -427,6 +432,19 @@
   }
 }
 
+void WebAppsChromeOs::OnWebAppUserDisplayModeChanged(
+    const AppId& app_id,
+    DisplayMode user_display_mode) {
+  if (GetWebApp(app_id) && Accepts(app_id)) {
+    apps::mojom::AppPtr app = apps::mojom::App::New();
+    app->app_type = app_type();
+    app->app_id = app_id;
+    app->window_mode =
+        publisher_helper().ConvertDisplayModeToWindowMode(user_display_mode);
+    Publish(std::move(app), subscribers());
+  }
+}
+
 void WebAppsChromeOs::UpdateAppDisabledMode(apps::mojom::AppPtr& app) {
   if (provider()->policy_manager().IsDisabledAppsModeHidden()) {
     app->show_in_launcher = apps::mojom::OptionalBool::kFalse;
@@ -636,20 +654,8 @@
   app->icon_key = publisher_helper().MakeIconKey(web_app);
 
   auto display_mode = GetRegistrar()->GetAppUserDisplayMode(web_app->app_id());
-  switch (display_mode) {
-    case blink::mojom::DisplayMode::kUndefined:
-      app->window_mode = apps::mojom::WindowMode::kUnknown;
-      break;
-    case blink::mojom::DisplayMode::kBrowser:
-      app->window_mode = apps::mojom::WindowMode::kBrowser;
-      break;
-    case blink::mojom::DisplayMode::kMinimalUi:
-    case blink::mojom::DisplayMode::kStandalone:
-    case blink::mojom::DisplayMode::kFullscreen:
-    case blink::mojom::DisplayMode::kWindowControlsOverlay:
-      app->window_mode = apps::mojom::WindowMode::kWindow;
-      break;
-  }
+  app->window_mode =
+      publisher_helper().ConvertDisplayModeToWindowMode(display_mode);
 
   apps::mojom::OptionalBool has_notification =
       app_notifications_.HasNotification(web_app->app_id())
diff --git a/chrome/browser/web_applications/app_service/web_apps_chromeos.h b/chrome/browser/web_applications/app_service/web_apps_chromeos.h
index 1c06c4fcf..b911bcaa 100644
--- a/chrome/browser/web_applications/app_service/web_apps_chromeos.h
+++ b/chrome/browser/web_applications/app_service/web_apps_chromeos.h
@@ -92,6 +92,8 @@
                                  int command_id,
                                  const std::string& shortcut_id,
                                  int64_t display_id) override;
+  void SetWindowMode(const std::string& app_id,
+                     apps::mojom::WindowMode window_mode) override;
 
   // AppRegistrarObserver:
   void OnWebAppInstalled(const AppId& app_id) override;
@@ -99,6 +101,8 @@
   void OnWebAppDisabledStateChanged(const AppId& app_id,
                                     bool is_disabled) override;
   void OnWebAppsDisabledModeChanged() override;
+  void OnWebAppUserDisplayModeChanged(const AppId& app_id,
+                                      DisplayMode user_display_mode) override;
 
   // Updates app visibility.
   void UpdateAppDisabledMode(apps::mojom::AppPtr& app);
diff --git a/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc b/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc
index 8d2a8089..3337bdb 100644
--- a/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc
+++ b/chrome/browser/web_applications/app_service/web_apps_publisher_host.cc
@@ -162,6 +162,11 @@
   publisher_helper().OpenNativeSettings(app_id);
 }
 
+void WebAppsPublisherHost::SetWindowMode(const std::string& app_id,
+                                         apps::mojom::WindowMode window_mode) {
+  return publisher_helper().SetWindowMode(app_id, window_mode);
+}
+
 void WebAppsPublisherHost::OnWebAppInstalled(const AppId& app_id) {
   const WebApp* web_app = GetWebApp(app_id);
   if (!web_app) {
@@ -226,6 +231,19 @@
   PublishWebApp(publisher_helper().ConvertLaunchedWebApp(web_app));
 }
 
+void WebAppsPublisherHost::OnWebAppUserDisplayModeChanged(
+    const AppId& app_id,
+    DisplayMode user_display_mode) {
+  if (GetWebApp(app_id)) {
+    apps::mojom::AppPtr app = apps::mojom::App::New();
+    app->app_type = apps::mojom::AppType::kWeb;
+    app->app_id = app_id;
+    app->window_mode =
+        publisher_helper().ConvertDisplayModeToWindowMode(user_display_mode);
+    PublishWebApp(std::move(app));
+  }
+}
+
 void WebAppsPublisherHost::OnRequestUpdate(
     int render_process_id,
     int render_frame_id,
diff --git a/chrome/browser/web_applications/app_service/web_apps_publisher_host.h b/chrome/browser/web_applications/app_service/web_apps_publisher_host.h
index 0ec15372..45fab0e1 100644
--- a/chrome/browser/web_applications/app_service/web_apps_publisher_host.h
+++ b/chrome/browser/web_applications/app_service/web_apps_publisher_host.h
@@ -88,10 +88,14 @@
       apps::mojom::IntentPtr intent,
       apps::mojom::LaunchSource launch_source,
       apps::mojom::WindowInfoPtr window_info);
+
   void SetPermission(const std::string& app_id,
                      apps::mojom::PermissionPtr permission);
   void OpenNativeSettings(const std::string& app_id);
 
+  void SetWindowMode(const std::string& app_id,
+                     apps::mojom::WindowMode window_mode);
+
  private:
   void OnReady();
 
@@ -115,6 +119,8 @@
   void OnWebAppLastLaunchTimeChanged(
       const std::string& app_id,
       const base::Time& last_launch_time) override;
+  void OnWebAppUserDisplayModeChanged(const AppId& app_id,
+                                      DisplayMode user_display_mode) override;
 
   // TODO(crbug.com/1194709): Add more overrides, guided by WebAppsChromeOs.
 
diff --git a/chrome/browser/web_applications/components/app_registrar.cc b/chrome/browser/web_applications/components/app_registrar.cc
index c5a7f1d..c5d9597 100644
--- a/chrome/browser/web_applications/components/app_registrar.cc
+++ b/chrome/browser/web_applications/components/app_registrar.cc
@@ -114,6 +114,13 @@
     observer.OnWebAppInstalledWithOsHooks(app_id);
 }
 
+void AppRegistrar::NotifyWebAppUserDisplayModeChanged(
+    const AppId& app_id,
+    DisplayMode user_display_mode) {
+  for (AppRegistrarObserver& observer : observers_)
+    observer.OnWebAppUserDisplayModeChanged(app_id, user_display_mode);
+}
+
 void AppRegistrar::NotifyAppRegistrarShutdown() {
   for (AppRegistrarObserver& observer : observers_)
     observer.OnAppRegistrarShutdown();
diff --git a/chrome/browser/web_applications/components/app_registrar.h b/chrome/browser/web_applications/components/app_registrar.h
index bfd45d4..5168e5e3 100644
--- a/chrome/browser/web_applications/components/app_registrar.h
+++ b/chrome/browser/web_applications/components/app_registrar.h
@@ -231,6 +231,8 @@
 
   // Notify when OS hooks installation is finished during Web App installation.
   void NotifyWebAppInstalledWithOsHooks(const AppId& app_id);
+  void NotifyWebAppUserDisplayModeChanged(const AppId& app_id,
+                                          DisplayMode user_display_mode);
 
  protected:
   Profile* profile() const { return profile_; }
diff --git a/chrome/browser/web_applications/components/app_registrar_observer.h b/chrome/browser/web_applications/components/app_registrar_observer.h
index e9aca4a1..57164c35 100644
--- a/chrome/browser/web_applications/components/app_registrar_observer.h
+++ b/chrome/browser/web_applications/components/app_registrar_observer.h
@@ -64,6 +64,9 @@
                                              const base::Time& time) {}
   virtual void OnWebAppInstallTimeChanged(const AppId& app_id,
                                           const base::Time& time) {}
+
+  virtual void OnWebAppUserDisplayModeChanged(const AppId& app_id,
+                                              DisplayMode user_display_mode) {}
 };
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_install_utils.cc b/chrome/browser/web_applications/components/web_app_install_utils.cc
index 2f97b699..5a9a07e 100644
--- a/chrome/browser/web_applications/components/web_app_install_utils.cc
+++ b/chrome/browser/web_applications/components/web_app_install_utils.cc
@@ -90,9 +90,7 @@
     shortcut_info.name = shortcut.name;
     shortcut_info.url = shortcut.url;
 
-    std::array<IconPurpose, 3> purposes = {
-        IconPurpose::ANY, IconPurpose::MASKABLE, IconPurpose::MONOCHROME};
-    for (IconPurpose purpose : purposes) {
+    for (IconPurpose purpose : kIconPurposes) {
       std::vector<WebApplicationShortcutsMenuItemInfo::Icon> shortcut_icons;
       for (const auto& icon : shortcut.icons) {
         DCHECK(!icon.purpose.empty());
@@ -322,10 +320,8 @@
   if (base::FeatureList::IsEnabled(
           features::kDesktopPWAsAppIconShortcutsMenu)) {
     // Also add shortcut icon urls, so they can be downloaded.
-    std::array<IconPurpose, 3> purposes = {
-        IconPurpose::ANY, IconPurpose::MASKABLE, IconPurpose::MONOCHROME};
     for (const auto& shortcut : web_app_info.shortcuts_menu_item_infos) {
-      for (IconPurpose purpose : purposes) {
+      for (IconPurpose purpose : kIconPurposes) {
         for (const auto& icon :
              shortcut.GetShortcutIconInfosForPurpose(purpose)) {
           if (!icon.url.is_valid())
@@ -345,9 +341,7 @@
   for (auto& shortcut : web_app_info->shortcuts_menu_item_infos) {
     IconBitmaps shortcut_icon_bitmaps;
 
-    std::array<IconPurpose, 3> purposes = {
-        IconPurpose::ANY, IconPurpose::MASKABLE, IconPurpose::MONOCHROME};
-    for (IconPurpose purpose : purposes) {
+    for (IconPurpose purpose : kIconPurposes) {
       std::map<SquareSizePx, SkBitmap> bitmaps;
       for (const auto& icon :
            shortcut.GetShortcutIconInfosForPurpose(purpose)) {
diff --git a/chrome/browser/web_applications/components/web_app_install_utils_unittest.cc b/chrome/browser/web_applications/components/web_app_install_utils_unittest.cc
index be93a474..9bd49dc 100644
--- a/chrome/browser/web_applications/components/web_app_install_utils_unittest.cc
+++ b/chrome/browser/web_applications/components/web_app_install_utils_unittest.cc
@@ -316,7 +316,7 @@
   web_app_info.icon_infos.push_back(info);
 
   const GURL kShortcutItemUrl("http://www.chromium.org/shortcuts/action");
-  for (int i = 0; i < 3; ++i) {
+  for (int i = 0; i < 4; ++i) {
     WebApplicationShortcutsMenuItemInfo shortcuts_menu_item_info;
     WebApplicationShortcutsMenuItemInfo::Icon icon;
     shortcuts_menu_item_info.name =
@@ -326,10 +326,7 @@
     icon.url = GURL("http://www.chromium.org/shortcuts/icon1.png");
     icon.square_size_px = kIconSize;
 
-    ASSERT_LE(static_cast<int>(IconPurpose::kMinValue), i);
-    ASSERT_LE(i, static_cast<int>(IconPurpose::kMaxValue));
-    auto purpose = static_cast<IconPurpose>(i);
-
+    IconPurpose purpose = kIconPurposes[i % kIconPurposes.size()];
     shortcuts_menu_item_info.SetShortcutIconInfosForPurpose(purpose,
                                                             {std::move(icon)});
     web_app_info.shortcuts_menu_item_infos.push_back(
@@ -364,6 +361,7 @@
     url_handler.has_origin_wildcard = true;
     manifest.url_handlers.push_back(url_handler);
   }
+  WebApplicationInfo web_app_info_original{web_app_info};
 
   const GURL kAppManifestUrl("http://www.chromium.org/manifest.json");
   UpdateWebAppInfoFromManifest(manifest, kAppManifestUrl, &web_app_info);
@@ -379,16 +377,9 @@
 
   // The shortcuts_menu_item_infos from |web_app_info| should be left as is,
   // since the manifest doesn't have any shortcut information.
-  EXPECT_EQ(3u, web_app_info.shortcuts_menu_item_infos.size());
-  EXPECT_EQ(1u, web_app_info.shortcuts_menu_item_infos[0]
-                    .GetShortcutIconInfosForPurpose(IconPurpose::ANY)
-                    .size());
-  EXPECT_EQ(1u, web_app_info.shortcuts_menu_item_infos[1]
-                    .GetShortcutIconInfosForPurpose(IconPurpose::MONOCHROME)
-                    .size());
-  EXPECT_EQ(1u, web_app_info.shortcuts_menu_item_infos[2]
-                    .GetShortcutIconInfosForPurpose(IconPurpose::MASKABLE)
-                    .size());
+  EXPECT_EQ(4u, web_app_info.shortcuts_menu_item_infos.size());
+  EXPECT_EQ(web_app_info_original.shortcuts_menu_item_infos,
+            web_app_info.shortcuts_menu_item_infos);
 
   // Test that |manifest.name| takes priority over |manifest.short_name|, and
   // that icons provided by the manifest replace icons in |web_app_info|.
@@ -438,6 +429,8 @@
   UpdateWebAppInfoFromManifest(manifest, kAppManifestUrl, &web_app_info);
   EXPECT_EQ(kAppTitle, web_app_info.title);
   EXPECT_EQ(DisplayMode::kMinimalUi, web_app_info.display_mode);
+  // Sanity check that original copy was not changed.
+  EXPECT_EQ(4u, web_app_info_original.shortcuts_menu_item_infos.size());
 
   // We currently duplicate the app icons with multiple Purposes.
   EXPECT_EQ(5u, web_app_info.icon_infos.size());
diff --git a/chrome/browser/web_applications/components/web_app_run_on_os_login_mac_unittest.mm b/chrome/browser/web_applications/components/web_app_run_on_os_login_mac_unittest.mm
index b664dbcf..e9f692b 100644
--- a/chrome/browser/web_applications/components/web_app_run_on_os_login_mac_unittest.mm
+++ b/chrome/browser/web_applications/components/web_app_run_on_os_login_mac_unittest.mm
@@ -110,6 +110,7 @@
   void TearDown() override {
     WebAppAutoLoginUtil::SetInstanceForTesting(nullptr);
     SetChromeAppsFolderForTesting(base::FilePath());
+    WebAppShortcutCreator::ResetHaveLocalizedAppDirNameForTesting();
     WebAppTest::TearDown();
   }
 
@@ -163,4 +164,4 @@
   EXPECT_TRUE(base::DeletePathRecursively(shim_path_));
 }
 
-}  // namespace web_app
\ No newline at end of file
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_mac.h b/chrome/browser/web_applications/components/web_app_shortcut_mac.h
index 9cf04023..d7d816a0 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut_mac.h
+++ b/chrome/browser/web_applications/components/web_app_shortcut_mac.h
@@ -100,6 +100,10 @@
 
   virtual ~WebAppShortcutCreator();
 
+  // This allows UpdateAppShortcutsSubdirLocalizedName to be called multiple
+  // times in a process, for unit tests.
+  static void ResetHaveLocalizedAppDirNameForTesting();
+
   // Returns the base name for the shortcut. This will be a sanitized version
   // of the application title. If |copy_number| is not 1, then append it before
   // the .app part of the extension.
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_mac.mm b/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
index 631e960..92bc8dce 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
+++ b/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
@@ -1039,6 +1039,13 @@
   return true;
 }
 
+static bool g_have_localized_app_dir_name = false;
+
+// static
+void WebAppShortcutCreator::ResetHaveLocalizedAppDirNameForTesting() {
+  g_have_localized_app_dir_name = false;
+}
+
 bool WebAppShortcutCreator::UpdateShortcuts(
     bool create_if_needed,
     std::vector<base::FilePath>* updated_paths) {
@@ -1054,8 +1061,11 @@
     }
     // Only set folder icons and a localized name once. This avoids concurrent
     // calls to -[NSWorkspace setIcon:..], which is not reentrant.
-    static bool once = UpdateAppShortcutsSubdirLocalizedName(applications_dir);
-    if (!once) {
+    if (!g_have_localized_app_dir_name) {
+      g_have_localized_app_dir_name =
+          UpdateAppShortcutsSubdirLocalizedName(applications_dir);
+    }
+    if (!g_have_localized_app_dir_name) {
       RecordCreateShortcut(CreateShortcutResult::kFailToLocalizeApplication);
       LOG(ERROR) << "Failed to localize " << applications_dir.value();
     }
diff --git a/chrome/browser/web_applications/components/web_application_info.h b/chrome/browser/web_applications/components/web_application_info.h
index 0ac5b9f1..8160ace 100644
--- a/chrome/browser/web_applications/components/web_application_info.h
+++ b/chrome/browser/web_applications/components/web_application_info.h
@@ -29,6 +29,11 @@
 // Iterates in ascending order (checked in SortedSizesPxIsAscending test).
 using SortedSizesPx = base::flat_set<SquareSizePx, std::less<>>;
 using IconPurpose = blink::mojom::ManifestImageResource_Purpose;
+constexpr std::array<IconPurpose,
+                     static_cast<int>(IconPurpose::kMaxValue) -
+                         static_cast<int>(IconPurpose::kMinValue) + 1>
+    kIconPurposes{IconPurpose::ANY, IconPurpose::MONOCHROME,
+                  IconPurpose::MASKABLE};
 
 // Icon bitmaps for each IconPurpose.
 struct IconBitmaps {
diff --git a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
index 87b60cfc..c5e9a76 100644
--- a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
@@ -267,7 +267,7 @@
         std::move(params));
   }
 
-  void GrantFileHandlingPermisson() {
+  void GrantFileHandlingPermission() {
     auto* map =
         HostContentSettingsMapFactory::GetForProfile(browser()->profile());
     map->SetDefaultContentSetting(ContentSettingsType::FILE_HANDLING,
@@ -332,7 +332,7 @@
 IN_PROC_BROWSER_TEST_P(SystemWebAppManagerLaunchFilesBrowserTest,
                        LaunchFilesForSystemWebApp) {
   WaitForTestSystemAppInstall();
-  GrantFileHandlingPermisson();
+  GrantFileHandlingPermission();
 
   base::ScopedAllowBlockingForTesting allow_blocking;
   base::ScopedTempDir temp_directory;
@@ -368,6 +368,33 @@
                                         "window.launchParams2.files[0].name"));
 }
 
+IN_PROC_BROWSER_TEST_P(SystemWebAppManagerLaunchFilesBrowserTest,
+                       LaunchMetricsWorks) {
+  WaitForTestSystemAppInstall();
+  GrantFileHandlingPermission();
+
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  base::ScopedTempDir temp_directory;
+  ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
+  base::FilePath temp_file_path;
+  ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_directory.GetPath(),
+                                             &temp_file_path));
+
+  base::HistogramTester histograms;
+
+  content::TestNavigationObserver navigation_observer(
+      maybe_installation_->GetAppUrl());
+  navigation_observer.StartWatchingNewWebContents();
+
+  SystemAppLaunchParams params;
+  params.launch_paths = {temp_file_path};
+  params.launch_source = apps::mojom::LaunchSource::kFromOtherApp;
+  LaunchSystemWebAppAsync(browser()->profile(), GetMockAppType(), params);
+
+  navigation_observer.Wait();
+  histograms.ExpectTotalCount("Apps.DefaultAppLaunch.FromOtherApp", 1);
+}
+
 // The helper methods in this class uses ExecuteScriptXXX instead of ExecJs and
 // EvalJs because of some quirks surrounding origin trials and content security
 // policies.
@@ -516,7 +543,7 @@
 IN_PROC_BROWSER_TEST_P(SystemWebAppManagerLaunchDirectoryBrowserTest,
                        LaunchDirectoryForSystemWebApp) {
   WaitForTestSystemAppInstall();
-  GrantFileHandlingPermisson();
+  GrantFileHandlingPermission();
 
   base::ScopedAllowBlockingForTesting allow_blocking;
   base::ScopedTempDir temp_directory;
@@ -573,7 +600,7 @@
 IN_PROC_BROWSER_TEST_P(SystemWebAppManagerLaunchDirectoryBrowserTest,
                        ReadWritePermissions_OrdinaryDirectory) {
   WaitForTestSystemAppInstall();
-  GrantFileHandlingPermisson();
+  GrantFileHandlingPermission();
 
   // Test for ordinary directory.
   base::ScopedAllowBlockingForTesting allow_blocking;
@@ -585,7 +612,7 @@
 IN_PROC_BROWSER_TEST_P(SystemWebAppManagerLaunchDirectoryBrowserTest,
                        ReadWritePermissions_SensitiveDirectory) {
   WaitForTestSystemAppInstall();
-  GrantFileHandlingPermisson();
+  GrantFileHandlingPermission();
 
   // Test for sensitive directory (which are otherwise blocked by
   // FileSystemAccess API). It is safe to use |chrome::DIR_DEFAULT_DOWNLOADS|,
@@ -683,7 +710,7 @@
   Profile* profile = browser()->profile();
 
   WaitForTestSystemAppInstall();
-  GrantFileHandlingPermisson();
+  GrantFileHandlingPermission();
   InstallTestFileSystemProvider(profile);
 
   // Launch from FileSystemProvider path.
@@ -733,7 +760,7 @@
   Profile* profile = browser()->profile();
 
   WaitForTestSystemAppInstall();
-  GrantFileHandlingPermisson();
+  GrantFileHandlingPermission();
   InstallTestFileSystemProvider(profile);
 
   content::WebContents* web_contents =
@@ -758,7 +785,7 @@
   Profile* profile = browser()->profile();
 
   WaitForTestSystemAppInstall();
-  GrantFileHandlingPermisson();
+  GrantFileHandlingPermission();
   InstallTestFileSystemProvider(profile);
 
   content::WebContents* web_contents =
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc
index 56a5de4..b008114 100644
--- a/chrome/browser/web_applications/web_app_database.cc
+++ b/chrome/browser/web_applications/web_app_database.cc
@@ -305,15 +305,13 @@
     }
   }
 
-  std::array<IconPurpose, 3> purposes = {
-      IconPurpose::ANY, IconPurpose::MASKABLE, IconPurpose::MONOCHROME};
   for (const WebApplicationShortcutsMenuItemInfo& shortcut_info :
        web_app.shortcuts_menu_item_infos()) {
     WebAppShortcutsMenuItemInfoProto* shortcut_info_proto =
         local_data->add_shortcuts_menu_item_infos();
     shortcut_info_proto->set_name(base::UTF16ToUTF8(shortcut_info.name));
     shortcut_info_proto->set_url(shortcut_info.url.spec());
-    for (IconPurpose purpose : purposes) {
+    for (IconPurpose purpose : kIconPurposes) {
       for (const WebApplicationShortcutsMenuItemInfo::Icon& icon_info :
            shortcut_info.GetShortcutIconInfosForPurpose(purpose)) {
         sync_pb::WebAppIconInfo* shortcut_icon_info_proto;
@@ -669,14 +667,12 @@
   }
 
   std::vector<WebApplicationShortcutsMenuItemInfo> shortcuts_menu_item_infos;
-  std::array<IconPurpose, 3> purposes = {
-      IconPurpose::ANY, IconPurpose::MASKABLE, IconPurpose::MONOCHROME};
   for (const auto& shortcut_info_proto :
        local_data.shortcuts_menu_item_infos()) {
     WebApplicationShortcutsMenuItemInfo shortcut_info;
     shortcut_info.name = base::UTF8ToUTF16(shortcut_info_proto.name());
     shortcut_info.url = GURL(shortcut_info_proto.url());
-    for (IconPurpose purpose : purposes) {
+    for (IconPurpose purpose : kIconPurposes) {
       // This default init needed to infer the sophisticated protobuf type.
       const auto* shortcut_icon_infos =
           &shortcut_info_proto.shortcut_icon_infos();
diff --git a/chrome/browser/web_applications/web_app_database_unittest.cc b/chrome/browser/web_applications/web_app_database_unittest.cc
index 081801da..1a800ef5 100644
--- a/chrome/browser/web_applications/web_app_database_unittest.cc
+++ b/chrome/browser/web_applications/web_app_database_unittest.cc
@@ -390,10 +390,6 @@
 TEST_F(WebAppDatabaseTest, WebAppWithManyIcons) {
   controller().Init();
 
-  const int min_purpose_type = static_cast<int>(IconPurpose::kMinValue);
-  const int max_purpose_type = static_cast<int>(IconPurpose::kMaxValue);
-  const int num_icon_purpose_types = max_purpose_type - min_purpose_type + 1;
-
   const GURL base_url("https://example.com/path");
   // A number of icons of each IconPurpose.
   const int num_icons = 32;
@@ -403,12 +399,8 @@
 
   std::vector<WebApplicationIconInfo> icons;
 
-  std::vector<SquareSizePx> sizes[num_icon_purpose_types];
-
-  // Iterates over each icon purpose.
-  for (int p = min_purpose_type; p <= max_purpose_type; ++p) {
-    auto purpose = static_cast<IconPurpose>(p);
-
+  for (IconPurpose purpose : kIconPurposes) {
+    std::vector<SquareSizePx> sizes;
     for (int i = 1; i <= num_icons; ++i) {
       WebApplicationIconInfo icon;
       icon.url = base_url.Resolve("icon" + base::NumberToString(num_icons));
@@ -416,11 +408,11 @@
       icon.square_size_px = i * i;
 
       icon.purpose = purpose;
-      sizes[p].push_back(*icon.square_size_px);
+      sizes.push_back(*icon.square_size_px);
       icons.push_back(std::move(icon));
     }
 
-    app->SetDownloadedIconSizes(purpose, std::move(sizes[p]));
+    app->SetDownloadedIconSizes(purpose, std::move(sizes));
   }
 
   app->SetIconInfos(std::move(icons));
@@ -432,7 +424,7 @@
   EXPECT_EQ(1UL, registry.size());
 
   std::unique_ptr<WebApp>& app_copy = registry.at(app_id);
-  EXPECT_EQ(static_cast<unsigned>(num_icons * num_icon_purpose_types),
+  EXPECT_EQ(static_cast<unsigned>(num_icons * kIconPurposes.size()),
             app_copy->icon_infos().size());
   for (int i = 1; i <= num_icons; ++i) {
     const int icon_size_in_px = i * i;
diff --git a/chrome/browser/web_applications/web_app_icon_manager.cc b/chrome/browser/web_applications/web_app_icon_manager.cc
index b132ceb..61374e0 100644
--- a/chrome/browser/web_applications/web_app_icon_manager.cc
+++ b/chrome/browser/web_applications/web_app_icon_manager.cc
@@ -172,9 +172,7 @@
     FileUtilsWrapper* utils,
     const base::FilePath& app_manifest_resources_directory,
     const ShortcutsMenuIconBitmaps& shortcuts_menu_icon_bitmaps) {
-  std::array<IconPurpose, 3> purposes = {
-      IconPurpose::ANY, IconPurpose::MASKABLE, IconPurpose::MONOCHROME};
-  for (IconPurpose purpose : purposes) {
+  for (IconPurpose purpose : kIconPurposes) {
     const base::FilePath shortcuts_menu_icons_dir =
         GetAppShortcutsMenuIconsDirectory(app_manifest_resources_directory,
                                           purpose);
@@ -227,10 +225,7 @@
     return false;
   }
 
-  // Iterates over each icon purpose.
-  for (int p = static_cast<int>(IconPurpose::kMinValue);
-       p <= static_cast<int>(IconPurpose::kMaxValue); ++p) {
-    auto purpose = static_cast<IconPurpose>(p);
+  for (IconPurpose purpose : kIconPurposes) {
     if (!WriteIcons(utils.get(),
                     GetAppIconsDirectory(app_temp_dir.GetPath(), purpose),
                     icon_bitmaps.GetBitmapsForPurpose(purpose))) {
@@ -487,9 +482,7 @@
   for (const auto& icon_sizes : shortcuts_menu_icons_sizes) {
     IconBitmaps result;
 
-    std::array<IconPurpose, 3> purposes = {
-        IconPurpose::ANY, IconPurpose::MASKABLE, IconPurpose::MONOCHROME};
-    for (IconPurpose purpose : purposes) {
+    for (IconPurpose purpose : kIconPurposes) {
       std::map<SquareSizePx, SkBitmap> bitmaps;
 
       for (SquareSizePx icon_size_px : icon_sizes.GetSizesForPurpose(purpose)) {
diff --git a/chrome/browser/web_applications/web_app_icon_manager_unittest.cc b/chrome/browser/web_applications/web_app_icon_manager_unittest.cc
index 3a509dc0..6ddfc559 100644
--- a/chrome/browser/web_applications/web_app_icon_manager_unittest.cc
+++ b/chrome/browser/web_applications/web_app_icon_manager_unittest.cc
@@ -155,9 +155,7 @@
     for (int i = 0; i < num_menu_items; ++i) {
       IconSizes icon_sizes;
 
-      for (int p = static_cast<int>(IconPurpose::kMinValue);
-           p <= static_cast<int>(IconPurpose::kMaxValue); ++p) {
-        auto purpose = static_cast<IconPurpose>(p);
+      for (IconPurpose purpose : kIconPurposes) {
         switch (purpose) {
           case IconPurpose::ANY:
             icon_sizes.SetSizesForPurpose(purpose, sizes_any);
@@ -781,9 +779,7 @@
   EXPECT_EQ(3u, shortcuts_menu_icons_map.size());
 
   for (int i = 0; i < num_menu_items; ++i) {
-    for (int p = static_cast<int>(IconPurpose::kMinValue);
-         p <= static_cast<int>(IconPurpose::kMaxValue); ++p) {
-      auto purpose = static_cast<IconPurpose>(p);
+    for (IconPurpose purpose : kIconPurposes) {
       SCOPED_TRACE(purpose);
 
       const std::vector<int>* expect_sizes;
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.cc b/chrome/browser/web_applications/web_app_sync_bridge.cc
index 7c291042..4abb4fd 100644
--- a/chrome/browser/web_applications/web_app_sync_bridge.cc
+++ b/chrome/browser/web_applications/web_app_sync_bridge.cc
@@ -203,6 +203,8 @@
   WebApp* web_app = update->UpdateApp(app_id);
   if (web_app)
     web_app->SetUserDisplayMode(user_display_mode);
+
+  registrar_->NotifyWebAppUserDisplayModeChanged(app_id, user_display_mode);
 }
 
 void WebAppSyncBridge::SetAppRunOnOsLoginMode(const AppId& app_id,
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index e27edd3..eea1bf4 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -443,16 +443,6 @@
 // Optional PEM private key to use in signing packaged .crx.
 const char kPackExtensionKey[]              = "pack-extension-key";
 
-// Development flag for permission request API. This flag is needed until
-// the API is finalized.
-// TODO(bauerb): Remove when this flag is not needed anymore.
-const char kPermissionRequestApiScope[]     = "permission-request-api-scope";
-
-// Development flag for permission request API. This flag is needed until
-// the API is finalized.
-// TODO(bauerb): Remove when this flag is not needed anymore.
-const char kPermissionRequestApiUrl[]       = "permission-request-api-url";
-
 // Used to mock the response received from the Web Permission Prediction
 // Service. Used for testing.
 const char kPredictionServiceMockLikelihood[] =
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 6cd006e..7b2b5d5 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -140,8 +140,6 @@
 extern const char kOpenInNewWindow[];
 extern const char kPackExtension[];
 extern const char kPackExtensionKey[];
-extern const char kPermissionRequestApiScope[];
-extern const char kPermissionRequestApiUrl[];
 extern const char kPredictionServiceMockLikelihood[];
 extern const char kPrivetIPv6Only[];
 extern const char kProductVersion[];
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 7c60823e..afa4398 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -472,13 +472,22 @@
       "3F5995FE79A861F019C6F093BEF98D73FA9D3A5F"  // Login screen APIs in-sesesion test extension
     ]
   }],
-  "loginScreenStorage": {
+  "loginScreenStorage": [{
     "channel": "stable",
     "dependencies": ["behavior:imprivata_extension"],
     "extension_types": ["extension","login_screen_extension"],
     "location": "policy",
     "platforms": ["chromeos"]
-  },
+  }, {
+    "channel": "canary",
+    "extension_types": ["extension","login_screen_extension"],
+    "location": "policy",
+    "platforms": ["chromeos"],
+    "allowlist": [
+      "7FE4A999359A456C4B0FB7B7AD85CEA29CA50519", // Login screen APIs test extension
+      "3F5995FE79A861F019C6F093BEF98D73FA9D3A5F"  // Login screen APIs in-sesesion test extension
+    ]
+  }],
   "loginScreenUi": [{
     "channel": "stable",
     "dependencies": ["behavior:imprivata_login_screen_extension"],
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 45742ef3..b0aec24 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -2401,12 +2401,12 @@
 const char kRemoveUsersRemoteCommand[] = "remove_users_remote_command";
 
 // Integer pref used by the metrics::DailyEvent owned by
-// chromeos::power::auto_screen_brightness::MetricsReporter.
+// ash::power::auto_screen_brightness::MetricsReporter.
 const char kAutoScreenBrightnessMetricsDailySample[] =
     "auto_screen_brightness.metrics.daily_sample";
 
 // Integer prefs used to back event counts reported by
-// chromeos::power::auto_screen_brightness::MetricsReporter.
+// ash::power::auto_screen_brightness::MetricsReporter.
 const char kAutoScreenBrightnessMetricsAtlasUserAdjustmentCount[] =
     "auto_screen_brightness.metrics.atlas_user_adjustment_count";
 const char kAutoScreenBrightnessMetricsEveUserAdjustmentCount[] =
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index d55f00d..3017152a 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3269,12 +3269,11 @@
         "../browser/chromeos/policy/affiliation_mixin.h",
         "../browser/chromeos/policy/affiliation_test_helper.cc",
         "../browser/chromeos/policy/affiliation_test_helper.h",
+        "../browser/chromeos/policy/arc/unaffiliated_arc_allowed_browsertest.cc",
         "../browser/chromeos/policy/blocking_login_browsertest.cc",
         "../browser/chromeos/policy/browser_policy_connector_chromeos_browsertest.cc",
         "../browser/chromeos/policy/component_active_directory_policy_browsertest.cc",
         "../browser/chromeos/policy/device_cloud_policy_browsertest.cc",
-        "../browser/chromeos/policy/device_display_cros_browser_test.cc",
-        "../browser/chromeos/policy/device_display_cros_browser_test.h",
         "../browser/chromeos/policy/device_local_account_browsertest.cc",
         "../browser/chromeos/policy/device_login_screen_policy_browsertest.cc",
         "../browser/chromeos/policy/device_policy_cros_browser_test.cc",
@@ -3282,8 +3281,10 @@
         "../browser/chromeos/policy/device_quirks_policy_browsertest.cc",
         "../browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc",
         "../browser/chromeos/policy/device_system_wide_tracing_enabled_browsertest.cc",
-        "../browser/chromeos/policy/display_resolution_handler_browsertest.cc",
-        "../browser/chromeos/policy/display_rotation_default_handler_browsertest.cc",
+        "../browser/chromeos/policy/display/device_display_cros_browser_test.cc",
+        "../browser/chromeos/policy/display/device_display_cros_browser_test.h",
+        "../browser/chromeos/policy/display/display_resolution_handler_browsertest.cc",
+        "../browser/chromeos/policy/display/display_rotation_default_handler_browsertest.cc",
         "../browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc",
@@ -3306,8 +3307,8 @@
         "../browser/chromeos/policy/login_screen_accessibility_policy_browsertest.cc",
         "../browser/chromeos/policy/login_screen_default_policy_browsertest.cc",
         "../browser/chromeos/policy/minimum_version_policy_handler_browsertest.cc",
-        "../browser/chromeos/policy/network_policy_application_browsertest.cc",
-        "../browser/chromeos/policy/policy_certs_browsertest.cc",
+        "../browser/chromeos/policy/networking/network_policy_application_browsertest.cc",
+        "../browser/chromeos/policy/networking/policy_certs_browsertest.cc",
         "../browser/chromeos/policy/power_policy_browsertest.cc",
         "../browser/chromeos/policy/restore_on_startup_browsertest_chromeos.cc",
         "../browser/chromeos/policy/signin_profile_extensions_policy_browsertest.cc",
@@ -3316,7 +3317,6 @@
         "../browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc",
         "../browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc",
         "../browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc",
-        "../browser/chromeos/policy/unaffiliated_arc_allowed_browsertest.cc",
         "../browser/chromeos/policy/user_affiliation_browsertest.cc",
         "../browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc",
         "../browser/chromeos/policy/variations_service_policy_browsertest.cc",
@@ -3503,6 +3503,7 @@
       ]
 
       deps += [
+        "//chromeos/components/help_app_ui:buildflags",
         "//chromeos/components/help_app_ui/search:mojo_bindings",
         "//chromeos/components/media_app_ui:buildflags",
         "//chromeos/ui/frame:test_support",
diff --git a/chrome/test/data/extensions/api_test/platform_keys/basic.js b/chrome/test/data/extensions/api_test/platform_keys/basic.js
index ace4de0..06d9f71 100644
--- a/chrome/test/data/extensions/api_test/platform_keys/basic.js
+++ b/chrome/test/data/extensions/api_test/platform_keys/basic.js
@@ -402,8 +402,7 @@
   };
   chrome.platformKeys.getKeyPair(
       data.client_1.buffer, keyParams,
-      callbackFail(
-          'The requested Algorithm is not permitted by the certificate.'));
+      callbackFail('Algorithm not supported.'));
   chrome.platformKeys.getKeyPairBySpki(
       data.client_1_spki.buffer, keyParams,
       callbackFail('Algorithm not supported.'));
diff --git a/chrome/test/data/webui/cr_elements/cr_tabs_test.js b/chrome/test/data/webui/cr_elements/cr_tabs_test.js
index baa675da..106e148 100644
--- a/chrome/test/data/webui/cr_elements/cr_tabs_test.js
+++ b/chrome/test/data/webui/cr_elements/cr_tabs_test.js
@@ -52,7 +52,6 @@
     assertTrue(!!tabElement);
     assertTrue(tabElement.classList.contains('selected'));
     assertEquals('0', tabElement.getAttribute('tabindex'));
-    assertEquals(getDeepActiveElement(), tabElement);
     const notSelected = tabs.shadowRoot.querySelectorAll('.tab:not(.selected)');
     assertEquals(2, notSelected.length);
     notSelected.forEach(tab => {
@@ -126,18 +125,4 @@
     await checkClickTab(1, 2);
     await checkClickTab(2, 2);
   });
-
-  test('selection underline does not freeze with two tabs', async () => {
-    const underline = tabs.shadowRoot.querySelector('#selectionBar');
-    const fullyExpanded = 'translateX(0%) scaleX(1)';
-    tabs.tabNames = ['tab1', 'tab2'];
-    assertEquals(undefined, tabs.selected);
-    tabs.selected = 0;
-    await flushTasks();
-    assertNotEquals(fullyExpanded, underline.style.transform);
-    underline.style.transform = fullyExpanded;
-    const wait = eventToPromise('transitionend', underline);
-    tabs.selected = 1;
-    await wait;
-  });
 });
diff --git a/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js b/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
index a76e5d3a..3cd91997 100644
--- a/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
@@ -183,7 +183,7 @@
 
         // Simuluate saved printer changes.
         cr.webUIListenerCallback(
-            'on-printers-changed', cupsPrintersBrowserProxy.printerList);
+            'on-saved-printers-changed', cupsPrintersBrowserProxy.printerList);
         Polymer.dom.flush();
       });
 }
@@ -267,7 +267,7 @@
   function updateSavedPrinters() {
     cupsPrintersBrowserProxy.printerList = {printerList: printerList};
     cr.webUIListenerCallback(
-        'on-printers-changed', cupsPrintersBrowserProxy.printerList);
+        'on-saved-printers-changed', cupsPrintersBrowserProxy.printerList);
     Polymer.dom.flush();
   }
 
@@ -277,7 +277,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -304,7 +304,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -332,7 +332,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -368,7 +368,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -421,7 +421,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -450,6 +450,9 @@
           addressField.value = expectedAddress;
           addressField.fire('input');
 
+          expectFalse(editDialog.$$('.cancel-button').hidden);
+          expectFalse(editDialog.$$('.action-button').hidden);
+
           Polymer.dom.flush();
 
           clickButton(editDialog.$$('.action-button'));
@@ -475,7 +478,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -543,7 +546,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -594,7 +597,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(async () => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -630,7 +633,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3'),
     ]);
 
-    await cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList');
+    await cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList');
 
     const params = new URLSearchParams;
     params.append('settingId', '1401');
@@ -655,7 +658,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -707,7 +710,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
       cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -756,7 +759,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
       cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -807,7 +810,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -873,7 +876,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -970,7 +973,7 @@
       cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
       cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
-    return cupsPrintersBrowserProxy.whenCalled('getCupsPrintersList')
+    return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
           Polymer.dom.flush();
@@ -1553,3 +1556,179 @@
     });
   });
 });
+
+suite('CupsEnterprisePrintersTests', function() {
+  let page = null;
+  let enterprisePrintersElement = null;
+
+  /** @type{!HtmlElement} */
+  let printerEntryListTestElement = null;
+
+  /** @type {?settings.TestCupsPrintersBrowserProxy} */
+  let cupsPrintersBrowserProxy = null;
+
+  /** @type {?Array<!CupsPrinterInfo>} */
+  let printerList = null;
+
+  setup(function() {
+    cupsPrintersBrowserProxy =
+        new printerBrowserProxy.TestCupsPrintersBrowserProxy;
+
+    PolymerTest.clearBody();
+    settings.Router.getInstance().navigateTo(settings.routes.CUPS_PRINTERS);
+  });
+
+  teardown(function() {
+    cupsPrintersBrowserProxy.reset();
+    page.remove();
+    enterprisePrintersElement = null;
+    printerList = null;
+    page = null;
+  });
+
+  /** @param {!Array<!CupsPrinterInfo>} printerList */
+  function createCupsPrinterPage(printers) {
+    printerList = printers;
+    // |cupsPrinterBrowserProxy| needs to have a list of printers before
+    // initializing the landing page.
+    cupsPrintersBrowserProxy.printerList = {printerList: printerList};
+    settings.CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
+
+    page = document.createElement('settings-cups-printers');
+    document.body.appendChild(page);
+    assertTrue(!!page);
+
+    Polymer.dom.flush();
+  }
+
+  // Verifies that enterprise printers are correctly shown on the OS settings
+  // page.
+  test('EnterprisePrinters', () => {
+    createCupsPrinterPage([
+      cups_printer_test_util.createCupsPrinterInfo(
+          'test1', '1', 'id1', /*isManaged=*/ true),
+      cups_printer_test_util.createCupsPrinterInfo(
+          'test2', '2', 'id2', /*isManaged=*/ true),
+    ]);
+    return cupsPrintersBrowserProxy.whenCalled('getCupsEnterprisePrintersList')
+        .then(() => {
+          // Wait for saved printers to populate.
+          Polymer.dom.flush();
+
+          enterprisePrintersElement =
+              page.$$('settings-cups-enterprise-printers');
+          printerEntryListTestElement =
+              enterprisePrintersElement.$$('#printerEntryList');
+          verifyVisiblePrinters(printerEntryListTestElement, [
+            cups_printer_test_util.createPrinterListEntry(
+                'test1', '1', 'id1', PrinterType.ENTERPRISE),
+            cups_printer_test_util.createPrinterListEntry(
+                'test2', '2', 'id2', PrinterType.ENTERPRISE),
+          ]);
+        });
+  });
+
+  // Verifies that enterprise printers are not editable.
+  test('EnterprisePrinterDialog', function() {
+    const expectedName = 'edited name';
+    let editDialog = null;
+
+    createCupsPrinterPage([
+      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1', true),
+    ]);
+    return cupsPrintersBrowserProxy.whenCalled('getCupsEnterprisePrintersList')
+        .then(() => {
+          // Wait for enterprise printers to populate.
+          Polymer.dom.flush();
+
+          enterprisePrintersElement =
+              page.$$('settings-cups-enterprise-printers');
+          assertTrue(!!enterprisePrintersElement);
+
+          const enterprisePrinterEntries =
+              cups_printer_test_util.getPrinterEntries(
+                  enterprisePrintersElement);
+
+          // Users are not allowed to remove enterprise printers.
+          const removeButton = enterprisePrintersElement.$$('#removeButton');
+          expectTrue(removeButton.disabled);
+
+          clickButton(enterprisePrinterEntries[0].$$('.icon-more-vert'));
+          clickButton(enterprisePrintersElement.$$('#viewButton'));
+
+          Polymer.dom.flush();
+
+          editDialog = initializeEditDialog(page);
+
+          const nameField = editDialog.$$('.printer-name-input');
+          assertTrue(!!nameField);
+          expectEquals('test1', nameField.value);
+          expectTrue(nameField.readonly);
+
+          expectTrue(editDialog.$$('#printerAddress').readonly);
+          expectTrue(editDialog.$$('.md-select').disabled);
+          expectTrue(editDialog.$$('#printerQueue').readonly);
+          expectTrue(editDialog.$$('#printerPPDManufacturer').readonly);
+
+          // The "specify PDD" section should be hidden.
+          expectTrue(editDialog.$$('.browse-button').parentElement.hidden);
+          expectTrue(editDialog.$$('#ppdLabel').hidden);
+
+          // Save and Cancel buttons should be hidden. Close button should be
+          // visible.
+          expectTrue(editDialog.$$('.cancel-button').hidden);
+          expectTrue(editDialog.$$('.action-button').hidden);
+          expectFalse(editDialog.$$('.close-button').hidden);
+        });
+  });
+
+  test('PressShowMoreButton', function() {
+    createCupsPrinterPage([
+      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1', true),
+      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2', true),
+      cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3', true),
+      cups_printer_test_util.createCupsPrinterInfo('test4', '4', 'id4', true),
+    ]);
+    return cupsPrintersBrowserProxy.whenCalled('getCupsEnterprisePrintersList')
+        .then(() => {
+          // Wait for enterprise printers to populate.
+          Polymer.dom.flush();
+
+          enterprisePrintersElement =
+              page.$$('settings-cups-enterprise-printers');
+          assertTrue(!!enterprisePrintersElement);
+
+          const printerEntryListTestElement =
+              enterprisePrintersElement.$$('#printerEntryList');
+
+          // There are 4 total printers but only 3 printers are visible and 1 is
+          // hidden underneath the Show more section.
+          verifyVisiblePrinters(printerEntryListTestElement, [
+            cups_printer_test_util.createPrinterListEntry(
+                'test1', '1', 'id1', PrinterType.ENTERPRISE),
+            cups_printer_test_util.createPrinterListEntry(
+                'test2', '2', 'id2', PrinterType.ENTERPRISE),
+            cups_printer_test_util.createPrinterListEntry(
+                'test3', '3', 'id3', PrinterType.ENTERPRISE),
+          ]);
+          // Assert that the Show more button is shown since printer list length
+          // is > 3.
+          assertTrue(!!enterprisePrintersElement.$$('#show-more-container'));
+
+          // Click on the Show more button.
+          clickButton(enterprisePrintersElement.$$('#show-more-icon'));
+          assertFalse(!!enterprisePrintersElement.$$('#show-more-container'));
+          // Clicking on the Show more button reveals all hidden printers.
+          verifyVisiblePrinters(printerEntryListTestElement, [
+            cups_printer_test_util.createPrinterListEntry(
+                'test1', '1', 'id1', PrinterType.ENTERPRISE),
+            cups_printer_test_util.createPrinterListEntry(
+                'test2', '2', 'id2', PrinterType.ENTERPRISE),
+            cups_printer_test_util.createPrinterListEntry(
+                'test3', '3', 'id3', PrinterType.ENTERPRISE),
+            cups_printer_test_util.createPrinterListEntry(
+                'test4', '4', 'id4', PrinterType.ENTERPRISE),
+          ]);
+        });
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.js b/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.js
index 305fd2c2..b723d3e 100644
--- a/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.js
+++ b/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.js
@@ -7,12 +7,14 @@
    * @param {string} printerName
    * @param {string} printerAddress
    * @param {string} printerId
+   * @param {boolean} isManaged
    * @return {!CupsPrinterInfo}
    * @private
    */
   /* #export */ function createCupsPrinterInfo(
-      printerName, printerAddress, printerId) {
+      printerName, printerAddress, printerId, isManaged = false) {
     const printer = {
+      isManaged: isManaged,
       ppdManufacturer: '',
       ppdModel: '',
       printerAddress: printerAddress,
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui_test.js
index 73fa357..749a701 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_ui_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui_test.js
@@ -36,7 +36,7 @@
     settingsPage = settingsMain.$$('os-settings-page');
     assertTrue(!!settingsPage);
 
-    // Simulate Kerberos settings section enabled.
+    // Simulate Kerberos enabled.
     settingsPage.showKerberosSection = true;
 
     const idleRender =
diff --git a/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.js b/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.js
index c2859cb..8e09e23 100644
--- a/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.js
+++ b/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.js
@@ -14,7 +14,8 @@
       super([
         'addCupsPrinter',
         'addDiscoveredPrinter',
-        'getCupsPrintersList',
+        'getCupsSavedPrintersList',
+        'getCupsEnterprisePrintersList',
         'getCupsPrinterManufacturersList',
         'getCupsPrinterModelsList',
         'getPrinterInfo',
@@ -86,8 +87,14 @@
     }
 
     /** @override */
-    getCupsPrintersList() {
-      this.methodCalled('getCupsPrintersList');
+    getCupsSavedPrintersList() {
+      this.methodCalled('getCupsSavedPrintersList');
+      return Promise.resolve(this.printerList);
+    }
+
+    /** @override */
+    getCupsEnterprisePrintersList() {
+      this.methodCalled('getCupsEnterprisePrintersList');
       return Promise.resolve(this.printerList);
     }
 
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb
index fea8b272..e8c13ad 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofoon</translation>
 <translation id="3240426699337459095">Skakel gekopieer</translation>
 <translation id="3259149966178251584">Kameraresolusie</translation>
+<translation id="3448774564454087943">Video is nie gestoor nie want dis te kort</translation>
 <translation id="3517926952904427380">Kan nie portretfoto neem nie</translation>
 <translation id="3569311554794739032">Wil jy regtig <ph name="FILE" /> verwyder?</translation>
 <translation id="3733597664308256288">Bykomende kamerakontroles beskikbaar. Soek + regspyl om toegang te kry.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb
index 921293b..5302ecd 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">ማይክሮፎን</translation>
 <translation id="3240426699337459095">አገናኝ ተቀድቷል</translation>
 <translation id="3259149966178251584">የካሜራ ምስል ጥራት</translation>
+<translation id="3448774564454087943">ቪዲዮ በጣም አጭር ስለሆነ አልተቀመጠም</translation>
 <translation id="3517926952904427380">የቁም ፎቶን ማንሳት አልተቻለም</translation>
 <translation id="3569311554794739032">እርግጠኛ ነዎት <ph name="FILE" />ን ማስወገድ ይፈልጋሉ?</translation>
 <translation id="3733597664308256288">ተጨማሪ የካሜራ መቆጣጠሪያዎች ይገኛሉ። ለመድረስ ፍለጋ + የቀኝ ቀስት።</translation>
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 20ed9f2..5fcf99a 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
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">الميكروفون</translation>
 <translation id="3240426699337459095">تم نسخ الرابط</translation>
 <translation id="3259149966178251584">درجة دقة الكاميرا</translation>
+<translation id="3448774564454087943">لم يتم حفظ الفيديو لأنّه قصير جدًا.</translation>
 <translation id="3517926952904427380">تعذّر التقاط صور أشخاص</translation>
 <translation id="3569311554794739032">هل تريد فعلاً إزالة <ph name="FILE" />؟</translation>
 <translation id="3733597664308256288">تتوفّر عناصر تحكُّم إضافية في الكاميرا. للوصول إلى هذه العناصر، اضغط على مفتاح البحث + السهم المتّجه لليمين.</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 0450006fb..494460816 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
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">মাইক্ৰ’ফ’ন</translation>
 <translation id="3240426699337459095">লিংকটোৰ প্ৰতিলিপি কৰা হ’ল</translation>
 <translation id="3259149966178251584">কেমেৰা ৰিজ'লিউশ্বন</translation>
+<translation id="3448774564454087943">ভিডিঅ’টো অতি চুটি হোৱাৰ কাৰণে সেইটো ছেভ নহ’ল</translation>
 <translation id="3517926952904427380">প’ৰ্ট্ৰেইট ফট’ ল’ব নোৱাৰিলে</translation>
 <translation id="3569311554794739032">আপুনি সঁচাকৈয়ে <ph name="FILE" /> আঁতৰাবলৈ বিচাৰে বুলি নিশ্চিতনে?</translation>
 <translation id="3733597664308256288">অতিৰিক্ত কেমেৰাৰ নিয়ন্ত্ৰণ উপলব্ধ। এক্সেছৰ বাবে ছাৰ্চ + সোঁফালৰ এৰ' কী টিপক।</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb
index 8898cc1..1396fa3 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -36,6 +36,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Link kopyalandı</translation>
 <translation id="3259149966178251584">Kameranın ayırdetmə dəqiqliyi</translation>
+<translation id="3448774564454087943">Çox qısa olduğuna görə video saxlanılmadı</translation>
 <translation id="3517926952904427380">Portret fotosu çəkmək alınmadı</translation>
 <translation id="3569311554794739032"><ph name="FILE" /> faylını silmək istəyirsiniz?</translation>
 <translation id="3733597664308256288">Əlavə kamera nizamlayıcıları əlçatandır. Giriş üçün Axtarış + Sağ oxa basın.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
index 58b5dc9..b5bf481 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Мікрафон</translation>
 <translation id="3240426699337459095">Спасылка скапіравана</translation>
 <translation id="3259149966178251584">Раздзяляльнасць камеры</translation>
+<translation id="3448774564454087943">Відэа не захавана, бо яно занадта кароткае</translation>
 <translation id="3517926952904427380">Не ўдалося зрабіць фотапартрэт</translation>
 <translation id="3569311554794739032">Сапраўды выдаліць файл "<ph name="FILE" />"?</translation>
 <translation id="3733597664308256288">Дадатковыя элементы кіравання камерай даступныя. Каб перайсці да іх, націсніце кнопку Пошук + стрэлка ўправа.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
index 53cc4b0..59d70d0 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Link je kopiran</translation>
 <translation id="3259149966178251584">Rezolucija kamere</translation>
+<translation id="3448774564454087943">Videozapis nije sačuvan jer je prekratak</translation>
 <translation id="3517926952904427380">Snimanje uspravne fotografije nije uspjelo</translation>
 <translation id="3569311554794739032">Želite li zaista ukloniti fajl <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Dostupne su dodatne kontrole kamere. Da im pristupite, pritisnite Pretraživanje + strelicu udesno.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
index 238e080..7cd4c16 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Micròfon</translation>
 <translation id="3240426699337459095">S'ha copiat l'enllaç.</translation>
 <translation id="3259149966178251584">Resolució de la càmera</translation>
+<translation id="3448774564454087943">El vídeo no s'ha desat perquè és massa curt</translation>
 <translation id="3517926952904427380">No es pot fer una foto vertical</translation>
 <translation id="3569311554794739032">Confirmes que vols suprimir <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Controls de càmera addicionals disponibles. Cerca+fletxa a la dreta per accedir-hi.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
index a423d829..9f4707e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Odkaz byl zkopírován</translation>
 <translation id="3259149966178251584">Rozlišení fotoaparátu</translation>
+<translation id="3448774564454087943">Video se neuložilo, protože je moc krátké</translation>
 <translation id="3517926952904427380">Portrétovou fotku nelze pořídit</translation>
 <translation id="3569311554794739032">Opravdu soubor <ph name="FILE" /> chcete odstranit?</translation>
 <translation id="3733597664308256288">Jsou k dispozici další ovládací prvky kamery. Přejdete na ně stisknutím tlačítka Hledat a šipky vpravo.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
index abed3a7..0aa32740 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Linket er kopieret</translation>
 <translation id="3259149966178251584">Kameraets opløsning</translation>
+<translation id="3448774564454087943">Videoen blev ikke gemt, fordi den er for kort</translation>
 <translation id="3517926952904427380">Det var ikke muligt at tage et billede i stående format</translation>
 <translation id="3569311554794739032">Er du sikker på, at du vil fjerne <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Yderligere styringselementer til kameraet er tilgængelige. Tryk på søgetasten+højrepil for at få adgang til dem.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
index 8310db4..5b1289df 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Link wurde kopiert.</translation>
 <translation id="3259149966178251584">Kameraauflösung</translation>
+<translation id="3448774564454087943">Das Video ist zu kurz und wird nicht gespeichert</translation>
 <translation id="3517926952904427380">Es konnte kein Foto im Hochformat aufgenommen werden</translation>
 <translation id="3569311554794739032">Möchten Sie "<ph name="FILE" />" wirklich entfernen?</translation>
 <translation id="3733597664308256288">Zusätzliche Kameraeinstellungen verfügbar. „Suchtaste + Rechtspfeil“ drücken, um darauf zuzugreifen.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
index 48f228d..8fbf1f6 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Μικρόφωνο</translation>
 <translation id="3240426699337459095">Ο σύνδεσμος αντιγράφηκε</translation>
 <translation id="3259149966178251584">Ανάλυση κάμερας</translation>
+<translation id="3448774564454087943">Το βίντεο δεν αποθηκεύτηκε επειδή είναι πολύ σύντομο</translation>
 <translation id="3517926952904427380">Δεν είναι δυνατή η λήψη φωτογραφίας πορτραίτου.</translation>
 <translation id="3569311554794739032">Είστε βέβαιοι ότι θέλετε να καταργήσετε το αρχείο <ph name="FILE" />;</translation>
 <translation id="3733597664308256288">Υπάρχουν διαθέσιμα επιπλέον στοιχεία ελέγχου κάμερας. Πατήστε Αναζήτηση + Δεξί βέλος για να αποκτήσετε πρόσβαση.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
index 3f70ed5f2..dd2bb7b 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Microphone</translation>
 <translation id="3240426699337459095">Link copied</translation>
 <translation id="3259149966178251584">Camera resolution</translation>
+<translation id="3448774564454087943">Video hasn't been saved as it's too short</translation>
 <translation id="3517926952904427380">Unable to take portrait photo</translation>
 <translation id="3569311554794739032">Do you really want to remove <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Additional camera controls available. Search + right arrow to access.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
index ff3420d..717dda3a 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Micrófono</translation>
 <translation id="3240426699337459095">Vínculo copiado</translation>
 <translation id="3259149966178251584">Resolución de la cámara</translation>
+<translation id="3448774564454087943">No se guardó el video porque es demasiado breve.</translation>
 <translation id="3517926952904427380">No es posible cambiar al modo vertical para tomar fotos.</translation>
 <translation id="3569311554794739032">¿Confirmas que quieres quitar <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Hay controles adicionales de cámara disponibles. Para acceder, presiona Búsqueda + flecha hacia la derecha.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb
index d3ab656..294d44bb 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Micrófono</translation>
 <translation id="3240426699337459095">Enlace copiado</translation>
 <translation id="3259149966178251584">Resolución de la cámara</translation>
+<translation id="3448774564454087943">El vídeo no se ha guardado porque es demasiado corto</translation>
 <translation id="3517926952904427380">No se ha podido hacer una foto vertical</translation>
 <translation id="3569311554794739032">¿Seguro que quieres eliminar <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Controles de cámara adicionales disponibles. Pulsa la tecla de búsqueda y la flecha hacia la derecha para acceder a ellos.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_et.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_et.xtb
index 3cd44dd..8d25f5a 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_et.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_et.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Link on kopeeritud</translation>
 <translation id="3259149966178251584">Kaamera eraldusvõime</translation>
+<translation id="3448774564454087943">Videot ei salvestatud, sest see on liiga lühike</translation>
 <translation id="3517926952904427380">Vertikaalpaigutuses fotot ei saa jäädvustada</translation>
 <translation id="3569311554794739032">Kas soovite faili <ph name="FILE" /> kindlasti eemaldada?</translation>
 <translation id="3733597664308256288">Saadaval on kaamera täiendavad juhtnupud. Juurdepääsemiseks vajutage klahvikombinatsiooni Otsing + paremnool.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
index f0dc353e..9f293dd 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofonoa</translation>
 <translation id="3240426699337459095">Esteka kopiatu da</translation>
 <translation id="3259149966178251584">Kameraren bereizmena</translation>
+<translation id="3448774564454087943">Ez da gorde bideoa, laburregia zelako</translation>
 <translation id="3517926952904427380">Ezin da atera erretratu-argazkia</translation>
 <translation id="3569311554794739032">Ziur zaude <ph name="FILE" /> kendu nahi duzula?</translation>
 <translation id="3733597664308256288">Kamera kontrolatzeko aukera gehiago daude. Haiek atzitzeko, sakatu bilaketa-tekla + eskuinera egiteko gezi-tekla.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb
index 107e413..e355612 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">میکروفن</translation>
 <translation id="3240426699337459095">پیوند کپی شد</translation>
 <translation id="3259149966178251584">وضوح دوربین</translation>
+<translation id="3448774564454087943">ویدیو ذخیره نمی‌شود چون خیلی کوتاه است</translation>
 <translation id="3517926952904427380">عکس عمودی ممکن نیست</translation>
 <translation id="3569311554794739032">واقعاً می‌خواهید <ph name="FILE" /> را بردارید؟</translation>
 <translation id="3733597664308256288">کنترل‌های بیشتر دوربین دردسترس است. برای دسترسی، «جستجو + جهت‌نمای راست» را فشار دهید.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb
index f74880be..dffbd46 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofoni</translation>
 <translation id="3240426699337459095">Linkki kopioitu</translation>
 <translation id="3259149966178251584">Kameran resoluutio</translation>
+<translation id="3448774564454087943">Videota ei tallennettu, koska se on liian lyhyt</translation>
 <translation id="3517926952904427380">Muotokuvan ottaminen epäonnistui</translation>
 <translation id="3569311554794739032">Haluatko varmasti, että <ph name="FILE" /> poistetaan?</translation>
 <translation id="3733597664308256288">Lisää kameran säätimiä käytettävissä. Käytä niitä valitsemalla Haku + oikea nuoli.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb
index 682562e2..12f6cb7 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikropono</translation>
 <translation id="3240426699337459095">Nakopya ang link</translation>
 <translation id="3259149966178251584">Resolution ng camera</translation>
+<translation id="3448774564454087943">Hindi na-save ang video dahil masyado itong maikli</translation>
 <translation id="3517926952904427380">Hindi makakuha ng portrait na larawan</translation>
 <translation id="3569311554794739032">Gusto mo ba talagang alisin ang <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Available ang mga karagdagang kontrol sa camera Pindutin ang Search + Pakanang arrow para i-access.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
index f7245676..c8dd2cc 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Microphone</translation>
 <translation id="3240426699337459095">Lien copié</translation>
 <translation id="3259149966178251584">Résolution de l'appareil photo</translation>
+<translation id="3448774564454087943">Impossible d'enregistrer la vidéo parce qu'elle est trop courte</translation>
 <translation id="3517926952904427380">Impossible de prendre une photo en mode portrait</translation>
 <translation id="3569311554794739032">Voulez-vous vraiment supprimer <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">De nouvelles commandes sont offertes pour l'appareil photo. Utilisez les touches Rechercher+flèche vers la droite pour y accéder.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb
index 1c522f9..3060063 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Micro</translation>
 <translation id="3240426699337459095">Le lien a bien été copié.</translation>
 <translation id="3259149966178251584">Résolution de la caméra</translation>
+<translation id="3448774564454087943">Impossible d'enregistrer la vidéo, car elle est trop courte</translation>
 <translation id="3517926952904427380">Impossible de prendre une photo en mode portrait</translation>
 <translation id="3569311554794739032">Voulez-vous vraiment supprimer <ph name="FILE" /> ?</translation>
 <translation id="3733597664308256288">D'autres commandes sont disponibles pour la caméra. Recherche+Flèche vers la droite pour y accéder.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb
index e1436549..c6813d0e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Micrófono</translation>
 <translation id="3240426699337459095">Copiouse a ligazón</translation>
 <translation id="3259149966178251584">Resolución da cámara</translation>
+<translation id="3448774564454087943">Non se gardou o vídeo porque é demasiado curto</translation>
 <translation id="3517926952904427380">Non se puido facer a foto de retrato</translation>
 <translation id="3569311554794739032">Seguro que queres eliminar <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Hai dispoñibles novos controis da cámara. Para acceder a eles, preme Buscar + Frecha dereita.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
index 9022672..e06fcb07 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">माइक्रोफ़ोन</translation>
 <translation id="3240426699337459095">लिंक कॉपी की गई</translation>
 <translation id="3259149966178251584">कैमरे का रिज़ॉल्यूशन</translation>
+<translation id="3448774564454087943">वीडियो बहुत छोटा होने की वजह से सेव नहीं किया गया है</translation>
 <translation id="3517926952904427380">पोर्ट्रेट फ़ोटो नहीं ली जा सकी</translation>
 <translation id="3569311554794739032">क्या आप वाकई <ph name="FILE" /> को हटाना चाहते हैं?</translation>
 <translation id="3733597664308256288">कैमरे के लिए अतिरिक्त कंट्रोल उपलब्ध हैं. इन्हें ऐक्सेस करने के लिए, खोज बटन + राइट ऐरो दबाएं.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb
index df3ae78..360d646f 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Veza je kopirana</translation>
 <translation id="3259149966178251584">Razlučivost fotoaparata</translation>
+<translation id="3448774564454087943">Videozapis nije spremljen jer je prekratak</translation>
 <translation id="3517926952904427380">Snimanje portretne fotografije nije uspjelo</translation>
 <translation id="3569311554794739032">Želite li doista ukloniti datoteku <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Dostupne su dodatne kontrole kamere. Pritisnite tipke Pretraživanje i strelica udesno da biste im pristupili.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
index 3c52613..20f6722e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Link másolva</translation>
 <translation id="3259149966178251584">Kamera felbontása</translation>
+<translation id="3448774564454087943">A videót nem mentette a rendszer, mert túl rövid</translation>
 <translation id="3517926952904427380">Nem sikerült álló fényképet készíteni</translation>
 <translation id="3569311554794739032">Biztosan eltávolítja a következő fájlt: <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Újabb kameravezérlők állnak rendelkezésre. Megtekintésükhöz nyomja le a Keresés + Jobbra nyíl billentyűparancsot.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
index d7cb702..a35428f0 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Խոսափող</translation>
 <translation id="3240426699337459095">Հղումը պատճենվեց</translation>
 <translation id="3259149966178251584">Տեսախցիկի լուծաչափը</translation>
+<translation id="3448774564454087943">Տեսանյութը չի պահվել, քանի որ այն չափազանց կարճ էր</translation>
 <translation id="3517926952904427380">Չհաջողվեց ուղղաձիգ դիրքով լուսանկարել</translation>
 <translation id="3569311554794739032">Հեռացնե՞լ <ph name="FILE" /> ֆայլը:</translation>
 <translation id="3733597664308256288">Հասանելի են տեսախցիկի լրացուցիչ կարգավորումներ։ Դրանք օգտագործելու համար սեղմեք «Որոնում»+աջ սլաք։</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
index 53d6de2..a32e6ee 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Tautan disalin</translation>
 <translation id="3259149966178251584">Resolusi kamera</translation>
+<translation id="3448774564454087943">Video tidak disimpan karena terlalu pendek</translation>
 <translation id="3517926952904427380">Tidak dapat mengambil foto potret</translation>
 <translation id="3569311554794739032">Yakin ingin menghapus <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Kontrol kamera tambahan tersedia. Penelusuran + Panah kanan untuk mengakses.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb
index c3a5e86..91b6fbc 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Hljóðnemi</translation>
 <translation id="3240426699337459095">Tengill afritaður</translation>
 <translation id="3259149966178251584">Upplausn myndavélar</translation>
+<translation id="3448774564454087943">Ekki er hægt að vista myndskeiðið því það er of stutt</translation>
 <translation id="3517926952904427380">Ekki tókst að taka andlitsmynd</translation>
 <translation id="3569311554794739032">Viltu örugglega fjarlægja <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Viðbótarstýringar tiltækar fyrir myndavél. Leit + ör til hægri til að fá aðgang.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
index cf2eea7..d90b0c5 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Microfono</translation>
 <translation id="3240426699337459095">Link copiato</translation>
 <translation id="3259149966178251584">Risoluzione della fotocamera</translation>
+<translation id="3448774564454087943">Video non salvato perché è troppo breve</translation>
 <translation id="3517926952904427380">Impossibile scattare foto verticale</translation>
 <translation id="3569311554794739032">Vuoi rimuovere <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Disponibili controlli della videocamera aggiuntivi. Tasto per la ricerca + Freccia destra per accedere.</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 5a7cf58..1a91ba96 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
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">מיקרופון</translation>
 <translation id="3240426699337459095">הקישור הועתק</translation>
 <translation id="3259149966178251584">רזולוציית המצלמה</translation>
+<translation id="3448774564454087943">הסרטון לא נשמר כי הוא קצר מדי</translation>
 <translation id="3517926952904427380">לא ניתן לצלם לאורך</translation>
 <translation id="3569311554794739032">להסיר את <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">יש פקדים חדשים למצלמה. ניתן לגשת אליהם באמצעות חיפוש + חץ ימינה.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb
index c44eab45..fe513765 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">マイク</translation>
 <translation id="3240426699337459095">リンクをコピーしました</translation>
 <translation id="3259149966178251584">カメラの解像度</translation>
+<translation id="3448774564454087943">短すぎるため動画は保存されません</translation>
 <translation id="3517926952904427380">縦向きの写真を撮影できません</translation>
 <translation id="3569311554794739032"><ph name="FILE" /> を削除してもよろしいですか?</translation>
 <translation id="3733597664308256288">カメラの設定が追加されました。アクセスするには検索+右矢印キーを押します。</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
index b5100cc..ba4fea7e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">მიკროფონი</translation>
 <translation id="3240426699337459095">ბმული დაკოპირდა</translation>
 <translation id="3259149966178251584">კამერის გარჩევადობა</translation>
+<translation id="3448774564454087943">ვიდეო არ შეინახა, რადგან ის ზედმეტად მოკლეა</translation>
 <translation id="3517926952904427380">პორტრეტის რეჟიმში ფოტოს გადაღება ვერ მოხერხდა</translation>
 <translation id="3569311554794739032">ნამდვილად გსურთ, ამოშალოთ <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">ხელმისაწვდომია კამერის მართვის დამატებითი საშუალებები. წვდომისთვის გამოიყენეთ კლავიშთა კომბინაცია Search + მარჯვნივ მიმართული ისარი.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb
index 70c53c7f..9eb837c 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3240426699337459095">Сілтеме көшірілді</translation>
 <translation id="3259149966178251584">Камера ажыратымдылығы</translation>
+<translation id="3448774564454087943">Бейне сақталмады, себебі тым қысқа.</translation>
 <translation id="3517926952904427380">Портреттік суретке түсіру мүмкін болмады.</translation>
 <translation id="3569311554794739032"><ph name="FILE" /> файлын шынымен өшіргіңіз келе ме?</translation>
 <translation id="3733597664308256288">Камераның қосымша басқару элементтері қолжетімді. Оларға өту үшін Search + оң жаққа бағыттауыш перне тіркесімін пайдаланыңыз.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
index 3bc2d88..1cf13849 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">마이크</translation>
 <translation id="3240426699337459095">링크 복사됨</translation>
 <translation id="3259149966178251584">카메라 해상도</translation>
+<translation id="3448774564454087943">동영상이 너무 짧아서 저장할 수 없습니다.</translation>
 <translation id="3517926952904427380">세로 모드 사진을 찍을 수 없습니다.</translation>
 <translation id="3569311554794739032"><ph name="FILE" /> 파일을 삭제하시겠습니까?</translation>
 <translation id="3733597664308256288">추가 카메라 제어 기능을 사용할 수 있습니다. 검색 키와 오른쪽 화살표 키를 사용하여 액세스하세요.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb
index b54dad7..eea8f14 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3240426699337459095">Шилтеме көчүрүлдү</translation>
 <translation id="3259149966178251584">Камеранын дааналыгы</translation>
+<translation id="3448774564454087943">Видео өтө кыска болгондуктан, сакталган жок</translation>
 <translation id="3517926952904427380">Сүрөткө тигинен тартылбай жатат</translation>
 <translation id="3569311554794739032">"<ph name="FILE" />" файлын чын эле өчүрөсүзбү?</translation>
 <translation id="3733597664308256288">Камераны көзөмөлдөй турган кошумча каражаттар бар. Аларга мүмкүнчүлүк алуу үчүн Издөө + Оңго жебе баскычтарын басыңыз.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb
index ba97da32..41de109 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">ໄມໂຄຣໂຟນ</translation>
 <translation id="3240426699337459095">ອັດ​ສຳ​ເນົາ​ລິ້ງ​ແລ້ວ</translation>
 <translation id="3259149966178251584">ຄວາມລະອຽດກ້ອງຖ່າຍຮູບ</translation>
+<translation id="3448774564454087943">ບໍ່ໄດ້ບັນທຶກວິດີໂອເນື່ອງຈາກມັນສັ້ນເກີນໄປ</translation>
 <translation id="3517926952904427380">ບໍ່ສາມາດຖ່າຍຮູບບຸກຄົນໄດ້</translation>
 <translation id="3569311554794739032">ທ່ານຕ້ອງການລຶບ <ph name="FILE" /> ອອກແທ້ບໍ?</translation>
 <translation id="3733597664308256288">ສາມາດໃຊ້ການຄວບຄຸມກ້ອງຖ່າຍຮູບເພີ່ມເຕີມໄດ້. ຊອກຫາ + ລູກຂວາ ເພື່ອເຂົ້າເຖິງ.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
index 8b6c4f24..13b256e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofonas</translation>
 <translation id="3240426699337459095">Nuoroda nukopijuota</translation>
 <translation id="3259149966178251584">Fotoaparato skyra</translation>
+<translation id="3448774564454087943">Vaizdo įrašas neišsaugotas, nes yra per trumpas</translation>
 <translation id="3517926952904427380">Nepavyko nufotografuoti portretinės nuotraukos</translation>
 <translation id="3569311554794739032">Ar tikrai norite pašalinti „<ph name="FILE" />“?</translation>
 <translation id="3733597664308256288">Pasiekiami papildomi fotoaparato valdikliai. Naudokite paieškos ir rodyklės dešinėn klavišus, kad juos pasiektumėte.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb
index 16be378..4b5ea1a04 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofons</translation>
 <translation id="3240426699337459095">Saite nokopēta</translation>
 <translation id="3259149966178251584">Kameras izšķirtspēja</translation>
+<translation id="3448774564454087943">Videoklips netika saglabāts, jo tas ir pārāk īss.</translation>
 <translation id="3517926952904427380">Nevar uzņemt portretu</translation>
 <translation id="3569311554794739032">Vai tiešām vēlaties noņemt failu <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Ir pieejamas papildu kameras vadīklas. Lai piekļūtu tām, vienlaikus nospiediet meklēšanas taustiņu un labo bulttaustiņu.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
index 298d7b09..8fa1e8fe 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3240426699337459095">Врската е копирана</translation>
 <translation id="3259149966178251584">Резолуција на камерата</translation>
+<translation id="3448774564454087943">Видеото не се зачува бидејќи е прекратко</translation>
 <translation id="3517926952904427380">Не може да фотографира во портрет</translation>
 <translation id="3569311554794739032">Дали навистина сакате да ја отстраните <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Достапни се дополнителни контроли за камерата. Search + Стрелка надесно за пристап.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb
index 7e4bea3c..aaf3257 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">മൈക്രോഫോൺ</translation>
 <translation id="3240426699337459095">ലിങ്ക് പകർത്തി</translation>
 <translation id="3259149966178251584">ക്യാമറ റെസല്യൂഷൻ</translation>
+<translation id="3448774564454087943">തീരെ ചെറുതായതിനാൽ വീഡിയോ സംരക്ഷിക്കാനായില്ല</translation>
 <translation id="3517926952904427380">പോർട്രെയ്റ്റ് ഫോട്ടോ എടുക്കാനായില്ല</translation>
 <translation id="3569311554794739032">"<ph name="FILE" />" നീക്കംചെയ്യണമെന്ന് തീർച്ചയാണോ?</translation>
 <translation id="3733597664308256288">അധിക ക്യാമറാ നിയന്ത്രണങ്ങൾ ലഭ്യമാണ്. ആക്‌സസ് ചെയ്യാൻ തിരയൽ + വലത്തേയ്ക്കുള്ള അമ്പടയാളം അമർത്തുക.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
index a848f44..dc10c2b 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Pautan disalin</translation>
 <translation id="3259149966178251584">Peleraian kamera</translation>
+<translation id="3448774564454087943">Video tidak disimpan kerana terlalu pendek</translation>
 <translation id="3517926952904427380">Tidak dapat mengambil foto potret</translation>
 <translation id="3569311554794739032">Adakah anda benar-benar mahu mengalih keluar <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Kawalan kamera tambahan tersedia. Carian + Anak panah ke kanan untuk mengakses.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_nl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_nl.xtb
index 00e643c..65989b48 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_nl.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Microfoon</translation>
 <translation id="3240426699337459095">Link gekopieerd</translation>
 <translation id="3259149966178251584">Cameraresolutie</translation>
+<translation id="3448774564454087943">De video is niet opgeslagen omdat deze te kort is</translation>
 <translation id="3517926952904427380">Kan geen portretfoto maken</translation>
 <translation id="3569311554794739032">Weet je zeker dat je <ph name="FILE" /> wilt verwijderen?</translation>
 <translation id="3733597664308256288">Er zijn nieuwe camera-opties beschikbaar. Druk op Zoeken + pijl-rechts om ze te openen.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
index 47ac0bb..770283ab 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Linken er kopiert</translation>
 <translation id="3259149966178251584">Kameraoppløsning</translation>
+<translation id="3448774564454087943">Videoen blir ikke lagret, siden den er for kort</translation>
 <translation id="3517926952904427380">Kunne ikke ta bilde i stående format</translation>
 <translation id="3569311554794739032">Er du sikker på at du vil fjerne <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Flere kamerakontroller er tilgjengelige. Trykk på søketasten + høyrepil for å se dem.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb
index 0e725f08..da59d73 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">ମାଇକ୍ରୋଫୋନ୍</translation>
 <translation id="3240426699337459095">ଲିଙ୍କ୍ କପି ହୋଇଛି</translation>
 <translation id="3259149966178251584">କ୍ୟାମେରା ରିଜୋଲ୍ୟୁଶନ୍</translation>
+<translation id="3448774564454087943">ଭିଡିଓଟି ବହୁତ ଛୋଟ ହୋଇଥିବା ଯୋଗୁଁ ଏହା ସେଭ୍ ହୋଇନାହିଁ</translation>
 <translation id="3517926952904427380">ପୋଟ୍ରେଟ୍ ଫଟୋ ଉଠାଇବା ପାଇଁ ଅକ୍ଷମ</translation>
 <translation id="3569311554794739032">ଆପଣ କ'ଣ ପ୍ରକୃତରେ <ph name="FILE" />କୁ କାଢ଼ି ଦେବାକୁ ଚାହୁଁଛନ୍ତି?</translation>
 <translation id="3733597664308256288">ଅତିରିକ୍ତ କ୍ୟାମେରା ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଉପଲବ୍ଧ ଅଛି। ଆକ୍ସେସ୍ କରିବା ପାଇଁ ସନ୍ଧାନ + ଡାହାଣ ତୀର କୀ ଦବାନ୍ତୁ।</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb
index 4da75906..40d8285 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">ਮਾਈਕ੍ਰੋਫੋਨ</translation>
 <translation id="3240426699337459095">ਲਿੰਕ ਕਾਪੀ ਕੀਤਾ</translation>
 <translation id="3259149966178251584">ਕੈਮਰਾ ਰੈਜ਼ੋਲਿਊਸ਼ਨ</translation>
+<translation id="3448774564454087943">ਵੀਡੀਓ ਬਹੁਤ ਛੋਟਾ ਹੋਣ ਕਰਕੇ ਇਸਨੂੰ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ</translation>
 <translation id="3517926952904427380">ਪੋਰਟਰੇਟ ਫ਼ੋਟੋ ਖਿੱਚੀ ਨਹੀਂ ਜਾ ਸਕੀ</translation>
 <translation id="3569311554794739032">ਕੀ ਤੁਸੀਂ ਪੱਕਾ <ph name="FILE" /> ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation>
 <translation id="3733597664308256288">ਵਾਧੂ ਕੈਮਰਾ ਕੰਟਰੋਲ ਉਪਲਬਧ ਹਨ। ਇਹਨਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ Search + ਸੱਜਾ ਤੀਰ ਦਬਾਓ।</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
index 92b933b..8ca97b0 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Link skopiowany</translation>
 <translation id="3259149966178251584">Rozdzielczość aparatu</translation>
+<translation id="3448774564454087943">Film nie został zapisany, ponieważ jest za krótki</translation>
 <translation id="3517926952904427380">Nie można zrobić zdjęcia w orientacji pionowej</translation>
 <translation id="3569311554794739032">Czy na pewno chcesz usunąć plik <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Dostępne są dodatkowe ustawienia aparatu. Aby uzyskać do nich dostęp, naciśnij klawisz wyszukiwania + strzałkę w prawo.</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 42641829..7c02cb9 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
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Microfone</translation>
 <translation id="3240426699337459095">Link copiado</translation>
 <translation id="3259149966178251584">Resolução da câmera</translation>
+<translation id="3448774564454087943">O vídeo não foi salvo porque é curto demais</translation>
 <translation id="3517926952904427380">Não foi possível capturar o retrato</translation>
 <translation id="3569311554794739032">Tem certeza de que quer remover <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Novos controles de câmera disponíveis. Para acessá-los, pressione Pesquisa + seta para a direita.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
index 4f9a877..9fd009f 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Microfone</translation>
 <translation id="3240426699337459095">Link copiado</translation>
 <translation id="3259149966178251584">Resolução da câmara</translation>
+<translation id="3448774564454087943">O vídeo não foi guardado, uma vez que é demasiado curto</translation>
 <translation id="3517926952904427380">Não é possível tirar foto de retrato</translation>
 <translation id="3569311554794739032">Tem a certeza de que pretende remover <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Controlos da câmara adicionais disponíveis. Prima a tecla de pesquisa + seta para a direita para aceder.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb
index 938c8df9..cfd8d96 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Microfon</translation>
 <translation id="3240426699337459095">Linkul a fost copiat</translation>
 <translation id="3259149966178251584">Rezoluția camerei</translation>
+<translation id="3448774564454087943">Videoclipul nu va fi salvat, deoarece este prea scurt</translation>
 <translation id="3517926952904427380">Nu se poate face fotografia portret</translation>
 <translation id="3569311554794739032">Sigur vrei să elimini <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Sunt disponibile comenzi suplimentare pentru cameră. Apasă pe Căutare + săgeată spre dreapta pentru a le accesa.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
index 43b5362..4bed8d8 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3240426699337459095">Готово</translation>
 <translation id="3259149966178251584">Разрешение камеры</translation>
+<translation id="3448774564454087943">Видео не сохранено, так как оно слишком короткое.</translation>
 <translation id="3517926952904427380">Не удалось сделать вертикальное фото.</translation>
 <translation id="3569311554794739032">Удалить файл <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Доступны дополнительные настройки камеры. Чтобы перейти к ним, нажмите Поиск + Стрелка вправо.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb
index 7d10a938..9bc2f2c 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">මයික්‍රෆෝනය:</translation>
 <translation id="3240426699337459095">සබැඳිය පිටපත් කරන ලදි</translation>
 <translation id="3259149966178251584">කැමරා විභේදනය</translation>
+<translation id="3448774564454087943">වීඩියෝව ඉතා කෙටි බැවින් සුරකිනු නොලැබේ</translation>
 <translation id="3517926952904427380">ප්‍රතිමූර්ති ඡායාරූප ගත නොහැක</translation>
 <translation id="3569311554794739032">ඔබට සැබැවින්ම <ph name="FILE" /> ඉවත් කිරීමට අවශ්‍යද?</translation>
 <translation id="3733597664308256288">අතිරේක කැමරා පාලන ලබා ගත හැකිය. ප්‍රවේශ වීමට සෙවීම + දකුණු ඊතලය.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
index a3656ae..c4411e46 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofón</translation>
 <translation id="3240426699337459095">Odkaz bol skopírovaný</translation>
 <translation id="3259149966178251584">Rozlíšenie fotoaparátu</translation>
+<translation id="3448774564454087943">Video sa neuložilo, pretože je príliš krátke</translation>
 <translation id="3517926952904427380">Nepodarilo sa nasnímať portrétovú fotku</translation>
 <translation id="3569311554794739032">Naozaj chcete odstrániť <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">K dispozícii je ďalšie ovládanie kamery. Otvoríte ho klávesmi Hľadať + šípka doprava.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb
index 1ec519c3..fc81dbc4 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Povezava kopirana</translation>
 <translation id="3259149966178251584">Ločljivost fotoaparata</translation>
+<translation id="3448774564454087943">Videoposnetek se ni shranil, ker je prekratek</translation>
 <translation id="3517926952904427380">Portretne fotografije ni bilo mogoče posneti</translation>
 <translation id="3569311554794739032">Ali res želite odstraniti datoteko <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Na voljo so dodatni kontrolniki kamere. Za dostop uporabite tipko za iskanje in puščico desno.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb
index b5ebf2eb..c729a8e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofoni</translation>
 <translation id="3240426699337459095">Lidhja u kopjua</translation>
 <translation id="3259149966178251584">Rezolucioni i kamerës</translation>
+<translation id="3448774564454087943">Videoja nuk është ruajtur duke qenë se është shumë e shkurtër</translation>
 <translation id="3517926952904427380">Nuk mund të nxjerrësh një fotografi portret</translation>
 <translation id="3569311554794739032">Vërtet dëshiron të heqësh <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Ofrohen kontrolle shtesë të kamerës. Kërko + Shigjeta djathtas për të pasur qasje.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
index c6b7424..ce77d8b 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Link je kopiran</translation>
 <translation id="3259149966178251584">Rezolucija kamere</translation>
+<translation id="3448774564454087943">Video nije sačuvan jer je prekratak</translation>
 <translation id="3517926952904427380">Snimanje uspravne slike nije uspelo</translation>
 <translation id="3569311554794739032">Želite li stvarno da uklonite datoteku <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Dostupne su dodatne kontrole za kameru. Ako želite da im pristupite, koristite taster za pretragu + strelicu nadesno.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
index 99667bad..f4dbbfd 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3240426699337459095">Линк је копиран</translation>
 <translation id="3259149966178251584">Резолуција камере</translation>
+<translation id="3448774564454087943">Видео није сачуван јер је прекратак</translation>
 <translation id="3517926952904427380">Снимање усправне слике није успело</translation>
 <translation id="3569311554794739032">Желите ли стварно да уклоните датотеку <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Доступне су додатне контроле за камеру. Ако желите да им приступите, користите тастер за претрагу + стрелицу надесно.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb
index aae61a6f..99683742e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Länken har kopierats</translation>
 <translation id="3259149966178251584">Kameraupplösning</translation>
+<translation id="3448774564454087943">Videon sparas inte eftersom den är för kort</translation>
 <translation id="3517926952904427380">Det gick inte att ta porträttfoto</translation>
 <translation id="3569311554794739032">Vill du ta bort <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Ytterligare kamerakontroller tillgängliga. Tryck på Sök + högerpil för att få åtkomst.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb
index ad695fea..976c94a 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Maikrofoni</translation>
 <translation id="3240426699337459095">Kiungo kimenakiliwa</translation>
 <translation id="3259149966178251584">Ubora wa kamera</translation>
+<translation id="3448774564454087943">Video haijahifadhiwa kwa sababu ni fupi mno</translation>
 <translation id="3517926952904427380">Imeshindwa kupiga picha ya wima</translation>
 <translation id="3569311554794739032">Una uhakika ungependa kuondoa <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Vidhibiti vya ziada vya kamera vinapatikana. Bonyeza kitufe cha Utafutaji pamoja na kishale cha Kulia ili uvifikie.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb
index 4a56bc8..15a8e46 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">ไมโครโฟน</translation>
 <translation id="3240426699337459095">คัดลอกลิงก์แล้ว</translation>
 <translation id="3259149966178251584">ความละเอียดกล้อง</translation>
+<translation id="3448774564454087943">ไม่ได้บันทึกวิดีโอเนื่องจากสั้นเกินไป</translation>
 <translation id="3517926952904427380">ถ่ายภาพบุคคลไม่ได้</translation>
 <translation id="3569311554794739032">คุณต้องการนำ <ph name="FILE" /> ออกจริงๆ ใช่ไหม</translation>
 <translation id="3733597664308256288">มีตัวควบคุมกล้องให้ใช้งานเพิ่มเติม กดค้นหา + ลูกศรขวาเพื่อเข้าถึง</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 22a11431..737077f 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
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3240426699337459095">Bağlantı kopyalandı</translation>
 <translation id="3259149966178251584">Kamera çözünürlüğü</translation>
+<translation id="3448774564454087943">Video çok kısa olduğu için kaydedilmedi</translation>
 <translation id="3517926952904427380">Portre fotoğrafı çekilemiyor</translation>
 <translation id="3569311554794739032"><ph name="FILE" /> dosyasını kaldırmak istediğinizden emin misiniz?</translation>
 <translation id="3733597664308256288">Ek kamera kontrolleri mevcut. Erişmek için Arama + Sağ ok tuşlarına basın.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb
index 84580df..ed2d61466 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Мікрофон</translation>
 <translation id="3240426699337459095">Посилання скопійовано</translation>
 <translation id="3259149966178251584">Роздільна здатність камери</translation>
+<translation id="3448774564454087943">Відео не збережено, оскільки воно закоротке</translation>
 <translation id="3517926952904427380">Не вдалося зробити портретне фото</translation>
 <translation id="3569311554794739032">Видалити файл "<ph name="FILE" />"?</translation>
 <translation id="3733597664308256288">Доступні додаткові елементи керування камерою. Щоб перейти до них, натисніть клавішу пошуку + стрілку вправо.</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb
index 9035f98..088c590 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">麦克风</translation>
 <translation id="3240426699337459095">已复制链接</translation>
 <translation id="3259149966178251584">摄像头分辨率</translation>
+<translation id="3448774564454087943">未能保存此视频,因为它太短了</translation>
 <translation id="3517926952904427380">无法拍摄纵向照片</translation>
 <translation id="3569311554794739032">确定要移除“<ph name="FILE" />”吗?</translation>
 <translation id="3733597664308256288">已推出新的相机控件。使用搜索键 + 向右键即可访问这些控件。</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
index 5660170..16c9ab8 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">麥克風</translation>
 <translation id="3240426699337459095">連結已複製</translation>
 <translation id="3259149966178251584">相機解像度</translation>
+<translation id="3448774564454087943">影片太短,因此系統並未儲存影片</translation>
 <translation id="3517926952904427380">無法拍攝肖像相片</translation>
 <translation id="3569311554794739032">您確定要移除「<ph name="FILE" />」嗎?</translation>
 <translation id="3733597664308256288">推出咗新嘅相機控制項。㩒搜尋鍵 + 向右箭咀就可以用。</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 cfe9d4c..dde7166 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
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">麥克風</translation>
 <translation id="3240426699337459095">連結已複製</translation>
 <translation id="3259149966178251584">相機解析度</translation>
+<translation id="3448774564454087943">無法儲存長度太短的影片</translation>
 <translation id="3517926952904427380">無法拍攝肖像相片</translation>
 <translation id="3569311554794739032">確定要移除「<ph name="FILE" />」嗎?</translation>
 <translation id="3733597664308256288">已推出新的相機控制項。按下搜尋鍵 + 向右鍵即可使用。</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
index 1809b24..07f9fa0b 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
@@ -38,6 +38,7 @@
 <translation id="3227137524299004712">Imakrofoni</translation>
 <translation id="3240426699337459095">Isixhumanisi sikopishiwe</translation>
 <translation id="3259149966178251584">Ukulungiswa kwekhamera</translation>
+<translation id="3448774564454087943">Ividiyo ayilondoloziwe ngoba imfushane kakhulu</translation>
 <translation id="3517926952904427380">Ayikwazi ukuthatha isithombe sokuma ngobude</translation>
 <translation id="3569311554794739032">Ufuna ngempela ukukhipha <ph name="FILE" />?</translation>
 <translation id="3733597664308256288">Izilawuli zekhamera ezengeziwe ziyatholakala. Sesha + Umcibisholo wangokwesokudla ukuze ufinyelele.</translation>
diff --git a/chromeos/components/drivefs/drivefs_auth_unittest.cc b/chromeos/components/drivefs/drivefs_auth_unittest.cc
index 23b3d5b..d172e8d 100644
--- a/chromeos/components/drivefs/drivefs_auth_unittest.cc
+++ b/chromeos/components/drivefs/drivefs_auth_unittest.cc
@@ -67,7 +67,8 @@
  protected:
   void SetUp() override {
     clock_.SetNow(base::Time::Now());
-    identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(kTestEmail);
+    identity_test_env_.MakePrimaryAccountAvailable(
+        kTestEmail, signin::ConsentLevel::kSignin);
     auto timer = std::make_unique<base::MockOneShotTimer>();
     timer_ = timer.get();
     delegate_ = std::make_unique<AuthDelegateImpl>(
diff --git a/chromeos/components/drivefs/drivefs_host_unittest.cc b/chromeos/components/drivefs/drivefs_host_unittest.cc
index e3c15f2..ca0b746 100644
--- a/chromeos/components/drivefs/drivefs_host_unittest.cc
+++ b/chromeos/components/drivefs/drivefs_host_unittest.cc
@@ -207,8 +207,8 @@
     account_id_ = AccountId::FromUserEmailGaiaId("test@example.com", "ID");
 
     disk_manager_ = std::make_unique<chromeos::disks::MockDiskMountManager>();
-    identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(
-        "test@example.com");
+    identity_test_env_.MakePrimaryAccountAvailable(
+        "test@example.com", signin::ConsentLevel::kSignin);
     host_delegate_ = std::make_unique<TestingDriveFsHostDelegate>(
         identity_test_env_.identity_manager(), account_id_);
     auto timer = std::make_unique<base::MockOneShotTimer>();
diff --git a/chromeos/components/help_app_ui/BUILD.gn b/chromeos/components/help_app_ui/BUILD.gn
index 7ac0482..148f365 100644
--- a/chromeos/components/help_app_ui/BUILD.gn
+++ b/chromeos/components/help_app_ui/BUILD.gn
@@ -2,7 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/buildflag_header.gni")
 import("//chrome/test/base/js2gtest.gni")
+import("//chromeos/components/help_app_ui/help_app_ui.gni")
 import("//chromeos/components/web_applications/system_apps.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//third_party/closure_compiler/compile_js.gni")
@@ -196,3 +198,10 @@
     "//chromeos/components/system_apps/public/js:message_pipe",
   ]
 }
+
+# Used to turn off tests that only work with our CIPD package.
+buildflag_header("buildflags") {
+  header = "buildflags.h"
+
+  flags = [ "ENABLE_CROS_HELP_APP=$enable_cros_help_app" ]
+}
diff --git a/chromeos/login/auth/test_attempt_state.h b/chromeos/login/auth/test_attempt_state.h
index 51e88a4..b515985 100644
--- a/chromeos/login/auth/test_attempt_state.h
+++ b/chromeos/login/auth/test_attempt_state.h
@@ -19,7 +19,7 @@
 class COMPONENT_EXPORT(CHROMEOS_LOGIN_AUTH) TestAttemptState
     : public AuthAttemptState {
  public:
-  TestAttemptState(const UserContext& credentials);
+  explicit TestAttemptState(const UserContext& credentials);
 
   ~TestAttemptState() override;
 
diff --git a/chromeos/login/login_state/scoped_test_public_session_login_state.h b/chromeos/login/login_state/scoped_test_public_session_login_state.h
index 46053a9..f0754ab 100644
--- a/chromeos/login/login_state/scoped_test_public_session_login_state.h
+++ b/chromeos/login/login_state/scoped_test_public_session_login_state.h
@@ -15,7 +15,7 @@
 // (so it nicely cleans up after going out of scope).
 class ScopedTestPublicSessionLoginState {
  public:
-  ScopedTestPublicSessionLoginState(
+  explicit ScopedTestPublicSessionLoginState(
       LoginState::LoggedInUserType user_type =
           LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT);
   ~ScopedTestPublicSessionLoginState();
diff --git a/chromeos/printing/printer_translator.cc b/chromeos/printing/printer_translator.cc
index 72448690..59b8eba 100644
--- a/chromeos/printing/printer_translator.cc
+++ b/chromeos/printing/printer_translator.cc
@@ -92,6 +92,7 @@
 std::unique_ptr<base::DictionaryValue> CreateEmptyPrinterInfo() {
   std::unique_ptr<base::DictionaryValue> printer_info =
       std::make_unique<base::DictionaryValue>();
+  printer_info->SetBoolean("isManaged", false);
   printer_info->SetString("ppdManufacturer", "");
   printer_info->SetString("ppdModel", "");
   printer_info->SetString("printerAddress", "");
@@ -171,6 +172,8 @@
   std::unique_ptr<base::DictionaryValue> printer_info =
       CreateEmptyPrinterInfo();
 
+  printer_info->SetBoolean("isManaged",
+                           printer.source() == Printer::Source::SRC_POLICY);
   printer_info->SetString("printerId", printer.id());
   printer_info->SetString("printerName", printer.display_name());
   printer_info->SetString("printerDescription", printer.description());
diff --git a/chromeos/printing/printer_translator_unittest.cc b/chromeos/printing/printer_translator_unittest.cc
index 8d81b05..468ab02c 100644
--- a/chromeos/printing/printer_translator_unittest.cc
+++ b/chromeos/printing/printer_translator_unittest.cc
@@ -369,4 +369,16 @@
             status_reasons_list[1].FindIntPath("severity"));
 }
 
+TEST(PrinterTranslatorTest, GetCupsPrinterInfoManagedPrinter) {
+  Printer printer = CreateGenericPrinter();
+  printer.set_source(Printer::Source::SRC_USER_PREFS);
+  std::unique_ptr<base::DictionaryValue> printer_info =
+      GetCupsPrinterInfo(printer);
+  ExpectDictBooleanValue(false, *printer_info, "isManaged");
+
+  printer.set_source(Printer::Source::SRC_POLICY);
+  printer_info = GetCupsPrinterInfo(printer);
+  ExpectDictBooleanValue(true, *printer_info, "isManaged");
+}
+
 }  // namespace chromeos
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index 7024e9b..0c317816 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-93-4515.9-1622454091-benchmark-93.0.4530.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-93-4515.9-1622454091-benchmark-93.0.4531.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index 38d663c..a4c1146c 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-93-4515.9-1622460530-benchmark-93.0.4530.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-93-4515.9-1622460530-benchmark-93.0.4531.0-r1-redacted.afdo.xz
diff --git a/chromeos/services/assistant/service_unittest.cc b/chromeos/services/assistant/service_unittest.cc
index 47d65264..285c5de 100644
--- a/chromeos/services/assistant/service_unittest.cc
+++ b/chromeos/services/assistant/service_unittest.cc
@@ -91,7 +91,8 @@
     assistant_state_.RegisterPrefChanges(&pref_service_);
 
     // In production the primary account is set before the service is created.
-    identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(kEmailAddress);
+    identity_test_env_.MakePrimaryAccountAvailable(
+        kEmailAddress, signin::ConsentLevel::kSignin);
 
     service_ = std::make_unique<Service>(shared_url_loader_factory_->Clone(),
                                          identity_test_env_.identity_manager());
diff --git a/chromeos/services/device_sync/cryptauth_client_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_client_impl_unittest.cc
index dc724af6..16975be 100644
--- a/chromeos/services/device_sync/cryptauth_client_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_client_impl_unittest.cc
@@ -184,7 +184,8 @@
     device_classifier.set_device_software_package(kDeviceSoftwarePackage);
     device_classifier.set_device_type(DeviceTypeEnumToString(kDeviceType));
 
-    identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable(kEmail);
+    identity_test_environment_.MakePrimaryAccountAvailable(
+        kEmail, signin::ConsentLevel::kSignin);
 
     client_ = std::make_unique<CryptAuthClientImpl>(
         base::WrapUnique(api_call_flow_),
diff --git a/chromeos/services/device_sync/device_sync_service_unittest.cc b/chromeos/services/device_sync/device_sync_service_unittest.cc
index 24a47ae..e5727557 100644
--- a/chromeos/services/device_sync/device_sync_service_unittest.cc
+++ b/chromeos/services/device_sync/device_sync_service_unittest.cc
@@ -916,8 +916,8 @@
   }
 
   void MakePrimaryAccountAvailable() {
-    identity_test_environment_->MakeUnconsentedPrimaryAccountAvailable(
-        kTestEmail);
+    identity_test_environment_->MakePrimaryAccountAvailable(
+        kTestEmail, signin::ConsentLevel::kSignin);
   }
 
   void SetInitialRegistrationId(const std::string& registration_id) {
diff --git a/chromeos/services/device_sync/public/cpp/device_sync_client_impl_unittest.cc b/chromeos/services/device_sync/public/cpp/device_sync_client_impl_unittest.cc
index 7bde94e..03d256e 100644
--- a/chromeos/services/device_sync/public/cpp/device_sync_client_impl_unittest.cc
+++ b/chromeos/services/device_sync/public/cpp/device_sync_client_impl_unittest.cc
@@ -157,9 +157,10 @@
 
     identity_test_environment_ =
         std::make_unique<signin::IdentityTestEnvironment>();
-    // "Unconsented" because this feature is not tied to browser sync consent.
-    identity_test_environment_->MakeUnconsentedPrimaryAccountAvailable(
-        kTestEmail);
+    // ConsentLevel::kSignin because this feature is not tied to browser sync
+    // consent.
+    identity_test_environment_->MakePrimaryAccountAvailable(
+        kTestEmail, signin::ConsentLevel::kSignin);
 
     auto fake_device_sync = std::make_unique<FakeDeviceSync>();
     fake_device_sync_ = fake_device_sync.get();
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc
index 0114114..32096a61 100644
--- a/chromeos/settings/cros_settings_names.cc
+++ b/chromeos/settings/cros_settings_names.cc
@@ -509,4 +509,6 @@
 const char kDeviceAllowedBluetoothServices[] =
     "cros.device.allowed_bluetooth_services";
 
+// A dictionary pref specifying the recurring schedule for device reboot.
+const char kDeviceScheduledReboot[] = "cros.device.device_scheduled_reboot";
 }  // namespace chromeos
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h
index 728e6263..e3ab5a4 100644
--- a/chromeos/settings/cros_settings_names.h
+++ b/chromeos/settings/cros_settings_names.h
@@ -292,6 +292,9 @@
 
 COMPONENT_EXPORT(CHROMEOS_SETTINGS)
 extern const char kDeviceAllowedBluetoothServices[];
+
+COMPONENT_EXPORT(CHROMEOS_SETTINGS)
+extern const char kDeviceScheduledReboot[];
 }  // namespace chromeos
 
 // TODO(https://crbug.com/1164001): remove when migrated to ash/components/.
@@ -351,6 +354,7 @@
 using ::chromeos::kDevicePrintersBlocklist;
 using ::chromeos::kDeviceQuirksDownloadEnabled;
 using ::chromeos::kDeviceRebootOnUserSignout;
+using ::chromeos::kDeviceScheduledReboot;
 using ::chromeos::kDeviceScheduledUpdateCheck;
 using ::chromeos::kDeviceSecondFactorAuthenticationMode;
 using ::chromeos::kDeviceShowLowDiskSpaceNotification;
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb
index 2194208..db29501 100644
--- a/chromeos/strings/chromeos_strings_de.xtb
+++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -163,7 +163,7 @@
 <translation id="4691278870498629773">Angehalten – Fach fehlt</translation>
 <translation id="469379815867856270">Signalstärke</translation>
 <translation id="4707579418881001319">L2TP/IPSec + Nutzerzertifikat</translation>
-<translation id="4731797938093519117">Elternfreigabe</translation>
+<translation id="4731797938093519117">Elternzugang</translation>
 <translation id="4773299976671772492">Angehalten</translation>
 <translation id="4794140124556169553">Der CPU-Test kann sich auf die Leistung Ihres Systems auswirken</translation>
 <translation id="4808449224298348341">Druckauftrag für "<ph name="DOCUMENT_TITLE" />" wurde abgebrochen</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb
index 5c5c017..ed511948 100644
--- a/chromeos/strings/chromeos_strings_fa.xtb
+++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -163,7 +163,7 @@
 <translation id="4691278870498629773">متوقف شد - سینی موجود نیست</translation>
 <translation id="469379815867856270">قدرت سیگنال</translation>
 <translation id="4707579418881001319">‏L2TP/IPSec + گواهی کاربر</translation>
-<translation id="4731797938093519117">دسترسی والدین</translation>
+<translation id="4731797938093519117">دسترسی ولی</translation>
 <translation id="4773299976671772492">متوقف شد</translation>
 <translation id="4794140124556169553">‏انجام آزمایش CPU ممکن است بر عملکرد سیستم تأثیر بگذارد</translation>
 <translation id="4808449224298348341">کار چاپ <ph name="DOCUMENT_TITLE" /> لغو شد</translation>
diff --git a/components/arc/compat_mode/resize_toggle_menu.cc b/components/arc/compat_mode/resize_toggle_menu.cc
index 6c3f4036..3692b78 100644
--- a/components/arc/compat_mode/resize_toggle_menu.cc
+++ b/components/arc/compat_mode/resize_toggle_menu.cc
@@ -14,6 +14,7 @@
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/gfx/text_constants.h"
+#include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/background.h"
 #include "ui/views/border.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
@@ -70,6 +71,8 @@
                      .Build());
     SetBorder(views::CreateEmptyBorder(gfx::Insets(kBorderThicknessDp)));
     SetPreferredSize(gfx::Size(96, 86));
+    SetAccessibleName(l10n_util::GetStringUTF16(title_string_id));
+    GetViewAccessibility().OverrideRole(ax::mojom::Role::kMenuItem);
   }
   MenuButtonView(const MenuButtonView&) = delete;
   MenuButtonView& operator=(const MenuButtonView&) = delete;
@@ -194,6 +197,10 @@
   delegate_view->set_title_margins(gfx::Insets());
   delegate_view->set_margins(gfx::Insets());
   delegate_view->SetAnchorRect(anchor_rect);
+  delegate_view->SetTitle(
+      l10n_util::GetStringUTF16(IDS_ARC_COMPAT_MODE_RESIZE_TOGGLE_MENU_TITLE));
+  delegate_view->SetShowTitle(false);
+  delegate_view->SetAccessibleRole(ax::mojom::Role::kMenu);
 
   // Setup view.
   auto* const provider = views::LayoutProvider::Get();
diff --git a/components/arc_strings.grdp b/components/arc_strings.grdp
index 50548d37..237606f 100644
--- a/components/arc_strings.grdp
+++ b/components/arc_strings.grdp
@@ -25,6 +25,9 @@
   <message name="IDS_ARC_COMPAT_MODE_RESIZE_TOGGLE_MENU_RESIZE_SETTINGS" desc="Label for the button to allow the user to go to resize settings.">
     Settings
   </message>
+  <message name="IDS_ARC_COMPAT_MODE_RESIZE_TOGGLE_MENU_TITLE" desc="Title for the menu window that shows predefined resize buttons.">
+    Resize toggle menu
+  </message>
   <message name="IDS_ARC_COMPAT_MODE_SPLASH_SCREEN_TITLE" desc="A Dialog title of splash screen to advertise the app is designed for mobile.">
     This app is designed for mobile
   </message>
diff --git a/components/arc_strings_grdp/IDS_ARC_COMPAT_MODE_RESIZE_TOGGLE_MENU_TITLE.png.sha1 b/components/arc_strings_grdp/IDS_ARC_COMPAT_MODE_RESIZE_TOGGLE_MENU_TITLE.png.sha1
new file mode 100644
index 0000000..cbc1135
--- /dev/null
+++ b/components/arc_strings_grdp/IDS_ARC_COMPAT_MODE_RESIZE_TOGGLE_MENU_TITLE.png.sha1
@@ -0,0 +1 @@
+faf6183aa14465929328bbdae721628dd137d699
\ No newline at end of file
diff --git a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
index fdf4a7984..6d149ce 100644
--- a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
+++ b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
@@ -582,16 +582,13 @@
                            ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
                            .email;
 
-  absl::optional<AccountInfo> account_info =
-      autofill_client_->GetIdentityManager()
-          ->FindExtendedAccountInfoForAccountWithRefreshToken(
-              autofill_client_->GetPersonalDataManager()
-                  ->GetAccountInfoForPaymentsServer());
-  if (account_info.has_value()) {
-    options->user.display_name = account_info.value().given_name;
-    options->user.icon_url = GURL(account_info.value().picture_url);
-  } else {
-    options->user.display_name = "";
+  AccountInfo account_info =
+      autofill_client_->GetIdentityManager()->FindExtendedAccountInfo(
+          autofill_client_->GetPersonalDataManager()
+              ->GetAccountInfoForPaymentsServer());
+  options->user.display_name = account_info.given_name;
+  if (!account_info.IsEmpty()) {
+    options->user.icon_url = GURL(account_info.picture_url);
   }
 
   const auto* challenge = creation_options.FindStringKey("challenge");
diff --git a/components/autofill/core/browser/payments/payments_client_unittest.cc b/components/autofill/core/browser/payments/payments_client_unittest.cc
index 5919a012..3def478 100644
--- a/components/autofill/core/browser/payments/payments_client_unittest.cc
+++ b/components/autofill/core/browser/payments/payments_client_unittest.cc
@@ -109,7 +109,8 @@
         test_shared_loader_factory_, identity_test_env_.identity_manager(),
         &test_personal_data_);
     test_personal_data_.SetAccountInfoForPayments(
-        identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com"));
+        identity_test_env_.MakePrimaryAccountAvailable(
+            "example@gmail.com", signin::ConsentLevel::kSync));
   }
 
   void TearDown() override { client_.reset(); }
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h
index 2f6b2a5..611d918 100644
--- a/components/autofill/core/browser/personal_data_manager.h
+++ b/components/autofill/core/browser/personal_data_manager.h
@@ -544,7 +544,6 @@
   friend class PersonalDataManagerHelper;
   friend class PersonalDataManagerMockTest;
   friend class SaveImportedProfileTest;
-  friend class ProfileSyncServiceAutofillTest;
   friend class ::RemoveAutofillTester;
   friend std::default_delete<PersonalDataManager>;
   friend void autofill_helper::SetProfiles(
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index 5641ca4..620aa40b 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -7348,7 +7348,8 @@
   sync_service_.SetIsAuthenticatedAccountPrimary(true);
 // MakePrimaryAccountAvailable is not supported on CrOS.
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-  identity_test_env_.MakePrimaryAccountAvailable(primary_account_info.email);
+  identity_test_env_.MakePrimaryAccountAvailable(primary_account_info.email,
+                                                 signin::ConsentLevel::kSync);
 #endif
 
   // Check that the sync state is |SignedInAndSyncFeature| if the sync feature
@@ -7377,9 +7378,8 @@
   ///////////////////////////////////////////////////////////
   // Make a primary account with no sync consent available to be in Sync
   // Transport for Wallet mode.
-  CoreAccountInfo active_info =
-      identity_test_env_.MakeUnconsentedPrimaryAccountAvailable(
-          kSyncTransportAccountEmail);
+  CoreAccountInfo active_info = identity_test_env_.MakePrimaryAccountAvailable(
+      kSyncTransportAccountEmail, signin::ConsentLevel::kSignin);
   sync_service_.SetAuthenticatedAccountInfo(active_info);
   sync_service_.SetIsAuthenticatedAccountPrimary(false);
   sync_service_.SetActiveDataTypes(
diff --git a/components/autofill_assistant/browser/controller_unittest.cc b/components/autofill_assistant/browser/controller_unittest.cc
index ed05caca..5342ed08 100644
--- a/components/autofill_assistant/browser/controller_unittest.cc
+++ b/components/autofill_assistant/browser/controller_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/test/gtest_util.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill_assistant/browser/cud_condition.pb.h"
@@ -88,16 +89,13 @@
 
 }  // namespace
 
-class ControllerTest : public content::RenderViewHostTestHarness {
+class ControllerTest : public testing::Test {
  public:
-  ControllerTest()
-      : RenderViewHostTestHarness(
-            base::test::TaskEnvironment::MainThreadType::UI,
-            base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
-  ~ControllerTest() override {}
+  ControllerTest() = default;
 
   void SetUp() override {
-    RenderViewHostTestHarness::SetUp();
+    web_contents_ = content::WebContentsTester::CreateTestWebContents(
+        &browser_context_, nullptr);
 
     scoped_feature_list_.InitAndEnableFeature(
         features::kAutofillAssistantChromeEntry);
@@ -147,7 +145,12 @@
   void TearDown() override {
     controller_->RemoveObserver(&mock_observer_);
     controller_.reset();
-    RenderViewHostTestHarness::TearDown();
+  }
+
+  content::WebContents* web_contents() { return web_contents_.get(); }
+
+  content::BrowserTaskEnvironment* task_environment() {
+    return &task_environment_;
   }
 
  protected:
@@ -245,8 +248,11 @@
     return required_data_piece;
   }
 
-  // |task_environment_| must be the first field, to make sure that everything
-  // runs in the same task environment.
+  content::BrowserTaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  content::RenderViewHostTestEnabler rvh_test_enabler_;
+  content::TestBrowserContext browser_context_;
+  std::unique_ptr<content::WebContents> web_contents_;
   base::test::ScopedFeatureList scoped_feature_list_;
   base::TimeTicks now_;
   std::vector<AutofillAssistantState> states_;
diff --git a/components/autofill_assistant/browser/protocol_utils.cc b/components/autofill_assistant/browser/protocol_utils.cc
index 45724fc..e55089d6 100644
--- a/components/autofill_assistant/browser/protocol_utils.cc
+++ b/components/autofill_assistant/browser/protocol_utils.cc
@@ -4,6 +4,7 @@
 
 #include "components/autofill_assistant/browser/protocol_utils.h"
 
+#include <map>
 #include <utility>
 
 #include "base/feature_list.h"
@@ -429,11 +430,13 @@
     std::vector<std::unique_ptr<TriggerScript>>* trigger_scripts,
     std::vector<std::string>* additional_allowed_domains,
     int* trigger_condition_check_interval_ms,
-    absl::optional<int>* timeout_ms) {
+    absl::optional<int>* timeout_ms,
+    absl::optional<std::unique_ptr<ScriptParameters>>* script_parameters) {
   DCHECK(trigger_scripts);
   DCHECK(additional_allowed_domains);
   DCHECK(trigger_condition_check_interval_ms);
   DCHECK(timeout_ms);
+  DCHECK(script_parameters);
 
   GetTriggerScriptsResponseProto response_proto;
   if (!response_proto.ParseFromString(response)) {
@@ -468,6 +471,14 @@
   if (response_proto.has_timeout_ms()) {
     *timeout_ms = response_proto.timeout_ms();
   }
+
+  if (!response_proto.script_parameters().empty()) {
+    std::map<std::string, std::string> parameters;
+    for (const auto& param : response_proto.script_parameters()) {
+      parameters.emplace(param.name(), param.value());
+    }
+    *script_parameters = std::make_unique<ScriptParameters>(parameters);
+  }
   return true;
 }
 
diff --git a/components/autofill_assistant/browser/protocol_utils.h b/components/autofill_assistant/browser/protocol_utils.h
index cdfed6e..fb6dd7e6 100644
--- a/components/autofill_assistant/browser/protocol_utils.h
+++ b/components/autofill_assistant/browser/protocol_utils.h
@@ -92,7 +92,8 @@
       std::vector<std::unique_ptr<TriggerScript>>* trigger_scripts,
       std::vector<std::string>* additional_allowed_domains,
       int* trigger_condition_check_interval_ms,
-      absl::optional<int>* timeout_ms);
+      absl::optional<int>* timeout_ms,
+      absl::optional<std::unique_ptr<ScriptParameters>>* script_parameters);
 
  private:
   // Checks that the |trigger_condition| is well-formed (e.g. does not contain
diff --git a/components/autofill_assistant/browser/protocol_utils_unittest.cc b/components/autofill_assistant/browser/protocol_utils_unittest.cc
index 865add7..8934adb 100644
--- a/components/autofill_assistant/browser/protocol_utils_unittest.cc
+++ b/components/autofill_assistant/browser/protocol_utils_unittest.cc
@@ -17,7 +17,9 @@
 using ::testing::ElementsAre;
 using ::testing::Eq;
 using ::testing::IsEmpty;
+using ::testing::Ne;
 using ::testing::Not;
+using ::testing::Optional;
 using ::testing::Pair;
 using ::testing::Pointee;
 using ::testing::Property;
@@ -325,9 +327,10 @@
   std::vector<std::string> additional_allowed_domains;
   int interval_ms;
   absl::optional<int> timeout_ms;
-  EXPECT_FALSE(ProtocolUtils::ParseTriggerScripts("invalid", &trigger_scripts,
-                                                  &additional_allowed_domains,
-                                                  &interval_ms, &timeout_ms));
+  absl::optional<std::unique_ptr<ScriptParameters>> script_parameters;
+  EXPECT_FALSE(ProtocolUtils::ParseTriggerScripts(
+      "invalid", &trigger_scripts, &additional_allowed_domains, &interval_ms,
+      &timeout_ms, &script_parameters));
   EXPECT_TRUE(trigger_scripts.empty());
 }
 
@@ -356,6 +359,13 @@
   proto.set_trigger_condition_check_interval_ms(2000);
   proto.set_timeout_ms(500000);
 
+  auto* param_1 = proto.add_script_parameters();
+  param_1->set_name("param_1");
+  param_1->set_value("value_1");
+  auto* param_2 = proto.add_script_parameters();
+  param_2->set_name("param_2");
+  param_2->set_value("value_2");
+
   TriggerScriptProto trigger_script_1;
   *trigger_script_1.mutable_trigger_condition()->mutable_selector() =
       ToSelectorProto("fake_element_1");
@@ -371,9 +381,10 @@
   std::vector<std::string> additional_allowed_domains;
   int interval_ms;
   absl::optional<int> timeout_ms;
-  EXPECT_TRUE(ProtocolUtils::ParseTriggerScripts(proto_str, &trigger_scripts,
-                                                 &additional_allowed_domains,
-                                                 &interval_ms, &timeout_ms));
+  absl::optional<std::unique_ptr<ScriptParameters>> script_parameters;
+  EXPECT_TRUE(ProtocolUtils::ParseTriggerScripts(
+      proto_str, &trigger_scripts, &additional_allowed_domains, &interval_ms,
+      &timeout_ms, &script_parameters));
   EXPECT_THAT(
       trigger_scripts,
       ElementsAre(
@@ -383,6 +394,12 @@
               ElementsAre("example.com", "other-example.com"));
   EXPECT_EQ(interval_ms, 2000);
   EXPECT_EQ(timeout_ms, 500000);
+  ASSERT_THAT(script_parameters, Ne(absl::nullopt));
+  EXPECT_THAT((*script_parameters)
+                  ->ToProto(
+                      /* only_trigger_script_allowlisted = */ false),
+              ElementsAre(std::make_pair("param_1", "value_1"),
+                          std::make_pair("param_2", "value_2")));
 }
 
 TEST_F(ProtocolUtilsTest, TurnOffResizeVisualViewport) {
@@ -402,10 +419,10 @@
   std::vector<std::string> additional_allowed_domains;
   int interval_ms;
   absl::optional<int> timeout_ms;
-
-  EXPECT_TRUE(ProtocolUtils::ParseTriggerScripts(proto_str, &trigger_scripts,
-                                                 &additional_allowed_domains,
-                                                 &interval_ms, &timeout_ms));
+  absl::optional<std::unique_ptr<ScriptParameters>> script_parameters;
+  EXPECT_TRUE(ProtocolUtils::ParseTriggerScripts(
+      proto_str, &trigger_scripts, &additional_allowed_domains, &interval_ms,
+      &timeout_ms, &script_parameters));
   ASSERT_THAT(trigger_scripts, SizeIs(2));
 
   EXPECT_TRUE(trigger_scripts[0]->AsProto().user_interface().scroll_to_hide());
@@ -435,10 +452,10 @@
   std::vector<std::string> additional_allowed_domains;
   int interval_ms;
   absl::optional<int> timeout_ms;
-
-  EXPECT_FALSE(ProtocolUtils::ParseTriggerScripts(proto_str, &trigger_scripts,
-                                                  &additional_allowed_domains,
-                                                  &interval_ms, &timeout_ms));
+  absl::optional<std::unique_ptr<ScriptParameters>> script_parameters;
+  EXPECT_FALSE(ProtocolUtils::ParseTriggerScripts(
+      proto_str, &trigger_scripts, &additional_allowed_domains, &interval_ms,
+      &timeout_ms, &script_parameters));
   EXPECT_THAT(trigger_scripts, IsEmpty());
 }
 
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index 2ec0ee3..5edfb4b 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -574,6 +574,16 @@
   // The amount of time between consecutive checks of trigger conditions. Should
   // not be too small to limit performance impact.
   optional int32 trigger_condition_check_interval_ms = 4 [default = 1000];
+
+  // The list of script parameters for the client to use. This can be different
+  // from the list the client sent in the GetTriggerScriptsRequest.
+  //
+  // For some flows, the GetTriggerScripts RPC is the first and only
+  // communication with the backend prior to the start of the regular flow. As
+  // such, the backend needs to send any additional script parameters (such as
+  // appropriate overlay colors) back to the client such that the regular flows
+  // are guaranteed to have a full set of script parameters when/if they start.
+  repeated ScriptParameterProto script_parameters = 5;
 }
 
 // A trigger script contains the full specification for a trigger script that is
diff --git a/components/autofill_assistant/browser/starter_unittest.cc b/components/autofill_assistant/browser/starter_unittest.cc
index 7cba2319..725f57e 100644
--- a/components/autofill_assistant/browser/starter_unittest.cc
+++ b/components/autofill_assistant/browser/starter_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
 #include "base/time/tick_clock.h"
 #include "components/autofill_assistant/browser/fake_starter_platform_delegate.h"
 #include "components/autofill_assistant/browser/features.h"
@@ -56,16 +57,13 @@
 
 const char kExampleDeeplink[] = "https://www.example.com";
 
-class StarterTest : public content::RenderViewHostTestHarness {
+class StarterTest : public testing::Test {
  public:
-  StarterTest()
-      : content::RenderViewHostTestHarness(
-            base::test::TaskEnvironment::MainThreadType::UI,
-            base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
-  ~StarterTest() override = default;
+  StarterTest() = default;
 
   void SetUp() override {
-    RenderViewHostTestHarness::SetUp();
+    web_contents_ = content::WebContentsTester::CreateTestWebContents(
+        &browser_context_, nullptr);
     ukm::InitializeSourceUrlRecorderForWebContents(web_contents());
     SimulateNavigateToUrl(GURL(kExampleDeeplink));
     PrepareTriggerScriptUiDelegate();
@@ -106,7 +104,12 @@
     // Note: it is important to reset the starter explicitly here to ensure that
     // destructors are called on the right thread, as required by devtools.
     starter_.reset();
-    RenderViewHostTestHarness::TearDown();
+  }
+
+  content::WebContents* web_contents() { return web_contents_.get(); }
+
+  content::BrowserTaskEnvironment* task_environment() {
+    return &task_environment_;
   }
 
   base::HashingMRUCache<std::string, base::TimeTicks>*
@@ -220,6 +223,11 @@
     });
   }
 
+  content::BrowserTaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  content::RenderViewHostTestEnabler rvh_test_enabler_;
+  content::TestBrowserContext browser_context_;
+  std::unique_ptr<content::WebContents> web_contents_;
   NiceMock<MockTriggerScriptUiDelegate>* mock_trigger_script_ui_delegate_ =
       nullptr;
   NiceMock<MockServiceRequestSender>*
diff --git a/components/autofill_assistant/browser/trigger_context.cc b/components/autofill_assistant/browser/trigger_context.cc
index 61d052d..1263fcf32 100644
--- a/components/autofill_assistant/browser/trigger_context.cc
+++ b/components/autofill_assistant/browser/trigger_context.cc
@@ -85,7 +85,13 @@
 TriggerContext::~TriggerContext() = default;
 
 const ScriptParameters& TriggerContext::GetScriptParameters() const {
-  return *script_parameters_.get();
+  return *script_parameters_;
+}
+
+void TriggerContext::SetScriptParameters(
+    std::unique_ptr<ScriptParameters> script_parameters) {
+  DCHECK(script_parameters);
+  script_parameters_ = std::move(script_parameters);
 }
 
 std::string TriggerContext::GetExperimentIds() const {
diff --git a/components/autofill_assistant/browser/trigger_context.h b/components/autofill_assistant/browser/trigger_context.h
index a14e614..7c6c725 100644
--- a/components/autofill_assistant/browser/trigger_context.h
+++ b/components/autofill_assistant/browser/trigger_context.h
@@ -69,6 +69,10 @@
   // Returns a const reference to the script parameters.
   virtual const ScriptParameters& GetScriptParameters() const;
 
+  // Replaces the current script parameters with |script_parameters|.
+  virtual void SetScriptParameters(
+      std::unique_ptr<ScriptParameters> script_parameters);
+
   // Returns a comma-separated set of experiment ids.
   virtual std::string GetExperimentIds() const;
 
diff --git a/components/autofill_assistant/browser/trigger_context_unittest.cc b/components/autofill_assistant/browser/trigger_context_unittest.cc
index bc1ffa35..b2200bf3 100644
--- a/components/autofill_assistant/browser/trigger_context_unittest.cc
+++ b/components/autofill_assistant/browser/trigger_context_unittest.cc
@@ -164,4 +164,14 @@
   EXPECT_TRUE(single_element.HasExperimentId("1"));
 }
 
+TEST(TriggerContextTest, SetScriptParameters) {
+  TriggerContext::Options options;
+  TriggerContext context = {std::make_unique<ScriptParameters>(),
+                            TriggerContext::Options()};
+  auto new_script_params = std::make_unique<ScriptParameters>();
+  auto* new_script_params_ptr = new_script_params.get();
+  context.SetScriptParameters(std::move(new_script_params));
+  EXPECT_THAT(&context.GetScriptParameters(), Eq(new_script_params_ptr));
+}
+
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc
index 2ebd22ab..171a903 100644
--- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc
+++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc
@@ -94,9 +94,10 @@
   additional_allowed_domains_.clear();
   absl::optional<int> timeout_ms;
   int check_interval_ms;
-  if (!ProtocolUtils::ParseTriggerScripts(response, &trigger_scripts_,
-                                          &additional_allowed_domains_,
-                                          &check_interval_ms, &timeout_ms)) {
+  absl::optional<std::unique_ptr<ScriptParameters>> script_parameters;
+  if (!ProtocolUtils::ParseTriggerScripts(
+          response, &trigger_scripts_, &additional_allowed_domains_,
+          &check_interval_ms, &timeout_ms, &script_parameters)) {
     Stop(Metrics::TriggerScriptFinishedState::GET_ACTIONS_PARSE_ERROR);
     return;
   }
@@ -104,6 +105,9 @@
     Stop(Metrics::TriggerScriptFinishedState::NO_TRIGGER_SCRIPT_AVAILABLE);
     return;
   }
+  if (script_parameters.has_value()) {
+    trigger_context_->SetScriptParameters(std::move(*script_parameters));
+  }
   trigger_condition_check_interval_ =
       base::TimeDelta::FromMilliseconds(check_interval_ms);
   if (timeout_ms.has_value()) {
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc
index 3aef615..b138855 100644
--- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc
+++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc
@@ -25,6 +25,7 @@
 #include "components/ukm/test_ukm_recorder.h"
 #include "components/version_info/version_info.h"
 #include "content/public/test/navigation_simulator.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 "net/http/http_status_code.h"
@@ -34,6 +35,7 @@
 
 using ::base::test::RunOnceCallback;
 using ::testing::_;
+using ::testing::ElementsAre;
 using ::testing::ElementsAreArray;
 using ::testing::Eq;
 using ::testing::NiceMock;
@@ -53,16 +55,13 @@
 const char kFakeServerUrl[] =
     "https://www.fake.backend.com/trigger_script_server";
 
-class TriggerScriptCoordinatorTest : public content::RenderViewHostTestHarness {
+class TriggerScriptCoordinatorTest : public testing::Test {
  public:
-  TriggerScriptCoordinatorTest()
-      : content::RenderViewHostTestHarness(
-            base::test::TaskEnvironment::MainThreadType::UI,
-            base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
-  ~TriggerScriptCoordinatorTest() override = default;
+  TriggerScriptCoordinatorTest() = default;
 
   void SetUp() override {
-    RenderViewHostTestHarness::SetUp();
+    web_contents_ = content::WebContentsTester::CreateTestWebContents(
+        &browser_context_, nullptr);
     ukm::InitializeSourceUrlRecorderForWebContents(web_contents());
 
     auto mock_request_sender =
@@ -103,9 +102,12 @@
         ukm::GetSourceIdForWebContentsDocument(web_contents()));
   }
 
-  void TearDown() override {
-    coordinator_.reset();
-    RenderViewHostTestHarness::TearDown();
+  void TearDown() override { coordinator_.reset(); }
+
+  content::WebContents* web_contents() { return web_contents_.get(); }
+
+  content::BrowserTaskEnvironment* task_environment() {
+    return &task_environment_;
   }
 
   void SimulateWebContentsVisibilityChanged(content::Visibility visibility) {
@@ -126,6 +128,11 @@
   }
 
  protected:
+  content::BrowserTaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  content::RenderViewHostTestEnabler rvh_test_enabler_;
+  content::TestBrowserContext browser_context_;
+  std::unique_ptr<content::WebContents> web_contents_;
   ukm::TestAutoSetUkmRecorder ukm_recorder_;
   NiceMock<MockServiceRequestSender>* mock_request_sender_;
   NiceMock<MockWebController>* mock_web_controller_;
@@ -1177,4 +1184,31 @@
                      TriggerScriptProto::SHOPPING_CART_RETURNING_USER}}})));
 }
 
+TEST_F(TriggerScriptCoordinatorTest, BackendCanOverrideScriptParameters) {
+  GetTriggerScriptsResponseProto response;
+  response.add_trigger_scripts();
+  auto* param_1 = response.add_script_parameters();
+  param_1->set_name("name_1");
+  param_1->set_value("new_value_1");
+  auto* param_2 = response.add_script_parameters();
+  param_2->set_name("name_2");
+  param_2->set_value("new_value_2");
+  std::string serialized_response;
+  response.SerializeToString(&serialized_response);
+
+  EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _))
+      .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response));
+
+  coordinator_->Start(
+      GURL(kFakeDeepLink),
+      std::make_unique<TriggerContext>(
+          std::make_unique<ScriptParameters>(std::map<std::string, std::string>{
+              {"name_1", "old_value_1"}, {"name_3", "value_3"}}),
+          TriggerContext::Options()),
+      mock_callback_.Get());
+  EXPECT_THAT(coordinator_->GetTriggerContext().GetScriptParameters().ToProto(),
+              ElementsAre(std::make_pair("name_1", "new_value_1"),
+                          std::make_pair("name_2", "new_value_2")));
+}
+
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc b/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc
index 9daa00b..44f5a54 100644
--- a/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc
+++ b/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc
@@ -14,7 +14,9 @@
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "content/public/browser/web_contents.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"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -94,17 +96,14 @@
 
 }  // namespace
 
-class WebsiteLoginManagerImplTest : public content::RenderViewHostTestHarness {
+class WebsiteLoginManagerImplTest : public testing::Test {
  public:
-  WebsiteLoginManagerImplTest()
-      : RenderViewHostTestHarness(
-            base::test::TaskEnvironment::MainThreadType::UI,
-            base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
-  ~WebsiteLoginManagerImplTest() override = default;
+  WebsiteLoginManagerImplTest() = default;
 
  protected:
   void SetUp() override {
-    RenderViewHostTestHarness::SetUp();
+    web_contents_ = content::WebContentsTester::CreateTestWebContents(
+        &browser_context_, nullptr);
     profile_store_ = new password_manager::MockPasswordStore;
     ON_CALL(*profile_store_, IsAccountStore()).WillByDefault(Return(false));
     ASSERT_TRUE(profile_store_->Init(/*prefs=*/nullptr));
@@ -122,8 +121,8 @@
           .WillByDefault(Return(account_store_.get()));
     }
 
-    manager_ =
-        std::make_unique<WebsiteLoginManagerImpl>(&client_, web_contents());
+    manager_ = std::make_unique<WebsiteLoginManagerImpl>(&client_,
+                                                         web_contents_.get());
   }
 
   void TearDown() override {
@@ -131,15 +130,18 @@
       account_store_->ShutdownOnUIThread();
     }
     profile_store_->ShutdownOnUIThread();
-    RenderViewHostTestHarness::TearDown();
   }
 
   WebsiteLoginManagerImpl* manager() { return manager_.get(); }
   password_manager::MockPasswordStore* store() { return profile_store_.get(); }
 
-  void WaitForPasswordStore() { task_environment()->RunUntilIdle(); }
+  void WaitForPasswordStore() { task_environment_.RunUntilIdle(); }
 
  private:
+  content::BrowserTaskEnvironment task_environment_;
+  content::RenderViewHostTestEnabler rvh_test_enabler_;
+  content::TestBrowserContext browser_context_;
+  std::unique_ptr<content::WebContents> web_contents_;
   testing::NiceMock<MockPasswordManagerClient> client_;
   std::unique_ptr<WebsiteLoginManagerImpl> manager_;
   scoped_refptr<password_manager::MockPasswordStore> profile_store_;
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
index c767ca1..bdca9908 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokkeer derdeparty-webkoekies</translation>
 <translation id="6206551242102657620">Verbinding is veilig. Werfinligting</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />-opsies</translation>
+<translation id="6231752747840485235">Deïnstalleer "<ph name="APP_NAME" />"?</translation>
 <translation id="6260852843601447737">Maak toe en gee misbruik aan</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> en <ph name="PERMISSION_2" /> word geblokkeer.</translation>
 <translation id="6270391203985052864">Werwe kan vra om kennisgewings te stuur</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
index 800731c..e59486d 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">የሦስተኛ ወገን ኩኪዎችን አግድ</translation>
 <translation id="6206551242102657620">ግንኙነት ደህንነቱ የተጠበቀ ነው። የጣቢያ መረጃ</translation>
 <translation id="6216432067784365534">የ<ph name="NAME_OF_LIST_ITEM" /> አማራጮች</translation>
+<translation id="6231752747840485235">«<ph name="APP_NAME" />» ይራገፍ?</translation>
 <translation id="6260852843601447737">ይዝጉ እና አላግባብ መጠቀምን ሪፖርት ያድርጉ</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> እና <ph name="PERMISSION_2" /> ታግደዋል</translation>
 <translation id="6270391203985052864">ጣቢያዎች ማሳወቂያዎችን ለመላክ መጠየቅ ይችላሉ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
index b9dc0be..ec03dc03 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">حظر ملفات تعريف الارتباط للجهات الخارجية</translation>
 <translation id="6206551242102657620">يُعدُّ اتصالك آمنًا. معلومات الموقع الإلكتروني</translation>
 <translation id="6216432067784365534">خيارات <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">هل تريد إلغاء تثبيت "<ph name="APP_NAME" />"؟</translation>
 <translation id="6260852843601447737">الإغلاق والإبلاغ عن إساءة استخدام</translation>
 <translation id="6262279340360821358">تم حظر <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" />.</translation>
 <translation id="6270391203985052864">السماح للمواقع الإلكترونية بطلب إرسال إشعارات</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
index 064a4b8..cf201ed 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">তৃতীয়-পক্ষৰ কুকিসমূহ অৱৰোধ কৰক</translation>
 <translation id="6206551242102657620">সংযোগটো নিৰাপদ। ছাইটৰ তথ্য</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> বিকল্প</translation>
+<translation id="6231752747840485235">'<ph name="APP_NAME" />' আনইনষ্টল কৰিবনে?</translation>
 <translation id="6260852843601447737">বন্ধ কৰক আৰু দুৰ্ব্যৱহাৰৰ সম্পৰ্কে অভিযোগ দিয়ক</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> আৰু <ph name="PERMISSION_2" />ক অৱৰোধ কৰা আছে</translation>
 <translation id="6270391203985052864">ছাইটসমূহে জাননী পঠিয়াবলৈ ক’ব পাৰে</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
index 5f0d5a4..ac8890f5 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Üçüncü tərəf kukiləri blok edin</translation>
 <translation id="6206551242102657620">Bağlantınız güvənlidir. Sayt barədə məlumat</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Seçimləri</translation>
+<translation id="6231752747840485235">"<ph name="APP_NAME" />" sistemdən silinsin?</translation>
 <translation id="6260852843601447737">Bağlayın və sui-istifadə barədə bildirin</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> və <ph name="PERMISSION_2" /> bloklanıb</translation>
 <translation id="6270391203985052864">Saytlar bildiriş göndərilməsini tələb edə bilər</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
index 78f7a9f6..63ff4704 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Блакіраваць староннія файлы cookie</translation>
 <translation id="6206551242102657620">Падключэнне бяспечнае. Звесткі пра сайт</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: параметры</translation>
+<translation id="6231752747840485235">Выдаліць "<ph name="APP_NAME" />"?</translation>
 <translation id="6260852843601447737">Закрыць і паскардзіцца на парушэнне</translation>
 <translation id="6262279340360821358">Заблакіравана: <ph name="PERMISSION_1" /> і <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Сайтам дазволена запытваць дазвол на паказ апавяшчэнняў</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
index ab1af32..fed5af8d 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokiraj kolačiće trećih strana</translation>
 <translation id="6206551242102657620">Veza je sigurna. Informacije o web lokaciji</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> opcije</translation>
+<translation id="6231752747840485235">Deinstalirati aplikaciju <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Zatvori i prijavi zloupotrebu</translation>
 <translation id="6262279340360821358">Blokirano: <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Web lokacije mogu tražiti da šalju obavještenja</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
index 99e8f60..c7c0bf5 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloqueja les galetes de tercers</translation>
 <translation id="6206551242102657620">La connexió és segura. Informació del lloc web</translation>
 <translation id="6216432067784365534">Opcions per a <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Vols desinstal·lar <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Tanca i informa d'un ús abusiu</translation>
 <translation id="6262279340360821358">S'han bloquejat <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Els llocs web poden demanar-te permís per enviar-te notificacions</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
index 55bc54e..53fb1af 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokovat soubory cookie třetích stran</translation>
 <translation id="6206551242102657620">Připojení je zabezpečené. Informace o webu</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – možnosti</translation>
+<translation id="6231752747840485235">Odinstalovat aplikaci <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Zavřít a nahlásit zneužití</translation>
 <translation id="6262279340360821358">Oprávnění <ph name="PERMISSION_1" /> a <ph name="PERMISSION_2" /> jsou zablokována</translation>
 <translation id="6270391203985052864">Weby mohou žádat o oprávnění zasílat vám oznámení</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
index 4012497..67c3ffab 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloker cookies fra tredjeparter</translation>
 <translation id="6206551242102657620">Forbindelsen er sikker. Websiteoplysninger</translation>
 <translation id="6216432067784365534">Valgmuligheder for <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Vil du afinstallere "<ph name="APP_NAME" />"?</translation>
 <translation id="6260852843601447737">Luk, og rapportér misbrug</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> og <ph name="PERMISSION_2" /> blev blokeret</translation>
 <translation id="6270391203985052864">Websites kan spørge dig, om de må sende dig notifikationer</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
index 88a62d9a..17a4a0a 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Drittanbieter-Cookies blockieren</translation>
 <translation id="6206551242102657620">Die Verbindung ist sicher. Websiteinformationen</translation>
 <translation id="6216432067784365534">Optionen für <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">„<ph name="APP_NAME" />“ deinstallieren?</translation>
 <translation id="6260852843601447737">Schließen und Missbrauch melden</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> und <ph name="PERMISSION_2" /> blockiert</translation>
 <translation id="6270391203985052864">Websites können fragen, ob Sie Benachrichtigungen erhalten möchten</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
index 051c248..c1d2b9c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Αποκλεισμός cookie τρίτων</translation>
 <translation id="6206551242102657620">Η σύνδεση είναι ασφαλής. Πληροφορίες ιστοτόπου</translation>
 <translation id="6216432067784365534">Επιλογές <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Απεγκατάσταση <ph name="APP_NAME" />;</translation>
 <translation id="6260852843601447737">Κλείσιμο και αναφορά κατάχρησης</translation>
 <translation id="6262279340360821358">Οι άδειες <ph name="PERMISSION_1" /> και <ph name="PERMISSION_2" /> αποκλείστηκαν.</translation>
 <translation id="6270391203985052864">Οι ιστότοποι μπορούν να ζητούν να στέλνουν ειδοποιήσεις.</translation>
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 c88ba23e..d932878 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
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Block third-party cookies</translation>
 <translation id="6206551242102657620">Connection is secure. Site information</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Options</translation>
+<translation id="6231752747840485235">Uninstall '<ph name="APP_NAME" />'?</translation>
 <translation id="6260852843601447737">Close and report abuse</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> and <ph name="PERMISSION_2" /> blocked</translation>
 <translation id="6270391203985052864">Sites can ask to send notifications</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
index 67ca34b..58992af 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloquear cookies de terceros</translation>
 <translation id="6206551242102657620">La conexión es segura. Consulta la información del sitio.</translation>
 <translation id="6216432067784365534">Opciones de <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">¿Quieres desinstalar "<ph name="APP_NAME" />"?</translation>
 <translation id="6260852843601447737">Cerrar y denunciar un abuso</translation>
 <translation id="6262279340360821358">Bloqueados: <ph name="PERMISSION_1" /> y <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Los sitios podrán preguntarte si quieres recibir notificaciones</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
index fd98aac..80c0637 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloquear cookies de terceros</translation>
 <translation id="6206551242102657620">La conexión es segura. Información del sitio web</translation>
 <translation id="6216432067784365534">Opciones de <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">¿Desinstalar <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Cerrar y denunciar un abuso</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> y <ph name="PERMISSION_2" /> bloqueados</translation>
 <translation id="6270391203985052864">Los sitios pueden preguntarte si quieres que te envíen notificaciones</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
index 5f03a9f..0008d63 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokeeri kolmanda osapoole küpsisefailid</translation>
 <translation id="6206551242102657620">Ühendus on turvaline. Saidi teave</translation>
 <translation id="6216432067784365534">Üksuse <ph name="NAME_OF_LIST_ITEM" /> valikud</translation>
+<translation id="6231752747840485235">Kas desinstallida rakendus <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Sulge ja teavita väärkasutusest</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> ja <ph name="PERMISSION_2" /> on keelatud</translation>
 <translation id="6270391203985052864">Saidid saavad küsida luba märguannete saatmiseks</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
index 3ed21c1..1142306 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokeatu hirugarrenen cookieak</translation>
 <translation id="6206551242102657620">Konexioa segurua da. Webguneari buruzko informazioa</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> - Aukerak</translation>
+<translation id="6231752747840485235">"<ph name="APP_NAME" />" desinstalatu nahi duzu?</translation>
 <translation id="6260852843601447737">Itxi eta salatu erabilera okerra</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> eta <ph name="PERMISSION_2" /> blokeatu egin dira</translation>
 <translation id="6270391203985052864">Webguneek jakinarazpenak bidaltzea eska dezakete</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
index e04647d..a3e3031 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">مسدود کردن کوکی‌های شخص ثالث</translation>
 <translation id="6206551242102657620">اتصال امن است. اطلاعات سایت</translation>
 <translation id="6216432067784365534">گزینه‌های <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">«<ph name="APP_NAME" />» حذف نصب شود؟</translation>
 <translation id="6260852843601447737">بستن و گزارش سوءاستفاده</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> و <ph name="PERMISSION_2" /> مسدود هستند</translation>
 <translation id="6270391203985052864">سایت‌ها می‌توانند برای ارسال اعلان درخواست دهند</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
index 7cc8d9b..d93b772 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Estä kolmannen osapuolen evästeet</translation>
 <translation id="6206551242102657620">Yhteys on turvallinen. Sivuston tiedot</translation>
 <translation id="6216432067784365534">Vaihtoehdot: <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Poistetaanko <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Sulje ja ilmoita väärinkäytöstä</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> ja <ph name="PERMISSION_2" /> estetty</translation>
 <translation id="6270391203985052864">Sivustot saavat pyytää lupaa lähettää ilmoituksia</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
index 158bc7b..80d47d6 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">I-block ang mga third-party na cookie</translation>
 <translation id="6206551242102657620">Secure ang koneksyon. Impormasyon ng site</translation>
 <translation id="6216432067784365534">Mga Opsyon sa <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">I-uninstall ang '<ph name="APP_NAME" />'?</translation>
 <translation id="6260852843601447737">Isara at iulat ang pang-aabuso</translation>
 <translation id="6262279340360821358">Naka-block ang <ph name="PERMISSION_1" /> at <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Puwedeng humiling ang mga site na magpadala ng mga notification</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
index 8ef20bbd..692dcf8 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloquer les témoins de tiers</translation>
 <translation id="6206551242102657620">La connexion est sécurisée. Renseignements sur le site</translation>
 <translation id="6216432067784365534">Options de <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Désinstaller « <ph name="APP_NAME" /> »?</translation>
 <translation id="6260852843601447737">Fermer et signaler l'abus</translation>
 <translation id="6262279340360821358">Autorisations <ph name="PERMISSION_1" /> et <ph name="PERMISSION_2" /> bloquées</translation>
 <translation id="6270391203985052864">Les sites peuvent vous demander l'autorisation d'envoyer des notifications</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
index 586fcc2..518d7fc 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloquer les cookies tiers</translation>
 <translation id="6206551242102657620">La connexion est sécurisée. Informations sur le site</translation>
 <translation id="6216432067784365534">Options pour <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Désinstaller <ph name="APP_NAME" /> ?</translation>
 <translation id="6260852843601447737">Fermer et signaler l'abus</translation>
 <translation id="6262279340360821358">Autorisations refusées : <ph name="PERMISSION_1" /> et <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Les sites peuvent vous demander l'autorisation d'envoyer des notifications</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
index accfbf87..72ee1aa 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloquear cookies de terceiros</translation>
 <translation id="6206551242102657620">A conexión é segura. Información do sitio</translation>
 <translation id="6216432067784365534">Opcións de <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Queres desinstalar <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Pechar e denunciar uso inadecuado</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> e <ph name="PERMISSION_2" /> (bloqueados)</translation>
 <translation id="6270391203985052864">Os sitios poden pedir permiso para enviar notificacións</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
index 2b201ee..4a83915 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">तीसरे पक्ष की कुकी ब्लॉक करें</translation>
 <translation id="6206551242102657620">कनेक्शन सुरक्षित है. साइट की जानकारी</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> विकल्प</translation>
+<translation id="6231752747840485235">क्या आपको '<ph name="APP_NAME" />' अनइंस्टॉल करना है?</translation>
 <translation id="6260852843601447737">बंद करके शिकायत करें</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> और <ph name="PERMISSION_2" /> को ब्लॉक किया गया</translation>
 <translation id="6270391203985052864">साइटें आपको सूचनाएं भेजने के लिए पूछ सकती हैं</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
index d0e5c84..7c2b98f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokiraj kolačiće trećih strana</translation>
 <translation id="6206551242102657620">Veza je sigurna. Informacije o web-lokaciji</translation>
 <translation id="6216432067784365534">Opcije stavke <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Želite li deinstalirati aplikaciju <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Zatvori i prijavi zloupotrebu</translation>
 <translation id="6262279340360821358">Blokirana su dopuštenja <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Web-lokacije mogu postavljati pitanja o slanju obavijesti</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
index b5ecc37..cac027d 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Harmadik féltől származó cookie-k letiltása</translation>
 <translation id="6206551242102657620">A kapcsolat biztonságos. Webhelyadatok</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – lehetőségek</translation>
+<translation id="6231752747840485235">Eltávolítja ezt az alkalmazást: <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Bezárás és a visszaélés jelentése</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> és <ph name="PERMISSION_2" /> letiltva</translation>
 <translation id="6270391203985052864">A webhelyek rákérdezhetnek, hogy küldjenek-e Önnek értesítéseket</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
index 88faf2ca..61edfb7f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Արգելափակել երրորդ կողմի քուքիները</translation>
 <translation id="6206551242102657620">Կապակցումը պաշտպանված չէ: Տեղեկություններ կայքի մասին:</translation>
 <translation id="6216432067784365534">Ընտրանքներ՝ <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Ապատեղադրե՞լ <ph name="APP_NAME" /> հավելվածը</translation>
 <translation id="6260852843601447737">Փակել և հաղորդել խախտման մասին</translation>
 <translation id="6262279340360821358">Արգելափակված են՝ «<ph name="PERMISSION_1" />» և «<ph name="PERMISSION_2" />»</translation>
 <translation id="6270391203985052864">Կայքերը կարող են խնդրել ծանուցումներ ուղարկել</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
index 66cc954..6e80d3d 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokir cookie pihak ketiga</translation>
 <translation id="6206551242102657620">Sambungan aman. Informasi situs</translation>
 <translation id="6216432067784365534">Opsi <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Uninstal '<ph name="APP_NAME" />'?</translation>
 <translation id="6260852843601447737">Tutup dan laporkan penyalahgunaan</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> dan <ph name="PERMISSION_2" /> diblokir</translation>
 <translation id="6270391203985052864">Situs dapat meminta izin mengirimkan notifikasi</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
index 29b71fe..4d30b13 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Loka á fótspor frá þriðja aðila</translation>
 <translation id="6206551242102657620">Örugg tenging. Upplýsingar um vefsvæði</translation>
 <translation id="6216432067784365534">Valkostir fyrir <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Fjarlægja „<ph name="APP_NAME" />“?</translation>
 <translation id="6260852843601447737">Loka og tilkynna misnotkun</translation>
 <translation id="6262279340360821358">Lokað er fyrir <ph name="PERMISSION_1" /> og <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Vefsvæði geta óskað eftir því að senda tilkynningar</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
index 8bcd36c..516a16e 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blocca cookie di terze parti</translation>
 <translation id="6206551242102657620">La connessione è sicura. Informazioni sul sito</translation>
 <translation id="6216432067784365534">Opzioni <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Vuoi disinstallare "<ph name="APP_NAME" />"?</translation>
 <translation id="6260852843601447737">Chiudi e segnala illecito</translation>
 <translation id="6262279340360821358">Autorizzazioni <ph name="PERMISSION_1" /> e <ph name="PERMISSION_2" /> bloccate</translation>
 <translation id="6270391203985052864">I siti possono chiedere di inviare notifiche</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
index c83d150..15db5a1 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">‏חסימת קובצי Cookie של צד שלישי</translation>
 <translation id="6206551242102657620">החיבור מאובטח. פרטי האתר</translation>
 <translation id="6216432067784365534">אפשרויות של <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">להסיר את '<ph name="APP_NAME" />'?</translation>
 <translation id="6260852843601447737">סגירה ודיווח על התנהלות פוגעת</translation>
 <translation id="6262279340360821358">ההרשאות <ph name="PERMISSION_1" /> וגם <ph name="PERMISSION_2" /> חסומות</translation>
 <translation id="6270391203985052864">אתרים יכולים לבקש לשלוח התראות</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
index 42cc4e0..33d007d 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">サードパーティの Cookie をブロックする</translation>
 <translation id="6206551242102657620">接続は保護されています。サイト情報</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> のオプション</translation>
+<translation id="6231752747840485235">「<ph name="APP_NAME" />」をアンインストールしますか?</translation>
 <translation id="6260852843601447737">閉じて不正行為を報告</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />をブロック</translation>
 <translation id="6270391203985052864">通知を送信するかどうかの確認をサイトに許可する</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
index 96f951c..26ff136 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა</translation>
 <translation id="6206551242102657620">კავშირი დაცულია. საიტის ინფორმაცია.</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> — ვარიანტები</translation>
+<translation id="6231752747840485235">გსურთ <ph name="APP_NAME" />-ის დეინსტალაცია?</translation>
 <translation id="6260852843601447737">დახურვა და დარღვევის შესახებ შეტყობინება</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> და <ph name="PERMISSION_2" /> დაბლოკილია</translation>
 <translation id="6270391203985052864">საიტებს შეუძლიათ შეტყობინებების გამოგზავნის თხოვნა</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
index dd7fac2..fd10ac0 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Үшінші тарап cookie файлдарын бөгеу</translation>
 <translation id="6206551242102657620">Байланыс қорғалған. Сайт ақпараты</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> опциялары</translation>
+<translation id="6231752747840485235">"<ph name="APP_NAME" />" қолданбасы жойылсын ба?</translation>
 <translation id="6260852843601447737">Жабу және бұзушылық туралы хабарлау</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> және <ph name="PERMISSION_2" /> үшін тыйым салынған.</translation>
 <translation id="6270391203985052864">Сайттар хабарландырулар жіберу рұқсатын сұрай алады</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
index f189569..b2f3901 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">타사 쿠키 차단</translation>
 <translation id="6206551242102657620">이 사이트와의 연결은 안전합니다. 사이트 정보</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> 옵션</translation>
+<translation id="6231752747840485235">'<ph name="APP_NAME" />' 앱을 제거하시겠습니까?</translation>
 <translation id="6260852843601447737">닫은 후 악용사례 신고</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> 및 <ph name="PERMISSION_2" /> 차단됨</translation>
 <translation id="6270391203985052864">사이트에서 알림 전송 허용을 요청할 수 있음</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
index d9c1e2e..0903951 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Үчүнчү жактын кукилери бөгөттөлсүн</translation>
 <translation id="6206551242102657620">Туташуу корголгон. Сайт тууралуу маалымат</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Параметрлер</translation>
+<translation id="6231752747840485235">"<ph name="APP_NAME" />" колдонмосун чыгарып саласызбы?</translation>
 <translation id="6260852843601447737">Жаап, эрежелерди бузуу тууралуу кабар берүү</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> жана <ph name="PERMISSION_2" /> бөгөттөлдү</translation>
 <translation id="6270391203985052864">Сайттар билдирмелерди жөнөтүүнү сурана алышат</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
index e26dbcf1..b1c8161 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">ບລັອກຄຸກກີ້ພາກສ່ວນທີສາມ</translation>
 <translation id="6206551242102657620">ການເຊື່ອມຕໍ່ປອດໄພ. ຂໍ້ມູນເວັບໄຊ</translation>
 <translation id="6216432067784365534">ຕົວເລືອກ <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">ຖອນການຕິດຕັ້ງ '<ph name="APP_NAME" />' ບໍ?</translation>
 <translation id="6260852843601447737">ປິດ ແລະ ລາຍງານການລະເມີດ</translation>
 <translation id="6262279340360821358">ບລັອກ <ph name="PERMISSION_1" /> ແລະ <ph name="PERMISSION_2" /> ໄວ້ແລ້ວ</translation>
 <translation id="6270391203985052864">ເວັບໄຊສາມາດຂໍໃຫ້ສົ່ງການແຈ້ງເຕືອນໄດ້</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
index 48730e83..7c6d20f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokuoti trečiosios šalies slapukus</translation>
 <translation id="6206551242102657620">Ryšys yra saugus. Svetainės informacija</translation>
 <translation id="6216432067784365534">„<ph name="NAME_OF_LIST_ITEM" />“ parinktys</translation>
+<translation id="6231752747840485235">Pašalinti „<ph name="APP_NAME" />“?</translation>
 <translation id="6260852843601447737">Uždaryti ir pranešti apie piktnaudžiavimą</translation>
 <translation id="6262279340360821358">Užblokuota: <ph name="PERMISSION_1" /> ir <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Svetainės gali prašyti siųsti pranešimus</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
index e2d8a02..20b6a8b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloķēt trešo pušu sīkfailus</translation>
 <translation id="6206551242102657620">Savienojums ir drošs. Vietnes informācija</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: iespējas</translation>
+<translation id="6231752747840485235">Vai atinstalēt lietotni <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Aizvērt un ziņot par ļaunprātīgu izmantošanu</translation>
 <translation id="6262279340360821358">Bloķētas: <ph name="PERMISSION_1" /> un <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Vietnēs var lūgt atļauju sūtīt paziņojumus</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
index f84787d2..40fef52 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Блокирај колачиња од трети лица</translation>
 <translation id="6206551242102657620">Врската е безбедна. Информации за сајтот</translation>
 <translation id="6216432067784365534">Опции за <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Да се деинсталира „<ph name="APP_NAME" />“?</translation>
 <translation id="6260852843601447737">Затворете и пријавете злоупотреба</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> и <ph name="PERMISSION_2" /> се блокирани</translation>
 <translation id="6270391203985052864">Сајтовите можат да прашуваат дали да испраќаат известувања</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
index 01f878f..9093af5 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">മൂന്നാം കക്ഷി കുക്കികള്‍ ബ്ലോക്കുചെയ്യുക</translation>
 <translation id="6206551242102657620">കണക്ഷൻ സുരക്ഷിതമാണ്. സൈറ്റ് വിവരങ്ങള്‍</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> ഓപ്‌ഷനുകൾ</translation>
+<translation id="6231752747840485235">'<ph name="APP_NAME" />' അൺഇൻസ്റ്റാൾ ചെയ്യണോ?</translation>
 <translation id="6260852843601447737">അടച്ച് ദുരുപയോഗം റിപ്പോര്‍‌ട്ട് ചെയ്യുക</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" />,<ph name="PERMISSION_2" /> എന്നിവ ബ്ലോക്ക് ചെയ്‌തു</translation>
 <translation id="6270391203985052864">അറിയിപ്പുകൾ അയയ്ക്കാൻ സൈറ്റുകൾക്ക് അനുവാദം ചോദിക്കേണ്ടി വരും</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
index 028c19c6..0ab2341 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Sekat kuki pihak ketiga</translation>
 <translation id="6206551242102657620">Sambungan selamat. Maklumat tapak</translation>
 <translation id="6216432067784365534">Pilihan <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Nyahpasang '<ph name="APP_NAME" />'?</translation>
 <translation id="6260852843601447737">Tutup dan laporkan penyalahgunaan</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> dan <ph name="PERMISSION_2" /> disekat</translation>
 <translation id="6270391203985052864">Tapak boleh membuat permintaan untuk menghantar pemberitahuan</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
index 176c746..8518bb2b9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Cookies van derden blokkeren</translation>
 <translation id="6206551242102657620">De verbinding is beveiligd. Site-informatie</translation>
 <translation id="6216432067784365534">Opties voor <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235"><ph name="APP_NAME" /> verwijderen?</translation>
 <translation id="6260852843601447737">Sluiten en misbruik melden</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> en <ph name="PERMISSION_2" /> geblokkeerd</translation>
 <translation id="6270391203985052864">Sites kunnen vragen of ze je meldingen mogen sturen</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
index 1e543f3..9b2682ae 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokkér informasjonskapsler fra tredjeparter</translation>
 <translation id="6206551242102657620">Tilkoblingen er sikker. Informasjon om nettstedet</translation>
 <translation id="6216432067784365534">Alternativer for <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Vil du avinstallere «<ph name="APP_NAME" />»?</translation>
 <translation id="6260852843601447737">Lukk og rapportér misbruk</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> og <ph name="PERMISSION_2" /> er blokkert</translation>
 <translation id="6270391203985052864">Nettsteder kan be om å få sende deg varsler</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
index 3d3cd66..59219fad 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">ତୃତୀୟ ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation>
 <translation id="6206551242102657620">ସଂଯୋଗ ସୁରକ୍ଷିତ ଅଟେ। ସାଇଟ୍ ସୂଚନା</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> ବିକଳ୍ପ</translation>
+<translation id="6231752747840485235">'<ph name="APP_NAME" />' କୁ ଅନଇନଷ୍ଟଲ୍ କରିବେ?</translation>
 <translation id="6260852843601447737">ବନ୍ଦ କରି ଅପବ୍ୟବହାରର ରିପୋର୍ଟ କରନ୍ତୁ</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> ଏବଂ <ph name="PERMISSION_2" />କୁ ବ୍ଲକ୍ କରାଯାଇଛି</translation>
 <translation id="6270391203985052864">ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ପଠାଇବାକୁ ସାଇଟ୍‌ଗୁଡ଼ିକ ପଚାରିପାରିବେ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
index 8861c1c4..2cc3c00b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">ਤੀਜੀ-ਧਿਰ ਵਾਲੀਆਂ ਕੁੱਕੀਜ਼ ਨੂੰ ਬਲੌਕ ਕਰੋ</translation>
 <translation id="6206551242102657620">ਕਨੈਕਸ਼ਨ ਸੁਰੱਖਿਅਤ ਹੈ। ਸਾਈਟ ਜਾਣਕਾਰੀ</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> ਵਿਕਲਪ</translation>
+<translation id="6231752747840485235">ਕੀ '<ph name="APP_NAME" />' ਨੂੰ ਅਣਸਥਾਪਤ ਕਰਨਾ ਹੈ?</translation>
 <translation id="6260852843601447737">ਬੰਦ ਕਰੋ ਅਤੇ ਦੁਰਵਿਹਾਰ ਲਈ ਰਿਪੋਰਟ ਕਰੋ</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> ਅਤੇ <ph name="PERMISSION_2" /> ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ</translation>
 <translation id="6270391203985052864">ਸਾਈਟਾਂ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
index 4b246e06..dd9cf8c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokuj pliki cookie innych firm</translation>
 <translation id="6206551242102657620">Połączenie jest bezpieczne. Informacje o witrynie</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – opcje</translation>
+<translation id="6231752747840485235">Odinstalować aplikację „<ph name="APP_NAME" />”?</translation>
 <translation id="6260852843601447737">Zamknij i zgłoś nadużycie</translation>
 <translation id="6262279340360821358">Zablokowane: <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Strony mogą prosić o zgodę na wysyłanie powiadomień</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
index 76920783..c7066f9c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloquear cookies de terceiros</translation>
 <translation id="6206551242102657620">A conexão é segura. Informações do site</translation>
 <translation id="6216432067784365534">Opções de <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Desinstalar <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Fechar e denunciar abuso</translation>
 <translation id="6262279340360821358">Bloqueadas: <ph name="PERMISSION_1" /> e <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Os sites podem pedir para enviar notificações</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
index 199f98c..0700761 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Bloquear cookies de terceiros</translation>
 <translation id="6206551242102657620">A ligação é segura. Informações do site</translation>
 <translation id="6216432067784365534">Opções de <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Pretende desinstalar a app "<ph name="APP_NAME" />"?</translation>
 <translation id="6260852843601447737">Fechar e comunicar abuso</translation>
 <translation id="6262279340360821358">Bloqueio de <ph name="PERMISSION_1" /> e <ph name="PERMISSION_2" />.</translation>
 <translation id="6270391203985052864">Os sites podem pedir para enviar notificações.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
index 1a7cdc9..3edbb10 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blochează cookie-urile terță parte</translation>
 <translation id="6206551242102657620">Conexiunea este sigură. Informații despre site</translation>
 <translation id="6216432067784365534">Opțiuni pentru <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Dezinstalezi <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Închide și raportează un abuz</translation>
 <translation id="6262279340360821358">Sunt blocate <ph name="PERMISSION_1" /> și <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Site-urile îți pot solicita să îți trimită notificări</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
index 6197d06..ea7509d 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Блокировать сторонние файлы cookie</translation>
 <translation id="6206551242102657620">Подключение защищено. Информация о сайте</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: параметры</translation>
+<translation id="6231752747840485235">Удалить приложение "<ph name="APP_NAME" />"?</translation>
 <translation id="6260852843601447737">Закрыть и сообщить о нарушении</translation>
 <translation id="6262279340360821358">Заблокировано: <ph name="PERMISSION_1" /> и <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Сайты могут запрашивать разрешения на отправку уведомлений</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
index 8f2804df..86a7568 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">තෙවන-පාර්ශ්ව කුකී අවහිර කරන්න</translation>
 <translation id="6206551242102657620">සම්බන්ධතාවය සුරක්ෂිතයි. අඩවි තොරතුරු</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> විකල්ප</translation>
+<translation id="6231752747840485235">'<ph name="APP_NAME" />' අස්ථාපන කරන්නද?</translation>
 <translation id="6260852843601447737">වසන්න සහ අපයෝජනය වාර්තා කරන්න</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> සහ <ph name="PERMISSION_2" /> අවහිර කරන ලදි</translation>
 <translation id="6270391203985052864">වෙබ් අඩවිවලට දැනුම්දීම් යැවීමට ඉල්ලිය හැක</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
index 63fa73c9..a6a9008f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokovať súbory cookie tretích strán</translation>
 <translation id="6206551242102657620">Spojenie je zabezpečené. Informácie o webe</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – možnosti</translation>
+<translation id="6231752747840485235">Chcete odinštalovať aplikáciu <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Zavrieť a nahlásiť zneužitie</translation>
 <translation id="6262279340360821358">Blokované: <ph name="PERMISSION_1" /> a <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Weby môžu žiadať o odosielanie upozornení</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
index 043d69c..e169595 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokiraj piškotke drugih spletnih mest</translation>
 <translation id="6206551242102657620">Povezava je varna. Podatki o spletnem mestu.</translation>
 <translation id="6216432067784365534">Možnosti za <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Želite odmestiti aplikacijo »<ph name="APP_NAME" />«?</translation>
 <translation id="6260852843601447737">Zaprite in prijavite zlorabo</translation>
 <translation id="6262279340360821358">Blokirano: <ph name="PERMISSION_1" /> in <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Spletna mesta vas lahko vprašajo, ali želite, da vam pošiljajo obvestila</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
index 70f6710..8876300 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blloko kukit e palëve të treta</translation>
 <translation id="6206551242102657620">Lidhja është e sigurt. Informacioni i faqes</translation>
 <translation id="6216432067784365534">Opsionet për <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Të çinstalohet "<ph name="APP_NAME" />"?</translation>
 <translation id="6260852843601447737">Mbyll dhe raporto abuzimin</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> dhe <ph name="PERMISSION_2" /> të bllokuara</translation>
 <translation id="6270391203985052864">Sajtet mund të kërkojnë të dërgojnë njoftime</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
index 7f4a3b0..bf1dbe2 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blokiraj kolačiće treće strane</translation>
 <translation id="6206551242102657620">Veza je bezbedna. Informacije o sajtu</translation>
 <translation id="6216432067784365534">Opcije stavke <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Želite da deinstalatirate „<ph name="APP_NAME" />“?</translation>
 <translation id="6260852843601447737">Zatvori i prijavi zloupotrebu</translation>
 <translation id="6262279340360821358">Dozvole <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /> su blokirane</translation>
 <translation id="6270391203985052864">Sajtovi mogu da traže da šalju obaveštenja</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
index bfa8544..7da5e3e 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Блокирај колачиће треће стране</translation>
 <translation id="6206551242102657620">Веза је безбедна. Информације о сајту</translation>
 <translation id="6216432067784365534">Опције ставке <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Желите да деинсталатирате „<ph name="APP_NAME" />“?</translation>
 <translation id="6260852843601447737">Затвори и пријави злоупотребу</translation>
 <translation id="6262279340360821358">Дозволе <ph name="PERMISSION_1" /> и <ph name="PERMISSION_2" /> су блокиране</translation>
 <translation id="6270391203985052864">Сајтови могу да траже да шаљу обавештења</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
index 0d42a25..25b36dd1 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Blockera cookies från tredje part</translation>
 <translation id="6206551242102657620">Anslutningen är säker. Webbplatsinformation</translation>
 <translation id="6216432067784365534">Alternativ för <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Vill du avinstallera <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Stäng och anmäl otillåten användning</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> och <ph name="PERMISSION_2" /> blockeras</translation>
 <translation id="6270391203985052864">Webbplatser får be om tillåtelse att skicka aviseringar</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
index f71a7ce..7aed5eed 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Zuia vidakuzi vya tovuti nyingine</translation>
 <translation id="6206551242102657620">Muunganisho ni salama. Maelezo ya tovuti</translation>
 <translation id="6216432067784365534">Chaguo za <ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">Ungependa kuondoa '<ph name="APP_NAME" />'?</translation>
 <translation id="6260852843601447737">Funga na uripoti matumizi mabaya</translation>
 <translation id="6262279340360821358">Umezuia <ph name="PERMISSION_1" /> na <ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">Tovuti zinaweza kukuuliza kutuma arifa</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
index 4718df1..0f1d4fbd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">บล็อกคุกกี้ของบุคคลที่สาม</translation>
 <translation id="6206551242102657620">การเชื่อมต่อปลอดภัย ข้อมูลเว็บไซต์</translation>
 <translation id="6216432067784365534">ตัวเลือกสำหรับ<ph name="NAME_OF_LIST_ITEM" /></translation>
+<translation id="6231752747840485235">ถอนการติดตั้ง "<ph name="APP_NAME" />" ไหม</translation>
 <translation id="6260852843601447737">ปิดและรายงานการละเมิด</translation>
 <translation id="6262279340360821358">บล็อก<ph name="PERMISSION_1" />และ<ph name="PERMISSION_2" /></translation>
 <translation id="6270391203985052864">เว็บไซต์ขออนุญาตเพื่อส่งการแจ้งเตือนได้</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
index 22df43a..7741494 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Üçüncü taraf çerezlerini engelle</translation>
 <translation id="6206551242102657620">Bağlantı güvenli. Site bilgileri</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Seçenekleri</translation>
+<translation id="6231752747840485235">"<ph name="APP_NAME" />" uygulaması kaldırılsın mı?</translation>
 <translation id="6260852843601447737">Kapatıp kötüye kullanımı bildirin</translation>
 <translation id="6262279340360821358"><ph name="PERMISSION_1" /> ve <ph name="PERMISSION_2" /> engellendi</translation>
 <translation id="6270391203985052864">Siteler bildirim gönderme izni isteyebilir</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
index c7e247c..e198eba 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Блокувати сторонні файли cookie</translation>
 <translation id="6206551242102657620">З’єднання безпечне. Інформація про сайт</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: опції</translation>
+<translation id="6231752747840485235">Видалити додаток <ph name="APP_NAME" />?</translation>
 <translation id="6260852843601447737">Закрити й повідомити про порушення</translation>
 <translation id="6262279340360821358">Заблоковано: "<ph name="PERMISSION_1" />" і "<ph name="PERMISSION_2" />"</translation>
 <translation id="6270391203985052864">Сайти можуть просити дозвіл надсилати сповіщення</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
index b6beb49..007a4a2e 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">阻止第三方 Cookie</translation>
 <translation id="6206551242102657620">连接是安全的。网站信息</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />选项</translation>
+<translation id="6231752747840485235">卸载“<ph name="APP_NAME" />”?</translation>
 <translation id="6260852843601447737">关闭此应用并举报它的滥用行为</translation>
 <translation id="6262279340360821358">已禁用“<ph name="PERMISSION_1" />”权限和“<ph name="PERMISSION_2" />”权限</translation>
 <translation id="6270391203985052864">网站可以询问能否向您发送通知</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
index a13e9d4..90ab1f5 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">封鎖第三方 Cookie</translation>
 <translation id="6206551242102657620">連線安全。網站資料</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />選項</translation>
+<translation id="6231752747840485235">要解除安裝「<ph name="APP_NAME" />」嗎?</translation>
 <translation id="6260852843601447737">關閉並報告濫用情況</translation>
 <translation id="6262279340360821358">已封鎖「<ph name="PERMISSION_1" />」和「<ph name="PERMISSION_2" />」</translation>
 <translation id="6270391203985052864">網站將可以要求向您傳送通知</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
index ed0c37c..4462423 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">封鎖第三方 Cookie</translation>
 <translation id="6206551242102657620">已建立安全連線。網站資訊</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />選項</translation>
+<translation id="6231752747840485235">要解除安裝「<ph name="APP_NAME" />」嗎?</translation>
 <translation id="6260852843601447737">關閉並檢舉濫用情形</translation>
 <translation id="6262279340360821358">已封鎖「<ph name="PERMISSION_1" />」和「<ph name="PERMISSION_2" />」</translation>
 <translation id="6270391203985052864">網站可以要求傳送通知給你</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
index 5458402..f9a4622 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -201,6 +201,7 @@
 <translation id="6196640612572343990">Vimba amakhukhi enkampani yangaphandle</translation>
 <translation id="6206551242102657620">Uxhumo luphephile. Ulwazi lwesayithi</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Izinketho</translation>
+<translation id="6231752747840485235">Khipha i-'<ph name="APP_NAME" />'?</translation>
 <translation id="6260852843601447737">Vala bese ubika ukuhlukunyezwa</translation>
 <translation id="6262279340360821358">I-<ph name="PERMISSION_1" /> ne-<ph name="PERMISSION_2" /> kuvinjelwe</translation>
 <translation id="6270391203985052864">Amasayithi angacela ukuthumela izaziso</translation>
diff --git a/components/feed/core/v2/feed_network_impl_unittest.cc b/components/feed/core/v2/feed_network_impl_unittest.cc
index 6b507ed..d55b2b7 100644
--- a/components/feed/core/v2/feed_network_impl_unittest.cc
+++ b/components/feed/core/v2/feed_network_impl_unittest.cc
@@ -89,7 +89,8 @@
 class FeedNetworkTest : public testing::Test {
  public:
   FeedNetworkTest() {
-    identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com");
+    identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com",
+                                                   signin::ConsentLevel::kSync);
     identity_test_env_.SetAutomaticIssueOfAccessTokens(true);
   }
   FeedNetworkTest(FeedNetworkTest&) = delete;
diff --git a/components/gcm_driver/gcm_account_tracker_unittest.cc b/components/gcm_driver/gcm_account_tracker_unittest.cc
index c7c6ec4..cbc0a28 100644
--- a/components/gcm_driver/gcm_account_tracker_unittest.cc
+++ b/components/gcm_driver/gcm_account_tracker_unittest.cc
@@ -219,7 +219,8 @@
   // setting of the primary account is done afterward to check that the flow
   // that ensues from the GoogleSigninSucceeded callback firing works as
   // expected.
-  return identity_test_env_.MakePrimaryAccountAvailable(email);
+  return identity_test_env_.MakePrimaryAccountAvailable(
+      email, signin::ConsentLevel::kSync);
 }
 
 void GCMAccountTrackerTest::RemoveAccount(const CoreAccountId& account_id) {
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc
index c3f16455..13991c3 100644
--- a/components/history/core/browser/history_service.cc
+++ b/components/history/core/browser/history_service.cc
@@ -1073,7 +1073,7 @@
   // NOTE(mastiz): If this implementation changes, be cautious with implications
   // for sync, because a) the sync engine (sync thread) post tasks directly to
   // the task runner via ModelTypeProcessorProxy (which is subtle); and b)
-  // ProfileSyncService (UI thread) does the same via
+  // SyncServiceImpl (UI thread) does the same via
   // ProxyModelTypeControllerDelegate.
   backend_task_runner_->PostTask(FROM_HERE, std::move(task));
 }
diff --git a/components/history/core/browser/web_history_service_unittest.cc b/components/history/core/browser/web_history_service_unittest.cc
index 1e1caae6..36774ca6 100644
--- a/components/history/core/browser/web_history_service_unittest.cc
+++ b/components/history/core/browser/web_history_service_unittest.cc
@@ -210,10 +210,6 @@
 }  // namespace
 
 // A test class used for testing the WebHistoryService class.
-// In order for WebHistoryService to be valid, we must have a valid
-// ProfileSyncService. Using the ProfileSyncServiceMock class allows to
-// assign specific return values as needed to make sure the web history
-// service is available.
 class WebHistoryServiceTest : public testing::Test {
  public:
   WebHistoryServiceTest()
diff --git a/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc b/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
index 1ec91a55..36a34fc1d 100644
--- a/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
+++ b/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
@@ -139,8 +139,8 @@
   void SetUp() override {
     PerUserTopicSubscriptionManager::RegisterProfilePrefs(
         pref_service_.registry());
-    AccountInfo account =
-        identity_test_env_.MakePrimaryAccountAvailable("example@gmail.com");
+    AccountInfo account = identity_test_env_.MakePrimaryAccountAvailable(
+        "example@gmail.com", signin::ConsentLevel::kSync);
     identity_test_env_.SetAutomaticIssueOfAccessTokens(true);
     identity_provider_ = std::make_unique<ProfileIdentityProvider>(
         identity_test_env_.identity_manager());
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher_impl_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_fetcher_impl_unittest.cc
index e43b44ad..4ecb9b1 100644
--- a/components/ntp_snippets/remote/remote_suggestions_fetcher_impl_unittest.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_fetcher_impl_unittest.cc
@@ -204,7 +204,10 @@
     fetcher_->SetClockForTesting(task_environment_.GetMockClock());
   }
 
-  void SignIn() { identity_test_env_.MakePrimaryAccountAvailable(kTestEmail); }
+  void SignIn() {
+    identity_test_env_.MakePrimaryAccountAvailable(kTestEmail,
+                                                   signin::ConsentLevel::kSync);
+  }
 
   RemoteSuggestionsFetcher::SnippetsAvailableCallback
   ToSnippetsAvailableCallback(MockSnippetsAvailableCallback* callback) {
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc b/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc
index d2b0972d..140c0dd 100644
--- a/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc
+++ b/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc
@@ -216,7 +216,8 @@
 }
 
 void LocalHistoryZeroSuggestProviderTest::SignIn() {
-  identity_env_->MakeUnconsentedPrimaryAccountAvailable("test@email.com");
+  identity_env_->MakePrimaryAccountAvailable("test@email.com",
+                                             signin::ConsentLevel::kSignin);
 }
 
 void LocalHistoryZeroSuggestProviderTest::SignOut() {
diff --git a/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc b/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
index a739396..e1efd71 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
+++ b/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
@@ -50,7 +50,13 @@
 void PageContentAnnotationsModelManager::Annotate(
     const std::string& text,
     PageContentAnnotatedCallback callback) {
-  if (!page_topics_model_executor_handle_->ModelAvailable()) {
+  bool model_available = page_topics_model_executor_handle_->ModelAvailable();
+
+  base::UmaHistogramBoolean(
+      "OptimizationGuide.PageContentAnnotationsService.ModelAvailable",
+      model_available);
+
+  if (!model_available) {
     // TODO(crbug/1177102): Figure out if we want to enqueue it for later if
     // model isn't ready, but if we call this when the model isn't ready, it
     // will just return absl::nullopt for now.
diff --git a/components/password_manager/core/browser/bulk_leak_check_service.cc b/components/password_manager/core/browser/bulk_leak_check_service.cc
index 68157c2..9688486 100644
--- a/components/password_manager/core/browser/bulk_leak_check_service.cc
+++ b/components/password_manager/core/browser/bulk_leak_check_service.cc
@@ -57,8 +57,6 @@
 }
 
 void BulkLeakCheckService::MetricsReporter::OnCancelCheck() {
-  base::UmaHistogramCounts1000("PasswordManager.BulkCheck.CanceledCredentials",
-                               credential_count_);
   base::UmaHistogramMediumTimes("PasswordManager.BulkCheck.CanceledTime",
                                 timer_since_start_.Elapsed());
 
diff --git a/components/password_manager/core/browser/bulk_leak_check_service_unittest.cc b/components/password_manager/core/browser/bulk_leak_check_service_unittest.cc
index 48bbedc..8eff1fc 100644
--- a/components/password_manager/core/browser/bulk_leak_check_service_unittest.cc
+++ b/components/password_manager/core/browser/bulk_leak_check_service_unittest.cc
@@ -276,12 +276,7 @@
   EXPECT_EQ(BulkLeakCheckService::State::kCanceled, service().GetState());
   EXPECT_EQ(0u, service().GetPendingChecksCount());
   histogram_tester().ExpectUniqueSample(
-      "PasswordManager.BulkCheck.CanceledCredentials", 2, 1);
-  histogram_tester().ExpectUniqueSample(
       "PasswordManager.BulkCheck.CanceledTime", kMockElapsedTime, 1);
-  EXPECT_THAT(
-      histogram_tester().GetTotalCountsForPrefix("PasswordManager.BulkCheck"),
-      ::testing::SizeIs(2));
 
   service().RemoveObserver(&observer);
 }
diff --git a/components/password_manager/core/browser/password_store_signin_notifier_impl_unittest.cc b/components/password_manager/core/browser/password_store_signin_notifier_impl_unittest.cc
index 6d33f89..db92c24b 100644
--- a/components/password_manager/core/browser/password_store_signin_notifier_impl_unittest.cc
+++ b/components/password_manager/core/browser/password_store_signin_notifier_impl_unittest.cc
@@ -45,7 +45,8 @@
 TEST_F(PasswordStoreSigninNotifierImplTest, Subscribed) {
   PasswordStoreSigninNotifierImpl notifier(identity_manager());
   notifier.SubscribeToSigninEvents(store_.get());
-  identity_test_env()->MakePrimaryAccountAvailable("test@example.com");
+  identity_test_env()->MakePrimaryAccountAvailable("test@example.com",
+                                                   signin::ConsentLevel::kSync);
   testing::Mock::VerifyAndClearExpectations(store_.get());
   EXPECT_CALL(*store_, ClearAllGaiaPasswordHash());
   identity_test_env()->ClearPrimaryAccount();
@@ -59,7 +60,8 @@
   notifier.SubscribeToSigninEvents(store_.get());
   notifier.UnsubscribeFromSigninEvents();
   EXPECT_CALL(*store_, ClearAllGaiaPasswordHash()).Times(0);
-  identity_test_env()->MakePrimaryAccountAvailable("test@example.com");
+  identity_test_env()->MakePrimaryAccountAvailable("test@example.com",
+                                                   signin::ConsentLevel::kSync);
   identity_test_env()->ClearPrimaryAccount();
 }
 
@@ -71,7 +73,8 @@
   PasswordStoreSigninNotifierImpl notifier(identity_manager());
   notifier.SubscribeToSigninEvents(store_.get());
 
-  identity_test_env()->MakePrimaryAccountAvailable("username");
+  identity_test_env()->MakePrimaryAccountAvailable("username",
+                                                   signin::ConsentLevel::kSync);
   testing::Mock::VerifyAndClearExpectations(store_.get());
   EXPECT_CALL(*store_, ClearGaiaPasswordHash("username2"));
   auto* identity_manager = identity_test_env()->identity_manager();
diff --git a/components/password_manager/core/browser/sync_username_test_base.cc b/components/password_manager/core/browser/sync_username_test_base.cc
index 6d7efaf3..d763ee14 100644
--- a/components/password_manager/core/browser/sync_username_test_base.cc
+++ b/components/password_manager/core/browser/sync_username_test_base.cc
@@ -51,7 +51,8 @@
             .email,
         email);
   } else {
-    identity_test_env_.MakePrimaryAccountAvailable(email);
+    identity_test_env_.MakePrimaryAccountAvailable(email,
+                                                   signin::ConsentLevel::kSync);
   }
 }
 
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 40e27fb0..712b167c 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -18108,7 +18108,10 @@
       isolated context. Chrome will require cross-origin isolation when using
       SharedArrayBuffers from Chrome 91 onward (2021-05-25) for Web Compatibility
       reasons. Additional details can be found on:
-      https://developer.chrome.com/blog/enabling-shared-array-buffer/.''',
+      https://developer.chrome.com/blog/enabling-shared-array-buffer/.
+      When set to True, sites can use SharedArrayBuffer with no restrictions.
+      When set to False or not set, sites can only use SharedArrayBuffers when
+      cross-origin isolated.''',
     },
     {
       'name': 'WebDriverOverridesIncompatiblePolicies',
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 4dffa0d..57e3fb1 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -3657,7 +3657,7 @@
 <translation id="5860010874344790473">Wenn die Richtlinie aktiviert ist, werden Systemprotokolle an den Verwaltungsserver gesendet, damit Administratoren die Protokolle beobachten können.
 
       Ist sie deaktiviert oder nicht konfiguriert, werden keine Systemprotokolle gemeldet.</translation>
-<translation id="5861856285460256766">Konfiguration von Elternzugriffscodes</translation>
+<translation id="5861856285460256766">Konfiguration von Elternzugangscodes</translation>
 <translation id="5868414965372171132">Netzwerkkonfiguration auf Nutzerebene</translation>
 <translation id="587242272905978723">Zulassen, dass <ph name="PLUGIN_VM_NAME" /> Nutzerdaten von <ph name="PLUGIN_VM_NAME" /> erhebt.
 
@@ -3893,6 +3893,9 @@
 
       Wird die Richtlinie nicht konfiguriert, können Nutzer das Design nach Belieben ändern.</translation>
 <translation id="6195802366906945965">Mit dieser Richtlinie kann festgelegt werden, ob die integrierte Zertifikatsprüfung zum Verifizieren von Serverzertifikaten verwendet wird</translation>
+<translation id="6198947200418556248">Diese Richtlinie wurde eingestellt. Falls Sie immer noch das alte Cookie-Verhalten benötigen, verwenden Sie stattdessen „<ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />“. Hiermit kann für alle Cookies das alte „<ph name="ATTRIBUTE_SAMESITE_NAME" />“-Verhalten wiederhergestellt werden. Wird es wiederhergestellt, werden Cookies, für die kein „<ph name="ATTRIBUTE_SAMESITE_NAME" />“-Attribut angegeben ist, so behandelt, als würden sie „<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />“ enthalten. Außerdem wird nicht mehr vorausgesetzt, dass Cookies mit dem Attribut „<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />“ auch das Attribut „<ph name="ATTRIBUTE_SECURE_NAME" />“ enthalten müssen, und bei der Auswertung, ob zwei Websites identisch sind, werden die Schemata nicht verglichen. Eine vollständige Beschreibung steht unter https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies zur Verfügung.
+
+          Wenn diese Richtlinie nicht konfiguriert ist, hängt das Standardverhalten von „<ph name="ATTRIBUTE_SAMESITE_NAME" />“ für Cookies von der jeweiligen Konfiguration der „<ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />“-, „<ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" />“- und „<ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />“-Funktion ab. Dies kann im Rahmen eines Testzeitraums oder durch Aktivieren oder Deaktivieren des „<ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />“-, „<ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" />“- oder „<ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" />“-Status festgelegt werden.</translation>
 <translation id="6208896993204286313"><ph name="PRODUCT_NAME" />-Richtliniendaten erfassen</translation>
 <translation id="6210259502936598222">Informationen zu Betriebssystem und <ph name="PRODUCT_NAME" />-Version erfassen</translation>
 <translation id="6212868225782276239">Alle Drucker außer denen in der Sperrliste werden angezeigt.</translation>
@@ -5076,17 +5079,17 @@
 <translation id="7613115815080726221">Zeitraum ohne Nutzereingabe, nach dem das Gerät in den Inaktivitätsmodus wechselt, angegeben in Millisekunden.</translation>
 <translation id="7614663184588396421">Liste der deaktivierten Protokollschemas</translation>
 <translation id="7616631530432070402">Cipher Suites von 3DES werden in TLS aktiviert</translation>
-<translation id="7620869951155758729">Anhand der in dieser Richtlinie angegebenen Konfiguration werden Elternzugriffscodes generiert und überprüft.
+<translation id="7620869951155758729">Anhand der in dieser Richtlinie angegebenen Konfiguration werden Elternzugangscodes generiert und überprüft.
 
-      |current_config| wird immer zum Generieren von Zugriffscodes verwendet und sollte nur für die Validierung verwendet werden, wenn dies mit |future_config| nicht möglich ist.
-      |future_config| ist die primäre Konfiguration zum Validieren von Zugriffscodes.
-      |old_configs| sollte nur zum Validieren von Zugriffscodes verwendet werden, wenn eine Validierung mit |future_config| oder |current_config| nicht möglich ist.
+      |current_config| wird immer zum Generieren von Zugangscodes verwendet und sollte nur für die Validierung verwendet werden, wenn dies mit |future_config| nicht möglich ist.
+      |future_config| ist die primäre Konfiguration zum Validieren von Zugangscodes.
+      |old_configs| sollte nur zum Validieren von Zugangscodes verwendet werden, wenn eine Validierung mit |future_config| oder |current_config| nicht möglich ist.
 
-      Mit dieser Richtlinie soll die Konfiguration von Zugriffscodes schrittweise rotiert werden. Die neue Konfiguration wird immer in |future_config| eingefügt, während gleichzeitig der vorhandene Wert in |current_config| verschoben wird. Die vorherigen Werte von |current_config| werden in |old_configs| verschoben und nach Beenden des Rotationszyklus entfernt.
+      Mit dieser Richtlinie soll die Konfiguration von Zugangscodes schrittweise rotiert werden. Die neue Konfiguration wird immer in |future_config| eingefügt, während gleichzeitig der vorhandene Wert in |current_config| verschoben wird. Die vorherigen Werte von |current_config| werden in |old_configs| verschoben und nach Beenden des Rotationszyklus entfernt.
 
       Diese Richtlinie gilt nur für Kinder.
-      Wenn diese Richtlinie festgelegt ist, kann der Elternzugriffscode auf dem Gerät des Kindes überprüft werden.
-      Ist die Richtlinie nicht festgelegt, kann der Elternzugriffscode auf dem Gerät des Kindes nicht überprüft werden.</translation>
+      Wenn diese Richtlinie festgelegt ist, kann der Elternzugangscode auf dem Gerät des Kindes überprüft werden.
+      Ist die Richtlinie nicht festgelegt, kann der Elternzugangscode auf dem Gerät des Kindes nicht überprüft werden.</translation>
 <translation id="7629840767216985001">Wenn Sie die Richtlinie auf "True" setzen, wird der große Cursor auf dem Anmeldebildschirm aktiviert. Wenn Sie die Richtlinie auf "False" setzen, wird der große Cursor auf dem Anmeldebildschirm deaktiviert.
 
       Wenn Sie diese Richtlinie konfigurieren, können Nutzer vorübergehend den großen Cursor aktivieren oder deaktivieren. Wenn der Anmeldebildschirm neu geladen wird oder eine Minute lang inaktiv bleibt, wird er in den Originalzustand zurückversetzt.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 3be9cae9..9fbcd33 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -3921,6 +3921,9 @@
 
       Si no la estableces, los usuarios podrán cambiar el tema de su navegador como prefieran.</translation>
 <translation id="6195802366906945965">Determina si se utilizará el verificador de certificados integrado para verificar los certificados de servidores</translation>
+<translation id="6198947200418556248">Esta política dejó de estar disponible. Si todavía necesitas el comportamiento heredado de las cookies, usa <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Permite revertir el comportamiento de todas las cookies conforme al atributo heredado <ph name="ATTRIBUTE_SAMESITE_NAME" />. Si se revierte el comportamiento conforme al atributo heredado, las cookies que no tengan un atributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> especificado se tratarán según el atributo "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />", las cookies con el atributo "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" ya no necesitarán el atributo "<ph name="ATTRIBUTE_SECURE_NAME" />", y se omitirá la comparación de esquemas cuando se evalúa si dos sitios son el mismo sitio. Para obtener la descripción completa, consulta https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
+
+          Si no se establece esta política, el comportamiento predeterminado <ph name="ATTRIBUTE_SAMESITE_NAME" /> para las cookies dependerá de la configuración personal del usuario para las funciones <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> y <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />, las cuales pueden establecerse con una prueba pública o si se habilitan o inhabilitan las marcas <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> o <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" />, respectivamente.</translation>
 <translation id="6208896993204286313">Enviar la información de la política de <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">Enviar la información del SO y de la versión de <ph name="PRODUCT_NAME" /></translation>
 <translation id="6212868225782276239">Se muestran todas las impresoras, excepto las de la lista negra.</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 5bfd777..85854bd 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -811,7 +811,7 @@
       Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> no es un valor aceptado para esta política.</translation>
 <translation id="2043749682619281558">Habilita el resaltado del cursor en la pantalla de inicio de sesión</translation>
 <translation id="2043770014371753404">Impresoras de empresa inhabilitadas</translation>
-<translation id="2057317273526988987">Permitir el acceso a una lista de URL</translation>
+<translation id="2057317273526988987">Permitir el acceso a una lista de URLs</translation>
 <translation id="2061123930713023976">Permite capturas de paquetes de red de depuración</translation>
 <translation id="2061810934846663491">Configurar los nombres de dominio obligatorios para hosts de acceso remoto</translation>
 <translation id="2069350366303315077">Si se habilita la política, <ph name="PRODUCT_NAME" /> usará sesiones de invitado e impedirá inicios de sesión de perfiles. Las sesiones de invitado son perfiles de <ph name="PRODUCT_NAME" /> en los que las ventanas están en modo de incógnito.
@@ -3937,6 +3937,9 @@
 
       Si no se asigna ningún valor a la política, los usuarios podrán cambiar al tema que prefieran en su navegador.</translation>
 <translation id="6195802366906945965">Determina si se utilizará el verificador de certificados integrado para verificar los certificados de los servidores</translation>
+<translation id="6198947200418556248">Esta política está obsoleta. Si necesitas que las cookies tengan el comportamiento antiguo, usa <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Te permite revertir todas las cookies al comportamiento antiguo de <ph name="ATTRIBUTE_SAMESITE_NAME" />. Si restableces el comportamiento antiguo, las cookies que no especifiquen un atributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> se tratarán como si fueran <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />. Además, se eliminará el requisito de que las cookies <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> tengan el atributo <ph name="ATTRIBUTE_SECURE_NAME" /> y se omitirá la comparación de esquemas cuando se evalúe si dos sitios son iguales. Para ver la descripción completa, consulta https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
+
+          Si no se establece esta política, el comportamiento predeterminado de <ph name="ATTRIBUTE_SAMESITE_NAME" /> correspondiente a las cookies dependerá de la configuración personal del usuario en las funciones <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> y <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />, que pueden definirse mediante una prueba pública o mediante la habilitación o la inhabilitación de las marcas <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> o <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> (respectivamente).</translation>
 <translation id="6208896993204286313">Proporcionar información de políticas de <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">Proporcionar información de versiones del SO y de <ph name="PRODUCT_NAME" /></translation>
 <translation id="6212868225782276239">Se muestran todas las impresas excepto las que se incluyen en la lista negra.</translation>
@@ -6275,7 +6278,7 @@
 
       Si se asigna el valor "Falso" a esta política o no se establece, no se enviará ninguna información.
       Si se le asigna el valor "Verdadero", se enviará información sobre el sistema del dispositivo.</translation>
-<translation id="913195841488580904">Bloquear el acceso a una lista de URL</translation>
+<translation id="913195841488580904">Bloquear el acceso a una lista de URLs</translation>
 <translation id="9135033364005346124">Habilitar el proxy de <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="9136399279941091445">Intervalos fuera del horario en los que se publican las políticas de dispositivos especificadas</translation>
 <translation id="9150416707757015439">Esta política está obsoleta. Te recomendamos que uses IncognitoModeAvailability en su lugar.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 8d9e428..e1898b5 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -3911,6 +3911,9 @@
 
       En revanche, ils peuvent appliquer le thème de leur choix au navigateur si la règle n'est pas configurée.</translation>
 <translation id="6195802366906945965">Déterminer si l'outil de vérification des certificats intégré sera utilisé pour vérifier les certificats des serveurs</translation>
+<translation id="6198947200418556248">Cette règle est obsolète. Si vous nécessitez toujours l'ancien comportement des cookies, veuillez utiliser <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Permet de rétablir l'ancien comportement <ph name="ATTRIBUTE_SAMESITE_NAME" /> pour tous les cookies. Si vous rétablissez l'ancien comportement, les cookies dont la valeur de l'attribut <ph name="ATTRIBUTE_SAMESITE_NAME" /> n'est pas spécifiée sont traités comme si la valeur "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" était définie. Ceux dont l'attribut a pour valeur "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" n'exigent plus que la valeur de l'attribut "<ph name="ATTRIBUTE_SECURE_NAME" />" soit spécifiée. Les schémas ne sont pas non plus comparés pour déterminer si deux sites sont identiques ou non. Pour obtenir une description complète, consultez https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
+
+          Lorsque cette règle n'est pas configurée, le comportement <ph name="ATTRIBUTE_SAMESITE_NAME" /> par défaut des cookies dépend de la configuration personnelle de l'utilisateur concernant les fonctionnalités <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> et <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />, qui peut être définie lors d'un test, ou par l'activation ou la désactivation des indicateurs <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> ou <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" />, respectivement.</translation>
 <translation id="6208896993204286313">Enregistrer les informations sur les règles concernant <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">Enregistrer les informations sur la version de <ph name="PRODUCT_NAME" /> et l'OS</translation>
 <translation id="6212868225782276239">Toutes les imprimantes sont affichées à l'exception de celles qui sont répertoriées dans la liste noire.</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 8097973e..8c087a6 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -3938,6 +3938,9 @@
 
       Jika kebijakan tidak disetel, pengguna akan dapat mengubah tema browser sesuai keinginan.</translation>
 <translation id="6195802366906945965">Menentukan apakah pemverifikasi sertifikat bawaan akan digunakan untuk memverifikasi sertifikat server</translation>
+<translation id="6198947200418556248">Kebijakan ini tidak digunakan lagi. Jika Anda masih memerlukan perilaku cookie lama, gunakan <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Mengizinkan Anda mengembalikan semua cookie ke perilaku <ph name="ATTRIBUTE_SAMESITE_NAME" /> lama. Pengembalian ke perilaku lama akan menyebabkan cookie yang tidak menentukan atribut <ph name="ATTRIBUTE_SAMESITE_NAME" /> dianggap sebagai "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />", menghapus persyaratan bagi cookie "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" untuk membawa atribut "<ph name="ATTRIBUTE_SECURE_NAME" />", dan melewati perbandingan skema saat evaluasi jika dua situs adalah situs yang sama. Lihat penjelasan lengkapnya di https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
+
+          Jika kebijakan ini tidak disetel, perilaku <ph name="ATTRIBUTE_SAMESITE_NAME" /> default bagi cookie akan bergantung pada konfigurasi pribadi pengguna untuk fitur <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, fitur <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" />, dan fitur <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" /> yang dapat disetel berdasarkan uji coba lapangan atau dengan mengaktifkan atau menonaktifkan tanda <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, tanda <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" />, atau tanda <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" />, secara berurutan.</translation>
 <translation id="6208896993204286313">Melaporkan Informasi Kebijakan <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">Laporkan OS dan Informasi Versi <ph name="PRODUCT_NAME" /></translation>
 <translation id="6212868225782276239">Semua printer ditampilkan, kecuali printer yang tidak diizinkan.</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 540eb880..d0a3cb6 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -3890,6 +3890,9 @@
 
       Lasciare il criterio non impostato consente agli utenti di modificare il tema del browser come preferiscono.</translation>
 <translation id="6195802366906945965">Consente di stabilire se verrà utilizzato lo strumento di verifica dei certificati integrato per verificare i certificati dei server</translation>
+<translation id="6198947200418556248">Questo criterio è deprecato. Se hai ancora bisogno del comportamento dei cookie precedente, usa il criterio <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Ti consente di ripristinare il comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> precedente per tutti i cookie. Se ripristini il comportamento precedente, i cookie per cui non è specificato un attributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> vengono considerati come se avessero il valore "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />"; viene rimosso il requisito che richiede che i cookie "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" abbiano l'attributo "<ph name="ATTRIBUTE_SECURE_NAME" />" e viene ignorato il confronto tra schemi nel valutare se due siti sono uno stesso sito. Per una descrizione completa, visita la pagina https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
+
+          Se questo criterio non viene impostato, il comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> predefinito per i cookie dipenderà dalla configurazione personale dell'utente per la funzionalità <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, la funzionalità <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> e la funzionalità <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />, che potrebbero essere impostate in base a una prova pubblica o tramite l'attivazione o disattivazione rispettivamente dei flag <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> o <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" />.</translation>
 <translation id="6208896993204286313">Segnala informazioni sulle norme di <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">Segnala informazioni sulla versione del sistema operativo e di <ph name="PRODUCT_NAME" /></translation>
 <translation id="6212868225782276239">Vengono mostrate tutte le stampanti, tranne quelle indicate nella lista nera.</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 85ee586..441ed88 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -3787,6 +3787,9 @@
 
       このポリシーを未設定のままにした場合、ユーザーはブラウザのテーマを自由に変更できます。</translation>
 <translation id="6195802366906945965">サーバー証明書の確認に組み込みの証明書確認機能を使用する</translation>
+<translation id="6198947200418556248">このポリシーはサポートが終了しています。Cookie を以前の動作に戻す必要がある場合は、<ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" /> ポリシーを使用してください。すべての Cookie を以前の <ph name="ATTRIBUTE_SAMESITE_NAME" /> 動作に戻します。以前の動作に戻すと、<ph name="ATTRIBUTE_SAMESITE_NAME" /> 属性のない Cookie は「<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />」が指定されたものとして扱われます。また、「<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />」の Cookie に「<ph name="ATTRIBUTE_SECURE_NAME" />」属性は必須ではなくなります。さらに、2 つのサイトが同一サイトかどうかを評価する際に、スキーム比較がスキップされます。詳細については https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies をご覧ください。
+
+          このポリシーを設定しない場合、Cookie のデフォルトの <ph name="ATTRIBUTE_SAMESITE_NAME" /> 動作は、<ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 機能、<ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> 機能、<ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" /> 機能に対するユーザーの個人設定(公開テストで、またはそれぞれ <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> フラグ、<ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> フラグ、<ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> フラグを有効か無効にすることで設定される)によって決まります。</translation>
 <translation id="6208896993204286313"><ph name="PRODUCT_NAME" /> のポリシー情報に関するレポートを作成</translation>
 <translation id="6210259502936598222">OS と <ph name="PRODUCT_NAME" /> のバージョン情報に関するレポートを作成</translation>
 <translation id="6212868225782276239">ブラックリスト登録されている以外のすべてのプリンタを表示する。</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 5f5f6229..ba7661c 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -3933,6 +3933,9 @@
 
       정책을 설정하지 않으면 사용자가 원하는 대로 브라우저의 테마를 변경할 수 있습니다.</translation>
 <translation id="6195802366906945965">서버 인증서 확인을 위해 내장 인증서 확인 기능을 사용할지 결정</translation>
+<translation id="6198947200418556248">이 정책은 지원 중단되었으므로 기존 쿠키 동작이 계속 필요하면 <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />를 사용하세요. 모든 쿠키를 기존 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 동작으로 되돌릴 수 있습니다. 기존 동작으로 되돌리면 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 속성이 지정되지 않은 쿠키가 "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />"인 것처럼 처리되고, "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" 쿠키가 "<ph name="ATTRIBUTE_SECURE_NAME" />" 속성을 전달하지 않아도 되며, 두 사이트가 동일한 사이트인지 평가할 때 스킴 비교를 건너뜁니다. https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies에서 전체 설명을 확인하세요.
+
+          정책을 설정하지 않으면 쿠키의 기본 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 동작은 <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 기능, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> 기능, <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" /> 기능의 사용자 개인 구성에 따라 달라지며, 이러한 구성은 초기 체험판을 통해 또는 <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 플래그, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> 플래그, <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> 플래그를 각각 사용 설정 또는 사용 중지하여 설정할 수 있습니다.</translation>
 <translation id="6208896993204286313"><ph name="PRODUCT_NAME" /> 정책 정보 보고</translation>
 <translation id="6210259502936598222">OS 및 <ph name="PRODUCT_NAME" /> 버전 정보 보고</translation>
 <translation id="6212868225782276239">차단 목록에 있는 프린터를 제외한 모든 프린터가 표시됨</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index a7f21bb..797f856 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -3867,6 +3867,9 @@
 
       Als je dit beleid niet instelt, kunnen gebruikers het thema voor de browser naar eigen inzicht instellen.</translation>
 <translation id="6195802366906945965">Bepaalt of de ingebouwde certificaatverificatie wordt gebruikt om servercertificaten te verifiëren</translation>
+<translation id="6198947200418556248">Dit beleid is beëindigd. Als je nog steeds verouderd cookiegedrag nodig hebt, gebruik je <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Hiermee kun je alle cookies terugzetten op het verouderde gedrag van <ph name="ATTRIBUTE_SAMESITE_NAME" />. Als je het verouderde gedrag terugzet, worden cookies waarin geen <ph name="ATTRIBUTE_SAMESITE_NAME" />-kenmerk is opgegeven, als <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> behandeld en wordt de vereiste weggenomen dat cookies van <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> het kenmerk <ph name="ATTRIBUTE_SECURE_NAME" /> bevatten. De schemavergelijking wordt overgeslagen tijdens de controle of 2 sites dezelfde site zijn. Zie https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies voor een volledige beschrijving.
+
+          Als je dit beleid niet instelt, is het standaardgedrag van <ph name="ATTRIBUTE_SAMESITE_NAME" /> voor cookies afhankelijk van de persoonlijke configuratie van de gebruiker voor de functies <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> en <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />. Deze functies kunnen worden ingesteld via een online test of door de markering <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> of <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> aan of uit te zetten.</translation>
 <translation id="6208896993204286313">Beleidsgegevens van <ph name="PRODUCT_NAME" /> rapporteren</translation>
 <translation id="6210259502936598222">OS- en <ph name="PRODUCT_NAME" />-versiegegevens rapporteren</translation>
 <translation id="6212868225782276239">Alle printers worden getoond, behalve printers op de blokkeerlijst.</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 8c2849f8..decf792 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -3913,6 +3913,9 @@
 
       Se a política for deixada sem definição, o usuário poderá mudar o tema do navegador como quiser.</translation>
 <translation id="6195802366906945965">Determina se o verificador integrado de certificados será usado para verificar os certificados do servidor</translation>
+<translation id="6198947200418556248">Esta política foi descontinuada. Se você ainda precisa de um comportamento de cookies legado, use a <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Com ela, é possível reverter todos os cookies para o comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> legado. A reversão para o comportamento legado faz com que os cookies que não especificam um atributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> sejam tratados como <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />, remove o requisito de que cookies <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> precisam ter o atributo <ph name="ATTRIBUTE_SECURE_NAME" /> e ignora a comparação do esquema ao avaliar se dois sites são o mesmo. Para ver uma descrição completa, consulte https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies (em inglês).
+
+          Quando esta política não é definida, o comportamento <ph name="ATTRIBUTE_SAMESITE_NAME" /> padrão para cookies depende da configuração pessoal do usuário para os recursos <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> e <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />, que podem ser definidos por um teste de campo ou ativando e desativando as sinalizações <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> ou <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" />, respectivamente.</translation>
 <translation id="6208896993204286313">Reportar informações da política do <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">Reportar informações sobre a versão do SO e do <ph name="PRODUCT_NAME" /></translation>
 <translation id="6212868225782276239">Todas as impressoras são mostradas, exceto as da lista de proibições.</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 27c024a..20a2b04 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -3899,6 +3899,9 @@
 
       Если правило не настроено, пользователи могут изменить тему браузера.</translation>
 <translation id="6195802366906945965">Определяет, будет ли использоваться встроенный инструмент верификации для проверки сертификатов сервера</translation>
+<translation id="6198947200418556248">Это правило больше не поддерживается. Если вам требуется ранее применявшееся поведение для файлов cookie, используйте правило <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Позволяет восстановить ранее применявшееся поведение для всех файлов cookie с атрибутом <ph name="ATTRIBUTE_SAMESITE_NAME" />. В этом случае файлы cookie, в которых не указан атрибут <ph name="ATTRIBUTE_SAMESITE_NAME" />, будут обрабатываться как файлы с атрибутом <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />. Кроме того, требование о наличии атрибута <ph name="ATTRIBUTE_SECURE_NAME" /> в файлах cookie с атрибутом <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> будет снято, а сравнение протоколов при оценке двух одинаковых сайтов будет пропущено. Полное описание правила приведено здесь: https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
+
+          Если правило не настроено, поведение атрибута <ph name="ATTRIBUTE_SAMESITE_NAME" /> по умолчанию для файлов cookie будет зависеть от пользовательских настроек функций <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> и <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />, которые можно задать с помощью экспериментальных функций или путем включения или отключения параметра <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> или <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> соответственно.</translation>
 <translation id="6208896993204286313">Сообщать данные правил <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">Сообщать информацию об ОС и версии <ph name="PRODUCT_NAME" /></translation>
 <translation id="6212868225782276239">Пользователи видят все принтеры, кроме тех, которые находятся в черном списке</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 6712ca8..4ed0419 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -3859,6 +3859,9 @@
 
       การไม่ตั้งค่านโยบายจะทำให้ผู้ใช้เปลี่ยนธีมของเบราว์เซอร์ได้ตามที่ต้องการ</translation>
 <translation id="6195802366906945965">กำหนดว่าจะใช้ตัวตรวจสอบใบรับรองในตัวเพื่อยืนยันใบรับรองเซิร์ฟเวอร์หรือไม่</translation>
+<translation id="6198947200418556248">นโยบายนี้เลิกใช้งานไปแล้ว หากคุณยังคงต้องการให้คุกกี้มีลักษณะการทำงานเดิม โปรดใช้ <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" /> อนุญาตให้คุณเปลี่ยนคุกกี้ทั้งหมดกลับไปมีลักษณะการทำงาน <ph name="ATTRIBUTE_SAMESITE_NAME" /> เช่นเดิมได้ การเปลี่ยนกลับไปใช้ลักษณะการทำงานเดิมทำให้คุกกี้ที่ไม่ได้ระบุแอตทริบิวต์ <ph name="ATTRIBUTE_SAMESITE_NAME" /> ได้รับการดำเนินการเหมือนกับเป็น "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />", นำข้อกำหนดที่คุกกี้ "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" ต้องมีแอตทริบิวต์ "<ph name="ATTRIBUTE_SECURE_NAME" />" ออกไป และข้ามการเปรียบเทียบสกีมเมื่อประเมินว่าเว็บไซต์ 2 แห่งเป็นเว็บไซต์เดียวกันหรือไม่ ดูคำอธิบายแบบเต็มใน https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies
+
+          เมื่อไม่ได้ตั้งค่านโยบายนี้ ลักษณะการทำงาน <ph name="ATTRIBUTE_SAMESITE_NAME" /> ที่เป็นค่าเริ่มต้นของคุกกี้จะขึ้นอยู่กับการกำหนดค่าส่วนตัวของผู้ใช้สำหรับฟีเจอร์ <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, ฟีเจอร์ <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> และฟีเจอร์ <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" /> ซึ่งอาจมีการตั้งค่าโดยการทดสอบในวงจำกัด หรือโดยการเปิดหรือปิดใช้แฟล็ก <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, แฟล็ก <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> หรือแฟล็ก <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> ตามลำดับ</translation>
 <translation id="6208896993204286313">รายงานข้อมูลนโยบายของ <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">รายงานข้อมูลระบบปฏิบัติการและเวอร์ชันของ <ph name="PRODUCT_NAME" /></translation>
 <translation id="6212868225782276239">เครื่องพิมพ์ทั้งหมดยกเว้นที่อยู่ในบัญชีดำจะปรากฏ</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index ce32360..8f1c527 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -3880,6 +3880,9 @@
 
       Bu politika ayarlanmadan bırakılırsa kullanıcılar tarayıcılarının temasını istedikleri gibi değiştirebilir.</translation>
 <translation id="6195802366906945965">Yerleşik sertifika doğrulayıcının sunucu sertifikalarını doğrulamak için kullanılıp kullanılmayacağını belirler.</translation>
+<translation id="6198947200418556248">Bu politika kullanımdan kaldırıldı. Eski çerez davranışına ihtiyacınız varsa lütfen <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" /> politikasını kullanın. Tüm çerezleri eski <ph name="ATTRIBUTE_SAMESITE_NAME" /> davranışına geri döndürmenize olanak tanır. Eski davranışa geri dönmek, <ph name="ATTRIBUTE_SAMESITE_NAME" /> özelliği belirtmeyen çerezlerin "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" gibi değerlendirilmesine neden olur, "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" çerezlerinin "<ph name="ATTRIBUTE_SECURE_NAME" />" özelliğini taşıma şartını ortadan kaldırır ve iki sitenin aynı URL'yi paylaşması durumunda, değerlendirirken şema karşılaştırmasını atlar. Tam açıklama için https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies adresine bakın.
+
+          Bu politika ayarlanmadığında; çerezler için varsayılan <ph name="ATTRIBUTE_SAMESITE_NAME" /> davranışı, kullanıcının <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> özelliğini kişisel yapılandırmasına, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> özelliğine ve saha denemesi tarafından ayarlanan veya sırasıyla <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> işaretinin, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> işaretinin ya da <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> işaretinin etkinleştirilmesi veya devre dışı bırakılması ile ayarlanan <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" /> özelliğine bağlıdır.</translation>
 <translation id="6208896993204286313"><ph name="PRODUCT_NAME" /> Politika Bilgilerini bildir</translation>
 <translation id="6210259502936598222">OS ve <ph name="PRODUCT_NAME" /> Sürümü Bilgilerini bildir</translation>
 <translation id="6212868225782276239">Kara listede olanlar hariç tüm yazıcılar gösterilir.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index a282bf64..fd22c01a 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -3936,6 +3936,9 @@
 
       Якщо це правило не налаштувати, користувачі зможуть вибирати тему для веб-переглядача.</translation>
 <translation id="6195802366906945965">Визначає, чи перевіряти сертифікати сервера за допомогою вбудованого інструмента перевірки сертифікатів</translation>
+<translation id="6198947200418556248">Це правило більше не підтримується. Якщо вам потрібна застаріла поведінка для файлів cookie, скористайтеся правилом <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Дозволяє налаштувати застарілу поведінку <ph name="ATTRIBUTE_SAMESITE_NAME" /> для всіх файлів cookie. Якщо повернутися до застарілої поведінки, файли cookie, у яких не вказано атрибут <ph name="ATTRIBUTE_SAMESITE_NAME" />, вважатимуться <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />, вимога, згідно з якою файли cookie <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> повинні мати атрибут <ph name="ATTRIBUTE_SECURE_NAME" />, скасується, а схема порівняння під час перевірки наявності атрибута same-site для двох сайтів пропускатиметься. Повний опис можна переглянути на сторінці https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies.
+
+          Якщо це правило не налаштувати, поведінка <ph name="ATTRIBUTE_SAMESITE_NAME" /> за умовчанням для файлів cookie залежатиме від того, як користувач налаштує функції <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> та <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" />. Це можна зробити на етапі тестування або ви можете поставити або зняти прапорець біля опцій <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />, <ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> чи <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> відповідно.</translation>
 <translation id="6208896993204286313">Повідомляти інформацію про правила <ph name="PRODUCT_NAME" /></translation>
 <translation id="6210259502936598222">Повідомляти інформацію про ОС і версію <ph name="PRODUCT_NAME" /></translation>
 <translation id="6212868225782276239">Відображаються всі принтери, крім тих, які є в чорному списку.</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index d9d5db6..e41039c8 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -3860,6 +3860,9 @@
 
       如果此政策未设置,用户可根据自己的偏好更改所用浏览器的主题。</translation>
 <translation id="6195802366906945965">确定是否会使用内置的证书验证程序来验证服务器证书</translation>
+<translation id="6198947200418556248">此政策已被弃用;如果您仍需设置旧版 Cookie 行为,请改用 <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />。此政策让您能够将所有 Cookie 都恢复为旧版 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 行为。恢复为旧版行为会导致未指定 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 属性的 Cookie 被当作“<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />”Cookie 来处理,会撤消“<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />”Cookie 必须附带“<ph name="ATTRIBUTE_SECURE_NAME" />”属性的要求,并会在评估两个网站是否为同一个网站时跳过架构对比。如需查看完整说明,请参阅 https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies。
+
+          如果此政策未设置,Cookie 的默认 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 行为将取决于用户针对 <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 功能、<ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> 功能和 <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" /> 功能(这些功能可通过现场试验来设置,也可通过启用或停用这些功能分别对应的 <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 标记、<ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> 标记或 <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> 标记来设置)指定的个人配置。</translation>
 <translation id="6208896993204286313">报告 <ph name="PRODUCT_NAME" /> 政策信息</translation>
 <translation id="6210259502936598222">报告操作系统和 <ph name="PRODUCT_NAME" /> 版本信息</translation>
 <translation id="6212868225782276239">系统会显示除黑名单中所列打印机之外的所有打印机。</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 3652269..b7476a0 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -3846,6 +3846,9 @@
 
       如果不設定這項政策,使用者則可依照個人偏好變更瀏覽器的主題。</translation>
 <translation id="6195802366906945965">決定是否使用內建憑證驗證器來驗證伺服器憑證</translation>
+<translation id="6198947200418556248">這項政策已淘汰;如果仍需要舊版 Cookie 行為,請改用 <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />。這項政策可以將所有 Cookie 還原成舊版的 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 行為。還原成舊版的行為會導致系統將未指定 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 屬性的 Cookie 視為「<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />」,並移除「<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />」Cookie 必須帶有「<ph name="ATTRIBUTE_SECURE_NAME" />」屬性的要求。此外,這也會讓系統在評估兩個網站的網址是否相同時,略過網路通訊協定的比較。如需完整說明,請參閱 https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies。
+
+          如果不設定這項政策,系統對 Cookie 採取的預設 <ph name="ATTRIBUTE_SAMESITE_NAME" /> 行為會取決於使用者對於 <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />、<ph name="FEATURE_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> 和 <ph name="FEATURE_NAME_SCHEMEFUL_SAME_SITE" /> 功能的個人配置。使用者可以透過公開實驗,或是分別啟用或停用 <ph name="FLAG_NAME_SAMESITE_BY_DEFAULT_COOKIES" />、<ph name="FLAG_NAME_SAMESITE_NONE_MUST_BE_SECURE" /> 或 <ph name="FLAG_NAME_SCHEMEFUL_SAME_SITE" /> 旗標,來設定這些功能的個人配置。</translation>
 <translation id="6208896993204286313">回報 <ph name="PRODUCT_NAME" /> 政策資訊</translation>
 <translation id="6210259502936598222">回報作業系統和 <ph name="PRODUCT_NAME" /> 版本資訊</translation>
 <translation id="6212868225782276239">顯示所有印表機 (黑名單中的印表機除外)。</translation>
diff --git a/components/safe_browsing/content/BUILD.gn b/components/safe_browsing/content/BUILD.gn
deleted file mode 100644
index d6e4b6d1..0000000
--- a/components/safe_browsing/content/BUILD.gn
+++ /dev/null
@@ -1,41 +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("//build/buildflag_header.gni")
-import("//components/safe_browsing/buildflags.gni")
-
-# safe_browsing/ pulls in content/, which doesn't work on iOS.
-# TODO(thakis): This should be `safe_browsing_mode != 0`, but chromecast builds
-# set safe_browsing_mode to 0 and build chrome/, and chrome/ currently
-# unconditionally depends on things in this build file. Make these dependencies
-# conditional on safe_browsing_mode != 0 and then change the conditional here.
-if (!is_ios) {
-  assert(!is_ios, "safe_browsing/ pulls in content/ which doesn't work on iOS")
-  source_set("content") {
-    sources = [
-      "base_blocking_page.cc",
-      "base_blocking_page.h",
-      "base_ui_manager.cc",
-      "base_ui_manager.h",
-      "safe_browsing_controller_client.cc",
-      "safe_browsing_controller_client.h",
-    ]
-    deps = [
-      "//base:base",
-      "//base:i18n",
-      "//components/safe_browsing/core:features",
-      "//components/safe_browsing/core:ping_manager",
-      "//components/safe_browsing/core:verdict_cache_manager",
-      "//components/safe_browsing/core/common:common",
-      "//components/safe_browsing/core/common:safe_browsing_prefs",
-      "//components/safe_browsing/core/db:database_manager",
-      "//components/safe_browsing/core/web_ui:constants",
-      "//components/security_interstitials/content:security_interstitial_page",
-      "//components/security_interstitials/core",
-      "//components/security_interstitials/core:unsafe_resource",
-      "//content/public/browser:browser",
-      "//content/public/common:common",
-      "//net:net",
-    ]
-  }
-}
diff --git a/components/safe_browsing/content/browser/BUILD.gn b/components/safe_browsing/content/browser/BUILD.gn
index 07f1106c..360c8b49 100644
--- a/components/safe_browsing/content/browser/BUILD.gn
+++ b/components/safe_browsing/content/browser/BUILD.gn
@@ -6,10 +6,16 @@
 
 source_set("browser") {
   sources = [
+    "base_blocking_page.cc",
+    "base_blocking_page.h",
+    "base_ui_manager.cc",
+    "base_ui_manager.h",
     "browser_url_loader_throttle.cc",
     "browser_url_loader_throttle.h",
     "mojo_safe_browsing_impl.cc",
     "mojo_safe_browsing_impl.h",
+    "safe_browsing_controller_client.cc",
+    "safe_browsing_controller_client.h",
     "threat_details.cc",
     "threat_details.h",
     "threat_details_cache.cc",
@@ -20,27 +26,33 @@
     "web_api_handshake_checker.h",
   ]
   deps = [
+    "//base",
+    "//base:i18n",
     "//components/back_forward_cache",
     "//components/history/core/browser",
-    "//components/safe_browsing/content",
     "//components/safe_browsing/content/common:interfaces",
     "//components/safe_browsing/content/web_ui:web_ui",
     "//components/safe_browsing/core:csd_proto",
     "//components/safe_browsing/core:features",
+    "//components/safe_browsing/core:ping_manager",
     "//components/safe_browsing/core:realtimeapi_proto",
     "//components/safe_browsing/core:verdict_cache_manager",
     "//components/safe_browsing/core/browser",
     "//components/safe_browsing/core/browser:network_context",
     "//components/safe_browsing/core/browser:referrer_chain_provider",
     "//components/safe_browsing/core/common:common",
+    "//components/safe_browsing/core/common:safe_browsing_prefs",
     "//components/safe_browsing/core/db:database_manager",
     "//components/safe_browsing/core/realtime:policy_engine",
     "//components/safe_browsing/core/realtime:url_lookup_service_base",
     "//components/safe_browsing/core/web_ui:constants",
     "//components/security_interstitials/content:security_interstitial_page",
+    "//components/security_interstitials/core",
     "//components/security_interstitials/core:unsafe_resource",
     "//components/signin/public/identity_manager",
     "//content/public/browser:browser",
+    "//content/public/common",
+    "//net",
     "//net:extras",
     "//services/network/public/mojom",
   ]
@@ -110,7 +122,7 @@
     "//base:base",
     "//components/prefs",
     "//components/safe_browsing:buildflags",
-    "//components/safe_browsing/content",
+    "//components/safe_browsing/content/browser",
     "//components/safe_browsing/content/common:interfaces",
     "//components/safe_browsing/content/web_ui:web_ui",
     "//components/safe_browsing/core:client_model_proto",
diff --git a/components/safe_browsing/content/base_blocking_page.cc b/components/safe_browsing/content/browser/base_blocking_page.cc
similarity index 97%
rename from components/safe_browsing/content/base_blocking_page.cc
rename to components/safe_browsing/content/browser/base_blocking_page.cc
index ba04f985..819c32dc 100644
--- a/components/safe_browsing/content/base_blocking_page.cc
+++ b/components/safe_browsing/content/browser/base_blocking_page.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/safe_browsing/content/base_blocking_page.h"
+#include "components/safe_browsing/content/browser/base_blocking_page.h"
 
 #include <memory>
 
@@ -11,7 +11,7 @@
 #include "base/lazy_instance.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
-#include "components/safe_browsing/content/safe_browsing_controller_client.h"
+#include "components/safe_browsing/content/browser/safe_browsing_controller_client.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/safe_browsing/core/features.h"
 #include "components/security_interstitials/content/security_interstitial_controller_client.h"
@@ -140,8 +140,7 @@
                                            int num_visits) {}
 
 // static
-BaseBlockingPage::UnsafeResourceMap*
-BaseBlockingPage::GetUnsafeResourcesMap() {
+BaseBlockingPage::UnsafeResourceMap* BaseBlockingPage::GetUnsafeResourcesMap() {
   return g_unsafe_resource_map.Pointer();
 }
 
@@ -222,8 +221,8 @@
   return main_frame_url_;
 }
 
-BaseBlockingPage::UnsafeResourceList
-BaseBlockingPage::unsafe_resources() const {
+BaseBlockingPage::UnsafeResourceList BaseBlockingPage::unsafe_resources()
+    const {
   return unsafe_resources_;
 }
 
diff --git a/components/safe_browsing/content/base_blocking_page.h b/components/safe_browsing/content/browser/base_blocking_page.h
similarity index 94%
rename from components/safe_browsing/content/base_blocking_page.h
rename to components/safe_browsing/content/browser/base_blocking_page.h
index c250db4d..72ef866 100644
--- a/components/safe_browsing/content/base_blocking_page.h
+++ b/components/safe_browsing/content/browser/base_blocking_page.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 COMPONENTS_SAFE_BROWSING_CONTENT_BASE_BLOCKING_PAGE_H_
-#define COMPONENTS_SAFE_BROWSING_CONTENT_BASE_BLOCKING_PAGE_H_
+#ifndef COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_BASE_BLOCKING_PAGE_H_
+#define COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_BASE_BLOCKING_PAGE_H_
 
 #include <map>
 #include <string>
 #include <vector>
 
 #include "base/macros.h"
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/safe_browsing/core/db/v4_protocol_manager_util.h"
 #include "components/security_interstitials/content/security_interstitial_page.h"
 #include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
@@ -155,4 +155,4 @@
 
 }  // namespace safe_browsing
 
-#endif  // COMPONENTS_SAFE_BROWSING_CONTENT_BASE_BLOCKING_PAGE_H_
+#endif  // COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_BASE_BLOCKING_PAGE_H_
diff --git a/components/safe_browsing/content/base_ui_manager.cc b/components/safe_browsing/content/browser/base_ui_manager.cc
similarity index 98%
rename from components/safe_browsing/content/base_ui_manager.cc
rename to components/safe_browsing/content/browser/base_ui_manager.cc
index 73637e5..ef77688 100644
--- a/components/safe_browsing/content/base_ui_manager.cc
+++ b/components/safe_browsing/content/browser/base_ui_manager.cc
@@ -4,7 +4,7 @@
 
 #include <utility>
 
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 
 #include "base/bind.h"
 #include "base/callback.h"
@@ -12,7 +12,7 @@
 #include "base/i18n/rtl.h"
 #include "base/memory/ptr_util.h"
 #include "base/supports_user_data.h"
-#include "components/safe_browsing/content/base_blocking_page.h"
+#include "components/safe_browsing/content/browser/base_blocking_page.h"
 #include "components/safe_browsing/core/features.h"
 #include "components/security_interstitials/content/unsafe_resource_util.h"
 #include "components/security_interstitials/core/unsafe_resource.h"
@@ -201,8 +201,7 @@
 }
 }  // namespace
 
-void BaseUIManager::DisplayBlockingPage(
-    const UnsafeResource& resource) {
+void BaseUIManager::DisplayBlockingPage(const UnsafeResource& resource) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (resource.is_subresource && !resource.is_subframe) {
     // Sites tagged as serving Unwanted Software should only show a warning for
diff --git a/components/safe_browsing/content/base_ui_manager.h b/components/safe_browsing/content/browser/base_ui_manager.h
similarity index 95%
rename from components/safe_browsing/content/base_ui_manager.h
rename to components/safe_browsing/content/browser/base_ui_manager.h
index 3cf6722..81c29cc 100644
--- a/components/safe_browsing/content/base_ui_manager.h
+++ b/components/safe_browsing/content/browser/base_ui_manager.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_SAFE_BROWSING_CONTENT_BASE_UI_MANAGER_H_
-#define COMPONENTS_SAFE_BROWSING_CONTENT_BASE_UI_MANAGER_H_
+#ifndef COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_BASE_UI_MANAGER_H_
+#define COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_BASE_UI_MANAGER_H_
 
 #include <string>
 #include <utility>
@@ -31,8 +31,7 @@
 class BaseBlockingPage;
 
 // Construction needs to happen on the main thread.
-class BaseUIManager
-    : public base::RefCountedThreadSafe<BaseUIManager> {
+class BaseUIManager : public base::RefCountedThreadSafe<BaseUIManager> {
  public:
   typedef security_interstitials::UnsafeResource UnsafeResource;
 
@@ -171,4 +170,4 @@
 
 }  // namespace safe_browsing
 
-#endif  // COMPONENTS_SAFE_BROWSING_CONTENT_BASE_UI_MANAGER_H_
+#endif  // COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_BASE_UI_MANAGER_H_
diff --git a/components/safe_browsing/content/browser/client_side_detection_host.h b/components/safe_browsing/content/browser/client_side_detection_host.h
index 1da21304..a30ade82 100644
--- a/components/safe_browsing/content/browser/client_side_detection_host.h
+++ b/components/safe_browsing/content/browser/client_side_detection_host.h
@@ -12,7 +12,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/safe_browsing/content/browser/client_side_model_loader.h"
 #include "components/safe_browsing/content/common/safe_browsing.mojom-shared.h"
 #include "components/safe_browsing/content/common/safe_browsing.mojom.h"
diff --git a/components/safe_browsing/content/safe_browsing_controller_client.cc b/components/safe_browsing/content/browser/safe_browsing_controller_client.cc
similarity index 94%
rename from components/safe_browsing/content/safe_browsing_controller_client.cc
rename to components/safe_browsing/content/browser/safe_browsing_controller_client.cc
index acb548d..301de73a 100644
--- a/components/safe_browsing/content/safe_browsing_controller_client.cc
+++ b/components/safe_browsing/content/browser/safe_browsing_controller_client.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/safe_browsing/content/safe_browsing_controller_client.h"
+#include "components/safe_browsing/content/browser/safe_browsing_controller_client.h"
 
 #include "base/feature_list.h"
 #include "components/safe_browsing/core/features.h"
diff --git a/components/safe_browsing/content/safe_browsing_controller_client.h b/components/safe_browsing/content/browser/safe_browsing_controller_client.h
similarity index 80%
rename from components/safe_browsing/content/safe_browsing_controller_client.h
rename to components/safe_browsing/content/browser/safe_browsing_controller_client.h
index 33a09a20..775ff24 100644
--- a/components/safe_browsing/content/safe_browsing_controller_client.h
+++ b/components/safe_browsing/content/browser/safe_browsing_controller_client.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_SAFE_BROWSING_CONTENT_SAFE_BROWSING_CONTROLLER_CLIENT_H_
-#define COMPONENTS_SAFE_BROWSING_CONTENT_SAFE_BROWSING_CONTROLLER_CLIENT_H_
+#ifndef COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_CONTROLLER_CLIENT_H_
+#define COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_CONTROLLER_CLIENT_H_
 
 #include "base/macros.h"
 #include "components/security_interstitials/content/security_interstitial_controller_client.h"
@@ -15,7 +15,7 @@
 namespace security_interstitials {
 class MetricsHelper;
 class SettingsPageHelper;
-}
+}  // namespace security_interstitials
 
 class PrefService;
 
@@ -46,4 +46,4 @@
 
 }  // namespace safe_browsing
 
-#endif  // COMPONENTS_SAFE_BROWSING_CONTENT_SAFE_BROWSING_CONTROLLER_CLIENT_H_
+#endif  // COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_SAFE_BROWSING_CONTROLLER_CLIENT_H_
diff --git a/components/safe_browsing/content/browser/threat_details.cc b/components/safe_browsing/content/browser/threat_details.cc
index 5885be6..c8a47b08 100644
--- a/components/safe_browsing/content/browser/threat_details.cc
+++ b/components/safe_browsing/content/browser/threat_details.cc
@@ -25,7 +25,7 @@
 #include "base/strings/stringprintf.h"
 #include "components/back_forward_cache/back_forward_cache_disable.h"
 #include "components/history/core/browser/history_service.h"
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/safe_browsing/content/browser/threat_details_cache.h"
 #include "components/safe_browsing/content/browser/threat_details_history.h"
 #include "components/safe_browsing/content/web_ui/safe_browsing_ui.h"
diff --git a/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc
index 4693725..f52bea1e8 100644
--- a/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc
+++ b/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc
@@ -371,7 +371,8 @@
     auto token_fetcher =
         std::make_unique<StrictMock<MockSafeBrowsingTokenFetcher>>();
     raw_token_fetcher_ = token_fetcher.get();
-    identity_test_env_.MakePrimaryAccountAvailable("user@gmail.com");
+    identity_test_env_.MakePrimaryAccountAvailable("user@gmail.com",
+                                                   signin::ConsentLevel::kSync);
     password_protection_service_ =
         std::make_unique<TestPasswordProtectionService>(
             database_manager_,
diff --git a/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher_unittest.cc b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher_unittest.cc
index bf8418b0..3b4fbd4 100644
--- a/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher_unittest.cc
+++ b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher_unittest.cc
@@ -24,8 +24,8 @@
 };
 
 TEST_F(SafeBrowsingPrimaryAccountTokenFetcherTest, Success) {
-  identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable(
-      "test@example.com");
+  identity_test_environment_.MakePrimaryAccountAvailable(
+      "test@example.com", signin::ConsentLevel::kSignin);
   std::string access_token;
   SafeBrowsingPrimaryAccountTokenFetcher fetcher(
       identity_test_environment_.identity_manager());
@@ -40,8 +40,8 @@
 }
 
 TEST_F(SafeBrowsingPrimaryAccountTokenFetcherTest, Failure) {
-  identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable(
-      "test@example.com");
+  identity_test_environment_.MakePrimaryAccountAvailable(
+      "test@example.com", signin::ConsentLevel::kSignin);
   std::string access_token;
   SafeBrowsingPrimaryAccountTokenFetcher fetcher(
       identity_test_environment_.identity_manager());
@@ -57,7 +57,8 @@
 
 TEST_F(SafeBrowsingPrimaryAccountTokenFetcherTest,
        SuccessWithConsentedPrimaryAccount) {
-  identity_test_environment_.MakePrimaryAccountAvailable("test@example.com");
+  identity_test_environment_.MakePrimaryAccountAvailable(
+      "test@example.com", signin::ConsentLevel::kSync);
   std::string access_token;
   SafeBrowsingPrimaryAccountTokenFetcher fetcher(
       identity_test_environment_.identity_manager());
diff --git a/components/safe_browsing/core/browser/sync/sync_utils_unittest.cc b/components/safe_browsing/core/browser/sync/sync_utils_unittest.cc
index cb5d3fc3..48fae0a 100644
--- a/components/safe_browsing/core/browser/sync/sync_utils_unittest.cc
+++ b/components/safe_browsing/core/browser/sync/sync_utils_unittest.cc
@@ -98,7 +98,8 @@
   // to perform URL lookups with tokens (even though the
   // kRealTimeLookupEnabledWithToken feature and sync/history sync are
   // disabled).
-  identity_test_env->MakeUnconsentedPrimaryAccountAvailable("test@example.com");
+  identity_test_env->MakePrimaryAccountAvailable("test@example.com",
+                                                 signin::ConsentLevel::kSignin);
   EXPECT_TRUE(SyncUtils::AreSigninAndSyncSetUpForSafeBrowsingTokenFetches(
       &sync_service, identity_manager,
       /* user_has_enabled_enhanced_protection=*/true));
diff --git a/components/safe_browsing/core/triggers/BUILD.gn b/components/safe_browsing/core/triggers/BUILD.gn
index a461950d..921c97f 100644
--- a/components/safe_browsing/core/triggers/BUILD.gn
+++ b/components/safe_browsing/core/triggers/BUILD.gn
@@ -19,7 +19,6 @@
     ":trigger_throttler",
     "//base:base",
     "//components/prefs:prefs",
-    "//components/safe_browsing/content",
     "//components/safe_browsing/content/browser",
     "//components/safe_browsing/core:features",
     "//components/safe_browsing/core/browser:browser",
diff --git a/components/safe_browsing/core/triggers/trigger_manager.cc b/components/safe_browsing/core/triggers/trigger_manager.cc
index 6ea30d2..4bc1df4c 100644
--- a/components/safe_browsing/core/triggers/trigger_manager.cc
+++ b/components/safe_browsing/core/triggers/trigger_manager.cc
@@ -9,7 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/prefs/pref_service.h"
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/safe_browsing/content/browser/threat_details.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/safe_browsing/core/common/thread_utils.h"
diff --git a/components/send_tab_to_self/features.cc b/components/send_tab_to_self/features.cc
index 69c902f..37c3999 100644
--- a/components/send_tab_to_self/features.cc
+++ b/components/send_tab_to_self/features.cc
@@ -19,7 +19,7 @@
 
 bool IsReceivingEnabledByUserOnThisDevice(PrefService* prefs) {
   // TODO(crbug.com/1015322): SyncPrefs is used directly instead of methods in
-  // SyncService due to a dependency of ProfileSyncService on
+  // SyncService due to a dependency of SyncServiceImpl on
   // DeviceInfoSyncService. IsReceivingEnabledByUserOnThisDevice is ultimately
   // used by DeviceInfoSyncClient which is owned by DeviceInfoSyncService.
   syncer::SyncPrefs sync_prefs(prefs);
diff --git a/components/send_tab_to_self/send_tab_to_self_sync_service.h b/components/send_tab_to_self/send_tab_to_self_sync_service.h
index 7e78060..b955183 100644
--- a/components/send_tab_to_self/send_tab_to_self_sync_service.h
+++ b/components/send_tab_to_self/send_tab_to_self_sync_service.h
@@ -38,7 +38,6 @@
 
   virtual SendTabToSelfModel* GetSendTabToSelfModel();
 
-  // For ProfileSyncService to initialize the controller.
   virtual base::WeakPtr<syncer::ModelTypeControllerDelegate>
   GetControllerDelegate();
 
diff --git a/components/services/app_service/app_service_impl.cc b/components/services/app_service/app_service_impl.cc
index 57cb52e..898222bc 100644
--- a/components/services/app_service/app_service_impl.cc
+++ b/components/services/app_service/app_service_impl.cc
@@ -417,6 +417,16 @@
   iter->second->SetResizeLocked(app_id, locked);
 }
 
+void AppServiceImpl::SetWindowMode(apps::mojom::AppType app_type,
+                                   const std::string& app_id,
+                                   apps::mojom::WindowMode window_mode) {
+  auto iter = publishers_.find(app_type);
+  if (iter == publishers_.end()) {
+    return;
+  }
+  iter->second->SetWindowMode(app_id, window_mode);
+}
+
 PreferredAppsList& AppServiceImpl::GetPreferredAppsForTesting() {
   return preferred_apps_;
 }
diff --git a/components/services/app_service/app_service_impl.h b/components/services/app_service/app_service_impl.h
index ccfc54a..e93ae3e 100644
--- a/components/services/app_service/app_service_impl.h
+++ b/components/services/app_service/app_service_impl.h
@@ -110,6 +110,9 @@
   void SetResizeLocked(apps::mojom::AppType app_type,
                        const std::string& app_id,
                        apps::mojom::OptionalBool locked) override;
+  void SetWindowMode(apps::mojom::AppType app_type,
+                     const std::string& app_id,
+                     apps::mojom::WindowMode window_mode) override;
 
   // Retern the preferred_apps_ for testing.
   PreferredAppsList& GetPreferredAppsForTesting();
diff --git a/components/services/app_service/public/cpp/publisher_base.cc b/components/services/app_service/public/cpp/publisher_base.cc
index bc2e7b4b6..f592fc3b 100644
--- a/components/services/app_service/public/cpp/publisher_base.cc
+++ b/components/services/app_service/public/cpp/publisher_base.cc
@@ -169,4 +169,9 @@
   NOTIMPLEMENTED();
 }
 
+void PublisherBase::SetWindowMode(const std::string& app_id,
+                                  apps::mojom::WindowMode window_mode) {
+  NOTIMPLEMENTED();
+}
+
 }  // namespace apps
diff --git a/components/services/app_service/public/cpp/publisher_base.h b/components/services/app_service/public/cpp/publisher_base.h
index 45ca3a4..63343cf7 100644
--- a/components/services/app_service/public/cpp/publisher_base.h
+++ b/components/services/app_service/public/cpp/publisher_base.h
@@ -94,6 +94,8 @@
       apps::mojom::ReplacedAppPreferencesPtr replaced_app_preferences) override;
   void SetResizeLocked(const std::string& app_id,
                        apps::mojom::OptionalBool locked) override;
+  void SetWindowMode(const std::string& app_id,
+                     apps::mojom::WindowMode window_mode) override;
 
   mojo::Receiver<apps::mojom::Publisher> receiver_{this};
 };
diff --git a/components/services/app_service/public/mojom/app_service.mojom b/components/services/app_service/public/mojom/app_service.mojom
index 1e208b1..3a1fbda5 100644
--- a/components/services/app_service/public/mojom/app_service.mojom
+++ b/components/services/app_service/public/mojom/app_service.mojom
@@ -135,6 +135,12 @@
       AppType app_type,
       string app_id,
       OptionalBool locked);
+
+  // Set the window display mode for the app identified by |app_id|.
+  SetWindowMode(
+      AppType app_type,
+      string app_id,
+      WindowMode window_mode);
 };
 
 interface Publisher {
@@ -232,6 +238,11 @@
   SetResizeLocked(
       string app_id,
       OptionalBool locked);
+
+  // Set the window display mode for the app identified by |app_id|.
+  SetWindowMode(
+      string app_id,
+      WindowMode window_mode);
 };
 
 // Subscriber works as a proxy, to receive a stream of apps from publishers,
diff --git a/components/signin/core/browser/account_investigator_unittest.cc b/components/signin/core/browser/account_investigator_unittest.cc
index d24de02..60b1535 100644
--- a/components/signin/core/browser/account_investigator_unittest.cc
+++ b/components/signin/core/browser/account_investigator_unittest.cc
@@ -379,7 +379,8 @@
   std::string email("f@bar.com");
   identity_test_env()->SetCookieAccounts(
       {{email, signin::GetTestGaiaIdForEmail(email)}});
-  identity_test_env()->MakePrimaryAccountAvailable(email);
+  identity_test_env()->MakePrimaryAccountAvailable(email,
+                                                   signin::ConsentLevel::kSync);
 
   const HistogramTester histogram_tester;
   TryPeriodicReport();
@@ -400,7 +401,8 @@
   std::string email("f@bar.com");
   identity_test_env()->SetCookieAccounts(
       {{email, signin::GetTestGaiaIdForEmail(email)}});
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(email);
+  identity_test_env()->MakePrimaryAccountAvailable(
+      email, signin::ConsentLevel::kSignin);
 
   const HistogramTester histogram_tester;
   TryPeriodicReport();
@@ -420,8 +422,8 @@
   std::string email("f@bar.com");
   identity_test_env()->SetCookieAccounts(
       {{email, signin::GetTestGaiaIdForEmail(email)}});
-  AccountInfo account_info =
-      identity_test_env()->MakePrimaryAccountAvailable(email);
+  AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+      email, signin::ConsentLevel::kSync);
   account_info.hosted_domain = "bar.com";
   identity_test_env()->UpdateAccountInfoForAccount(account_info);
 
diff --git a/components/signin/core/browser/account_reconcilor_unittest.cc b/components/signin/core/browser/account_reconcilor_unittest.cc
index 72477b1..5e8b09d 100644
--- a/components/signin/core/browser/account_reconcilor_unittest.cc
+++ b/components/signin/core/browser/account_reconcilor_unittest.cc
@@ -363,8 +363,8 @@
 
 AccountInfo AccountReconcilorTest::ConnectProfileToAccount(
     const std::string& email) {
-  AccountInfo account_info =
-      identity_test_env()->MakePrimaryAccountAvailable(email);
+  AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+      email, signin::ConsentLevel::kSync);
   return account_info;
 }
 
@@ -645,7 +645,8 @@
   ASSERT_TRUE(reconcilor);
   ASSERT_FALSE(reconcilor->IsRegisteredWithIdentityManager());
 
-  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com",
+                                                   signin::ConsentLevel::kSync);
   ASSERT_TRUE(reconcilor->IsRegisteredWithIdentityManager());
 
   EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
@@ -1184,7 +1185,8 @@
   ASSERT_TRUE(reconcilor);
   ASSERT_TRUE(reconcilor->IsRegisteredWithIdentityManager());
 
-  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable("user@gmail.com",
+                                                   signin::ConsentLevel::kSync);
   ASSERT_TRUE(reconcilor->IsRegisteredWithIdentityManager());
 
   // Reconcilor should not logout all accounts from the cookies when
@@ -1401,7 +1403,8 @@
 
   const CoreAccountId primary_account_id =
       identity_test_env()
-          ->MakePrimaryAccountAvailable("user@gmail.com")
+          ->MakePrimaryAccountAvailable("user@gmail.com",
+                                        signin::ConsentLevel::kSync)
           .account_id;
   const CoreAccountId secondary_account_id =
       identity_test_env()->MakeAccountAvailable("other@gmail.com").account_id;
diff --git a/components/signin/core/browser/signin_error_controller_unittest.cc b/components/signin/core/browser/signin_error_controller_unittest.cc
index 06df52a0..529fc20 100644
--- a/components/signin/core/browser/signin_error_controller_unittest.cc
+++ b/components/signin/core/browser/signin_error_controller_unittest.cc
@@ -119,7 +119,9 @@
   signin::IdentityTestEnvironment identity_test_env;
 
   CoreAccountId test_account_id =
-      identity_test_env.MakeUnconsentedPrimaryAccountAvailable(kTestEmail)
+      identity_test_env
+          .MakePrimaryAccountAvailable(kTestEmail,
+                                       signin::ConsentLevel::kSignin)
           .account_id;
   SigninErrorController error_controller(
       SigninErrorController::AccountMode::ANY_ACCOUNT,
@@ -246,7 +248,8 @@
   signin::IdentityTestEnvironment identity_test_env;
 
   AccountInfo primary_account_info =
-      identity_test_env.MakePrimaryAccountAvailable(kPrimaryAccountEmail);
+      identity_test_env.MakePrimaryAccountAvailable(
+          kPrimaryAccountEmail, signin::ConsentLevel::kSync);
   CoreAccountId secondary_account_id =
       identity_test_env.MakeAccountAvailable(kTestEmail).account_id;
   SigninErrorController error_controller(
@@ -293,7 +296,8 @@
   signin::IdentityTestEnvironment identity_test_env;
 
   AccountInfo primary_account_info =
-      identity_test_env.MakePrimaryAccountAvailable(kPrimaryAccountEmail);
+      identity_test_env.MakePrimaryAccountAvailable(
+          kPrimaryAccountEmail, signin::ConsentLevel::kSync);
   CoreAccountId secondary_account_id =
       identity_test_env.MakeAccountAvailable(kTestEmail).account_id;
   SigninErrorController error_controller(
diff --git a/components/signin/public/identity_manager/access_token_constants.cc b/components/signin/public/identity_manager/access_token_constants.cc
index cfbe377..381209fc 100644
--- a/components/signin/public/identity_manager/access_token_constants.cc
+++ b/components/signin/public/identity_manager/access_token_constants.cc
@@ -59,6 +59,9 @@
       // Required by Permission Request Creator.
       GaiaConstants::kClassifyUrlKidPermissionOAuth2Scope,
 
+      // Required by Enterprise policy extensions.
+      GaiaConstants::kChromeWebstoreOAuth2Scope,
+
       // Required by ChromeOS only.
 #if BUILDFLAG(IS_CHROMEOS_ASH)
       GaiaConstants::kAccountsReauthOAuth2Scope,
diff --git a/components/signin/public/identity_manager/accounts_mutator_unittest.cc b/components/signin/public/identity_manager/accounts_mutator_unittest.cc
index dc405e83..81e3eee 100644
--- a/components/signin/public/identity_manager/accounts_mutator_unittest.cc
+++ b/components/signin/public/identity_manager/accounts_mutator_unittest.cc
@@ -139,7 +139,9 @@
       run_loop.QuitClosure());
 
   CoreAccountId account_id =
-      identity_test_env()->MakePrimaryAccountAvailable(kTestEmail).account_id;
+      identity_test_env()
+          ->MakePrimaryAccountAvailable(kTestEmail, signin::ConsentLevel::kSync)
+          .account_id;
   run_loop.Run();
 
   EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 1U);
diff --git a/components/signin/public/identity_manager/identity_test_environment.cc b/components/signin/public/identity_manager/identity_test_environment.cc
index 5714731..196db6e 100644
--- a/components/signin/public/identity_manager/identity_test_environment.cc
+++ b/components/signin/public/identity_manager/identity_test_environment.cc
@@ -393,40 +393,10 @@
 }
 
 AccountInfo IdentityTestEnvironment::MakePrimaryAccountAvailable(
-    const std::string& email) {
+    const std::string& email,
+    ConsentLevel consent_level) {
   return signin::MakePrimaryAccountAvailable(identity_manager(), email,
-                                             signin::ConsentLevel::kSync);
-}
-
-AccountInfo IdentityTestEnvironment::MakeUnconsentedPrimaryAccountAvailable(
-    const std::string& email) {
-  DCHECK(!identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  // Chrome OS sets the unconsented primary account during login and does not
-  // allow signout.
-  AccountInfo account_info = MakeAccountAvailable(email);
-  identity_manager()->GetPrimaryAccountMutator()->SetPrimaryAccount(
-      account_info.account_id, signin::ConsentLevel::kSignin);
-#elif defined(OS_IOS)
-  // iOS only support the primary account.
-  AccountInfo account_info = MakePrimaryAccountAvailable(email);
-#else
-  // Android and Desktop platforms.
-  AccountInfo account_info =
-      MakeAccountAvailableWithCookies(email, GetTestGaiaIdForEmail(email));
-  base::RunLoop().RunUntilIdle();
-  // Tests that don't use the |SigninManager| needs the unconsented primary
-  // account to be set manually.
-  if (!identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin)) {
-    identity_manager()->GetPrimaryAccountMutator()->SetPrimaryAccount(
-        account_info.account_id, signin::ConsentLevel::kSignin);
-  }
-#endif
-  DCHECK(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
-  DCHECK_EQ(
-      email,
-      identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin).email);
-  return account_info;
+                                             consent_level);
 }
 
 void IdentityTestEnvironment::RevokeSyncConsent() {
diff --git a/components/signin/public/identity_manager/identity_test_environment.h b/components/signin/public/identity_manager/identity_test_environment.h
index af392ba..dffc2e25 100644
--- a/components/signin/public/identity_manager/identity_test_environment.h
+++ b/components/signin/public/identity_manager/identity_test_environment.h
@@ -142,14 +142,8 @@
   // IdentityManager and PrimaryAccountManager callbacks for signin success. On
   // all platforms, this method blocks until the primary account is available.
   // Returns the AccountInfo of the newly-available account.
-  AccountInfo MakePrimaryAccountAvailable(const std::string& email);
-
-  // Like MakeAccountAvailable(), but adds an "unconsented" primary account. See
-  // ./README.md for the distinction between primary account and unconsented
-  // primary account.
-  // TODO(crbug.com/1046746): Rename/Refactor |*PrimaryAccount*| functions to
-  // take |ConsentLevel| instead.
-  AccountInfo MakeUnconsentedPrimaryAccountAvailable(const std::string& email);
+  AccountInfo MakePrimaryAccountAvailable(const std::string& email,
+                                          ConsentLevel consent_level);
 
   // Combination of MakeAccountAvailable() and SetCookieAccounts() for a single
   // account. It makes an account available for the given email address, and
diff --git a/components/signin/public/identity_manager/identity_test_environment_unittest.cc b/components/signin/public/identity_manager/identity_test_environment_unittest.cc
index 8a494da1..516bf021 100644
--- a/components/signin/public/identity_manager/identity_test_environment_unittest.cc
+++ b/components/signin/public/identity_manager/identity_test_environment_unittest.cc
@@ -30,7 +30,8 @@
   std::unique_ptr<IdentityTestEnvironment> identity_test_environment =
       std::make_unique<IdentityTestEnvironment>();
 
-  identity_test_environment->MakePrimaryAccountAvailable("primary@example.com");
+  identity_test_environment->MakePrimaryAccountAvailable(
+      "primary@example.com", signin::ConsentLevel::kSync);
   AccessTokenFetcher::TokenCallback callback = base::BindOnce(
       [](GoogleServiceAuthError error, AccessTokenInfo access_token_info) {});
   std::set<std::string> scopes{"scope"};
@@ -65,6 +66,7 @@
   identity_test_environment->SetPrimaryAccount(primary_account_email,
                                                ConsentLevel::kSync);
   EXPECT_TRUE(identity_manager->HasPrimaryAccount(ConsentLevel::kSync));
+  EXPECT_TRUE(identity_manager->HasPrimaryAccount(ConsentLevel::kSignin));
 }
 
 TEST_F(IdentityTestEnvironmentTest,
@@ -84,4 +86,34 @@
   EXPECT_FALSE(identity_manager->HasPrimaryAccount(ConsentLevel::kSync));
 }
 
+TEST_F(IdentityTestEnvironmentTest,
+       IdentityTestEnvironmentMakePrimaryAccountAvailableWithSyncConsent) {
+  std::unique_ptr<IdentityTestEnvironment> identity_test_environment =
+      std::make_unique<IdentityTestEnvironment>();
+  IdentityManager* identity_manager =
+      identity_test_environment->identity_manager();
+  std::string primary_account_email = "primary@example.com";
+
+  EXPECT_FALSE(identity_manager->HasPrimaryAccount(ConsentLevel::kSync));
+  identity_test_environment->MakePrimaryAccountAvailable(primary_account_email,
+                                                         ConsentLevel::kSync);
+  EXPECT_TRUE(identity_manager->HasPrimaryAccount(ConsentLevel::kSync));
+  EXPECT_TRUE(identity_manager->HasPrimaryAccount(ConsentLevel::kSignin));
+}
+
+TEST_F(IdentityTestEnvironmentTest,
+       IdentityTestEnvironmentMakePrimaryAccountAvailableWithoutSyncConsent) {
+  std::unique_ptr<IdentityTestEnvironment> identity_test_environment =
+      std::make_unique<IdentityTestEnvironment>();
+  IdentityManager* identity_manager =
+      identity_test_environment->identity_manager();
+  std::string primary_account_email = "primary@example.com";
+
+  EXPECT_FALSE(identity_manager->HasPrimaryAccount(ConsentLevel::kSignin));
+  identity_test_environment->MakePrimaryAccountAvailable(primary_account_email,
+                                                         ConsentLevel::kSignin);
+  EXPECT_TRUE(identity_manager->HasPrimaryAccount(ConsentLevel::kSignin));
+  EXPECT_FALSE(identity_manager->HasPrimaryAccount(ConsentLevel::kSync));
+}
+
 }  // namespace signin
diff --git a/components/signin/public/identity_manager/identity_test_utils.cc b/components/signin/public/identity_manager/identity_test_utils.cc
index ae7a7ac..88376fc 100644
--- a/components/signin/public/identity_manager/identity_test_utils.cc
+++ b/components/signin/public/identity_manager/identity_test_utils.cc
@@ -187,7 +187,10 @@
                                         ConsentLevel consent_level) {
   CoreAccountInfo account_info =
       SetPrimaryAccount(identity_manager, email, consent_level);
-  SetRefreshTokenForPrimaryAccount(identity_manager);
+  // TODO(https://crbug.com/1176695): Refactor
+  // SetRefreshTokenForPrimaryAccount() to set the refresh token for
+  // signin::kSignin and use it here.
+  SetRefreshTokenForAccount(identity_manager, account_info.account_id);
   AccountInfo primary_account_info =
       identity_manager->FindExtendedAccountInfoByAccountId(
           account_info.account_id);
diff --git a/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc b/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
index 463f3c6..f85af31 100644
--- a/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
+++ b/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
@@ -82,7 +82,9 @@
 
   // Signs the user in to the primary account, returning the account ID.
   CoreAccountId SignIn() {
-    return identity_test_env_->MakePrimaryAccountAvailable("me@gmail.com")
+    return identity_test_env_
+        ->MakePrimaryAccountAvailable("me@gmail.com",
+                                      signin::ConsentLevel::kSync)
         .account_id;
   }
 
@@ -465,7 +467,8 @@
   TestTokenCallback callback;
 
   // Simulate login.
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("me@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "me@gmail.com", signin::ConsentLevel::kSignin);
 
   // Perform an immediate fetch with consent not required.
   auto fetcher = CreateFetcher(
@@ -485,7 +488,8 @@
   TestTokenCallback callback;
 
   // Simulate login.
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("me@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "me@gmail.com", signin::ConsentLevel::kSignin);
 
   // Try an immediate fetch with consent required.
   auto fetcher = CreateFetcher(
@@ -508,7 +512,8 @@
   EXPECT_FALSE(identity_test_env()->IsAccessTokenRequestPending());
 
   // Simulate login.
-  identity_test_env()->MakeUnconsentedPrimaryAccountAvailable("me@gmail.com");
+  identity_test_env()->MakePrimaryAccountAvailable(
+      "me@gmail.com", signin::ConsentLevel::kSignin);
 
   // Once the access token request is fulfilled, we should get called back with
   // the access token.
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb
index 698e231..0ab26e38 100644
--- a/components/strings/components_strings_af.xtb
+++ b/components/strings/components_strings_af.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> wil jou toestel se ligging gebruik</translation>
 <translation id="4736825316280949806">Herbegin Chromium</translation>
+<translation id="4736934858538408121">Virtuele kaart</translation>
 <translation id="473775607612524610">Dateer op</translation>
 <translation id="4738601419177586157"><ph name="TEXT" />-soekvoorstel</translation>
 <translation id="4742407542027196863">Bestuur wagwoorde …</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 90e7e4b..8713ad8 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -1019,6 +1019,7 @@
 <translation id="4731967714531604179">Prc2 (የደብዳቤ ፖስታ)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> የመሣሪያዎን አካባቢ መጠቀም ይፈልጋል</translation>
 <translation id="4736825316280949806">Chromiumን ዳግም ያስጀምሩት</translation>
+<translation id="4736934858538408121">ምናባዊ ካርድ</translation>
 <translation id="473775607612524610">አዘምን</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> የፍለጋ አስተያየት ጥቆማ</translation>
 <translation id="4742407542027196863">የይለፍ ቃላትን ያስተዳድሩ...</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 0c83664f..db097a5a 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -591,7 +591,7 @@
 <translation id="315504272643575312">يدير <ph name="MANAGER" /> حسابك.</translation>
 <translation id="3157931365184549694">استعادة</translation>
 <translation id="3162559335345991374">‏قد يتطلب Wi-Fi الذي تستخدمه زيارة صفحة تسجيل الدخول.</translation>
-<translation id="3169472444629675720">Discover</translation>
+<translation id="3169472444629675720">اقتراحات</translation>
 <translation id="3174168572213147020">جزيرة</translation>
 <translation id="3176929007561373547">تحقق من إعدادات الخادم الوكيل أو اتصل بمشرف الشبكة
           للتأكد من عمل الخادم الوكيل. فإذا كنت لا تعتقد أنه يجب عليك استخدام
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">‏Prc2 (مغلف)</translation>
 <translation id="4733082559415072992">يريد <ph name="URL" /> استخدام الموقع الجغرافي لجهازك.</translation>
 <translation id="4736825316280949806">‏إعادة تشغيل Chromium</translation>
+<translation id="4736934858538408121">البطاقة الافتراضية</translation>
 <translation id="473775607612524610">تحديث</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> اقتراحات البحث</translation>
 <translation id="4742407542027196863">إدارة كلمات المرور…</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb
index de27fab..aec6747d 100644
--- a/components/strings/components_strings_as.xtb
+++ b/components/strings/components_strings_as.xtb
@@ -1024,6 +1024,7 @@
 <translation id="4731967714531604179">Prc2 (লেফাফা)</translation>
 <translation id="4733082559415072992"><ph name="URL" />এ আপোনাৰ ডিভাইচৰ অৱস্থান জানিব বিচাৰে</translation>
 <translation id="4736825316280949806">Chromium ৰিষ্টাৰ্ট কৰক</translation>
+<translation id="4736934858538408121">ভাৰ্চুৱেল কাৰ্ড</translation>
 <translation id="473775607612524610">আপডে'ট কৰক</translation>
 <translation id="4738601419177586157">পৰামর্শৰ সন্ধান <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">পাছৱৰ্ডবোৰ পৰিচালনা কৰক…</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb
index be1b770..4aa40b3 100644
--- a/components/strings/components_strings_az.xtb
+++ b/components/strings/components_strings_az.xtb
@@ -1024,6 +1024,7 @@
 <translation id="4731967714531604179">Prc2 (Zərf)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> cihazın məkanını istifadə etmək istəyir</translation>
 <translation id="4736825316280949806">Chromium'u yenidən başladın</translation>
+<translation id="4736934858538408121">Virtual kart</translation>
 <translation id="473775607612524610">Güncəlləşdirin</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> axtarış təklifi</translation>
 <translation id="4742407542027196863">Parolları idarə edin...</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb
index 470fd36..eda18400 100644
--- a/components/strings/components_strings_be.xtb
+++ b/components/strings/components_strings_be.xtb
@@ -1028,6 +1028,7 @@
 <translation id="4731967714531604179">Prc2 (канверт)</translation>
 <translation id="4733082559415072992">Сайт <ph name="URL" /> запытвае дазвол на выкарыстанне звестак аб месцазнаходжанні прылады</translation>
 <translation id="4736825316280949806">Перазапусціце Chromium</translation>
+<translation id="4736934858538408121">Віртуальная картка</translation>
 <translation id="473775607612524610">Абнавіць</translation>
 <translation id="4738601419177586157">Прапанова пошуку: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Кіраваць паролямі…</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb
index ac911e3..6a7ae25 100644
--- a/components/strings/components_strings_bs.xtb
+++ b/components/strings/components_strings_bs.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (Koverta)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> želi koristiti lokciju vašeg uređaja</translation>
 <translation id="4736825316280949806">Ponovo pokrenite Chromium</translation>
+<translation id="4736934858538408121">Virtuelna kartica</translation>
 <translation id="473775607612524610">Ažuriraj</translation>
 <translation id="4738601419177586157">Prijedlog za pretraživanje: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Upravljanje lozinkama…</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 586a0b9..06ab442 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -1018,6 +1018,7 @@
 <translation id="4731967714531604179">Prc2 (sobre)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> vol utilitzar la ubicació del dispositiu</translation>
 <translation id="4736825316280949806">Reinicia Chromium</translation>
+<translation id="4736934858538408121">Targeta virtual</translation>
 <translation id="473775607612524610">Actualitza</translation>
 <translation id="4738601419177586157">Suggeriment de cerca de <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gestiona les contrasenyes…</translation>
@@ -1265,7 +1266,7 @@
 <translation id="5586446728396275693">No hi ha cap adreça desada</translation>
 <translation id="5593349413089863479">La connexió no és totalment segura</translation>
 <translation id="5595485650161345191">Edita l'adreça</translation>
-<translation id="5598944008576757369">Selecciona una forma de pagament</translation>
+<translation id="5598944008576757369">Tria la forma de pagament</translation>
 <translation id="560412284261940334">Gestió no compatible</translation>
 <translation id="5605670050355397069">Ledger</translation>
 <translation id="5607240918979444548">Architecture-C</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index b9bd6de..72e5907 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -1013,6 +1013,7 @@
 <translation id="4731967714531604179">Prc2 (obálka)</translation>
 <translation id="4733082559415072992">Web <ph name="URL" /> chce použít polohu vašeho zařízení</translation>
 <translation id="4736825316280949806">Restartujte Chromium</translation>
+<translation id="4736934858538408121">Virtuální karta</translation>
 <translation id="473775607612524610">Aktualizovat</translation>
 <translation id="4738601419177586157">Návrh vyhledávacího dotazu <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Spravovat hesla…</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 9bb2bae..51394a3 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> anmoder om at bruge enhedens placering</translation>
 <translation id="4736825316280949806">Genstart Chromium</translation>
+<translation id="4736934858538408121">Virtuelt kort</translation>
 <translation id="473775607612524610">Opdater</translation>
 <translation id="4738601419177586157"><ph name="TEXT" />-søgeforslag</translation>
 <translation id="4742407542027196863">Administrer adgangskoder…</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index cfb8f06..c9d5c77 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -1016,6 +1016,7 @@
 <translation id="4731967714531604179">Prc2 (Umschlag)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> möchte den Standort Ihres Geräts nutzen</translation>
 <translation id="4736825316280949806">Chromium neu starten</translation>
+<translation id="4736934858538408121">Virtuelle Karte</translation>
 <translation id="473775607612524610">Aktualisieren</translation>
 <translation id="4738601419177586157">Suchvorschlag: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Passwörter verwalten…</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index 27a83cfb..ccbfc06 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -1031,6 +1031,7 @@
 <translation id="4731967714531604179">Prc2 (Φάκελος)</translation>
 <translation id="4733082559415072992">Ο ιστότοπος <ph name="URL" /> ζητά να χρησιμοποιήσει την τοποθεσία της συσκευής σας</translation>
 <translation id="4736825316280949806">Επανεκκινήστε το Chromium</translation>
+<translation id="4736934858538408121">Εικονική κάρτα</translation>
 <translation id="473775607612524610">Ενημέρωση</translation>
 <translation id="4738601419177586157">Πρόταση αναζήτησης <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Διαχείριση κωδικών πρόσβασης…</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index cce012c8..8ea9255a 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -1028,6 +1028,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> wants to use your device's location</translation>
 <translation id="4736825316280949806">Restart Chromium</translation>
+<translation id="4736934858538408121">Virtual card</translation>
 <translation id="473775607612524610">Update</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> search suggestion</translation>
 <translation id="4742407542027196863">Manage passwords…</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index 4ff4dbe..ce5f470 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -1019,6 +1019,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> desea usar la ubicación de tu dispositivo</translation>
 <translation id="4736825316280949806">Reinicia Chromium.</translation>
+<translation id="4736934858538408121">Tarjeta virtual</translation>
 <translation id="473775607612524610">Actualizar</translation>
 <translation id="4738601419177586157">Sugerencia de búsqueda: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Administrar contraseñas…</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 7f53dced..887159b 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (sobre)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> quiere utilizar la ubicación de tu dispositivo</translation>
 <translation id="4736825316280949806">Reinicia Chromium</translation>
+<translation id="4736934858538408121">Tarjeta virtual</translation>
 <translation id="473775607612524610">Actualizar</translation>
 <translation id="4738601419177586157">Sugerencia de búsqueda de <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gestionar contraseñas…</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 4ce22e5..b794546 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -1028,6 +1028,7 @@
 <translation id="4731967714531604179">Prc2 (ümbrik)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> soovib kasutada teie seadme asukohta</translation>
 <translation id="4736825316280949806">Taaskäivitage Chromium</translation>
+<translation id="4736934858538408121">Virtuaalkaart</translation>
 <translation id="473775607612524610">Värskenda</translation>
 <translation id="4738601419177586157">Otsingusoovitus: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Halda paroole …</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb
index a45fe038..8b641652 100644
--- a/components/strings/components_strings_eu.xtb
+++ b/components/strings/components_strings_eu.xtb
@@ -1014,6 +1014,7 @@
 <translation id="4731967714531604179">Prc2 (gutun-azala)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> webguneak gailuaren kokapena erabili nahi du</translation>
 <translation id="4736825316280949806">Berrabiarazi Chromium</translation>
+<translation id="4736934858538408121">Txartel birtuala</translation>
 <translation id="473775607612524610">Eguneratu</translation>
 <translation id="4738601419177586157">Bilaketa-iradokizuna: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Kudeatu pasahitzak…</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index 1654e8ec..bc75fffb 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -1027,6 +1027,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> می‌خواهد از موقعیت مکانی دستگاهتان استفاده کند</translation>
 <translation id="4736825316280949806">‏Chromium را راه‌اندازی مجدد کنید</translation>
+<translation id="4736934858538408121">کارت مجازی</translation>
 <translation id="473775607612524610">به‌روزرسانی</translation>
 <translation id="4738601419177586157">پیشنهاد جستجوی <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">مدیریت گذرواژه‌ها…</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index fd52bda..55f5d90 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -1030,6 +1030,7 @@
 <translation id="4731967714531604179">Prc2 (kirjekuori)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> haluaa käyttää laitteesi sijaintia.</translation>
 <translation id="4736825316280949806">Käynnistä Chromium uudelleen.</translation>
+<translation id="4736934858538408121">Virtuaalinen kortti</translation>
 <translation id="473775607612524610">Päivitä</translation>
 <translation id="4738601419177586157">Hakuehdotus <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Ylläpidä salasanoja…</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 50bc158..ba50639 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992">Gustong gamitin ng <ph name="URL" /> ang lokasyon ng iyong device</translation>
 <translation id="4736825316280949806">I-restart ang Chromium</translation>
+<translation id="4736934858538408121">Virtual na card</translation>
 <translation id="473775607612524610">I-update</translation>
 <translation id="4738601419177586157">Suhestyon sa paghahanap para sa <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Pamahalaan ang mga password...</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb
index 5876d07a..cf631cfd 100644
--- a/components/strings/components_strings_fr-CA.xtb
+++ b/components/strings/components_strings_fr-CA.xtb
@@ -1018,6 +1018,7 @@
 <translation id="4731967714531604179">Enveloppe Prc2</translation>
 <translation id="4733082559415072992">L'URL <ph name="URL" /> veut utiliser la position de votre appareil</translation>
 <translation id="4736825316280949806">Redémarrer Chromium</translation>
+<translation id="4736934858538408121">Carte virtuelle</translation>
 <translation id="473775607612524610">Mise à jour</translation>
 <translation id="4738601419177586157">Suggestion de recherche <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gérer les mots de passe…</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 3a5e2d7..63f4361 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -1027,6 +1027,7 @@
 <translation id="4731967714531604179">Prc2 (enveloppe)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> souhaite utiliser la position de votre appareil</translation>
 <translation id="4736825316280949806">Relancez Chromium</translation>
+<translation id="4736934858538408121">Carte virtuelle</translation>
 <translation id="473775607612524610">Mettre à jour</translation>
 <translation id="4738601419177586157">Suggestion de recherche sur "<ph name="TEXT" />"</translation>
 <translation id="4742407542027196863">Gérer les mots de passe…</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb
index ae60eea..c001e19 100644
--- a/components/strings/components_strings_gl.xtb
+++ b/components/strings/components_strings_gl.xtb
@@ -1026,6 +1026,7 @@
 <translation id="4731967714531604179">Prc2 (sobre)</translation>
 <translation id="4733082559415072992">O URL <ph name="URL" /> quere utilizar a localización do teu dispositivo</translation>
 <translation id="4736825316280949806">Reinicia Chromium</translation>
+<translation id="4736934858538408121">Tarxeta virtual</translation>
 <translation id="473775607612524610">Actualizar</translation>
 <translation id="4738601419177586157">Suxestión de busca de "<ph name="TEXT" />"</translation>
 <translation id="4742407542027196863">Xestionar contrasinais…</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 9d0a21c..7b0b106 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -1027,6 +1027,7 @@
 <translation id="4731967714531604179">पीआरसी2 (एन्वेलप)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> वेबसाइट आपके डिवाइस के स्थान की जानकारी का इस्तेमाल करना चाहती है</translation>
 <translation id="4736825316280949806">क्रोमियम को फिर से शुरू करें</translation>
+<translation id="4736934858538408121">वर्चुअल कार्ड</translation>
 <translation id="473775607612524610">अपडेट करें</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> खोज सुझाव</translation>
 <translation id="4742407542027196863">पासवर्ड प्रबंधित करें…</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 4547803..cf145c6f 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (omotnica)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> želi upotrijebiti lokaciju vašeg uređaja</translation>
 <translation id="4736825316280949806">Ponovo pokrenite Chromium</translation>
+<translation id="4736934858538408121">Virtualna kartica</translation>
 <translation id="473775607612524610">Ažuriraj</translation>
 <translation id="4738601419177586157">Prijedlog za pretraživanje <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Upravljaj zaporkama…</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 05dd515..40e48d698 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -1025,6 +1025,7 @@
 <translation id="4731967714531604179">Prc2 (boríték)</translation>
 <translation id="4733082559415072992">A(z) <ph name="URL" /> az eszköz helyadatait szeretné használni</translation>
 <translation id="4736825316280949806">Indítsa újra a Chromiumot</translation>
+<translation id="4736934858538408121">Virtuális kártya</translation>
 <translation id="473775607612524610">Frissítés</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> keresési javaslat</translation>
 <translation id="4742407542027196863">Jelszavak kezelése…</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb
index 9dc0e687..505d01d 100644
--- a/components/strings/components_strings_hy.xtb
+++ b/components/strings/components_strings_hy.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (ծրար)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> կայքն ուզում է օգտագործել ձեր սարքի տեղադրությունը</translation>
 <translation id="4736825316280949806">Վերագործարկեք Chromium-ը</translation>
+<translation id="4736934858538408121">Վիրտուալ քարտ</translation>
 <translation id="473775607612524610">Թարմացնել</translation>
 <translation id="4738601419177586157">Առաջարկվող որոնման հարցում՝ «<ph name="TEXT" />»</translation>
 <translation id="4742407542027196863">Գաղտնաբառերի կառավարում…</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 5186e49491..91d5308f 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -1019,6 +1019,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> ingin menggunakan lokasi perangkat Anda</translation>
 <translation id="4736825316280949806">Buka Ulang Chromium</translation>
+<translation id="4736934858538408121">Kartu virtual</translation>
 <translation id="473775607612524610">Perbarui</translation>
 <translation id="4738601419177586157">Saran penelusuran <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Kelola sandi...</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb
index 20913dee..7e17d2f 100644
--- a/components/strings/components_strings_is.xtb
+++ b/components/strings/components_strings_is.xtb
@@ -1030,6 +1030,7 @@
 <translation id="4731967714531604179">Prc2 (umslag)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> vill nota staðsetningu tækisins</translation>
 <translation id="4736825316280949806">Endurræsa Chromium</translation>
+<translation id="4736934858538408121">Sýndarkort</translation>
 <translation id="473775607612524610">Uppfæra</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> leitartillaga</translation>
 <translation id="4742407542027196863">Stjórna aðgangsorðum…</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 55e41897..b863473 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -1026,6 +1026,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> vuole usare la posizione del dispositivo</translation>
 <translation id="4736825316280949806">Riavvia Chromium</translation>
+<translation id="4736934858538408121">Carta virtuale</translation>
 <translation id="473775607612524610">Aggiorna</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> suggerimento di ricerca</translation>
 <translation id="4742407542027196863">Gestisci password…</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index 48e7f823..70394086 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -1027,6 +1027,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)‎</translation>
 <translation id="4733082559415072992"><ph name="URL" />‏ רוצה להשתמש במיקום המכשיר שלך</translation>
 <translation id="4736825316280949806">‏אתחול ה-Chromium</translation>
+<translation id="4736934858538408121">כרטיס וירטואלי</translation>
 <translation id="473775607612524610">עדכון</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> – הצעת חיפוש</translation>
 <translation id="4742407542027196863">ניהול סיסמאות…</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 4a4b18b9..a607cd9 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -1018,6 +1018,7 @@
 <translation id="4731967714531604179">Prc2(封筒)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> から、デバイスの現在地情報の使用許可を求められています</translation>
 <translation id="4736825316280949806">Chromium を再起動する</translation>
+<translation id="4736934858538408121">仮想カード</translation>
 <translation id="473775607612524610">更新</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> の検索候補</translation>
 <translation id="4742407542027196863">パスワードを管理…</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb
index 410cd3c..38b53c9 100644
--- a/components/strings/components_strings_ka.xtb
+++ b/components/strings/components_strings_ka.xtb
@@ -1018,6 +1018,7 @@
 <translation id="4731967714531604179">Prc2 (კონვერტი)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> ითხოვს მოწყობილობის მდებარეობის გამოყენების ნებართვას</translation>
 <translation id="4736825316280949806">Chromium-ის გადატვირთვა</translation>
+<translation id="4736934858538408121">ვირტუალური ბარათი</translation>
 <translation id="473775607612524610">განახლება</translation>
 <translation id="4738601419177586157">„<ph name="TEXT" />“-ის ძიების შემოთავაზება</translation>
 <translation id="4742407542027196863">პაროლების მართვა…</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb
index 1d608565..dab8988 100644
--- a/components/strings/components_strings_kk.xtb
+++ b/components/strings/components_strings_kk.xtb
@@ -1028,6 +1028,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> құрылғыңыздың орналасқан жер деректерін пайдаланғысы келеді</translation>
 <translation id="4736825316280949806">Chromium браузерін қайта іске қосу</translation>
+<translation id="4736934858538408121">Виртуалды карта</translation>
 <translation id="473775607612524610">Жаңарту</translation>
 <translation id="4738601419177586157">Ұсынылатын сұрау: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Құпия сөздерді басқару...</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index cd04fe5..04c2087 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -1018,6 +1018,7 @@
 <translation id="4731967714531604179">Prc2(봉투)</translation>
 <translation id="4733082559415072992"><ph name="URL" />에서 기기의 위치에 액세스하려고 합니다.</translation>
 <translation id="4736825316280949806">Chromium 다시 시작</translation>
+<translation id="4736934858538408121">가상 카드</translation>
 <translation id="473775607612524610">업데이트</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> 추천 검색어</translation>
 <translation id="4742407542027196863">비밀번호 관리...</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb
index f9c684a..c9484a29 100644
--- a/components/strings/components_strings_ky.xtb
+++ b/components/strings/components_strings_ky.xtb
@@ -1028,6 +1028,7 @@
 <translation id="4731967714531604179">Prc2 (Конверт)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> түзмөгүңүздүн жайгашкан жерин пайдаланганы жатат</translation>
 <translation id="4736825316280949806">Chromium’ду өчүрүп-күйгүзүңүз</translation>
+<translation id="4736934858538408121">Виртуалдык карта</translation>
 <translation id="473775607612524610">Жаңыртуу</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> издөө сунушу</translation>
 <translation id="4742407542027196863">Сырсөздөрдү башкаруу…</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb
index 99e595e8..64fe0d7 100644
--- a/components/strings/components_strings_lo.xtb
+++ b/components/strings/components_strings_lo.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (ຊອງຈົດໝາຍ)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> ຕ້ອງການໃຊ້ສະຖານທີ່ຂອງອຸປະກອນຂອງທ່ານ</translation>
 <translation id="4736825316280949806">ປິດເປີດ Chromium ຄືນໃໝ່</translation>
+<translation id="4736934858538408121">ບັດສະເໝືອນ</translation>
 <translation id="473775607612524610">ອັບເດດ</translation>
 <translation id="4738601419177586157">ການແນະນຳການຊອກຫາ <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">ຈັດການລະຫັດຜ່ານ...</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index 08a7569..8842a167 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -1030,6 +1030,7 @@
 <translation id="4731967714531604179">„Prc2“ (vokas)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> nori naudoti įrenginio vietovę</translation>
 <translation id="4736825316280949806">Iš naujo paleiskite „Chromium“</translation>
+<translation id="4736934858538408121">Virtuali kortelė</translation>
 <translation id="473775607612524610">Atnaujinti</translation>
 <translation id="4738601419177586157">„<ph name="TEXT" />“ paieškos pasiūlymas</translation>
 <translation id="4742407542027196863">Tvarkyti slaptažodžius…</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 34bdb9c..b165e8a 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -1026,6 +1026,7 @@
 <translation id="4731967714531604179">Prc2 (aploksne)</translation>
 <translation id="4733082559415072992">Vietnē <ph name="URL" /> tiek pieprasīta atļauja izmantot jūsu ierīces atrašanās vietu.</translation>
 <translation id="4736825316280949806">Restartējiet pārlūku Chromium</translation>
+<translation id="4736934858538408121">Virtuāla karte</translation>
 <translation id="473775607612524610">Atjaunināt</translation>
 <translation id="4738601419177586157">Meklēšanas ieteikums vaicājumam “<ph name="TEXT" />”</translation>
 <translation id="4742407542027196863">Pārvaldīt paroles…</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb
index cc63ffc0..fb4f580b 100644
--- a/components/strings/components_strings_mk.xtb
+++ b/components/strings/components_strings_mk.xtb
@@ -919,7 +919,7 @@
 <translation id="4275830172053184480">Рестартирај го уредот</translation>
 <translation id="4277028893293644418">Ресетирај ја лозинката</translation>
 <translation id="428639260510061158">{NUM_CARDS,plural, =1{Картичкава е зачувана во вашата сметка на Google}one{Картичкиве се зачувани во вашата сметка на Google}other{Картичкиве се зачувани во вашата сметка на Google}}</translation>
-<translation id="4287885627794386150">Подобно за пробен период, но не е активен</translation>
+<translation id="4287885627794386150">Подобно за пробен период, но не е активно</translation>
 <translation id="4297502707443874121">Сликичка за страницата <ph name="THUMBNAIL_PAGE" /></translation>
 <translation id="42981349822642051">Прошири</translation>
 <translation id="4300675098767811073">Повеќе дупки десно</translation>
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (плик)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> сака да ја користи локацијата на вашиот уред</translation>
 <translation id="4736825316280949806">Рестартирајте го Chromium</translation>
+<translation id="4736934858538408121">Виртуелна картичка</translation>
 <translation id="473775607612524610">Ажурирај</translation>
 <translation id="4738601419177586157">Предлог за пребарување: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Управувајте со лозинките…</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 4b3cfbc..71b3d4d 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -1023,6 +1023,7 @@
 <translation id="4731967714531604179">Prc2 (എൻവലപ്പ്)</translation>
 <translation id="4733082559415072992">നിങ്ങളുടെ ഉപകരണത്തിന്‍റെ ലൊക്കേഷൻ ഉപയോഗിക്കാൻ <ph name="URL" /> ആഗ്രഹിക്കുന്നു</translation>
 <translation id="4736825316280949806">Chromium റീസ്‌റ്റാർട്ടുചെയ്യുക</translation>
+<translation id="4736934858538408121">വെർച്വൽ കാർഡ്</translation>
 <translation id="473775607612524610">അപ്ഡേറ്റ് ചെയ്യുക</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> തിരയൽ നിർദ്ദേശം</translation>
 <translation id="4742407542027196863">പാസ്‌വേഡുകൾ മാനേജ് ചെയ്യുക…</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index 652874d..a79aab4 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -1030,6 +1030,7 @@
 <translation id="4731967714531604179">Prc2 (Sampul Surat)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> mahu menggunakan lokasi peranti anda</translation>
 <translation id="4736825316280949806">Mulakan semula Chromium</translation>
+<translation id="4736934858538408121">Kad maya</translation>
 <translation id="473775607612524610">Kemas kini</translation>
 <translation id="4738601419177586157">Cadangan carian <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Urus kata laluan…</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb
index 73fbe1cd..9f192e1 100644
--- a/components/strings/components_strings_ne.xtb
+++ b/components/strings/components_strings_ne.xtb
@@ -912,6 +912,7 @@
 <translation id="4275830172053184480">आफ्नो यन्त्रलाई फेरि सुरु गर्नुहोस्</translation>
 <translation id="4277028893293644418">पासवर्ड रिसेट गर्नुहोस्</translation>
 <translation id="428639260510061158">{NUM_CARDS,plural, =1{यो कार्डलाई तपाईंको Google खातामा सुरक्षित गरिएको छ।}other{यी कार्डहरूलाई तपाईंको Google खातामा सुरक्षित गरिएको छ}}</translation>
+<translation id="4287885627794386150">परीक्षण प्रयोग गर्न सकिन्छ तर सक्रिय भने छैन</translation>
 <translation id="4297502707443874121">पृष्ठ <ph name="THUMBNAIL_PAGE" /> को थम्बनेल</translation>
 <translation id="42981349822642051">विस्तृत गर्नुहोस्</translation>
 <translation id="4300675098767811073">दायाँपट्टि एकभन्दा बढी प्वाल</translation>
@@ -1714,6 +1715,7 @@
 <translation id="7378594059915113390">मिडियासम्बन्धी नियन्त्रणहरू</translation>
 <translation id="7378627244592794276">होइन</translation>
 <translation id="7378810950367401542">/</translation>
+<translation id="7386364858855961704">लागू नहुने</translation>
 <translation id="7390545607259442187">कार्डको पुष्टि गर्नुहोस्</translation>
 <translation id="7392089738299859607">ठेगाना परिवर्तन गर्नुहोस्</translation>
 <translation id="7399802613464275309">सुरक्षा जाँच</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 19ed2ed..b6e89d77 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -1017,6 +1017,7 @@
 <translation id="4731967714531604179">Prc2 (envelop)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> wil de locatie van je apparaat gebruiken</translation>
 <translation id="4736825316280949806">Chromium opnieuw starten</translation>
+<translation id="4736934858538408121">Virtuele kaart</translation>
 <translation id="473775607612524610">Updaten</translation>
 <translation id="4738601419177586157">Zoeksuggestie: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Wachtwoorden beheren…</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 637adde..0e67f71 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (konvolutt)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> ber om å bruke posisjonen til enheten din</translation>
 <translation id="4736825316280949806">Start Chromium på nytt</translation>
+<translation id="4736934858538408121">Virtuelt kort</translation>
 <translation id="473775607612524610">Oppdater</translation>
 <translation id="4738601419177586157">Søkeforslag for <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Administrer passord…</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb
index 171a19f..dc5e6981 100644
--- a/components/strings/components_strings_or.xtb
+++ b/components/strings/components_strings_or.xtb
@@ -1015,6 +1015,7 @@
 <translation id="4731967714531604179">Prc2 (ଏନଭଲପ୍)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> ଆପଣଙ୍କର ଡିଭାଇସ୍‌ର ଲୋକେସନ୍‌ ବ୍ୟବହାର କରିବାକୁ ଚାହୁଁଛି</translation>
 <translation id="4736825316280949806">Chromium ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation>
+<translation id="4736934858538408121">ଭର୍ଚୁଆଲ୍ କାର୍ଡ</translation>
 <translation id="473775607612524610">ଅପ୍‍‍ଡେଟ୍</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> ସନ୍ଧାନ ପ୍ରସ୍ତାବ</translation>
 <translation id="4742407542027196863">ପାସ୍‌ୱର୍ଡଗୁଡ଼ିକୁ ପରିଚାଳିତ କରନ୍ତୁ…</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb
index a2ec3db0..fb1d0548 100644
--- a/components/strings/components_strings_pa.xtb
+++ b/components/strings/components_strings_pa.xtb
@@ -1016,6 +1016,7 @@
 <translation id="4731967714531604179">Prc2 (ਲਿਫ਼ਾਫ਼ਾ)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> ਦੀ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਵਰਤਣ ਦੀ ਇੱਛਾ ਹੈ</translation>
 <translation id="4736825316280949806">Chromium ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰੋ</translation>
+<translation id="4736934858538408121">ਆਭਾਸੀ ਕਾਰਡ</translation>
 <translation id="473775607612524610">ਅੱਪਡੇਟ ਕਰੋ</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> ਖੋਜ ਸੁਝਾਅ</translation>
 <translation id="4742407542027196863">ਪਾਸਵਰਡਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ…</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index 2e917041..a000f8e 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -1020,6 +1020,7 @@
 <translation id="4731967714531604179">Prc2 (koperta)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> chce używać lokalizacji Twojego urządzenia</translation>
 <translation id="4736825316280949806">Uruchom ponownie Chromium</translation>
+<translation id="4736934858538408121">Karta wirtualna</translation>
 <translation id="473775607612524610">Aktualizuj</translation>
 <translation id="4738601419177586157">Propozycja wyszukiwania: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Zarządzaj hasłami…</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index aa43e6b..9626c844f86 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -1018,6 +1018,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> quer acessar o local do seu dispositivo</translation>
 <translation id="4736825316280949806">Reiniciar o Chromium</translation>
+<translation id="4736934858538408121">Cartão virtual</translation>
 <translation id="473775607612524610">Atualizar</translation>
 <translation id="4738601419177586157">Sugestão de pesquisa: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gerenciar senhas…</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 281bdf3..43ad1c59 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> pretende utilizar a localização do seu dispositivo.</translation>
 <translation id="4736825316280949806">Reiniciar o Chromium</translation>
+<translation id="4736934858538408121">Cartão virtual</translation>
 <translation id="473775607612524610">Atualizar</translation>
 <translation id="4738601419177586157">Sugestão de pesquisa de <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gerir palavras-passe…</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 7ab5177..6f56ed22 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -1027,6 +1027,7 @@
 <translation id="4731967714531604179">Prc2 (Plic)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> dorește să utilizeze locația dispozitivului</translation>
 <translation id="4736825316280949806">repornește Chromium;</translation>
+<translation id="4736934858538408121">Card virtual</translation>
 <translation id="473775607612524610">Actualizează</translation>
 <translation id="4738601419177586157">Sugestie de căutare <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gestionează parolele…</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 96eeac79..0565d66c 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -1017,6 +1017,7 @@
 <translation id="4731967714531604179">Prc2 (конверт)</translation>
 <translation id="4733082559415072992">Сайт <ph name="URL" /> запрашивает данные о местоположении вашего устройства.</translation>
 <translation id="4736825316280949806">Перезапустите Chromium.</translation>
+<translation id="4736934858538408121">Виртуальная карта</translation>
 <translation id="473775607612524610">Обновить</translation>
 <translation id="4738601419177586157">Подсказка при поиске "<ph name="TEXT" />"</translation>
 <translation id="4742407542027196863">Управление паролями</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb
index f119b91..92a32b1 100644
--- a/components/strings/components_strings_si.xtb
+++ b/components/strings/components_strings_si.xtb
@@ -1024,6 +1024,7 @@
 <translation id="4731967714531604179">Prc2 (ලියුම් කවරය)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> හට ඔබේ උපාංගයෙහි පිහිටීම භාවිතා කිරීමට අවශ්‍යයි</translation>
 <translation id="4736825316280949806">Chromium යළි අරඹන්න</translation>
+<translation id="4736934858538408121">අතථ්‍ය කාඩ්පත</translation>
 <translation id="473775607612524610">යාවත්කාලීනය</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> සෙවුම් යෝජනාව</translation>
 <translation id="4742407542027196863">මුරපද කළමනාකරණය කරන්න…</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 7fa14b3c..2cdb4cc0 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -1014,6 +1014,7 @@
 <translation id="4731967714531604179">Prc2 (obálka)</translation>
 <translation id="4733082559415072992">Web <ph name="URL" /> chce používať polohu vášho zariadenia</translation>
 <translation id="4736825316280949806">Reštartujte Chromium</translation>
+<translation id="4736934858538408121">Virtuálna karta</translation>
 <translation id="473775607612524610">Aktualizovať</translation>
 <translation id="4738601419177586157">Návrh vyhľadávania <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Spravovať heslá…</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index c14d7a1..b8d36576 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> želi uporabljati lokacijo vaše naprave</translation>
 <translation id="4736825316280949806">Znova zaženite Chromium</translation>
+<translation id="4736934858538408121">Navidezna kartica</translation>
 <translation id="473775607612524610">Posodobi</translation>
 <translation id="4738601419177586157">Predlog za iskanje poizvedbe <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Upravljaj gesla …</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb
index 55e746fc..dba9f1684 100644
--- a/components/strings/components_strings_sq.xtb
+++ b/components/strings/components_strings_sq.xtb
@@ -1024,6 +1024,7 @@
 <translation id="4731967714531604179">Prc2 (Zarf)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> kërkon të përdorë vendndodhjen e pajisjes sate</translation>
 <translation id="4736825316280949806">Rinis Chromium</translation>
+<translation id="4736934858538408121">Karta virtuale</translation>
 <translation id="473775607612524610">Përditësoje</translation>
 <translation id="4738601419177586157">Sugjerim kërkimi për <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Menaxho fjalëkalimet…</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb
index ae77bd5a..39079c1 100644
--- a/components/strings/components_strings_sr-Latn.xtb
+++ b/components/strings/components_strings_sr-Latn.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (koverat)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> želi da koristi lokaciju uređaja</translation>
 <translation id="4736825316280949806">Ponovo pokrenite Chromium</translation>
+<translation id="4736934858538408121">Virtuelna kartica</translation>
 <translation id="473775607612524610">Ažuriraj</translation>
 <translation id="4738601419177586157">Predlog za pretragu <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Upravljaj lozinkama...</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index ae7e8d3..b18e922 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (коверат)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> жели да користи локацију уређаја</translation>
 <translation id="4736825316280949806">Поново покрените Chromium</translation>
+<translation id="4736934858538408121">Виртуелна картица</translation>
 <translation id="473775607612524610">Ажурирај</translation>
 <translation id="4738601419177586157">Предлог за претрагу <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Управљај лозинкама...</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 07072d9b..9f248b16 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -1029,6 +1029,7 @@
 <translation id="4731967714531604179">Prc2 (kuvert)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> vill använda enhetens plats</translation>
 <translation id="4736825316280949806">Starta om Chromium</translation>
+<translation id="4736934858538408121">Virtuellt kort</translation>
 <translation id="473775607612524610">Uppdatera</translation>
 <translation id="4738601419177586157">Sökförslag för <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Hantera lösenord …</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index d4ee64a..9529b87 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -1028,6 +1028,7 @@
 <translation id="4731967714531604179">Prc2 (Bahasha)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> inataka kutumia maelezo kuhusu mahali kifaa chako kilipo</translation>
 <translation id="4736825316280949806">Zima na uwashe Chromium</translation>
+<translation id="4736934858538408121">Kadi pepe</translation>
 <translation id="473775607612524610">Sasisha</translation>
 <translation id="4738601419177586157">Pendekezo la utafutajI la <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Dhibiti manenosiri…</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index f01513a6..de88afca 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -1017,6 +1017,7 @@
 <translation id="4731967714531604179">Prc2 (ซองจดหมาย)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> ต้องการใช้ตำแหน่งอุปกรณ์ของคุณ</translation>
 <translation id="4736825316280949806">รีสตาร์ท Chromium</translation>
+<translation id="4736934858538408121">บัตรเสมือน</translation>
 <translation id="473775607612524610">อัปเดต</translation>
 <translation id="4738601419177586157">การแนะนำการค้นหา <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">จัดการรหัสผ่าน…</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index fd6fab4..4032930 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -1020,6 +1020,7 @@
 <translation id="4731967714531604179">Prc2 (Zarf)</translation>
 <translation id="4733082559415072992"><ph name="URL" />, cihazınızın konumunu kullanmak istiyor</translation>
 <translation id="4736825316280949806">Chromium'u yeniden başlatın</translation>
+<translation id="4736934858538408121">Sanal kart</translation>
 <translation id="473775607612524610">Güncelle</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> arama önerisi</translation>
 <translation id="4742407542027196863">Şifreleri yönet…</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 1c3001af..e0c5ebf 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -1027,6 +1027,7 @@
 <translation id="4731967714531604179">Prc2 (конверт)</translation>
 <translation id="4733082559415072992">Сайт <ph name="URL" /> хоче отримати доступ до геоданих вашого пристрою</translation>
 <translation id="4736825316280949806">Перезапустіть Chromium</translation>
+<translation id="4736934858538408121">Віртуальна картка</translation>
 <translation id="473775607612524610">Оновити</translation>
 <translation id="4738601419177586157">Пропозиція пошуку за запитом "<ph name="TEXT" />"</translation>
 <translation id="4742407542027196863">Керувати паролями…</translation>
@@ -1202,7 +1203,7 @@
 <translation id="5321288445143113935">Розгорнуто</translation>
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> з <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Вибрати контактну інформацію</translation>
-<translation id="5327248766486351172">Назва</translation>
+<translation id="5327248766486351172">Ім’я</translation>
 <translation id="5329858041417644019">Веб-переглядачем не керує адміністратор</translation>
 <translation id="5332219387342487447">Спосіб доставки</translation>
 <translation id="5333022057423422993">Веб-переглядач Chrome виявив, що введений пароль розкрито через порушення безпеки даних. Щоб захистити свої облікові записи, радимо перевірити надійність збережених паролів.</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index 355ac4c8..51abcfd 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -1014,6 +1014,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> 想使用您设备的位置信息</translation>
 <translation id="4736825316280949806">重新启动 Chromium</translation>
+<translation id="4736934858538408121">虚拟卡</translation>
 <translation id="473775607612524610">更新</translation>
 <translation id="4738601419177586157"><ph name="TEXT" />搜索建议</translation>
 <translation id="4742407542027196863">管理密码…</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb
index 38c0757..110b5eba 100644
--- a/components/strings/components_strings_zh-HK.xtb
+++ b/components/strings/components_strings_zh-HK.xtb
@@ -1017,6 +1017,7 @@
 <translation id="4731967714531604179">Prc2 (信封)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> 要求使用裝置的位置資料</translation>
 <translation id="4736825316280949806">重新啟動 Chromium</translation>
+<translation id="4736934858538408121">虛擬卡</translation>
 <translation id="473775607612524610">更新</translation>
 <translation id="4738601419177586157">「<ph name="TEXT" />」搜尋建議</translation>
 <translation id="4742407542027196863">管理密碼…</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 1e494ab..9a35649 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -1018,6 +1018,7 @@
 <translation id="4731967714531604179">Prc2 (信封)</translation>
 <translation id="4733082559415072992"><ph name="URL" /> 要求使用裝置的位置資訊</translation>
 <translation id="4736825316280949806">重新啟動 Chromium</translation>
+<translation id="4736934858538408121">虛擬卡片</translation>
 <translation id="473775607612524610">更新</translation>
 <translation id="4738601419177586157">「<ph name="TEXT" />」搜尋建議</translation>
 <translation id="4742407542027196863">管理密碼…</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb
index 34cd2aaa..fbcb8959 100644
--- a/components/strings/components_strings_zu.xtb
+++ b/components/strings/components_strings_zu.xtb
@@ -1026,6 +1026,7 @@
 <translation id="4731967714531604179">Prc2 (Envelope)</translation>
 <translation id="4733082559415072992">I-<ph name="URL" /> ifuna ukusebenzisa indawo yedivayisi yakho</translation>
 <translation id="4736825316280949806">Qalisa kabusha i-Chromium</translation>
+<translation id="4736934858538408121">Ikhadi elibonakalayo</translation>
 <translation id="473775607612524610">Buyekeza</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> sesha isiphakamiso</translation>
 <translation id="4742407542027196863">Phatha amaphasiwedi...</translation>
diff --git a/components/suggestions/suggestions_service_impl_unittest.cc b/components/suggestions/suggestions_service_impl_unittest.cc
index 60908661..143c3196 100644
--- a/components/suggestions/suggestions_service_impl_unittest.cc
+++ b/components/suggestions/suggestions_service_impl_unittest.cc
@@ -111,7 +111,8 @@
 class SuggestionsServiceTest : public testing::Test {
  protected:
   SuggestionsServiceTest() {
-    identity_test_env_.MakePrimaryAccountAvailable(kEmail);
+    identity_test_env_.MakePrimaryAccountAvailable(kEmail,
+                                                   signin::ConsentLevel::kSync);
     identity_test_env_.SetAutomaticIssueOfAccessTokens(true);
   }
 
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn
index a739ab0..c8575ba 100644
--- a/components/sync/BUILD.gn
+++ b/components/sync/BUILD.gn
@@ -141,11 +141,11 @@
     "driver/model_type_controller_unittest.cc",
     "driver/passphrase_type_metrics_provider_unittest.cc",
     "driver/profile_sync_service_startup_unittest.cc",
-    "driver/profile_sync_service_unittest.cc",
     "driver/startup_controller_unittest.cc",
     "driver/sync_auth_manager_unittest.cc",
     "driver/sync_internals_util_unittest.cc",
     "driver/sync_service_crypto_unittest.cc",
+    "driver/sync_service_impl_unittest.cc",
     "driver/sync_service_utils_unittest.cc",
     "driver/sync_session_durations_metrics_recorder_unittest.cc",
     "driver/sync_stopped_reporter_unittest.cc",
diff --git a/components/sync/base/sync_prefs.h b/components/sync/base/sync_prefs.h
index 1b67a12..1bf0374 100644
--- a/components/sync/base/sync_prefs.h
+++ b/components/sync/base/sync_prefs.h
@@ -154,7 +154,7 @@
 
   // Whether Sync is forced off by enterprise policy. Note that this only covers
   // one out of two types of policy, "browser" policy. The second kind, "cloud"
-  // policy, is handled directly in ProfileSyncService.
+  // policy, is handled directly in SyncServiceImpl.
   bool IsManaged() const;
 
   // Maps |type| to its corresponding preference name.
diff --git a/components/sync/driver/BUILD.gn b/components/sync/driver/BUILD.gn
index 9b6db57..a70a0cd5 100644
--- a/components/sync/driver/BUILD.gn
+++ b/components/sync/driver/BUILD.gn
@@ -33,8 +33,6 @@
     "non_ui_syncable_service_based_model_type_controller.h",
     "passphrase_type_metrics_provider.cc",
     "passphrase_type_metrics_provider.h",
-    "profile_sync_service.cc",
-    "profile_sync_service.h",
     "startup_controller.cc",
     "startup_controller.h",
     "sync_api_component_factory.h",
@@ -53,6 +51,8 @@
     "sync_service.h",
     "sync_service_crypto.cc",
     "sync_service_crypto.h",
+    "sync_service_impl.cc",
+    "sync_service_impl.h",
     "sync_service_observer.cc",
     "sync_service_observer.h",
     "sync_service_utils.cc",
diff --git a/components/sync/driver/backend_migrator.h b/components/sync/driver/backend_migrator.h
index f4e7005..7ee6f78 100644
--- a/components/sync/driver/backend_migrator.h
+++ b/components/sync/driver/backend_migrator.h
@@ -53,7 +53,7 @@
 
   State state() const;
 
-  // Called from ProfileSyncService to notify us of configure done.
+  // Called from SyncServiceImpl to notify us of configure done.
   // Note: We receive these notifications only when our state is not IDLE.
   void OnConfigureDone(const DataTypeManager::ConfigureResult& result);
 
diff --git a/components/sync/driver/configure_context.h b/components/sync/driver/configure_context.h
index ffd9315..e87fb2b4 100644
--- a/components/sync/driver/configure_context.h
+++ b/components/sync/driver/configure_context.h
@@ -16,7 +16,7 @@
 // Struct describing in which context sync was enabled, including state that can
 // be assumed to be fixed while sync is enabled (or, more precisely, is
 // representative of the last (re)configuration request). It's built by
-// ProfileSyncService and plumbed through DataTypeManager until datatype
+// SyncServiceImpl and plumbed through DataTypeManager until datatype
 // controllers, which for USS datatypes propagate analogous information to the
 // processor/bridge via DataTypeActivationRequest.
 struct ConfigureContext {
diff --git a/components/sync/driver/data_type_manager_impl.h b/components/sync/driver/data_type_manager_impl.h
index c44478d0..c0793c0 100644
--- a/components/sync/driver/data_type_manager_impl.h
+++ b/components/sync/driver/data_type_manager_impl.h
@@ -207,7 +207,7 @@
   // The manager that loads the local models of the data types.
   ModelLoadManager model_load_manager_;
 
-  // DataTypeManager must have only one observer -- the ProfileSyncService that
+  // DataTypeManager must have only one observer -- the SyncServiceImpl that
   // created it and manages its lifetime.
   DataTypeManagerObserver* const observer_;
 
diff --git a/components/sync/driver/profile_sync_service_bundle.cc b/components/sync/driver/profile_sync_service_bundle.cc
index 5cd4e08..065bd304 100644
--- a/components/sync/driver/profile_sync_service_bundle.cc
+++ b/components/sync/driver/profile_sync_service_bundle.cc
@@ -39,10 +39,10 @@
   return std::move(sync_client);
 }
 
-ProfileSyncService::InitParams ProfileSyncServiceBundle::CreateBasicInitParams(
-    ProfileSyncService::StartBehavior start_behavior,
+SyncServiceImpl::InitParams ProfileSyncServiceBundle::CreateBasicInitParams(
+    SyncServiceImpl::StartBehavior start_behavior,
     std::unique_ptr<SyncClient> sync_client) {
-  ProfileSyncService::InitParams init_params;
+  SyncServiceImpl::InitParams init_params;
 
   init_params.start_behavior = start_behavior;
   init_params.sync_client = std::move(sync_client);
diff --git a/components/sync/driver/profile_sync_service_bundle.h b/components/sync/driver/profile_sync_service_bundle.h
index 46e55e9f..ad0549a6 100644
--- a/components/sync/driver/profile_sync_service_bundle.h
+++ b/components/sync/driver/profile_sync_service_bundle.h
@@ -13,8 +13,8 @@
 #include "components/prefs/testing_pref_service.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
 #include "components/sync/driver/fake_sync_api_component_factory.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_client_mock.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/invalidations/mock_sync_invalidations_service.h"
 #include "components/sync/invalidations/switches.h"
 #include "services/network/test/test_url_loader_factory.h"
@@ -22,7 +22,7 @@
 namespace syncer {
 
 // Aggregate this class to get all necessary support for creating a
-// ProfileSyncService in tests. The test still needs to have its own
+// SyncServiceImpl in tests. The test still needs to have its own
 // MessageLoop, though.
 class ProfileSyncServiceBundle {
  public:
@@ -36,8 +36,8 @@
   // Creates an InitParams instance with the specified |start_behavior| and
   // |sync_client|, and fills the rest with dummy values and objects owned by
   // the bundle.
-  ProfileSyncService::InitParams CreateBasicInitParams(
-      ProfileSyncService::StartBehavior start_behavior,
+  SyncServiceImpl::InitParams CreateBasicInitParams(
+      SyncServiceImpl::StartBehavior start_behavior,
       std::unique_ptr<SyncClient> sync_client);
 
   // Accessors
diff --git a/components/sync/driver/profile_sync_service_startup_unittest.cc b/components/sync/driver/profile_sync_service_startup_unittest.cc
index 2955b85b..e76fa0c 100644
--- a/components/sync/driver/profile_sync_service_startup_unittest.cc
+++ b/components/sync/driver/profile_sync_service_startup_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/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 
 #include "base/bind.h"
 #include "base/test/task_environment.h"
@@ -51,7 +51,7 @@
   ~ProfileSyncServiceStartupTest() override { sync_service_->Shutdown(); }
 
   void CreateSyncService(
-      ProfileSyncService::StartBehavior start_behavior,
+      SyncServiceImpl::StartBehavior start_behavior,
       ModelTypeSet registered_types = ModelTypeSet(BOOKMARKS)) {
     DataTypeController::TypeVector controllers;
     for (ModelType type : registered_types) {
@@ -66,14 +66,14 @@
     ON_CALL(*sync_client, CreateDataTypeControllers)
         .WillByDefault(Return(ByMove(std::move(controllers))));
 
-    sync_service_ = std::make_unique<ProfileSyncService>(
+    sync_service_ = std::make_unique<SyncServiceImpl>(
         profile_sync_service_bundle_.CreateBasicInitParams(
             start_behavior, std::move(sync_client)));
   }
 
   void SimulateTestUserSignin() {
     profile_sync_service_bundle_.identity_test_env()
-        ->MakePrimaryAccountAvailable(kEmail);
+        ->MakePrimaryAccountAvailable(kEmail, signin::ConsentLevel::kSync);
   }
 
   void SimulateTestUserSigninWithoutRefreshToken() {
@@ -107,7 +107,7 @@
 
   SyncPrefs* sync_prefs() { return &sync_prefs_; }
 
-  ProfileSyncService* sync_service() { return sync_service_.get(); }
+  SyncServiceImpl* sync_service() { return sync_service_.get(); }
 
   PrefService* pref_service() {
     return profile_sync_service_bundle_.pref_service();
@@ -137,7 +137,7 @@
   base::test::TaskEnvironment task_environment_;
   ProfileSyncServiceBundle profile_sync_service_bundle_;
   SyncPrefs sync_prefs_;
-  std::unique_ptr<ProfileSyncService> sync_service_;
+  std::unique_ptr<SyncServiceImpl> sync_service_;
   // The controllers are owned by |sync_service_|.
   std::map<ModelType, FakeDataTypeController*> controller_map_;
 };
@@ -148,7 +148,7 @@
   // We've never completed startup.
   ASSERT_FALSE(sync_prefs()->IsFirstSetupComplete());
 
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
 
   // Should not actually start, rather just clean things up and wait
   // to be enabled.
@@ -166,7 +166,7 @@
   EXPECT_EQ(base::Time(), sync_service()->GetLastSyncedTimeForDebugging());
   EXPECT_FALSE(sync_prefs()->IsFirstSetupComplete());
 
-  // This tells the ProfileSyncService that setup is now in progress, which
+  // This tells the SyncServiceImpl that setup is now in progress, which
   // causes it to try starting up the engine. We're not signed in yet though, so
   // that won't work.
   sync_service()->GetUserSettings()->SetSyncRequested(true);
@@ -203,7 +203,7 @@
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_FALSE(sync_service()->IsSyncFeatureActive());
 
-  // Marking first setup complete will let ProfileSyncService reconfigure the
+  // Marking first setup complete will let SyncServiceImpl reconfigure the
   // DataTypeManager in full Sync-the-feature mode.
   sync_service()->GetUserSettings()->SetFirstSetupComplete(
       syncer::SyncFirstSetupCompleteSource::BASIC_FLOW);
@@ -222,15 +222,15 @@
   SimulateTestUserSigninWithoutRefreshToken();
   sync_prefs()->SetFirstSetupComplete();
 
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
   sync_service()->Initialize();
 
-  // ProfileSyncService should now be active, but of course not have an access
+  // SyncServiceImpl should now be active, but of course not have an access
   // token.
   EXPECT_EQ(SyncService::TransportState::ACTIVE,
             sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->GetAccessTokenForTest().empty());
-  // Note that ProfileSyncService is not in an auth error state - no auth was
+  // Note that SyncServiceImpl is not in an auth error state - no auth was
   // attempted, so no error.
 }
 
@@ -241,11 +241,11 @@
   SimulateWebSignout();
   sync_prefs()->SetFirstSetupComplete();
 
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
 
   sync_service()->Initialize();
 
-  // ProfileSyncService should now be in the paused state.
+  // SyncServiceImpl should now be in the paused state.
   EXPECT_EQ(SyncService::TransportState::PAUSED,
             sync_service()->GetTransportState());
 }
@@ -259,7 +259,7 @@
 
   // Note: Deferred startup is only enabled if SESSIONS is among the preferred
   // data types.
-  CreateSyncService(ProfileSyncService::MANUAL_START, {TYPED_URLS, SESSIONS});
+  CreateSyncService(SyncServiceImpl::MANUAL_START, {TYPED_URLS, SESSIONS});
   sync_service()->Initialize();
 
   ASSERT_EQ(SyncService::TransportState::START_DEFERRED,
@@ -277,7 +277,7 @@
   // Now sign out on the web to enter the sync-paused state.
   SimulateWebSignout();
 
-  // ProfileSyncService should now be in the paused state.
+  // SyncServiceImpl should now be in the paused state.
   EXPECT_EQ(SyncService::TransportState::PAUSED,
             sync_service()->GetTransportState());
 
@@ -292,7 +292,7 @@
   SimulateTestUserSignin();
   sync_prefs()->SetFirstSetupComplete();
 
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
   sync_service()->Initialize();
 
   // Respond to the token request to finish the initialization flow.
@@ -313,7 +313,7 @@
   // Now sign out on the web to enter the sync-paused state.
   SimulateWebSignout();
 
-  // ProfileSyncService should now be in the paused state.
+  // SyncServiceImpl should now be in the paused state.
   EXPECT_EQ(SyncService::TransportState::PAUSED,
             sync_service()->GetTransportState());
 
@@ -325,7 +325,7 @@
   sync_prefs()->SetSyncRequested(true);
   sync_prefs()->SetFirstSetupComplete();
 
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
 
   // Prevent automatic (and successful) completion of engine initialization.
   component_factory()->AllowFakeEngineInitCompletion(false);
@@ -352,7 +352,7 @@
   // isn't necessarily available yet.
   SimulateTestUserSigninWithoutRefreshToken();
 
-  CreateSyncService(ProfileSyncService::AUTO_START);
+  CreateSyncService(SyncServiceImpl::AUTO_START);
 
   // Calling Initialize should cause the service to immediately create and
   // initialize the engine, and configure the DataTypeManager.
@@ -371,7 +371,7 @@
   // isn't necessarily available yet.
   SimulateTestUserSigninWithoutRefreshToken();
 
-  CreateSyncService(ProfileSyncService::AUTO_START);
+  CreateSyncService(SyncServiceImpl::AUTO_START);
   ASSERT_FALSE(sync_prefs()->IsFirstSetupComplete());
 
   // The primary account is already populated, all that's left to do is provide
@@ -388,7 +388,7 @@
   sync_prefs()->SetFirstSetupComplete();
   SimulateTestUserSignin();
 
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
 
   // Since all conditions for starting Sync are already fulfilled, calling
   // Initialize should immediately create and initialize the engine and
@@ -403,7 +403,7 @@
 
 TEST_F(ProfileSyncServiceStartupTest, StopSync) {
   sync_prefs()->SetFirstSetupComplete();
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
   SimulateTestUserSignin();
 
   sync_service()->Initialize();
@@ -427,7 +427,7 @@
   sync_prefs()->SetSyncRequested(true);
   sync_prefs()->SetFirstSetupComplete();
   SimulateTestUserSignin();
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
 
   sync_service()->Initialize();
   ASSERT_TRUE(sync_service()->IsSyncFeatureActive());
@@ -465,7 +465,7 @@
   }
 
   sync_prefs()->SetFirstSetupComplete();
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
   SimulateTestUserSignin();
 
   sync_service()->Initialize();
@@ -484,7 +484,7 @@
       /*chosen_types=*/{UserSelectableType::kBookmarks});
 
   sync_prefs()->SetFirstSetupComplete();
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
   SimulateTestUserSignin();
 
   sync_service()->Initialize();
@@ -500,7 +500,7 @@
   sync_prefs()->SetFirstSetupComplete();
 
   SimulateTestUserSignin();
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
 
   sync_service()->Initialize();
   // Sync was disabled due to the policy, setting SyncRequested to false and
@@ -519,7 +519,7 @@
   sync_prefs()->SetSyncRequested(true);
   sync_prefs()->SetFirstSetupComplete();
   SimulateTestUserSignin();
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
 
   // Initialize() should be enough to kick off Sync startup (which is instant in
   // this test).
@@ -570,7 +570,7 @@
 
 TEST_F(ProfileSyncServiceStartupTest, StartDownloadFailed) {
   sync_prefs()->SetSyncRequested(true);
-  CreateSyncService(ProfileSyncService::MANUAL_START);
+  CreateSyncService(SyncServiceImpl::MANUAL_START);
   SimulateTestUserSignin();
   ASSERT_FALSE(sync_prefs()->IsFirstSetupComplete());
 
@@ -598,7 +598,7 @@
 
   // Note: Deferred startup is only enabled if SESSIONS is among the preferred
   // data types.
-  CreateSyncService(ProfileSyncService::MANUAL_START,
+  CreateSyncService(SyncServiceImpl::MANUAL_START,
                     ModelTypeSet(SESSIONS, TYPED_URLS));
   sync_service()->Initialize();
   ASSERT_FALSE(sync_service()->CanSyncFeatureStart());
@@ -683,7 +683,7 @@
 
   // Note: Deferred startup is only enabled if SESSIONS is among the preferred
   // data types.
-  CreateSyncService(ProfileSyncService::MANUAL_START,
+  CreateSyncService(SyncServiceImpl::MANUAL_START,
                     ModelTypeSet(SESSIONS, TYPED_URLS));
   sync_service()->Initialize();
   ASSERT_TRUE(sync_service()->CanSyncFeatureStart());
diff --git a/components/sync/driver/startup_controller.h b/components/sync/driver/startup_controller.h
index 699c3ba9..1701cf686 100644
--- a/components/sync/driver/startup_controller.h
+++ b/components/sync/driver/startup_controller.h
@@ -14,7 +14,7 @@
 
 namespace syncer {
 
-// This class is used by ProfileSyncService to manage all logic and state
+// This class is used by SyncServiceImpl to manage all logic and state
 // pertaining to initialization of the SyncEngine.
 class StartupController : public policy::PolicyService::Observer {
  public:
diff --git a/components/sync/driver/sync_auth_manager.h b/components/sync/driver/sync_auth_manager.h
index 53e523d5..66fa4656 100644
--- a/components/sync/driver/sync_auth_manager.h
+++ b/components/sync/driver/sync_auth_manager.h
@@ -91,15 +91,15 @@
   // internals UI.
   SyncTokenStatus GetSyncTokenStatus() const;
 
-  // Called by ProfileSyncService when Sync starts up and will try talking to
+  // Called by SyncServiceImpl when Sync starts up and will try talking to
   // the server soon. This initiates fetching an access token.
   void ConnectionOpened();
 
-  // Called by ProfileSyncService when the status of the connection to the Sync
+  // Called by SyncServiceImpl when the status of the connection to the Sync
   // server changed. Updates auth error state accordingly.
   void ConnectionStatusChanged(ConnectionStatus status);
 
-  // Called by ProfileSyncService when the connection to the Sync server is
+  // Called by SyncServiceImpl when the connection to the Sync server is
   // closed (due to Sync being shut down). Clears all related state (such as
   // cached access token, error from the server, etc).
   void ConnectionClosed();
diff --git a/components/sync/driver/sync_auth_manager_unittest.cc b/components/sync/driver/sync_auth_manager_unittest.cc
index 69ce71b..7b60c60ff 100644
--- a/components/sync/driver/sync_auth_manager_unittest.cc
+++ b/components/sync/driver/sync_auth_manager_unittest.cc
@@ -83,7 +83,10 @@
   // Fire some auth events. We haven't called RegisterForAuthNotifications, so
   // none of this should result in any callback calls.
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   // Without RegisterForAuthNotifications, the active account should always be
   // reported as empty.
   EXPECT_TRUE(
@@ -105,7 +108,10 @@
 TEST_F(SyncAuthManagerTest, ForwardsPrimaryAccountEvents) {
   // Start out already signed in before the SyncAuthManager is created.
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
 
   base::MockCallback<AccountStateChangedCallback> account_state_changed;
   base::MockCallback<CredentialsChangedCallback> credentials_changed;
@@ -132,7 +138,10 @@
   // Sign in to a different account.
   EXPECT_CALL(account_state_changed, Run());
   CoreAccountId second_account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   EXPECT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
             second_account_id);
 }
@@ -140,7 +149,10 @@
 TEST_F(SyncAuthManagerTest, NotifiesOfSignoutBeforeAccessTokenIsGone) {
   // Start out already signed in before the SyncAuthManager is created.
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
 
   base::MockCallback<AccountStateChangedCallback> account_state_changed;
   base::MockCallback<CredentialsChangedCallback> credentials_changed;
@@ -188,8 +200,8 @@
 
   // Make a non-primary account available with both a refresh token and cookie.
   EXPECT_CALL(account_state_changed, Run());
-  AccountInfo account_info =
-      identity_env()->MakeUnconsentedPrimaryAccountAvailable("test@email.com");
+  AccountInfo account_info = identity_env()->MakePrimaryAccountAvailable(
+      "test@email.com", signin::ConsentLevel::kSignin);
 
   EXPECT_FALSE(auth_manager->GetActiveAccountInfo().is_primary);
   EXPECT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -212,7 +224,10 @@
 TEST_F(SyncAuthManagerTest, ClearsAuthErrorOnSignout) {
   // Start out already signed in before the SyncAuthManager is created.
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
 
   auto auth_manager = CreateAuthManager();
 
@@ -243,7 +258,10 @@
 TEST_F(SyncAuthManagerTest, DoesNotClearAuthErrorOnSyncDisable) {
   // Start out already signed in before the SyncAuthManager is created.
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
 
   auto auth_manager = CreateAuthManager();
 
@@ -272,7 +290,10 @@
 TEST_F(SyncAuthManagerTest, ForwardsCredentialsEvents) {
   // Start out already signed in before the SyncAuthManager is created.
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
 
   base::MockCallback<AccountStateChangedCallback> account_state_changed;
   base::MockCallback<CredentialsChangedCallback> credentials_changed;
@@ -315,7 +336,10 @@
 
 TEST_F(SyncAuthManagerTest, RequestsAccessTokenOnSyncStartup) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -332,7 +356,10 @@
 TEST_F(SyncAuthManagerTest,
        RetriesAccessTokenFetchWithBackoffOnTransientFailure) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -358,7 +385,10 @@
   local_feature.InitAndDisableFeature(kSyncRetryFirstCanceledTokenFetch);
 
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -376,7 +406,10 @@
 TEST_F(SyncAuthManagerTest,
        RetriesAccessTokenFetchWithoutBackoffOnceOnFirstCancelTransientFailure) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -401,7 +434,10 @@
 TEST_F(SyncAuthManagerTest,
        RetriesAccessTokenFetchOnFirstCancelTransientFailure) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -426,7 +462,10 @@
 
 TEST_F(SyncAuthManagerTest, AbortsAccessTokenFetchOnPersistentFailure) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -448,7 +487,10 @@
 
 TEST_F(SyncAuthManagerTest, FetchesNewAccessTokenWithBackoffOnServerError) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -472,7 +514,10 @@
 
 TEST_F(SyncAuthManagerTest, ExposesServerError) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -496,7 +541,10 @@
 
 TEST_F(SyncAuthManagerTest, ClearsServerErrorOnSyncDisable) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -523,7 +571,10 @@
 
 TEST_F(SyncAuthManagerTest, RequestsNewAccessTokenOnExpiry) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -553,7 +604,10 @@
 
 TEST_F(SyncAuthManagerTest, RequestsNewAccessTokenOnRefreshTokenUpdate) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -583,7 +637,10 @@
 
 TEST_F(SyncAuthManagerTest, DoesNotRequestAccessTokenAutonomously) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -610,7 +667,10 @@
 
 TEST_F(SyncAuthManagerTest, ClearsCredentialsOnRefreshTokenRemoval) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -647,7 +707,10 @@
 
 TEST_F(SyncAuthManagerTest, ClearsCredentialsOnInvalidRefreshToken) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -689,7 +752,10 @@
 TEST_F(SyncAuthManagerTest,
        RequestsAccessTokenWhenInvalidRefreshTokenResolved) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   auto auth_manager = CreateAuthManager();
   auth_manager->RegisterForAuthNotifications();
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
@@ -721,7 +787,10 @@
 
 TEST_F(SyncAuthManagerTest, DoesNotRequestAccessTokenIfSyncInactive) {
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
 
   base::MockCallback<AccountStateChangedCallback> account_state_changed;
   base::MockCallback<CredentialsChangedCallback> credentials_changed;
@@ -770,8 +839,8 @@
       auth_manager->GetActiveAccountInfo().account_info.account_id.empty());
 
   // Make a primary account with no sync consent available.
-  AccountInfo account_info =
-      identity_env()->MakeUnconsentedPrimaryAccountAvailable("test@email.com");
+  AccountInfo account_info = identity_env()->MakePrimaryAccountAvailable(
+      "test@email.com", signin::ConsentLevel::kSignin);
 
   // Since unconsented primary account support is enabled, SyncAuthManager
   // should have picked up this account.
@@ -793,14 +862,16 @@
 
   // Make a primary account with no sync consent available.
   AccountInfo unconsented_primary_account_info =
-      identity_env()->MakeUnconsentedPrimaryAccountAvailable("test@email.com");
+      identity_env()->MakePrimaryAccountAvailable(
+          "test@email.com", signin::ConsentLevel::kSignin);
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
             unconsented_primary_account_info.account_id);
 
   // Once a primary account with sync consent becomes available, the unconsented
   // primary account should be overridden.
   AccountInfo primary_account_info =
-      identity_env()->MakePrimaryAccountAvailable("primary@email.com");
+      identity_env()->MakePrimaryAccountAvailable("primary@email.com",
+                                                  signin::ConsentLevel::kSync);
   EXPECT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
             primary_account_info.account_id);
 }
@@ -811,8 +882,8 @@
   auth_manager->RegisterForAuthNotifications();
 
   // Make a primary account with no sync consent available.
-  AccountInfo account_info =
-      identity_env()->MakeUnconsentedPrimaryAccountAvailable("test@email.com");
+  AccountInfo account_info = identity_env()->MakePrimaryAccountAvailable(
+      "test@email.com", signin::ConsentLevel::kSignin);
   ASSERT_EQ(auth_manager->GetActiveAccountInfo().account_info.account_id,
             account_info.account_id);
 
@@ -827,7 +898,10 @@
   // There is a primary account, but it has an invalid refresh token (with a
   // persistent auth error).
   CoreAccountId account_id =
-      identity_env()->MakePrimaryAccountAvailable("test@email.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@email.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   identity_env()->SetInvalidRefreshTokenForPrimaryAccount();
 
   // On initialization, SyncAuthManager should pick up the auth error. This
diff --git a/components/sync/driver/sync_internals_util.cc b/components/sync/driver/sync_internals_util.cc
index dbc815e..2d1f3a0 100644
--- a/components/sync/driver/sync_internals_util.cc
+++ b/components/sync/driver/sync_internals_util.cc
@@ -642,7 +642,7 @@
 
   // We don't need to check is_status_valid here.
   // full_status.sync_protocol_error is exported directly from the
-  // ProfileSyncService, even if the backend doesn't exist.
+  // SyncServiceImpl, even if the backend doesn't exist.
   const bool actionable_error_detected =
       full_status.sync_protocol_error.error_type != UNKNOWN_ERROR &&
       full_status.sync_protocol_error.error_type != SYNC_SUCCESS;
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/sync_service_impl.cc
similarity index 88%
rename from components/sync/driver/profile_sync_service.cc
rename to components/sync/driver/sync_service_impl.cc
index 6b18b6fd..28b2dabb 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/sync_service_impl.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/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 
 #include <cstddef>
 #include <utility>
@@ -70,13 +70,12 @@
 void RecordSyncInitialState(SyncService::DisableReasonSet disable_reasons,
                             bool first_setup_complete) {
   SyncInitialState sync_state = CAN_START;
-  if (disable_reasons.Has(ProfileSyncService::DISABLE_REASON_NOT_SIGNED_IN)) {
+  if (disable_reasons.Has(SyncService::DISABLE_REASON_NOT_SIGNED_IN)) {
     sync_state = NOT_SIGNED_IN;
   } else if (disable_reasons.Has(
-                 ProfileSyncService::DISABLE_REASON_ENTERPRISE_POLICY)) {
+                 SyncService::DISABLE_REASON_ENTERPRISE_POLICY)) {
     sync_state = NOT_ALLOWED_BY_POLICY;
-  } else if (disable_reasons.Has(
-                 ProfileSyncService::DISABLE_REASON_USER_CHOICE)) {
+  } else if (disable_reasons.Has(SyncService::DISABLE_REASON_USER_CHOICE)) {
     if (first_setup_complete) {
       sync_state = NOT_REQUESTED;
     } else {
@@ -127,19 +126,19 @@
 
 }  // namespace
 
-ProfileSyncService::InitParams::InitParams() = default;
-ProfileSyncService::InitParams::InitParams(InitParams&& other) = default;
-ProfileSyncService::InitParams::~InitParams() = default;
+SyncServiceImpl::InitParams::InitParams() = default;
+SyncServiceImpl::InitParams::InitParams(InitParams&& other) = default;
+SyncServiceImpl::InitParams::~InitParams() = default;
 
-ProfileSyncService::ProfileSyncService(InitParams init_params)
+SyncServiceImpl::SyncServiceImpl(InitParams init_params)
     : sync_client_(std::move(init_params.sync_client)),
       sync_prefs_(sync_client_->GetPrefService()),
       identity_manager_(init_params.identity_manager),
       auth_manager_(std::make_unique<SyncAuthManager>(
           identity_manager_,
-          base::BindRepeating(&ProfileSyncService::AccountStateChanged,
+          base::BindRepeating(&SyncServiceImpl::AccountStateChanged,
                               base::Unretained(this)),
-          base::BindRepeating(&ProfileSyncService::CredentialsChanged,
+          base::BindRepeating(&SyncServiceImpl::CredentialsChanged,
                               base::Unretained(this)))),
       channel_(init_params.channel),
       debug_identifier_(init_params.debug_identifier),
@@ -167,7 +166,7 @@
   DCHECK(sync_client_);
   DCHECK(IsLocalSyncEnabled() || identity_manager_ != nullptr);
 
-  // If Sync is disabled via command line flag, then ProfileSyncService
+  // If Sync is disabled via command line flag, then SyncServiceImpl
   // shouldn't be instantiated.
   DCHECK(switches::IsSyncAllowedByFlag());
 
@@ -175,11 +174,11 @@
       base::FeatureList::IsEnabled(switches::kSyncRequiresPoliciesLoaded);
 
   startup_controller_ = std::make_unique<StartupController>(
-      base::BindRepeating(&ProfileSyncService::GetPreferredDataTypes,
+      base::BindRepeating(&SyncServiceImpl::GetPreferredDataTypes,
                           base::Unretained(this)),
-      base::BindRepeating(&ProfileSyncService::IsEngineAllowedToRun,
+      base::BindRepeating(&SyncServiceImpl::IsEngineAllowedToRun,
                           base::Unretained(this)),
-      base::BindRepeating(&ProfileSyncService::StartUpSlowEngineComponents,
+      base::BindRepeating(&SyncServiceImpl::StartUpSlowEngineComponents,
                           base::Unretained(this)),
       should_wait_for_policies ? init_params.policy_service : nullptr);
 
@@ -191,7 +190,7 @@
     identity_manager_->AddObserver(this);
 }
 
-ProfileSyncService::~ProfileSyncService() {
+SyncServiceImpl::~SyncServiceImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (identity_manager_)
     identity_manager_->RemoveObserver(this);
@@ -200,7 +199,7 @@
   DCHECK(!engine_);
 }
 
-void ProfileSyncService::Initialize() {
+void SyncServiceImpl::Initialize() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   observers_.emplace();
@@ -269,7 +268,7 @@
   startup_controller_->TryStart(force_immediate);
 }
 
-void ProfileSyncService::StartSyncingWithServer() {
+void SyncServiceImpl::StartSyncingWithServer() {
   DCHECK(startup_controller_->ArePoliciesReady());
   if (engine_)
     engine_->StartSyncingWithServer();
@@ -278,11 +277,11 @@
   }
 }
 
-ModelTypeSet ProfileSyncService::GetRegisteredDataTypesForTest() const {
+ModelTypeSet SyncServiceImpl::GetRegisteredDataTypesForTest() const {
   return GetRegisteredDataTypes();
 }
 
-void ProfileSyncService::GetThrottledDataTypesForTest(
+void SyncServiceImpl::GetThrottledDataTypesForTest(
     base::OnceCallback<void(ModelTypeSet)> cb) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!engine_ || !engine_->IsInitialized()) {
@@ -293,15 +292,14 @@
   engine_->GetThrottledDataTypesForTest(std::move(cb));
 }
 
-void ProfileSyncService::TriggerPoliciesLoadedForTest() {
+void SyncServiceImpl::TriggerPoliciesLoadedForTest() {
   if (!startup_controller_->ArePoliciesReady()) {
     startup_controller_->OnFirstPoliciesLoaded(
         policy::PolicyDomain::POLICY_DOMAIN_CHROME);
   }
 }
 
-bool ProfileSyncService::IsDataTypeControllerRunningForTest(
-    ModelType type) const {
+bool SyncServiceImpl::IsDataTypeControllerRunningForTest(ModelType type) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto iter = data_type_controllers_.find(type);
   if (iter == data_type_controllers_.end()) {
@@ -310,7 +308,7 @@
   return iter->second->state() == DataTypeController::RUNNING;
 }
 
-void ProfileSyncService::AccountStateChanged() {
+void SyncServiceImpl::AccountStateChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
 #if defined(OS_ANDROID)
@@ -351,7 +349,7 @@
   }
 }
 
-void ProfileSyncService::CredentialsChanged() {
+void SyncServiceImpl::CredentialsChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // If the engine isn't allowed to start anymore due to the credentials change,
@@ -384,7 +382,7 @@
   NotifyObservers();
 }
 
-bool ProfileSyncService::IsEngineAllowedToRun() const {
+bool SyncServiceImpl::IsEngineAllowedToRun() const {
   // USER_CHOICE (i.e. the Sync feature toggle) and PLATFORM_OVERRIDE (i.e.
   // Android's "MasterSync" toggle) do not prevent starting up the Sync
   // transport.
@@ -394,13 +392,13 @@
   return disable_reasons.Empty() && !auth_manager_->IsSyncPaused();
 }
 
-void ProfileSyncService::OnProtocolEvent(const ProtocolEvent& event) {
+void SyncServiceImpl::OnProtocolEvent(const ProtocolEvent& event) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   for (auto& observer : protocol_event_observers_)
     observer.OnProtocolEvent(event);
 }
 
-void ProfileSyncService::OnDataTypeRequestsSyncStartup(ModelType type) {
+void SyncServiceImpl::OnDataTypeRequestsSyncStartup(ModelType type) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(UserTypes().Has(type));
 
@@ -421,7 +419,7 @@
   startup_controller_->OnDataTypeRequestsSyncStartup(type);
 }
 
-void ProfileSyncService::StartUpSlowEngineComponents() {
+void SyncServiceImpl::StartUpSlowEngineComponents() {
   DCHECK(IsEngineAllowedToRun());
 
   const CoreAccountInfo authenticated_account_info =
@@ -485,7 +483,7 @@
   engine_->Initialize(std::move(params));
 }
 
-void ProfileSyncService::Shutdown() {
+void SyncServiceImpl::Shutdown() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   NotifyShutdown();
@@ -509,7 +507,7 @@
   auth_manager_.reset();
 }
 
-void ProfileSyncService::ShutdownImpl(ShutdownReason reason) {
+void SyncServiceImpl::ShutdownImpl(ShutdownReason reason) {
   if (!engine_) {
     // If the engine hasn't started or is already shut down when a DISABLE_SYNC
     // happens, the Directory needs to be cleaned up here.
@@ -566,7 +564,7 @@
   NotifyObservers();
 }
 
-void ProfileSyncService::StopImpl(SyncStopDataFate data_fate) {
+void SyncServiceImpl::StopImpl(SyncStopDataFate data_fate) {
   switch (data_fate) {
     case KEEP_DATA:
       ShutdownImpl(STOP_SYNC);
@@ -592,20 +590,20 @@
   }
 }
 
-SyncUserSettings* ProfileSyncService::GetUserSettings() {
+SyncUserSettings* SyncServiceImpl::GetUserSettings() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return user_settings_.get();
 }
 
-const SyncUserSettings* ProfileSyncService::GetUserSettings() const {
+const SyncUserSettings* SyncServiceImpl::GetUserSettings() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return user_settings_.get();
 }
 
-SyncService::DisableReasonSet ProfileSyncService::GetDisableReasons() const {
+SyncService::DisableReasonSet SyncServiceImpl::GetDisableReasons() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  // If Sync is disabled via command line flag, then ProfileSyncService
+  // If Sync is disabled via command line flag, then SyncServiceImpl
   // shouldn't even be instantiated.
   DCHECK(switches::IsSyncAllowedByFlag());
   DisableReasonSet result;
@@ -632,7 +630,7 @@
   return result;
 }
 
-SyncService::TransportState ProfileSyncService::GetTransportState() const {
+SyncService::TransportState SyncServiceImpl::GetTransportState() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!IsEngineAllowedToRun()) {
@@ -686,29 +684,29 @@
   return TransportState::ACTIVE;
 }
 
-void ProfileSyncService::NotifyObservers() {
+void SyncServiceImpl::NotifyObservers() {
   for (auto& observer : *observers_) {
     observer.OnStateChanged(this);
   }
 }
 
-void ProfileSyncService::NotifySyncCycleCompleted() {
+void SyncServiceImpl::NotifySyncCycleCompleted() {
   for (auto& observer : *observers_)
     observer.OnSyncCycleCompleted(this);
 }
 
-void ProfileSyncService::NotifyShutdown() {
+void SyncServiceImpl::NotifyShutdown() {
   for (auto& observer : *observers_)
     observer.OnSyncShutdown(this);
 }
 
-void ProfileSyncService::ClearUnrecoverableError() {
+void SyncServiceImpl::ClearUnrecoverableError() {
   unrecoverable_error_reason_ = absl::nullopt;
   unrecoverable_error_message_.clear();
   unrecoverable_error_location_ = base::Location();
 }
 
-void ProfileSyncService::OnUnrecoverableErrorImpl(
+void SyncServiceImpl::OnUnrecoverableErrorImpl(
     const base::Location& from_here,
     const std::string& message,
     UnrecoverableErrorReason reason) {
@@ -718,20 +716,20 @@
   unrecoverable_error_location_ = from_here;
 
   LOG(ERROR) << "Unrecoverable error detected at " << from_here.ToString()
-             << " -- ProfileSyncService unusable: " << message;
+             << " -- SyncServiceImpl unusable: " << message;
 
   // Shut all data types down.
   ShutdownImpl(DISABLE_SYNC);
 }
 
-void ProfileSyncService::DataTypePreconditionChanged(ModelType type) {
+void SyncServiceImpl::DataTypePreconditionChanged(ModelType type) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!engine_ || !engine_->IsInitialized() || !data_type_manager_)
     return;
   data_type_manager_->DataTypePreconditionChanged(type);
 }
 
-void ProfileSyncService::UpdateEngineInitUMA(bool success) const {
+void SyncServiceImpl::UpdateEngineInitUMA(bool success) const {
   if (is_first_time_sync_configure_) {
     UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeFirstTimeSuccess", success);
   } else {
@@ -748,7 +746,7 @@
   }
 }
 
-void ProfileSyncService::OnEngineInitialized(
+void SyncServiceImpl::OnEngineInitialized(
     const WeakHandle<DataTypeDebugInfoListener>& debug_info_listener,
     bool success,
     bool is_first_time_sync_configure) {
@@ -812,8 +810,7 @@
   NotifyObservers();
 }
 
-void ProfileSyncService::OnSyncCycleCompleted(
-    const SyncCycleSnapshot& snapshot) {
+void SyncServiceImpl::OnSyncCycleCompleted(const SyncCycleSnapshot& snapshot) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   last_snapshot_ = snapshot;
@@ -822,7 +819,7 @@
   NotifySyncCycleCompleted();
 }
 
-void ProfileSyncService::OnConnectionStatusChange(ConnectionStatus status) {
+void SyncServiceImpl::OnConnectionStatusChange(ConnectionStatus status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!IsLocalSyncEnabled()) {
     auth_manager_->ConnectionStatusChanged(status);
@@ -830,7 +827,7 @@
   NotifyObservers();
 }
 
-void ProfileSyncService::OnMigrationNeededForTypes(ModelTypeSet types) {
+void SyncServiceImpl::OnMigrationNeededForTypes(ModelTypeSet types) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(engine_);
   DCHECK(engine_->IsInitialized());
@@ -841,7 +838,7 @@
   migrator_->MigrateTypes(types);
 }
 
-void ProfileSyncService::OnActionableError(const SyncProtocolError& error) {
+void SyncServiceImpl::OnActionableError(const SyncProtocolError& error) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   last_actionable_error_ = error;
   DCHECK_NE(last_actionable_error_.action, UNKNOWN_ACTION);
@@ -902,16 +899,17 @@
   NotifyObservers();
 }
 
-void ProfileSyncService::OnBackedOffTypesChanged() {
+void SyncServiceImpl::OnBackedOffTypesChanged() {
   NotifyObservers();
 }
 
-void ProfileSyncService::OnConfigureDone(
+void SyncServiceImpl::OnConfigureDone(
     const DataTypeManager::ConfigureResult& result) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   data_type_error_map_ = result.data_type_status_table.GetAllErrors();
 
-  DVLOG(1) << "PSS OnConfigureDone called with status: " << result.status;
+  DVLOG(1) << "SyncServiceImpl::OnConfigureDone called with status: "
+           << result.status;
   // The possible status values:
   //    ABORT - Configuration was aborted. This is not an error, if
   //            initiated by user.
@@ -920,7 +918,7 @@
   // First handle the abort case.
   if (result.status == DataTypeManager::ABORTED) {
     DCHECK(expect_sync_configuration_aborted_);
-    DVLOG(0) << "ProfileSyncService::Observe Sync Configure aborted";
+    DVLOG(0) << "SyncServiceImpl sync configuration aborted";
     expect_sync_configuration_aborted_ = false;
     return;
   }
@@ -951,18 +949,18 @@
   StartSyncingWithServer();
 }
 
-void ProfileSyncService::OnConfigureStart() {
+void SyncServiceImpl::OnConfigureStart() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   engine_->StartConfiguration();
   NotifyObservers();
 }
 
-void ProfileSyncService::CryptoStateChanged() {
+void SyncServiceImpl::CryptoStateChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   NotifyObservers();
 }
 
-void ProfileSyncService::CryptoRequiredUserActionChanged() {
+void SyncServiceImpl::CryptoRequiredUserActionChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (should_record_trusted_vault_error_shown_on_startup_ &&
@@ -977,7 +975,7 @@
   }
 }
 
-void ProfileSyncService::ReconfigureDataTypesDueToCrypto() {
+void SyncServiceImpl::ReconfigureDataTypesDueToCrypto() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (CanConfigureDataTypes(/*bypass_setup_in_progress_check=*/false)) {
@@ -991,18 +989,18 @@
   NotifyObservers();
 }
 
-void ProfileSyncService::EncryptionBootstrapTokenChanged(
+void SyncServiceImpl::EncryptionBootstrapTokenChanged(
     const std::string& bootstrap_token) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   sync_prefs_.SetEncryptionBootstrapToken(bootstrap_token);
 }
 
-bool ProfileSyncService::IsSetupInProgress() const {
+bool SyncServiceImpl::IsSetupInProgress() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return outstanding_setup_in_progress_handles_ > 0;
 }
 
-bool ProfileSyncService::QueryDetailedSyncStatusForDebugging(
+bool SyncServiceImpl::QueryDetailedSyncStatusForDebugging(
     SyncStatus* result) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (engine_ && engine_->IsInitialized()) {
@@ -1015,21 +1013,21 @@
   return false;
 }
 
-GoogleServiceAuthError ProfileSyncService::GetAuthError() const {
+GoogleServiceAuthError SyncServiceImpl::GetAuthError() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return auth_manager_->GetLastAuthError();
 }
 
-base::Time ProfileSyncService::GetAuthErrorTime() const {
+base::Time SyncServiceImpl::GetAuthErrorTime() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return auth_manager_->GetLastAuthErrorTime();
 }
 
-bool ProfileSyncService::RequiresClientUpgrade() const {
+bool SyncServiceImpl::RequiresClientUpgrade() const {
   return last_actionable_error_.action == UPGRADE_CLIENT;
 }
 
-bool ProfileSyncService::CanConfigureDataTypes(
+bool SyncServiceImpl::CanConfigureDataTypes(
     bool bypass_setup_in_progress_check) const {
   // TODO(crbug.com/856179): Arguably, IsSetupInProgress() shouldn't prevent
   // configuring data types in transport mode, but at least for now, it's
@@ -1040,7 +1038,7 @@
 }
 
 std::unique_ptr<SyncSetupInProgressHandle>
-ProfileSyncService::GetSetupInProgressHandle() {
+SyncServiceImpl::GetSetupInProgressHandle() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (++outstanding_setup_in_progress_handles_ == 1) {
@@ -1050,28 +1048,28 @@
   }
 
   return std::make_unique<SyncSetupInProgressHandle>(
-      base::BindRepeating(&ProfileSyncService::OnSetupInProgressHandleDestroyed,
+      base::BindRepeating(&SyncServiceImpl::OnSetupInProgressHandleDestroyed,
                           weak_factory_.GetWeakPtr()));
 }
 
-bool ProfileSyncService::IsLocalSyncEnabled() const {
+bool SyncServiceImpl::IsLocalSyncEnabled() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return sync_prefs_.IsLocalSyncEnabled();
 }
 
-void ProfileSyncService::TriggerRefresh(const ModelTypeSet& types) {
+void SyncServiceImpl::TriggerRefresh(const ModelTypeSet& types) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (engine_ && engine_->IsInitialized()) {
     engine_->TriggerRefresh(types);
   }
 }
 
-bool ProfileSyncService::IsSignedIn() const {
+bool SyncServiceImpl::IsSignedIn() const {
   // Sync is logged in if there is a non-empty account id.
   return !GetAuthenticatedAccountInfo().account_id.empty();
 }
 
-base::Time ProfileSyncService::GetLastSyncedTimeForDebugging() const {
+base::Time SyncServiceImpl::GetLastSyncedTimeForDebugging() const {
   if (!engine_ || !engine_->IsInitialized()) {
     return base::Time();
   }
@@ -1079,7 +1077,7 @@
   return engine_->GetLastSyncedTimeForDebugging();
 }
 
-void ProfileSyncService::OnPreferredDataTypesPrefChange() {
+void SyncServiceImpl::OnPreferredDataTypesPrefChange() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!engine_ && !HasDisableReason(DISABLE_REASON_UNRECOVERABLE_ERROR)) {
@@ -1092,40 +1090,39 @@
   ReconfigureDatatypeManager(/*bypass_setup_in_progress_check=*/false);
 }
 
-SyncClient* ProfileSyncService::GetSyncClientForTest() {
+SyncClient* SyncServiceImpl::GetSyncClientForTest() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return sync_client_.get();
 }
 
-void ProfileSyncService::AddObserver(SyncServiceObserver* observer) {
+void SyncServiceImpl::AddObserver(SyncServiceObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   observers_->AddObserver(observer);
 }
 
-void ProfileSyncService::RemoveObserver(SyncServiceObserver* observer) {
+void SyncServiceImpl::RemoveObserver(SyncServiceObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   observers_->RemoveObserver(observer);
 }
 
-bool ProfileSyncService::HasObserver(
-    const SyncServiceObserver* observer) const {
+bool SyncServiceImpl::HasObserver(const SyncServiceObserver* observer) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return observers_->HasObserver(observer);
 }
 
-ModelTypeSet ProfileSyncService::GetPreferredDataTypes() const {
+ModelTypeSet SyncServiceImpl::GetPreferredDataTypes() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return user_settings_->GetPreferredDataTypes();
 }
 
-ModelTypeSet ProfileSyncService::GetActiveDataTypes() const {
+ModelTypeSet SyncServiceImpl::GetActiveDataTypes() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!data_type_manager_ || GetAuthError().IsPersistentError())
     return ModelTypeSet();
   return data_type_manager_->GetActiveDataTypes();
 }
 
-void ProfileSyncService::SyncAllowedByPlatformChanged(bool allowed) {
+void SyncServiceImpl::SyncAllowedByPlatformChanged(bool allowed) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!allowed) {
@@ -1138,8 +1135,7 @@
   }
 }
 
-void ProfileSyncService::SetSyncRequestedAndIgnoreNotification(
-    bool is_requested) {
+void SyncServiceImpl::SetSyncRequestedAndIgnoreNotification(bool is_requested) {
   // For a no-op, OnSyncRequestedPrefChange() wouldn't be called and
   // |is_setting_sync_requested_| wouldn't get reset, so check.
   if (is_requested != user_settings_->IsSyncRequested()) {
@@ -1151,7 +1147,7 @@
   }
 }
 
-void ProfileSyncService::ConfigureDataTypeManager(ConfigureReason reason) {
+void SyncServiceImpl::ConfigureDataTypeManager(ConfigureReason reason) {
   DCHECK(engine_);
   DCHECK(engine_->IsInitialized());
   DCHECK(!engine_->GetCacheGuid().empty());
@@ -1170,9 +1166,9 @@
     // We create the migrator at the same time.
     migrator_ = std::make_unique<BackendMigrator>(
         debug_identifier_, data_type_manager_.get(),
-        base::BindRepeating(&ProfileSyncService::ConfigureDataTypeManager,
+        base::BindRepeating(&SyncServiceImpl::ConfigureDataTypeManager,
                             base::Unretained(this), CONFIGURE_REASON_MIGRATION),
-        base::BindRepeating(&ProfileSyncService::StartSyncingWithServer,
+        base::BindRepeating(&SyncServiceImpl::StartSyncingWithServer,
                             base::Unretained(this)));
 
     // Override reason if no configuration has completed ever.
@@ -1223,13 +1219,13 @@
   }
 }
 
-bool ProfileSyncService::UseTransportOnlyMode() const {
+bool SyncServiceImpl::UseTransportOnlyMode() const {
   // Note: When local Sync is enabled, then we want full-sync mode (not just
   // transport), even though Sync-the-feature is not considered enabled.
   return !IsSyncFeatureEnabled() && !IsLocalSyncEnabled();
 }
 
-ModelTypeSet ProfileSyncService::GetRegisteredDataTypes() const {
+ModelTypeSet SyncServiceImpl::GetRegisteredDataTypes() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   ModelTypeSet registered_types;
   // The |data_type_controllers_| are determined by command-line flags;
@@ -1241,7 +1237,7 @@
   return registered_types;
 }
 
-ModelTypeSet ProfileSyncService::GetModelTypesForTransportOnlyMode() const {
+ModelTypeSet SyncServiceImpl::GetModelTypesForTransportOnlyMode() const {
   // Collect the types from all controllers that support transport-only mode.
   ModelTypeSet allowed_types;
   for (const auto& type_and_controller : data_type_controllers_) {
@@ -1254,7 +1250,7 @@
   return allowed_types;
 }
 
-ModelTypeSet ProfileSyncService::GetDataTypesToConfigure() const {
+ModelTypeSet SyncServiceImpl::GetDataTypesToConfigure() const {
   ModelTypeSet types = GetPreferredDataTypes();
   // In transport-only mode, only a subset of data types is supported.
   if (UseTransportOnlyMode()) {
@@ -1263,7 +1259,7 @@
   return types;
 }
 
-void ProfileSyncService::UpdateDataTypesForInvalidations() {
+void SyncServiceImpl::UpdateDataTypesForInvalidations() {
   SyncInvalidationsService* invalidations_service =
       sync_client_->GetSyncInvalidationsService();
   if (!invalidations_service) {
@@ -1282,16 +1278,16 @@
     types.RemoveAll({AUTOFILL_WALLET_DATA, AUTOFILL_WALLET_OFFER});
   }
   invalidations_service->SetInterestedDataTypes(
-      types, base::BindRepeating(&ProfileSyncService::TriggerRefresh,
+      types, base::BindRepeating(&SyncServiceImpl::TriggerRefresh,
                                  sync_enabled_weak_factory_.GetWeakPtr()));
 }
 
-SyncCycleSnapshot ProfileSyncService::GetLastCycleSnapshotForDebugging() const {
+SyncCycleSnapshot SyncServiceImpl::GetLastCycleSnapshotForDebugging() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return last_snapshot_;
 }
 
-void ProfileSyncService::HasUnsyncedItemsForTest(
+void SyncServiceImpl::HasUnsyncedItemsForTest(
     base::OnceCallback<void(bool)> cb) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(engine_);
@@ -1299,13 +1295,12 @@
   engine_->HasUnsyncedItemsForTest(std::move(cb));
 }
 
-BackendMigrator* ProfileSyncService::GetBackendMigratorForTest() {
+BackendMigrator* SyncServiceImpl::GetBackendMigratorForTest() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return migrator_.get();
 }
 
-std::unique_ptr<base::Value>
-ProfileSyncService::GetTypeStatusMapForDebugging() {
+std::unique_ptr<base::Value> SyncServiceImpl::GetTypeStatusMapForDebugging() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto result = std::make_unique<base::ListValue>();
 
@@ -1369,7 +1364,7 @@
   return std::move(result);
 }
 
-void ProfileSyncService::GetEntityCountsForDebugging(
+void SyncServiceImpl::GetEntityCountsForDebugging(
     base::OnceCallback<void(const std::vector<TypeEntitiesCount>&)> callback)
     const {
   // The method must respond with the TypeEntitiesCount of all data types, but
@@ -1405,7 +1400,7 @@
   }
 }
 
-void ProfileSyncService::OnSyncManagedPrefChange(bool is_sync_managed) {
+void SyncServiceImpl::OnSyncManagedPrefChange(bool is_sync_managed) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // Local sync is not controlled by the "sync managed" policy, so these pref
@@ -1423,14 +1418,14 @@
   }
 }
 
-void ProfileSyncService::OnFirstSetupCompletePrefChange(
+void SyncServiceImpl::OnFirstSetupCompletePrefChange(
     bool is_first_setup_complete) {
   if (engine_ && engine_->IsInitialized()) {
     ReconfigureDatatypeManager(/*bypass_setup_in_progress_check=*/false);
   }
 }
 
-void ProfileSyncService::OnSyncRequestedPrefChange(bool is_sync_requested) {
+void SyncServiceImpl::OnSyncRequestedPrefChange(bool is_sync_requested) {
   // Ignore the notification if the service itself set the pref.
   if (is_setting_sync_requested_) {
     is_setting_sync_requested_ = false;
@@ -1465,18 +1460,18 @@
   }
 }
 
-void ProfileSyncService::OnAccountsInCookieUpdated(
+void SyncServiceImpl::OnAccountsInCookieUpdated(
     const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
     const GoogleServiceAuthError& error) {
   OnAccountsInCookieUpdatedWithCallback(
       accounts_in_cookie_jar_info.signed_in_accounts, base::NullCallback());
 }
 
-void ProfileSyncService::OnAccountsCookieDeletedByUserAction() {
+void SyncServiceImpl::OnAccountsCookieDeletedByUserAction() {
   sync_client_->GetTrustedVaultClient()->RemoveAllStoredKeys();
 }
 
-void ProfileSyncService::OnAccountsInCookieUpdatedWithCallback(
+void SyncServiceImpl::OnAccountsInCookieUpdatedWithCallback(
     const std::vector<gaia::ListedAccount>& signed_in_accounts,
     base::OnceClosure callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -1491,7 +1486,7 @@
   engine_->OnCookieJarChanged(cookie_jar_mismatch, std::move(callback));
 }
 
-bool ProfileSyncService::HasCookieJarMismatch(
+bool SyncServiceImpl::HasCookieJarMismatch(
     const std::vector<gaia::ListedAccount>& cookie_jar_accounts) {
   CoreAccountId account_id = GetAuthenticatedAccountInfo().account_id;
   // Iterate through list of accounts, looking for current sync account.
@@ -1502,7 +1497,7 @@
   return true;
 }
 
-void ProfileSyncService::AddProtocolEventObserver(
+void SyncServiceImpl::AddProtocolEventObserver(
     ProtocolEventObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   protocol_event_observers_.AddObserver(observer);
@@ -1511,7 +1506,7 @@
   }
 }
 
-void ProfileSyncService::RemoveProtocolEventObserver(
+void SyncServiceImpl::RemoveProtocolEventObserver(
     ProtocolEventObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   protocol_event_observers_.RemoveObserver(observer);
@@ -1583,7 +1578,7 @@
 
 }  // namespace
 
-void ProfileSyncService::GetAllNodesForDebugging(
+void SyncServiceImpl::GetAllNodesForDebugging(
     base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -1622,10 +1617,10 @@
   }
 }
 
-CoreAccountInfo ProfileSyncService::GetAuthenticatedAccountInfo() const {
+CoreAccountInfo SyncServiceImpl::GetAuthenticatedAccountInfo() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!auth_manager_) {
-    // Some crashes on iOS (crbug.com/962384) suggest that ProfileSyncService
+    // Some crashes on iOS (crbug.com/962384) suggest that SyncServiceImpl
     // gets called after it has been already shutdown. It's not clear why this
     // actually happens. We add this null check here to protect against such
     // crashes.
@@ -1634,7 +1629,7 @@
   return auth_manager_->GetActiveAccountInfo().account_info;
 }
 
-bool ProfileSyncService::IsAuthenticatedAccountPrimary() const {
+bool SyncServiceImpl::IsAuthenticatedAccountPrimary() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!auth_manager_) {
     // This is a precautionary check to be consistent with the check in
@@ -1644,7 +1639,7 @@
   return auth_manager_->GetActiveAccountInfo().is_primary;
 }
 
-void ProfileSyncService::SetInvalidationsForSessionsEnabled(bool enabled) {
+void SyncServiceImpl::SetInvalidationsForSessionsEnabled(bool enabled) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (engine_ && engine_->IsInitialized()) {
     engine_->SetInvalidationsForSessionsEnabled(enabled);
@@ -1654,7 +1649,7 @@
   UpdateDataTypesForInvalidations();
 }
 
-void ProfileSyncService::AddTrustedVaultDecryptionKeysFromWeb(
+void SyncServiceImpl::AddTrustedVaultDecryptionKeysFromWeb(
     const std::string& gaia_id,
     const std::vector<std::vector<uint8_t>>& keys,
     int last_key_version) {
@@ -1662,7 +1657,7 @@
                                                    last_key_version);
 }
 
-void ProfileSyncService::AddTrustedVaultRecoveryMethodFromWeb(
+void SyncServiceImpl::AddTrustedVaultRecoveryMethodFromWeb(
     const std::string& gaia_id,
     const std::vector<uint8_t>& public_key,
     int method_type_hint,
@@ -1671,7 +1666,7 @@
       gaia_id, public_key, method_type_hint, std::move(callback));
 }
 
-void ProfileSyncService::StopAndClear() {
+void SyncServiceImpl::StopAndClear() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   SetSyncRequestedAndIgnoreNotification(false);
@@ -1680,7 +1675,7 @@
   startup_controller_->TryStart(/*force_immediate=*/true);
 }
 
-void ProfileSyncService::SetSyncAllowedByPlatform(bool allowed) {
+void SyncServiceImpl::SetSyncAllowedByPlatform(bool allowed) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (allowed == sync_allowed_by_platform_) {
     return;
@@ -1697,7 +1692,7 @@
   }
 }
 
-void ProfileSyncService::ReconfigureDatatypeManager(
+void SyncServiceImpl::ReconfigureDatatypeManager(
     bool bypass_setup_in_progress_check) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (engine_ && engine_->IsInitialized()) {
@@ -1728,22 +1723,22 @@
   }
 }
 
-bool ProfileSyncService::IsRetryingAccessTokenFetchForTest() const {
+bool SyncServiceImpl::IsRetryingAccessTokenFetchForTest() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return auth_manager_->IsRetryingAccessTokenFetchForTest();
 }
 
-std::string ProfileSyncService::GetAccessTokenForTest() const {
+std::string SyncServiceImpl::GetAccessTokenForTest() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return auth_manager_->access_token();
 }
 
-SyncTokenStatus ProfileSyncService::GetSyncTokenStatusForDebugging() const {
+SyncTokenStatus SyncServiceImpl::GetSyncTokenStatusForDebugging() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return auth_manager_->GetSyncTokenStatus();
 }
 
-void ProfileSyncService::OverrideNetworkForTest(
+void SyncServiceImpl::OverrideNetworkForTest(
     const CreateHttpPostProviderFactory& create_http_post_provider_factory_cb) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // If the engine has already been created, then it has a copy of the previous
@@ -1777,23 +1772,23 @@
 }
 
 #if defined(OS_ANDROID)
-void ProfileSyncService::SetDecoupledFromAndroidMasterSync() {
+void SyncServiceImpl::SetDecoupledFromAndroidMasterSync() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   sync_prefs_.SetDecoupledFromAndroidMasterSync();
 }
 
-bool ProfileSyncService::GetDecoupledFromAndroidMasterSync() {
+bool SyncServiceImpl::GetDecoupledFromAndroidMasterSync() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return sync_prefs_.GetDecoupledFromAndroidMasterSync();
 }
 #endif  // defined(OS_ANDROID)
 
 SyncEncryptionHandler::Observer*
-ProfileSyncService::GetEncryptionObserverForTest() {
+SyncServiceImpl::GetEncryptionObserverForTest() {
   return &crypto_;
 }
 
-void ProfileSyncService::RemoveClientFromServer() const {
+void SyncServiceImpl::RemoveClientFromServer() const {
   if (!engine_ || !engine_->IsInitialized()) {
     return;
   }
@@ -1807,7 +1802,7 @@
   }
 }
 
-void ProfileSyncService::RecordMemoryUsageAndCountsHistograms() {
+void SyncServiceImpl::RecordMemoryUsageAndCountsHistograms() {
   ModelTypeSet active_types = GetActiveDataTypes();
   for (ModelType type : active_types) {
     auto dtc_it = data_type_controllers_.find(type);
@@ -1821,24 +1816,23 @@
   }
 }
 
-const GURL& ProfileSyncService::GetSyncServiceUrlForDebugging() const {
+const GURL& SyncServiceImpl::GetSyncServiceUrlForDebugging() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return sync_service_url_;
 }
 
-std::string ProfileSyncService::GetUnrecoverableErrorMessageForDebugging()
-    const {
+std::string SyncServiceImpl::GetUnrecoverableErrorMessageForDebugging() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return unrecoverable_error_message_;
 }
 
-base::Location ProfileSyncService::GetUnrecoverableErrorLocationForDebugging()
+base::Location SyncServiceImpl::GetUnrecoverableErrorLocationForDebugging()
     const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return unrecoverable_error_location_;
 }
 
-void ProfileSyncService::OnSetupInProgressHandleDestroyed() {
+void SyncServiceImpl::OnSetupInProgressHandleDestroyed() {
   DCHECK_GT(outstanding_setup_in_progress_handles_, 0);
 
   --outstanding_setup_in_progress_handles_;
diff --git a/components/sync/driver/profile_sync_service.h b/components/sync/driver/sync_service_impl.h
similarity index 94%
rename from components/sync/driver/profile_sync_service.h
rename to components/sync/driver/sync_service_impl.h
index adbca0d..8595f8f 100644
--- a/components/sync/driver/profile_sync_service.h
+++ b/components/sync/driver/sync_service_impl.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_SYNC_DRIVER_PROFILE_SYNC_SERVICE_H_
-#define COMPONENTS_SYNC_DRIVER_PROFILE_SYNC_SERVICE_H_
+#ifndef COMPONENTS_SYNC_DRIVER_SYNC_SERVICE_IMPL_H_
+#define COMPONENTS_SYNC_DRIVER_SYNC_SERVICE_IMPL_H_
 
 #include <memory>
 #include <set>
@@ -57,13 +57,13 @@
 class SyncAuthManager;
 
 // Look at the SyncService interface for information on how to use this class.
-// You should not need to know about ProfileSyncService directly.
-class ProfileSyncService : public SyncService,
-                           public SyncEngineHost,
-                           public SyncPrefObserver,
-                           public DataTypeManagerObserver,
-                           public SyncServiceCrypto::Delegate,
-                           public signin::IdentityManager::Observer {
+// You should not need to know about SyncServiceImpl directly.
+class SyncServiceImpl : public SyncService,
+                        public SyncEngineHost,
+                        public SyncPrefObserver,
+                        public DataTypeManagerObserver,
+                        public SyncServiceCrypto::Delegate,
+                        public signin::IdentityManager::Observer {
  public:
   // If AUTO_START, sync will set IsFirstSetupComplete() automatically and sync
   // will begin syncing without the user needing to confirm sync settings.
@@ -72,7 +72,7 @@
     MANUAL_START,
   };
 
-  // Bundles the arguments for ProfileSyncService construction. This is a
+  // Bundles the arguments for SyncServiceImpl construction. This is a
   // movable struct. Because of the non-POD data members, it needs out-of-line
   // constructors, so in particular the move constructor needs to be
   // explicitly defined.
@@ -97,9 +97,9 @@
     DISALLOW_COPY_AND_ASSIGN(InitParams);
   };
 
-  explicit ProfileSyncService(InitParams init_params);
+  explicit SyncServiceImpl(InitParams init_params);
 
-  ~ProfileSyncService() override;
+  ~SyncServiceImpl() override;
 
   // Initializes the object. This must be called at most once, and
   // immediately after an object of this class is constructed.
@@ -418,7 +418,7 @@
   int outstanding_setup_in_progress_handles_ = 0;
 
   // Set when sync receives STOP_SYNC_FOR_DISABLED_ACCOUNT error from server.
-  // Prevents ProfileSyncService from starting engine till browser restarted
+  // Prevents SyncServiceImpl from starting engine till browser restarted
   // or user signed out.
   bool sync_disabled_by_admin_;
 
@@ -484,13 +484,13 @@
   bool sessions_invalidations_enabled_;
 
   // This weak factory invalidates its issued pointers when Sync is disabled.
-  base::WeakPtrFactory<ProfileSyncService> sync_enabled_weak_factory_{this};
+  base::WeakPtrFactory<SyncServiceImpl> sync_enabled_weak_factory_{this};
 
-  base::WeakPtrFactory<ProfileSyncService> weak_factory_{this};
+  base::WeakPtrFactory<SyncServiceImpl> weak_factory_{this};
 
-  DISALLOW_COPY_AND_ASSIGN(ProfileSyncService);
+  DISALLOW_COPY_AND_ASSIGN(SyncServiceImpl);
 };
 
 }  // namespace syncer
 
-#endif  // COMPONENTS_SYNC_DRIVER_PROFILE_SYNC_SERVICE_H_
+#endif  // COMPONENTS_SYNC_DRIVER_SYNC_SERVICE_IMPL_H_
diff --git a/components/sync/driver/profile_sync_service_unittest.cc b/components/sync/driver/sync_service_impl_unittest.cc
similarity index 86%
rename from components/sync/driver/profile_sync_service_unittest.cc
rename to components/sync/driver/sync_service_impl_unittest.cc
index 5c160280..6179ce7 100644
--- a/components/sync/driver/profile_sync_service_unittest.cc
+++ b/components/sync/driver/sync_service_impl_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/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 
 #include <map>
 #include <memory>
@@ -77,15 +77,15 @@
   GoogleServiceAuthError auth_error_;
 };
 
-// A test harness that uses a real ProfileSyncService and in most cases a
+// A test harness that uses a real SyncServiceImpl and in most cases a
 // FakeSyncEngine.
 //
-// This is useful if we want to test the ProfileSyncService and don't care about
+// This is useful if we want to test the SyncServiceImpl and don't care about
 // testing the SyncEngine.
-class ProfileSyncServiceTest : public ::testing::Test {
+class SyncServiceImplTest : public ::testing::Test {
  protected:
-  ProfileSyncServiceTest() {}
-  ~ProfileSyncServiceTest() override {}
+  SyncServiceImplTest() {}
+  ~SyncServiceImplTest() override {}
 
   void SetUp() override {
     base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
@@ -97,9 +97,12 @@
     ShutdownAndDeleteService();
   }
 
-  void SignIn() { identity_test_env()->MakePrimaryAccountAvailable(kTestUser); }
+  void SignIn() {
+    identity_test_env()->MakePrimaryAccountAvailable(
+        kTestUser, signin::ConsentLevel::kSync);
+  }
 
-  void CreateService(ProfileSyncService::StartBehavior behavior,
+  void CreateService(SyncServiceImpl::StartBehavior behavior,
                      policy::PolicyService* policy_service = nullptr,
                      std::vector<std::pair<ModelType, bool>>
                          registered_types_and_transport_mode_support = {
@@ -130,7 +133,7 @@
         behavior, std::move(sync_client));
     init_params.policy_service = policy_service;
 
-    service_ = std::make_unique<ProfileSyncService>(std::move(init_params));
+    service_ = std::make_unique<SyncServiceImpl>(std::move(init_params));
   }
 
   void CreateServiceWithLocalSyncBackend() {
@@ -148,14 +151,14 @@
     ON_CALL(*sync_client, CreateDataTypeControllers)
         .WillByDefault(Return(ByMove(std::move(controllers))));
 
-    ProfileSyncService::InitParams init_params =
+    SyncServiceImpl::InitParams init_params =
         profile_sync_service_bundle_.CreateBasicInitParams(
-            ProfileSyncService::AUTO_START, std::move(sync_client));
+            SyncServiceImpl::AUTO_START, std::move(sync_client));
 
     prefs()->SetBoolean(prefs::kEnableLocalSyncBackend, true);
     init_params.identity_manager = nullptr;
 
-    service_ = std::make_unique<ProfileSyncService>(std::move(init_params));
+    service_ = std::make_unique<SyncServiceImpl>(std::move(init_params));
   }
 
   void ShutdownAndDeleteService() {
@@ -200,7 +203,7 @@
     return profile_sync_service_bundle_.identity_test_env();
   }
 
-  ProfileSyncService* service() { return service_.get(); }
+  SyncServiceImpl* service() { return service_.get(); }
 
   SyncClientMock* sync_client() { return sync_client_; }
 
@@ -231,46 +234,45 @@
  private:
   base::test::TaskEnvironment task_environment_;
   ProfileSyncServiceBundle profile_sync_service_bundle_;
-  std::unique_ptr<ProfileSyncService> service_;
+  std::unique_ptr<SyncServiceImpl> service_;
   SyncClientMock* sync_client_;  // Owned by |service_|.
   // The controllers are owned by |service_|.
   std::map<ModelType, FakeDataTypeController*> controller_map_;
 };
 
-class ProfileSyncServiceTestWithSyncInvalidationsServiceCreated
-    : public ProfileSyncServiceTest {
+class SyncServiceImplTestWithSyncInvalidationsServiceCreated
+    : public SyncServiceImplTest {
  public:
-  ProfileSyncServiceTestWithSyncInvalidationsServiceCreated() {
+  SyncServiceImplTestWithSyncInvalidationsServiceCreated() {
     override_features_.InitAndEnableFeature(
         switches::kSyncSendInterestedDataTypes);
   }
 
-  ~ProfileSyncServiceTestWithSyncInvalidationsServiceCreated() override =
-      default;
+  ~SyncServiceImplTestWithSyncInvalidationsServiceCreated() override = default;
 
  private:
   base::test::ScopedFeatureList override_features_;
 };
 
 // Verify that the server URLs are sane.
-TEST_F(ProfileSyncServiceTest, InitialState) {
-  CreateService(ProfileSyncService::MANUAL_START);
+TEST_F(SyncServiceImplTest, InitialState) {
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   const std::string& url = service()->GetSyncServiceUrlForDebugging().spec();
   EXPECT_TRUE(url == internal::kSyncServerUrl ||
               url == internal::kSyncDevServerUrl);
 }
 
-TEST_F(ProfileSyncServiceTest, SuccessfulInitialization) {
+TEST_F(SyncServiceImplTest, SuccessfulInitialization) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   EXPECT_EQ(SyncService::DisableReasonSet(), service()->GetDisableReasons());
   EXPECT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
 }
 
-TEST_F(ProfileSyncServiceTest, SuccessfulLocalBackendInitialization) {
+TEST_F(SyncServiceImplTest, SuccessfulLocalBackendInitialization) {
   CreateServiceWithLocalSyncBackend();
   InitializeForNthSync();
   EXPECT_EQ(SyncService::DisableReasonSet(), service()->GetDisableReasons());
@@ -280,9 +282,9 @@
 
 // Verify that an initialization where first setup is not complete does not
 // start up Sync-the-feature.
-TEST_F(ProfileSyncServiceTest, NeedsConfirmation) {
+TEST_F(SyncServiceImplTest, NeedsConfirmation) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
 
   // Mimic a sync cycle (transport-only) having completed earlier.
   SyncPrefs sync_prefs(prefs());
@@ -302,9 +304,9 @@
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 }
 
-TEST_F(ProfileSyncServiceTest, ModelTypesForTransportMode) {
+TEST_F(SyncServiceImplTest, ModelTypesForTransportMode) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
 
   // Disable sync-the-feature.
@@ -325,8 +327,8 @@
 
 // Verify that the SetSetupInProgress function call updates state
 // and notifies observers.
-TEST_F(ProfileSyncServiceTest, SetupInProgress) {
-  CreateService(ProfileSyncService::MANUAL_START);
+TEST_F(SyncServiceImplTest, SetupInProgress) {
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForFirstSync();
 
   TestSyncServiceObserver observer;
@@ -341,7 +343,7 @@
 }
 
 // Verify that we wait for policies to load before starting the sync engine.
-TEST_F(ProfileSyncServiceTest, WaitForPoliciesToStart) {
+TEST_F(SyncServiceImplTest, WaitForPoliciesToStart) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(switches::kSyncRequiresPoliciesLoaded);
   std::unique_ptr<policy::PolicyServiceImpl> policy_service =
@@ -349,7 +351,7 @@
           policy::PolicyServiceImpl::Providers());
 
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START, policy_service.get());
+  CreateService(SyncServiceImpl::MANUAL_START, policy_service.get());
   InitializeForNthSync();
   EXPECT_EQ(SyncService::DisableReasonSet(), service()->GetDisableReasons());
   EXPECT_EQ(SyncService::TransportState::START_DEFERRED,
@@ -367,11 +369,11 @@
 }
 
 // Verify that disable by enterprise policy works.
-TEST_F(ProfileSyncServiceTest, DisabledByPolicyBeforeInit) {
+TEST_F(SyncServiceImplTest, DisabledByPolicyBeforeInit) {
   prefs()->SetManagedPref(prefs::kSyncManaged,
                           std::make_unique<base::Value>(true));
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   // Sync was disabled due to the policy, setting SyncRequested to false and
   // causing DISABLE_REASON_USER_CHOICE.
@@ -383,11 +385,11 @@
             service()->GetTransportState());
 }
 
-TEST_F(ProfileSyncServiceTest, DisabledByPolicyBeforeInitThenPolicyRemoved) {
+TEST_F(SyncServiceImplTest, DisabledByPolicyBeforeInitThenPolicyRemoved) {
   prefs()->SetManagedPref(prefs::kSyncManaged,
                           std::make_unique<base::Value>(true));
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   // Sync was disabled due to the policy, setting SyncRequested to false and
   // causing DISABLE_REASON_USER_CHOICE.
@@ -420,9 +422,9 @@
 
 // Verify that disable by enterprise policy works even after the backend has
 // been initialized.
-TEST_F(ProfileSyncServiceTest, DisabledByPolicyAfterInit) {
+TEST_F(SyncServiceImplTest, DisabledByPolicyAfterInit) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
 
   ASSERT_EQ(SyncService::DisableReasonSet(), service()->GetDisableReasons());
@@ -442,10 +444,10 @@
             service()->GetTransportState());
 }
 
-TEST_F(ProfileSyncServiceTest,
+TEST_F(SyncServiceImplTest,
        ShouldDisableSyncFeatureWhenSyncDisallowedByPlatform) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
 
   ASSERT_EQ(SyncService::DisableReasonSet(), service()->GetDisableReasons());
@@ -460,11 +462,11 @@
             service()->GetTransportState());
 }
 
-// Exercises the ProfileSyncService's code paths related to getting shut down
+// Exercises the SyncServiceImpl's code paths related to getting shut down
 // before the backend initialize call returns.
-TEST_F(ProfileSyncServiceTest, AbortedByShutdown) {
+TEST_F(SyncServiceImplTest, AbortedByShutdown) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   component_factory()->AllowFakeEngineInitCompletion(false);
 
   InitializeForNthSync();
@@ -475,9 +477,9 @@
 }
 
 // Test SetSyncRequested(false) before we've initialized the backend.
-TEST_F(ProfileSyncServiceTest, EarlyRequestStop) {
+TEST_F(SyncServiceImplTest, EarlyRequestStop) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   // Set up a fake sync engine that will not immediately finish initialization.
   component_factory()->AllowFakeEngineInitCompletion(false);
   InitializeForNthSync();
@@ -507,9 +509,9 @@
 }
 
 // Test SetSyncRequested(false) after we've initialized the backend.
-TEST_F(ProfileSyncServiceTest, DisableAndEnableSyncTemporarily) {
+TEST_F(SyncServiceImplTest, DisableAndEnableSyncTemporarily) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
 
   SyncPrefs sync_prefs(prefs());
@@ -540,13 +542,13 @@
   EXPECT_TRUE(service()->IsSyncFeatureEnabled());
 }
 
-// Certain ProfileSyncService tests don't apply to Chrome OS, for example
+// Certain SyncServiceImpl tests don't apply to Chrome OS, for example
 // things that deal with concepts like "signing out".
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-TEST_F(ProfileSyncServiceTest, SignOutDisablesSyncTransportAndSyncFeature) {
+TEST_F(SyncServiceImplTest, SignOutDisablesSyncTransportAndSyncFeature) {
   // Sign-in and enable sync.
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::DisableReasonSet(), service()->GetDisableReasons());
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
@@ -558,7 +560,7 @@
   account_mutator->ClearPrimaryAccount(
       signin_metrics::SIGNOUT_TEST,
       signin_metrics::SignoutDelete::kIgnoreMetric);
-  // Wait for ProfileSyncService to be notified.
+  // Wait for SyncServiceImpl to be notified.
   base::RunLoop().RunUntilIdle();
   // SyncRequested was set to false, causing DISABLE_REASON_USER_CHOICE.
   EXPECT_EQ(
@@ -569,11 +571,11 @@
             service()->GetTransportState());
 }
 
-TEST_F(ProfileSyncServiceTest,
+TEST_F(SyncServiceImplTest,
        SignOutClearsSyncTransportDataAndSyncTheFeaturePrefs) {
   // Sign-in and enable sync.
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_TRUE(service()->GetUserSettings()->IsFirstSetupComplete());
   ASSERT_TRUE(service()->GetUserSettings()->IsSyncRequested());
@@ -585,7 +587,7 @@
   account_mutator->ClearPrimaryAccount(
       signin_metrics::SIGNOUT_TEST,
       signin_metrics::SignoutDelete::kIgnoreMetric);
-  // Wait for ProfileSyncService to be notified.
+  // Wait for SyncServiceImpl to be notified.
   base::RunLoop().RunUntilIdle();
   // These are specific to sync-the-feature and should be cleared.
   EXPECT_FALSE(service()->GetUserSettings()->IsFirstSetupComplete());
@@ -593,12 +595,12 @@
   EXPECT_EQ(1, component_factory()->clear_transport_data_call_count());
 }
 
-TEST_F(ProfileSyncServiceTest, SyncRequestedSetToFalseIfStartsSignedOut) {
+TEST_F(SyncServiceImplTest, SyncRequestedSetToFalseIfStartsSignedOut) {
   // Set up bad state.
   SyncPrefs sync_prefs(prefs());
   sync_prefs.SetSyncRequested(true);
 
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   service()->Initialize();
 
   // There's no signed-in user, so SyncRequested should have been set to false.
@@ -606,9 +608,9 @@
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
-TEST_F(ProfileSyncServiceTest, GetSyncTokenStatus) {
+TEST_F(SyncServiceImplTest, GetSyncTokenStatus) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
 
   // Initial status.
@@ -653,9 +655,9 @@
   EXPECT_EQ(CONNECTION_OK, token_status.connection_status);
 }
 
-TEST_F(ProfileSyncServiceTest, RevokeAccessTokenFromTokenService) {
+TEST_F(SyncServiceImplTest, RevokeAccessTokenFromTokenService) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -687,9 +689,9 @@
 
 // Checks that CREDENTIALS_REJECTED_BY_CLIENT resets the access token and stops
 // Sync. Regression test for https://crbug.com/824791.
-TEST_F(ProfileSyncServiceTest, CredentialsRejectedByClient_StopSync) {
+TEST_F(SyncServiceImplTest, CredentialsRejectedByClient_StopSync) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -739,9 +741,9 @@
 
 // CrOS does not support signout.
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-TEST_F(ProfileSyncServiceTest, SignOutRevokeAccessToken) {
+TEST_F(SyncServiceImplTest, SignOutRevokeAccessToken) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -773,10 +775,9 @@
 }
 #endif
 
-TEST_F(ProfileSyncServiceTest,
-       StopAndClearWillClearDataAndSwitchToTransportMode) {
+TEST_F(SyncServiceImplTest, StopAndClearWillClearDataAndSwitchToTransportMode) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -794,13 +795,13 @@
 
 // Verify that sync transport data is cleared when the service is initializing
 // and account is signed out.
-TEST_F(ProfileSyncServiceTest, ClearTransportDataOnInitializeWhenSignedOut) {
+TEST_F(SyncServiceImplTest, ClearTransportDataOnInitializeWhenSignedOut) {
   // Clearing prefs can be triggered only after `IdentityManager` finishes
   // loading the list of accounts, so wait for it to complete.
   identity_test_env()->WaitForRefreshTokensLoaded();
 
   // Don't sign-in before creating the service.
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
 
   ASSERT_EQ(0, component_factory()->clear_transport_data_call_count());
 
@@ -810,9 +811,9 @@
   EXPECT_EQ(1, component_factory()->clear_transport_data_call_count());
 }
 
-TEST_F(ProfileSyncServiceTest, StopSyncAndClearTwiceDoesNotCrash) {
+TEST_F(SyncServiceImplTest, StopSyncAndClearTwiceDoesNotCrash) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -830,13 +831,13 @@
 }
 
 // Verify that credential errors get returned from GetAuthError().
-TEST_F(ProfileSyncServiceTest, CredentialErrorReturned) {
+TEST_F(SyncServiceImplTest, CredentialErrorReturned) {
   // This test needs to manually send access tokens (or errors), so disable
   // automatic replies to access token requests.
   identity_test_env()->SetAutomaticIssueOfAccessTokens(false);
 
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -856,7 +857,7 @@
   // doesn't do any of this, call that explicitly here.
   service()->OnConnectionStatusChange(CONNECTION_AUTH_ERROR);
 
-  // Wait for ProfileSyncService to send an access token request.
+  // Wait for SyncServiceImpl to send an access token request.
   base::RunLoop().RunUntilIdle();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
       primary_account_id, "access token", base::Time::Max());
@@ -866,7 +867,7 @@
   // Emulate Chrome receiving a new, invalid LST. This happens when the user
   // signs out of the content area.
   identity_test_env()->SetRefreshTokenForPrimaryAccount();
-  // Again, wait for ProfileSyncService to be notified.
+  // Again, wait for SyncServiceImpl to be notified.
   base::RunLoop().RunUntilIdle();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
@@ -885,13 +886,13 @@
 
 // Verify that credential errors get cleared when a new token is fetched
 // successfully.
-TEST_F(ProfileSyncServiceTest, CredentialErrorClearsOnNewToken) {
+TEST_F(SyncServiceImplTest, CredentialErrorClearsOnNewToken) {
   // This test needs to manually send access tokens (or errors), so disable
   // automatic replies to access token requests.
   identity_test_env()->SetAutomaticIssueOfAccessTokens(false);
 
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -911,7 +912,7 @@
   // doesn't do any of this, call that explicitly here.
   service()->OnConnectionStatusChange(CONNECTION_AUTH_ERROR);
 
-  // Wait for ProfileSyncService to send an access token request.
+  // Wait for SyncServiceImpl to send an access token request.
   base::RunLoop().RunUntilIdle();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
       primary_account_id, "access token", base::Time::Max());
@@ -921,7 +922,7 @@
   // Emulate Chrome receiving a new, invalid LST. This happens when the user
   // signs out of the content area.
   identity_test_env()->SetRefreshTokenForPrimaryAccount();
-  // Wait for ProfileSyncService to be notified of the changed credentials and
+  // Wait for SyncServiceImpl to be notified of the changed credentials and
   // send a new access token request.
   base::RunLoop().RunUntilIdle();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
@@ -936,7 +937,7 @@
 
   // Now emulate Chrome receiving a new, valid LST.
   identity_test_env()->SetRefreshTokenForPrimaryAccount();
-  // Again, wait for ProfileSyncService to be notified.
+  // Again, wait for SyncServiceImpl to be notified.
   base::RunLoop().RunUntilIdle();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
       "this one works", base::Time::Now() + base::TimeDelta::FromDays(10));
@@ -951,21 +952,21 @@
 }
 
 // Verify that the disable sync flag disables sync.
-TEST_F(ProfileSyncServiceTest, DisableSyncFlag) {
+TEST_F(SyncServiceImplTest, DisableSyncFlag) {
   base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kDisableSync);
   EXPECT_FALSE(switches::IsSyncAllowedByFlag());
 }
 
 // Verify that no disable sync flag enables sync.
-TEST_F(ProfileSyncServiceTest, NoDisableSyncFlag) {
+TEST_F(SyncServiceImplTest, NoDisableSyncFlag) {
   EXPECT_TRUE(switches::IsSyncAllowedByFlag());
 }
 
-// Test that when ProfileSyncService receives actionable error
+// Test that when SyncServiceImpl receives actionable error
 // RESET_LOCAL_SYNC_DATA it restarts sync.
-TEST_F(ProfileSyncServiceTest, ResetSyncData) {
+TEST_F(SyncServiceImplTest, ResetSyncData) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   // Backend should get initialized two times: once during initialization and
   // once when handling actionable error.
   InitializeForNthSync();
@@ -975,11 +976,11 @@
   service()->OnActionableError(client_cmd);
 }
 
-// Test that when ProfileSyncService receives actionable error
+// Test that when SyncServiceImpl receives actionable error
 // DISABLE_SYNC_ON_CLIENT it disables sync and signs out.
-TEST_F(ProfileSyncServiceTest, DisableSyncOnClient) {
+TEST_F(SyncServiceImplTest, DisableSyncOnClient) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
 
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
@@ -1020,7 +1021,7 @@
 }
 
 // Verify a that local sync mode isn't impacted by sync being disabled.
-TEST_F(ProfileSyncServiceTest, LocalBackendUnimpactedByPolicy) {
+TEST_F(SyncServiceImplTest, LocalBackendUnimpactedByPolicy) {
   prefs()->SetManagedPref(prefs::kSyncManaged,
                           std::make_unique<base::Value>(false));
   CreateServiceWithLocalSyncBackend();
@@ -1049,11 +1050,11 @@
 }
 
 // Test ConfigureDataTypeManagerReason on First and Nth start.
-TEST_F(ProfileSyncServiceTest, ConfigureDataTypeManagerReason) {
+TEST_F(SyncServiceImplTest, ConfigureDataTypeManagerReason) {
   SignIn();
 
   // First sync.
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForFirstSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -1069,7 +1070,7 @@
   ShutdownAndDeleteService();
 
   // Nth sync.
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
@@ -1086,37 +1087,37 @@
 }
 
 // Regression test for crbug.com/1043642, can be removed once
-// ProfileSyncService usages after shutdown are addressed.
-TEST_F(ProfileSyncServiceTest, ShouldProvideDisableReasonsAfterShutdown) {
+// SyncServiceImpl usages after shutdown are addressed.
+TEST_F(SyncServiceImplTest, ShouldProvideDisableReasonsAfterShutdown) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForFirstSync();
   service()->Shutdown();
   EXPECT_FALSE(service()->GetDisableReasons().Empty());
 }
 
 #if defined(OS_ANDROID)
-TEST_F(ProfileSyncServiceTest, DecoupleFromMasterSyncIfInitializedSignedOut) {
+TEST_F(SyncServiceImplTest, DecoupleFromMasterSyncIfInitializedSignedOut) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(
       switches::kDecoupleSyncFromAndroidMasterSync);
 
   SyncPrefs sync_prefs(prefs());
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   ASSERT_FALSE(sync_prefs.GetDecoupledFromAndroidMasterSync());
 
   service()->Initialize();
   EXPECT_TRUE(sync_prefs.GetDecoupledFromAndroidMasterSync());
 }
 
-TEST_F(ProfileSyncServiceTest, DecoupleFromMasterSyncIfSignsOut) {
+TEST_F(SyncServiceImplTest, DecoupleFromMasterSyncIfSignsOut) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(
       switches::kDecoupleSyncFromAndroidMasterSync);
 
   SyncPrefs sync_prefs(prefs());
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   InitializeForNthSync();
   ASSERT_FALSE(sync_prefs.GetDecoupledFromAndroidMasterSync());
 
@@ -1126,16 +1127,16 @@
   account_mutator->ClearPrimaryAccount(
       signin_metrics::SIGNOUT_TEST,
       signin_metrics::SignoutDelete::kIgnoreMetric);
-  // Wait for ProfileSyncService to be notified.
+  // Wait for SyncServiceImpl to be notified.
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(sync_prefs.GetDecoupledFromAndroidMasterSync());
 }
 #endif  // defined(OS_ANDROID)
 
-TEST_F(ProfileSyncServiceTestWithSyncInvalidationsServiceCreated,
+TEST_F(SyncServiceImplTestWithSyncInvalidationsServiceCreated,
        ShouldSendDataTypesToSyncInvalidationsService) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   EXPECT_CALL(*sync_invalidations_service(), SetInterestedDataTypes);
   InitializeForFirstSync();
 }
@@ -1144,10 +1145,10 @@
   return arg.Has(SESSIONS);
 }
 
-TEST_F(ProfileSyncServiceTestWithSyncInvalidationsServiceCreated,
+TEST_F(SyncServiceImplTestWithSyncInvalidationsServiceCreated,
        ShouldEnableAndDisableInvalidationsForSessions) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START, nullptr,
+  CreateService(SyncServiceImpl::MANUAL_START, nullptr,
                 {{SESSIONS, false}, {TYPED_URLS, false}});
   InitializeForNthSync();
 
@@ -1159,18 +1160,18 @@
   service()->SetInvalidationsForSessionsEnabled(false);
 }
 
-TEST_F(ProfileSyncServiceTestWithSyncInvalidationsServiceCreated,
+TEST_F(SyncServiceImplTestWithSyncInvalidationsServiceCreated,
        ShouldActivateSyncInvalidationsServiceWhenSyncIsInitialized) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   EXPECT_CALL(*sync_invalidations_service(), SetActive(true)).Times(0);
   EXPECT_CALL(*sync_invalidations_service(), SetActive(true));
   InitializeForFirstSync();
 }
 
-TEST_F(ProfileSyncServiceTestWithSyncInvalidationsServiceCreated,
+TEST_F(SyncServiceImplTestWithSyncInvalidationsServiceCreated,
        ShouldActivateSyncInvalidationsServiceOnSignIn) {
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   EXPECT_CALL(*sync_invalidations_service(), SetActive(false));
   InitializeForFirstSync();
   EXPECT_CALL(*sync_invalidations_service(), SetActive(true));
@@ -1179,10 +1180,10 @@
 
 // CrOS does not support signout.
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-TEST_F(ProfileSyncServiceTestWithSyncInvalidationsServiceCreated,
+TEST_F(SyncServiceImplTestWithSyncInvalidationsServiceCreated,
        ShouldDectivateSyncInvalidationsServiceOnSignOut) {
   SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
+  CreateService(SyncServiceImpl::MANUAL_START);
   EXPECT_CALL(*sync_invalidations_service(), SetActive(true));
   InitializeForFirstSync();
 
diff --git a/components/sync/driver/sync_session_durations_metrics_recorder_unittest.cc b/components/sync/driver/sync_session_durations_metrics_recorder_unittest.cc
index 3bb4f132..726a025f 100644
--- a/components/sync/driver/sync_session_durations_metrics_recorder_unittest.cc
+++ b/components/sync/driver/sync_session_durations_metrics_recorder_unittest.cc
@@ -5,6 +5,7 @@
 #include "components/sync/driver/sync_session_durations_metrics_recorder.h"
 
 #include <memory>
+#include <string>
 
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
@@ -30,7 +31,8 @@
   ~SyncSessionDurationsMetricsRecorderTest() override {}
 
   void EnableSync() {
-    identity_test_env_.MakePrimaryAccountAvailable("foo@gmail.com");
+    identity_test_env_.MakePrimaryAccountAvailable("foo@gmail.com",
+                                                   signin::ConsentLevel::kSync);
     sync_service_.SetIsAuthenticatedAccountPrimary(true);
     sync_service_.SetDisableReasons(SyncService::DisableReasonSet());
     sync_service_.FireStateChanged();
diff --git a/components/sync/protocol/sync_protocol_error.h b/components/sync/protocol/sync_protocol_error.h
index f7f72c6..f0429c6 100644
--- a/components/sync/protocol/sync_protocol_error.h
+++ b/components/sync/protocol/sync_protocol_error.h
@@ -62,7 +62,7 @@
   // settings page that account is disabled.
   STOP_SYNC_FOR_DISABLED_ACCOUNT,
 
-  // Generated in response to CLIENT_DATA_OBSOLETE error. ProfileSyncService
+  // Generated in response to CLIENT_DATA_OBSOLETE error. SyncServiceImpl
   // should stop sync engine, delete the data and restart sync engine.
   RESET_LOCAL_SYNC_DATA,
 
diff --git a/components/sync/test/engine/fake_sync_engine.h b/components/sync/test/engine/fake_sync_engine.h
index ad2b60a1..f547f16 100644
--- a/components/sync/test/engine/fake_sync_engine.h
+++ b/components/sync/test/engine/fake_sync_engine.h
@@ -21,7 +21,7 @@
 
 // A fake of the SyncEngine.
 //
-// This class implements the bare minimum required for the ProfileSyncService to
+// This class implements the bare minimum required for the SyncServiceImpl to
 // get through initialization. It often returns null pointers or nonsense
 // values; it is not intended to be used in tests that depend on SyncEngine
 // behavior.
diff --git a/components/sync/test/fake_server/android/fake_server_helper_android.cc b/components/sync/test/fake_server/android/fake_server_helper_android.cc
index fa3524c5..8875aab 100644
--- a/components/sync/test/fake_server/android/fake_server_helper_android.cc
+++ b/components/sync/test/fake_server/android/fake_server_helper_android.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 
 #include <set>
+#include <string>
 #include <vector>
 
 #include "base/android/jni_array.h"
@@ -16,7 +17,7 @@
 #include "base/time/time.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/time.h"
-#include "components/sync/driver/profile_sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/nigori/nigori_test_utils.h"
 #include "components/sync/protocol/sync.pb.h"
 #include "components/sync/test/fake_server/bookmark_entity_builder.h"
@@ -45,10 +46,10 @@
 jlong FakeServerHelperAndroid::CreateFakeServer(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
-    jlong profile_sync_service) {
+    jlong sync_service_impl) {
   fake_server::FakeServer* fake_server = new fake_server::FakeServer();
-  syncer::ProfileSyncService* sync_service =
-      reinterpret_cast<syncer::ProfileSyncService*>(profile_sync_service);
+  syncer::SyncServiceImpl* sync_service =
+      reinterpret_cast<syncer::SyncServiceImpl*>(sync_service_impl);
   sync_service->OverrideNetworkForTest(
       fake_server::CreateFakeServerHttpPostProviderFactory(
           fake_server->AsWeakPtr()));
@@ -58,10 +59,10 @@
 void FakeServerHelperAndroid::DeleteFakeServer(JNIEnv* env,
                                                const JavaParamRef<jobject>& obj,
                                                jlong fake_server,
-                                               jlong profile_sync_service) {
+                                               jlong sync_service_impl) {
   base::ScopedAllowBlockingForTesting scoped_allow;
-  syncer::ProfileSyncService* sync_service =
-      reinterpret_cast<syncer::ProfileSyncService*>(profile_sync_service);
+  syncer::SyncServiceImpl* sync_service =
+      reinterpret_cast<syncer::SyncServiceImpl*>(sync_service_impl);
   sync_service->OverrideNetworkForTest(syncer::CreateHttpPostProviderFactory());
   fake_server::FakeServer* fake_server_ptr =
       reinterpret_cast<fake_server::FakeServer*>(fake_server);
diff --git a/components/sync/test/fake_server/android/fake_server_helper_android.h b/components/sync/test/fake_server/android/fake_server_helper_android.h
index f5c71d02..019a354 100644
--- a/components/sync/test/fake_server/android/fake_server_helper_android.h
+++ b/components/sync/test/fake_server/android/fake_server_helper_android.h
@@ -22,14 +22,14 @@
   // ownership.
   jlong CreateFakeServer(JNIEnv* env,
                          const base::android::JavaParamRef<jobject>& obj,
-                         jlong profile_sync_service);
+                         jlong sync_service_impl);
 
   // Deletes the given |fake_server| (a FakeServer pointer created via
   // CreateFakeServer).
   void DeleteFakeServer(JNIEnv* env,
                         const base::android::JavaParamRef<jobject>& obj,
                         jlong fake_server,
-                        jlong profile_sync_service);
+                        jlong sync_service_impl);
 
   // Returns true if and only if |fake_server| contains |count| entities that
   // match |model_type_string| and |name|.
diff --git a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend_unittest.cc b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend_unittest.cc
index 0d4fac1..51790cdf 100644
--- a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend_unittest.cc
+++ b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend_unittest.cc
@@ -42,7 +42,10 @@
 TEST_F(TrustedVaultAccessTokenFetcherFrontendTest,
        ShouldFetchAccessTokenForPrimaryAccount) {
   const CoreAccountId kAccountId =
-      identity_env()->MakePrimaryAccountAvailable("test@gmail.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@gmail.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   const std::string kAccessToken = "access_token";
 
   absl::optional<signin::AccessTokenInfo> fetched_access_token;
@@ -68,7 +71,8 @@
        ShouldFetchAccessTokenForUnconsentedPrimaryAccount) {
   const CoreAccountId kAccountId =
       identity_env()
-          ->MakeUnconsentedPrimaryAccountAvailable("test@gmail.com")
+          ->MakePrimaryAccountAvailable("test@gmail.com",
+                                        signin::ConsentLevel::kSignin)
           .account_id;
   const std::string kAccessToken = "access_token";
 
@@ -93,7 +97,8 @@
 
 TEST_F(TrustedVaultAccessTokenFetcherFrontendTest,
        ShouldRejectFetchAttemptForNonPrimaryAccount) {
-  identity_env()->MakePrimaryAccountAvailable("test1@gmail.com");
+  identity_env()->MakePrimaryAccountAvailable("test1@gmail.com",
+                                              signin::ConsentLevel::kSync);
   const CoreAccountId kSecondaryAccountId =
       identity_env()->MakeAccountAvailable("test2@gmail.com").account_id;
 
@@ -115,7 +120,10 @@
 TEST_F(TrustedVaultAccessTokenFetcherFrontendTest,
        ShouldReplyOnUnsuccessfulFetchAttempt) {
   const CoreAccountId kAccountId =
-      identity_env()->MakePrimaryAccountAvailable("test@gmail.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@gmail.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   const std::string kAccessToken = "access_token";
 
   absl::optional<signin::AccessTokenInfo> fetched_access_token;
@@ -139,7 +147,10 @@
 
 TEST_F(TrustedVaultAccessTokenFetcherFrontendTest, ShouldAllowMultipleFetches) {
   const CoreAccountId kAccountId =
-      identity_env()->MakePrimaryAccountAvailable("test@gmail.com").account_id;
+      identity_env()
+          ->MakePrimaryAccountAvailable("test@gmail.com",
+                                        signin::ConsentLevel::kSync)
+          .account_id;
   const std::string kAccessToken = "access_token";
 
   absl::optional<signin::AccessTokenInfo> fetched_access_token1;
diff --git a/components/sync_bookmarks/bookmark_model_merger.cc b/components/sync_bookmarks/bookmark_model_merger.cc
index 1bacc44..8a12698 100644
--- a/components/sync_bookmarks/bookmark_model_merger.cc
+++ b/components/sync_bookmarks/bookmark_model_merger.cc
@@ -47,7 +47,7 @@
 // It is the responsibility of something upstream (at time of writing, the sync
 // server) to create these tagged nodes when initializing sync for the first
 // time for a user.  Thus, once the backend finishes initializing, the
-// ProfileSyncService can rely on the presence of tagged nodes.
+// SyncService can rely on the presence of tagged nodes.
 const char kBookmarkBarTag[] = "bookmark_bar";
 const char kMobileBookmarksTag[] = "synced_bookmarks";
 const char kOtherBookmarksTag[] = "other_bookmarks";
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions.cc b/components/sync_bookmarks/bookmark_specifics_conversions.cc
index 59d217d..7c5ee5f 100644
--- a/components/sync_bookmarks/bookmark_specifics_conversions.cc
+++ b/components/sync_bookmarks/bookmark_specifics_conversions.cc
@@ -89,11 +89,9 @@
     const bookmarks::BookmarkNode* bookmark_node,
     favicon::FaviconService* favicon_service) {
   DCHECK(bookmark_node);
+  DCHECK(!bookmark_node->is_folder());
   DCHECK(favicon_service);
 
-  // TODO(crbug.com/1214843): Avoid invoking this function for folders, although
-  // it's harmless in practice due to later filtering via
-  // HistoryClient::CanAddURL().
   favicon_service->AddPageNoVisitForBookmark(bookmark_node->url(),
                                              bookmark_node->GetTitle());
 
@@ -105,18 +103,14 @@
   GURL icon_url(specifics.icon_url());
 
   if (icon_bytes->size() == 0 && icon_url.is_empty()) {
-    if (!bookmark_node->is_folder()) {
-      LogFaviconContainedInSpecifics(false);
-    }
     // Empty icon URL and no bitmap data means no icon mapping.
+    LogFaviconContainedInSpecifics(false);
     favicon_service->DeleteFaviconMappings({bookmark_node->url()},
                                            favicon_base::IconType::kFavicon);
     return;
   }
 
-  if (!bookmark_node->is_folder()) {
-    LogFaviconContainedInSpecifics(true);
-  }
+  LogFaviconContainedInSpecifics(true);
 
   if (icon_url.is_empty()) {
     // WebUI pages such as "chrome://bookmarks/" are missing a favicon URL but
@@ -299,22 +293,24 @@
 
   bookmarks::BookmarkNode::MetaInfoMap metainfo =
       GetBookmarkMetaInfo(specifics);
-  const bookmarks::BookmarkNode* node;
+
   if (is_folder) {
     // TODO(crbug.com/1214840): Folders should propagate the creation time into
     // BookmarkModel, just like non-folders.
-    node = model->AddFolder(parent, index, NodeTitleFromSpecifics(specifics),
+    return model->AddFolder(parent, index, NodeTitleFromSpecifics(specifics),
                             &metainfo, guid);
-  } else {
-    const int64_t create_time_us = specifics.creation_time_us();
-    base::Time create_time = base::Time::FromDeltaSinceWindowsEpoch(
-        // Use FromDeltaSinceWindowsEpoch because create_time_us has
-        // always used the Windows epoch.
-        base::TimeDelta::FromMicroseconds(create_time_us));
-    node = model->AddURL(parent, index, NodeTitleFromSpecifics(specifics),
-                         GURL(specifics.url()), &metainfo, create_time, guid);
   }
+
+  const int64_t create_time_us = specifics.creation_time_us();
+  base::Time create_time = base::Time::FromDeltaSinceWindowsEpoch(
+      // Use FromDeltaSinceWindowsEpoch because create_time_us has
+      // always used the Windows epoch.
+      base::TimeDelta::FromMicroseconds(create_time_us));
+  const bookmarks::BookmarkNode* node =
+      model->AddURL(parent, index, NodeTitleFromSpecifics(specifics),
+                    GURL(specifics.url()), &metainfo, create_time, guid);
   SetBookmarkFaviconFromSpecifics(specifics, node, favicon_service);
+
   return node;
 }
 
@@ -332,13 +328,13 @@
   base::GUID guid = base::GUID::ParseLowercase(specifics.guid());
   DCHECK(!guid.is_valid() || guid == node->guid());
 
-  if (!node->is_folder()) {
-    model->SetURL(node, GURL(specifics.url()));
-  }
-
   model->SetTitle(node, NodeTitleFromSpecifics(specifics));
   model->SetNodeMetaInfoMap(node, GetBookmarkMetaInfo(specifics));
-  SetBookmarkFaviconFromSpecifics(specifics, node, favicon_service);
+
+  if (!node->is_folder()) {
+    model->SetURL(node, GURL(specifics.url()));
+    SetBookmarkFaviconFromSpecifics(specifics, node, favicon_service);
+  }
 }
 
 const bookmarks::BookmarkNode* ReplaceBookmarkNodeGUID(
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
index 497edfd2..41cce7c 100644
--- a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
+++ b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
@@ -256,11 +256,9 @@
   std::unique_ptr<bookmarks::BookmarkModel> model =
       bookmarks::TestBookmarkClient::CreateModel();
   testing::NiceMock<favicon::MockFaviconService> favicon_service;
-  // AddPageNoVisitForBookmark() is redundant and later filtered out by
-  // HistoryService, via HistoryClient::CanAddURL().
-  // TODO(crbug.com/1214843): Avoid this call for folders.
-  EXPECT_CALL(favicon_service, AddPageNoVisitForBookmark(_, _));
+  EXPECT_CALL(favicon_service, AddPageNoVisitForBookmark(_, _)).Times(0);
   EXPECT_CALL(favicon_service, MergeFavicon(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(favicon_service, DeleteFaviconMappings(_, _)).Times(0);
   base::HistogramTester histogram_tester;
   const bookmarks::BookmarkNode* node = CreateBookmarkNodeFromSpecifics(
       *bm_specifics,
diff --git a/components/sync_sessions/session_sync_service.h b/components/sync_sessions/session_sync_service.h
index 3d1fce5..1bf2490 100644
--- a/components/sync_sessions/session_sync_service.h
+++ b/components/sync_sessions/session_sync_service.h
@@ -39,7 +39,6 @@
   virtual base::CallbackListSubscription SubscribeToForeignSessionsChanged(
       const base::RepeatingClosure& cb) WARN_UNUSED_RESULT = 0;
 
-  // For ProfileSyncService to initialize the controller for SESSIONS.
   virtual base::WeakPtr<syncer::ModelTypeControllerDelegate>
   GetControllerDelegate() = 0;
 
diff --git a/components/sync_sessions/session_sync_service_impl.h b/components/sync_sessions/session_sync_service_impl.h
index 08e46e64..d9d09ff 100644
--- a/components/sync_sessions/session_sync_service_impl.h
+++ b/components/sync_sessions/session_sync_service_impl.h
@@ -35,7 +35,6 @@
   base::CallbackListSubscription SubscribeToForeignSessionsChanged(
       const base::RepeatingClosure& cb) override WARN_UNUSED_RESULT;
 
-  // For ProfileSyncService to initialize the controller for SESSIONS.
   base::WeakPtr<syncer::ModelTypeControllerDelegate> GetControllerDelegate()
       override;
 
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc
index f0b8ae69..d9e1bdbb 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -278,6 +278,7 @@
     case ui::AXEventGenerator::Event::CLASS_NAME_CHANGED:
     case ui::AXEventGenerator::Event::COLLAPSED:
     case ui::AXEventGenerator::Event::CONTROLS_CHANGED:
+    case ui::AXEventGenerator::Event::DETAILS_CHANGED:
     case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED:
     case ui::AXEventGenerator::Event::DESCRIPTION_CHANGED:
     case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
index 146a147..b6a0d9fd3 100644
--- a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
@@ -280,6 +280,7 @@
     case ui::AXEventGenerator::Event::CHILDREN_CHANGED:
     case ui::AXEventGenerator::Event::CONTROLS_CHANGED:
     case ui::AXEventGenerator::Event::CLASS_NAME_CHANGED:
+    case ui::AXEventGenerator::Event::DETAILS_CHANGED:
     case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED:
     case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED:
     case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm
index 840b193..ade9b84 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -367,6 +367,7 @@
     case ui::AXEventGenerator::Event::CHILDREN_CHANGED:
     case ui::AXEventGenerator::Event::CONTROLS_CHANGED:
     case ui::AXEventGenerator::Event::CLASS_NAME_CHANGED:
+    case ui::AXEventGenerator::Event::DETAILS_CHANGED:
     case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED:
     case ui::AXEventGenerator::Event::DESCRIPTION_CHANGED:
     case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
index e77b8fc..3250605 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -492,6 +492,7 @@
     // Currently unused events on this platform.
     case ui::AXEventGenerator::Event::ATK_TEXT_OBJECT_ATTRIBUTE_CHANGED:
     case ui::AXEventGenerator::Event::AUTO_COMPLETE_CHANGED:
+    case ui::AXEventGenerator::Event::DETAILS_CHANGED:
     case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED:
     case ui::AXEventGenerator::Event::FOCUS_CHANGED:
     case ui::AXEventGenerator::Event::LIVE_REGION_NODE_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc
index 05dccefa..1e4de879 100644
--- a/content/browser/accessibility/browser_accessibility_win_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -2396,8 +2396,8 @@
   div_editable.role = ax::mojom::Role::kGenericContainer;
   div_editable.AddState(ax::mojom::State::kEditable);
   div_editable.AddState(ax::mojom::State::kRichlyEditable);
-  div_editable.AddBoolAttribute(ax::mojom::BoolAttribute::kContentEditableRoot,
-                                true);
+  div_editable.AddBoolAttribute(
+      ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true);
   div_editable.AddState(ax::mojom::State::kFocusable);
   div_editable.AddStringAttribute(ax::mojom::StringAttribute::kFontFamily,
                                   "Helvetica");
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
index b008be3..cb1a8de 100644
--- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -396,6 +396,21 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
+                       AccessibilityEventsAriaTextboxChildrenChange) {
+  RunEventTest(FILE_PATH_LITERAL("aria-textbox-children-change.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
+                       AccessibilityEventsAriaTextboxEditabilityChanges) {
+  RunEventTest(FILE_PATH_LITERAL("aria-textbox-editability-changes.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
+                       AccessibilityEventsAriaTextboxWithFocusableChildren) {
+  RunEventTest(FILE_PATH_LITERAL("aria-textbox-with-focusable-children.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
                        AccessibilityEventsAriaTreeCollapse) {
   RunEventTest(FILE_PATH_LITERAL("aria-tree-collapse.html"));
 }
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 7029f05..862aa6d3 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1306,6 +1306,16 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
+                       AccessibilityAriaTextboxWithAriaTextboxChild) {
+  RunAriaTest(FILE_PATH_LITERAL("aria-textbox-with-aria-textbox-child.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
+                       AccessibilityAriaTextboxWithNonTextChildren) {
+  RunAriaTest(FILE_PATH_LITERAL("aria-textbox-with-non-text-children.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityAriaTextboxWithRichText) {
   RunAriaTest(FILE_PATH_LITERAL("aria-textbox-with-rich-text.html"));
 }
diff --git a/content/browser/android/overscroll_controller_android.cc b/content/browser/android/overscroll_controller_android.cc
index 9d62cd9..e452b41 100644
--- a/content/browser/android/overscroll_controller_android.cc
+++ b/content/browser/android/overscroll_controller_android.cc
@@ -19,6 +19,7 @@
 #include "ui/android/window_android.h"
 #include "ui/android/window_android_compositor.h"
 #include "ui/base/l10n/l10n_util_android.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/events/blink/did_overscroll_params.h"
 
 using ui::DidOverscrollParams;
@@ -49,6 +50,12 @@
     return nullptr;
   }
 
+  // The elastic overscroll feature indicates when the user is scrolling beyond
+  // the range of the scrollable area. Showing a glow in addition would be
+  // redundant.
+  if (base::FeatureList::IsEnabled(features::kElasticOverscroll))
+    return nullptr;
+
   return std::make_unique<OverscrollGlow>(client);
 }
 
diff --git a/content/browser/background_fetch/background_fetch_test_base.cc b/content/browser/background_fetch/background_fetch_test_base.cc
index bbc861d..8476609 100644
--- a/content/browser/background_fetch/background_fetch_test_base.cc
+++ b/content/browser/background_fetch/background_fetch_test_base.cc
@@ -117,8 +117,8 @@
         script_url, key, options,
         blink::mojom::FetchClientSettingsObject::New(),
         base::BindOnce(&DidRegisterServiceWorker,
-                       &service_worker_registration_id,
-                       run_loop.QuitClosure()));
+                       &service_worker_registration_id, run_loop.QuitClosure()),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
 
     run_loop.Run();
   }
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc
index adcdd68..ca45a033 100644
--- a/content/browser/background_sync/background_sync_manager_unittest.cc
+++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -171,13 +171,15 @@
         GURL(kScript1), key1, options1,
         blink::mojom::FetchClientSettingsObject::New(),
         base::BindOnce(&RegisterServiceWorkerCallback, &called_1,
-                       &sw_registration_id_1_));
+                       &sw_registration_id_1_),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
 
     helper_->context()->RegisterServiceWorker(
         GURL(kScript2), key2, options2,
         blink::mojom::FetchClientSettingsObject::New(),
         base::BindOnce(&RegisterServiceWorkerCallback, &called_2,
-                       &sw_registration_id_2_));
+                       &sw_registration_id_2_),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
     base::RunLoop().RunUntilIdle();
     EXPECT_TRUE(called_1);
     EXPECT_TRUE(called_2);
diff --git a/content/browser/background_sync/background_sync_service_impl_test_harness.cc b/content/browser/background_sync/background_sync_service_impl_test_harness.cc
index da71875..60f3d00 100644
--- a/content/browser/background_sync/background_sync_service_impl_test_harness.cc
+++ b/content/browser/background_sync/background_sync_service_impl_test_harness.cc
@@ -180,7 +180,8 @@
       GURL(kServiceWorkerScript), key, options,
       blink::mojom::FetchClientSettingsObject::New(),
       base::BindOnce(&RegisterServiceWorkerCallback, &called,
-                     &sw_registration_id_));
+                     &sw_registration_id_),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(called);
 
diff --git a/content/browser/child_process_task_port_provider_mac_unittest.cc b/content/browser/child_process_task_port_provider_mac_unittest.cc
index 118d1cad..f2ac607 100644
--- a/content/browser/child_process_task_port_provider_mac_unittest.cc
+++ b/content/browser/child_process_task_port_provider_mac_unittest.cc
@@ -42,8 +42,6 @@
                void(mojo::PendingReceiver<
                     tracing::mojom::BackgroundTracingAgentProvider>));
   MOCK_METHOD0(CrashHungProcess, void());
-  MOCK_METHOD1(BootstrapLegacyIpc,
-               void(mojo::PendingReceiver<IPC::mojom::ChannelBootstrap>));
   MOCK_METHOD2(RunServiceDeprecated,
                void(const std::string&, mojo::ScopedMessagePipeHandle));
   MOCK_METHOD1(BindServiceInterface,
diff --git a/content/browser/content_index/content_index_database_unittest.cc b/content/browser/content_index/content_index_database_unittest.cc
index 07ac6c63..200c978 100644
--- a/content/browser/content_index/content_index_database_unittest.cc
+++ b/content/browser/content_index/content_index_database_unittest.cc
@@ -247,7 +247,8 @@
           blink::mojom::FetchClientSettingsObject::New(),
           base::BindOnce(&DidRegisterServiceWorker,
                          &service_worker_registration_id,
-                         run_loop.QuitClosure()));
+                         run_loop.QuitClosure()),
+          /*requesting_frame_id=*/GlobalFrameRoutingId());
 
       run_loop.Run();
     }
diff --git a/content/browser/conversions/conversion_storage.h b/content/browser/conversions/conversion_storage.h
index b2576247..e8a894bf 100644
--- a/content/browser/conversions/conversion_storage.h
+++ b/content/browser/conversions/conversion_storage.h
@@ -59,6 +59,7 @@
     // Returns the maximum number of impressions that can be in storage at any
     // time for an impression top-level origin.
     virtual int GetMaxImpressionsPerOrigin() const = 0;
+
     //  Returns the maximum number of conversions that can be in storage at any
     //  time for a conversion top-level origin. Note that since reporting
     //  origins are the actual entities that invoke conversion registration, we
@@ -66,6 +67,11 @@
     //  reporting origin> tuple.
     virtual int GetMaxConversionsPerOrigin() const = 0;
 
+    // Returns the maximum number of distinct conversion destinations that can
+    // be in storage at any time for event-source impressions with a given
+    // reporting origin.
+    virtual int GetMaxAttributionDestinationsPerEventSource() const = 0;
+
     struct RateLimitConfig {
       base::TimeDelta time_window;
       int max_attributions_per_window;
diff --git a/content/browser/conversions/conversion_storage_delegate_impl.cc b/content/browser/conversions/conversion_storage_delegate_impl.cc
index 5d9fb8d..f05f3c5 100644
--- a/content/browser/conversions/conversion_storage_delegate_impl.cc
+++ b/content/browser/conversions/conversion_storage_delegate_impl.cc
@@ -61,6 +61,12 @@
   return 1024;
 }
 
+int ConversionStorageDelegateImpl::GetMaxAttributionDestinationsPerEventSource()
+    const {
+  // TODO(apaseltiner): Finalize a value for this.
+  return INT_MAX;
+}
+
 ConversionStorage::Delegate::RateLimitConfig
 ConversionStorageDelegateImpl::GetRateLimits() const {
   // TODO(csharrison): Finalize max_attributions_per_window value.
diff --git a/content/browser/conversions/conversion_storage_delegate_impl.h b/content/browser/conversions/conversion_storage_delegate_impl.h
index 3e79c21..30dd3bc 100644
--- a/content/browser/conversions/conversion_storage_delegate_impl.h
+++ b/content/browser/conversions/conversion_storage_delegate_impl.h
@@ -37,6 +37,7 @@
       StorableImpression::SourceType source_type) const override;
   int GetMaxImpressionsPerOrigin() const override;
   int GetMaxConversionsPerOrigin() const override;
+  int GetMaxAttributionDestinationsPerEventSource() const override;
   RateLimitConfig GetRateLimits() const override;
   StorableImpression::AttributionLogic SelectAttributionLogic(
       const StorableImpression& impression) const override;
diff --git a/content/browser/conversions/conversion_storage_sql.cc b/content/browser/conversions/conversion_storage_sql.cc
index e7efc7f..03de3a8 100644
--- a/content/browser/conversions/conversion_storage_sql.cc
+++ b/content/browser/conversions/conversion_storage_sql.cc
@@ -149,6 +149,9 @@
   if (!transaction.Begin())
     return;
 
+  if (!EnsureCapacityForPendingDestinationLimit(impression))
+    return;
+
   const std::string serialized_conversion_destination =
       impression.ConversionDestination().Serialize();
   const std::string serialized_reporting_origin =
@@ -1102,4 +1105,107 @@
   db_init_status_ = DbStatus::kClosed;
 }
 
+bool ConversionStorageSql::EnsureCapacityForPendingDestinationLimit(
+    const StorableImpression& impression) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // TODO(apaseltiner): Add metrics for how this behaves so we can see how often
+  // sites are hitting the limit.
+
+  if (impression.source_type() != StorableImpression::SourceType::kEvent)
+    return true;
+
+  const std::string serialized_conversion_destination =
+      impression.ConversionDestination().Serialize();
+
+  const char kSelectImpressionsSql[] =
+      "SELECT impression_id, conversion_destination "
+      "FROM impressions "
+      "WHERE impression_site = ? AND source_type = ? "
+      "AND active = 1 AND num_conversions = 0 "
+      "ORDER BY impression_time ASC";
+  sql::Statement statement(
+      db_->GetCachedStatement(SQL_FROM_HERE, kSelectImpressionsSql));
+  statement.BindString(0, impression.ImpressionSite().Serialize());
+  statement.BindInt(1,
+                    static_cast<int>(StorableImpression::SourceType::kEvent));
+
+  base::flat_map<std::string, size_t> conversion_destinations;
+
+  struct ImpressionData {
+    int64_t impression_id;
+    std::string conversion_destination;
+  };
+  std::vector<ImpressionData> impressions_by_impression_time;
+
+  while (statement.Step()) {
+    ImpressionData impression_data = {
+        .impression_id = statement.ColumnInt64(0),
+        .conversion_destination = statement.ColumnString(1),
+    };
+
+    // If there's already an impression matching the to-be-stored
+    // `impression_site` and `conversion_destination`, then the unique count
+    // won't be changed, so there's nothing else to do.
+    if (impression_data.conversion_destination ==
+        serialized_conversion_destination) {
+      return true;
+    }
+
+    conversion_destinations[impression_data.conversion_destination]++;
+    impressions_by_impression_time.push_back(std::move(impression_data));
+  }
+
+  if (!statement.Succeeded())
+    return false;
+
+  const int max = delegate_->GetMaxAttributionDestinationsPerEventSource();
+  // TODO(apaseltiner): We could just make
+  // `GetMaxAttributionDestinationsPerEventSource()` return `size_t`, but it
+  // would be inconsistent with the other `ConversionStorage::Delegate` methods.
+  DCHECK_GT(max, 0);
+
+  // Otherwise, if there's capacity for the new `conversion_destination` to be
+  // stored for the `impression_site`, there's nothing else to do.
+  if (conversion_destinations.size() < static_cast<size_t>(max))
+    return true;
+
+  // Otherwise, delete impressions in order by `impression_time` until the
+  // number of distinct `conversion_destination`s is under `max`.
+  std::vector<int64_t> impression_ids_to_delete;
+  for (const auto& impression_data : impressions_by_impression_time) {
+    auto it =
+        conversion_destinations.find(impression_data.conversion_destination);
+    DCHECK(it != conversion_destinations.end());
+    it->second--;
+    if (it->second == 0)
+      conversion_destinations.erase(it);
+    impression_ids_to_delete.push_back(impression_data.impression_id);
+    if (conversion_destinations.size() < static_cast<size_t>(max))
+      break;
+  }
+
+  sql::Transaction transaction(db_.get());
+  if (!transaction.Begin())
+    return false;
+
+  const char kDeleteImpressionSql[] =
+      "DELETE FROM impressions WHERE impression_id = ?";
+  sql::Statement delete_impression_statement(
+      db_->GetCachedStatement(SQL_FROM_HERE, kDeleteImpressionSql));
+
+  for (int64_t impression_id : impression_ids_to_delete) {
+    delete_impression_statement.Reset(/*clear_bound_vars=*/true);
+    delete_impression_statement.BindInt64(0, impression_id);
+    if (!delete_impression_statement.Run())
+      return false;
+  }
+
+  // Because this is limited to active impressions with `num_conversions = 0`,
+  // we should be guaranteed that there is not any corresponding data in the
+  // rate limit table or the report table.
+
+  return transaction.Commit();
+}
+
 }  // namespace content
diff --git a/content/browser/conversions/conversion_storage_sql.h b/content/browser/conversions/conversion_storage_sql.h
index 2170c924..cbbdb3a2 100644
--- a/content/browser/conversions/conversion_storage_sql.h
+++ b/content/browser/conversions/conversion_storage_sql.h
@@ -97,6 +97,12 @@
   bool HasCapacityForStoringImpression(const std::string& serialized_origin);
   int GetCapacityForStoringConversion(const std::string& serialized_origin);
 
+  // When storing an event-source impression, deletes active event-source
+  // impressions in order by |impression_time| until there are sufficiently few
+  // unique conversion destinations for the same |impression_site|.
+  bool EnsureCapacityForPendingDestinationLimit(
+      const StorableImpression& impression);
+
   // Initializes the database if necessary, and returns whether the database is
   // open. |should_create| indicates whether the database should be created if
   // it is not already.
diff --git a/content/browser/conversions/conversion_storage_unittest.cc b/content/browser/conversions/conversion_storage_unittest.cc
index 40ac328..75505cd 100644
--- a/content/browser/conversions/conversion_storage_unittest.cc
+++ b/content/browser/conversions/conversion_storage_unittest.cc
@@ -887,4 +887,155 @@
   EXPECT_TRUE(ReportsEqual({}, actual_reports));
 }
 
+TEST_F(ConversionStorageTest,
+       MaxAttributionDestinationsPerSource_AlreadyStored) {
+  const auto impression =
+      ImpressionBuilder(clock()->Now())
+          .SetSourceType(StorableImpression::SourceType::kEvent)
+          .Build();
+
+  // Setting this doesn't affect the test behavior, but makes it clear that the
+  // test passes without depending on the default value of |INT_MAX|.
+  delegate()->set_max_attribution_destinations_per_event_source(1);
+  storage()->StoreImpression(impression);
+  storage()->StoreImpression(impression);
+
+  // The second impression's |conversion_destination| matches the first's, so it
+  // doesn't add to the number of distinct values for the |impression_site|,
+  // and both impressions should be stored.
+  EXPECT_EQ(2u, storage()->GetActiveImpressions().size());
+}
+
+TEST_F(
+    ConversionStorageTest,
+    MaxAttributionDestinationsPerSource_DifferentImpressionSitesAreIndependent) {
+  // Setting this doesn't affect the test behavior, but makes it clear that the
+  // test passes without depending on the default value of |INT_MAX|.
+  delegate()->set_max_attribution_destinations_per_event_source(1);
+  storage()->StoreImpression(
+      ImpressionBuilder(clock()->Now())
+          .SetImpressionOrigin(url::Origin::Create(GURL("https://a.example")))
+          .SetConversionOrigin(url::Origin::Create(GURL("https://c.example")))
+          .SetSourceType(StorableImpression::SourceType::kEvent)
+          .Build());
+  storage()->StoreImpression(
+      ImpressionBuilder(clock()->Now())
+          .SetImpressionOrigin(url::Origin::Create(GURL("https://b.example")))
+          .SetConversionOrigin(url::Origin::Create(GURL("https://d.example")))
+          .SetSourceType(StorableImpression::SourceType::kEvent)
+          .Build());
+
+  // The two impressions together have 2 distinct |conversion_destination|
+  // values, but they are independent because they vary by |impression_site|, so
+  // both should be stored.
+  EXPECT_EQ(2u, storage()->GetActiveImpressions().size());
+}
+
+TEST_F(ConversionStorageTest,
+       MaxAttributionDestinationsPerSource_IrrelevantForNavigationSources) {
+  // Setting this doesn't affect the test behavior, but makes it clear that the
+  // test passes without depending on the default value of |INT_MAX|.
+  delegate()->set_max_attribution_destinations_per_event_source(1);
+  storage()->StoreImpression(
+      ImpressionBuilder(clock()->Now())
+          .SetConversionOrigin(url::Origin::Create(GURL("https://a.example/")))
+          .Build());
+  storage()->StoreImpression(
+      ImpressionBuilder(clock()->Now())
+          .SetConversionOrigin(url::Origin::Create(GURL("https://b.example")))
+          .Build());
+
+  // Both impressions should be stored because they are navigation source.
+  EXPECT_EQ(2u, storage()->GetActiveImpressions().size());
+}
+
+TEST_F(
+    ConversionStorageTest,
+    MaxAttributionDestinationsPerSource_InsufficientCapacityDeletesOldImpressions) {
+  // Verifies that active sources are removed in order, and that the destination
+  // limit handles multiple active impressions for the same destination when
+  // deleting.
+
+  struct {
+    std::string impression_origin;
+    std::string conversion_origin;
+    int max;
+  } kImpressions[] = {
+      {"https://foo.test.example", "https://a.example", INT_MAX},
+      {"https://bar.test.example", "https://b.example", INT_MAX},
+      {"https://xyz.test.example", "https://a.example", INT_MAX},
+      {"https://ghi.test.example", "https://b.example", INT_MAX},
+      {"https://qrs.test.example", "https://c.example", 2},
+  };
+
+  for (const auto& impression : kImpressions) {
+    delegate()->set_max_attribution_destinations_per_event_source(
+        impression.max);
+    storage()->StoreImpression(
+        ImpressionBuilder(clock()->Now())
+            .SetImpressionOrigin(
+                url::Origin::Create(GURL(impression.impression_origin)))
+            .SetConversionOrigin(
+                url::Origin::Create(GURL(impression.conversion_origin)))
+            .SetSourceType(StorableImpression::SourceType::kEvent)
+            .Build());
+    clock()->Advance(base::TimeDelta::FromMilliseconds(1));
+  }
+
+  std::vector<StorableImpression> stored_impressions =
+      storage()->GetActiveImpressions();
+  EXPECT_EQ(2u, stored_impressions.size());
+
+  EXPECT_EQ(url::Origin::Create(GURL("https://ghi.test.example")),
+            stored_impressions[0].impression_origin());
+  EXPECT_EQ(url::Origin::Create(GURL("https://qrs.test.example")),
+            stored_impressions[1].impression_origin());
+}
+
+TEST_F(ConversionStorageTest,
+       MaxAttributionDestinationsPerSource_IgnoresInactiveImpressions) {
+  delegate()->set_max_conversions_per_impression(1);
+  delegate()->set_max_attribution_destinations_per_event_source(INT_MAX);
+
+  storage()->StoreImpression(
+      ImpressionBuilder(clock()->Now())
+          .SetSourceType(StorableImpression::SourceType::kEvent)
+          .Build());
+  EXPECT_EQ(1u, storage()->GetActiveImpressions().size());
+
+  storage()->MaybeCreateAndStoreConversionReport(DefaultConversion());
+  EXPECT_EQ(0u, storage()->GetActiveImpressions().size());
+
+  clock()->Advance(base::TimeDelta::FromMilliseconds(1));
+  storage()->StoreImpression(
+      ImpressionBuilder(clock()->Now())
+          .SetConversionOrigin(url::Origin::Create(GURL("https://a.example")))
+          .SetSourceType(StorableImpression::SourceType::kEvent)
+          .Build());
+  EXPECT_EQ(1u, storage()->GetActiveImpressions().size());
+
+  delegate()->set_max_attribution_destinations_per_event_source(1);
+  clock()->Advance(base::TimeDelta::FromMilliseconds(1));
+  storage()->StoreImpression(
+      ImpressionBuilder(clock()->Now())
+          .SetConversionOrigin(url::Origin::Create(GURL("https://b.example")))
+          .SetSourceType(StorableImpression::SourceType::kEvent)
+          .Build());
+
+  // The earliest active impression should be deleted to make room for this new
+  // one.
+  std::vector<StorableImpression> stored_impressions =
+      storage()->GetActiveImpressions();
+  EXPECT_EQ(1u, stored_impressions.size());
+  EXPECT_EQ(url::Origin::Create(GURL("https://b.example")),
+            stored_impressions[0].conversion_origin());
+
+  // Both the inactive impression and the new one for b.example should be
+  // retained; a.example is the only one that should have been deleted. The
+  // presence of 1 conversion to report implies that the inactive impression
+  // remains in the DB.
+  clock()->Advance(base::TimeDelta::FromMilliseconds(kReportTime));
+  EXPECT_EQ(1u, storage()->GetConversionsToReport(clock()->Now()).size());
+}
+
 }  // namespace content
diff --git a/content/browser/conversions/conversion_test_utils.cc b/content/browser/conversions/conversion_test_utils.cc
index 88eb2f12..97e4c26 100644
--- a/content/browser/conversions/conversion_test_utils.cc
+++ b/content/browser/conversions/conversion_test_utils.cc
@@ -115,6 +115,10 @@
 int ConfigurableStorageDelegate::GetMaxConversionsPerOrigin() const {
   return max_conversions_per_origin_;
 }
+int ConfigurableStorageDelegate::GetMaxAttributionDestinationsPerEventSource()
+    const {
+  return max_attribution_destinations_per_event_source_;
+}
 ConversionStorage::Delegate::RateLimitConfig
 ConfigurableStorageDelegate::GetRateLimits() const {
   return rate_limits_;
diff --git a/content/browser/conversions/conversion_test_utils.h b/content/browser/conversions/conversion_test_utils.h
index e7ebb986..f21dc98 100644
--- a/content/browser/conversions/conversion_test_utils.h
+++ b/content/browser/conversions/conversion_test_utils.h
@@ -91,6 +91,7 @@
   RateLimitConfig GetRateLimits() const override;
   StorableImpression::AttributionLogic SelectAttributionLogic(
       const StorableImpression& impression) const override;
+  int GetMaxAttributionDestinationsPerEventSource() const override;
 
   void set_max_conversions_per_impression(int max) {
     max_conversions_per_impression_ = max;
@@ -104,6 +105,10 @@
     max_conversions_per_origin_ = max;
   }
 
+  void set_max_attribution_destinations_per_event_source(int max) {
+    max_attribution_destinations_per_event_source_ = max;
+  }
+
   void set_rate_limits(RateLimitConfig c) { rate_limits_ = c; }
 
   void set_attribution_logic(
@@ -119,6 +124,7 @@
   int max_conversions_per_impression_ = INT_MAX;
   int max_impressions_per_origin_ = INT_MAX;
   int max_conversions_per_origin_ = INT_MAX;
+  int max_attribution_destinations_per_event_source_ = INT_MAX;
 
   RateLimitConfig rate_limits_ = {
       .time_window = base::TimeDelta::Max(),
diff --git a/content/browser/cookie_store/cookie_store_manager_unittest.cc b/content/browser/cookie_store/cookie_store_manager_unittest.cc
index 1c5dff0..aa7ed40 100644
--- a/content/browser/cookie_store/cookie_store_manager_unittest.cc
+++ b/content/browser/cookie_store/cookie_store_manager_unittest.cc
@@ -213,7 +213,8 @@
           EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status)
               << blink::ServiceWorkerStatusToString(status);
           run_loop.Quit();
-        }));
+        }),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
     run_loop.Run();
     if (!success)
       return kInvalidRegistrationId;
diff --git a/content/browser/devtools/devtools_background_services_context_impl_unittest.cc b/content/browser/devtools/devtools_background_services_context_impl_unittest.cc
index e2e2d4bd..6a15da5 100644
--- a/content/browser/devtools/devtools_background_services_context_impl_unittest.cc
+++ b/content/browser/devtools/devtools_background_services_context_impl_unittest.cc
@@ -222,7 +222,8 @@
           blink::mojom::FetchClientSettingsObject::New(),
           base::BindOnce(&DidRegisterServiceWorker,
                          &service_worker_registration_id,
-                         run_loop.QuitClosure()));
+                         run_loop.QuitClosure()),
+          /*requesting_frame_id=*/GlobalFrameRoutingId());
 
       run_loop.Run();
     }
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc
index a1f5ed58..09b5fa1 100644
--- a/content/browser/devtools/devtools_instrumentation.cc
+++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -1024,6 +1024,33 @@
   DispatchToAgents(ftn, &protocol::LogHandler::EntryAdded, entry.get());
 }
 
+void OnServiceWorkerMainScriptFetchingFailed(
+    const GlobalFrameRoutingId& requesting_frame_id,
+    const std::string& error) {
+  // If we have a requesting_frame_id, we should have a frame and a frame tree
+  // node. However since the lifetime of these objects can be complex, we check
+  // at each step that we indeed can go reach all the way to the FrameTreeNode.
+  if (!requesting_frame_id)
+    return;
+
+  RenderFrameHostImpl* requesting_frame =
+      RenderFrameHostImpl::FromID(requesting_frame_id);
+  if (!requesting_frame)
+    return;
+
+  FrameTreeNode* ftn = requesting_frame->frame_tree_node();
+  if (!ftn)
+    return;
+
+  auto entry = protocol::Log::LogEntry::Create()
+                   .SetSource(protocol::Log::LogEntry::SourceEnum::Network)
+                   .SetLevel(protocol::Log::LogEntry::LevelEnum::Error)
+                   .SetText(error)
+                   .SetTimestamp(base::Time::Now().ToDoubleT() * 1000.0)
+                   .Build();
+  DispatchToAgents(ftn, &protocol::LogHandler::EntryAdded, entry.get());
+}
+
 void LogWorkletError(RenderFrameHostImpl* frame_host,
                      const std::string& error) {
   FrameTreeNode* ftn = frame_host->frame_tree_node();
diff --git a/content/browser/devtools/devtools_instrumentation.h b/content/browser/devtools/devtools_instrumentation.h
index 3bd8e7b..a903016 100644
--- a/content/browser/devtools/devtools_instrumentation.h
+++ b/content/browser/devtools/devtools_instrumentation.h
@@ -13,6 +13,7 @@
 
 #include "content/common/navigation_params.mojom.h"
 #include "content/public/browser/certificate_request_result_type.h"
+#include "content/public/browser/global_routing_id.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
@@ -230,6 +231,10 @@
     const GURL& url,
     const absl::optional<net::WebTransportError>& error);
 
+void OnServiceWorkerMainScriptFetchingFailed(
+    const GlobalFrameRoutingId& requesting_frame_id,
+    const std::string& error);
+
 // Adds a debug error message from a worklet to the devtools console.
 void LogWorkletError(RenderFrameHostImpl* frame_host, const std::string& error);
 
diff --git a/content/browser/loader/file_url_loader_factory.cc b/content/browser/loader/file_url_loader_factory.cc
index 1bc6f82..a857355 100644
--- a/content/browser/loader/file_url_loader_factory.cc
+++ b/content/browser/loader/file_url_loader_factory.cc
@@ -194,7 +194,7 @@
              scoped_refptr<net::HttpResponseHeaders> response_headers) {
     receiver_.Bind(std::move(loader));
     receiver_.set_disconnect_handler(base::BindOnce(
-        &FileURLDirectoryLoader::OnMojoDisconnct, base::Unretained(this)));
+        &FileURLDirectoryLoader::OnMojoDisconnect, base::Unretained(this)));
 
     mojo::Remote<network::mojom::URLLoaderClient> client(
         std::move(client_remote));
@@ -241,7 +241,7 @@
         std::make_unique<mojo::DataPipeProducer>(std::move(producer_handle));
   }
 
-  void OnMojoDisconnct() {
+  void OnMojoDisconnect() {
     lister_.reset();
     data_producer_.reset();
     receiver_.reset();
@@ -461,7 +461,7 @@
     head->headers = extra_response_headers;
     receiver_.Bind(std::move(loader));
     receiver_.set_disconnect_handler(base::BindOnce(
-        &FileURLLoader::OnMojoDisconnct, base::Unretained(this)));
+        &FileURLLoader::OnMojoDisconnect, base::Unretained(this)));
 
     client_.Bind(std::move(client_remote));
     host_safety_status_ = url::CheckHostnameSafety(
@@ -706,7 +706,7 @@
                                          base::Unretained(this), nullptr));
   }
 
-  void OnMojoDisconnct() {
+  void OnMojoDisconnect() {
     data_producer_.reset();
     receiver_.reset();
     client_.reset();
diff --git a/content/browser/notifications/blink_notification_service_impl_unittest.cc b/content/browser/notifications/blink_notification_service_impl_unittest.cc
index 0c2117e..2bdd5f7 100644
--- a/content/browser/notifications/blink_notification_service_impl_unittest.cc
+++ b/content/browser/notifications/blink_notification_service_impl_unittest.cc
@@ -180,7 +180,8 @@
           base::BindOnce(
               &BlinkNotificationServiceImplTest::DidRegisterServiceWorker,
               base::Unretained(this), &service_worker_registration_id,
-              run_loop.QuitClosure()));
+              run_loop.QuitClosure()),
+          /*requesting_frame_id=*/GlobalFrameRoutingId());
       run_loop.Run();
     }
 
diff --git a/content/browser/notifications/notification_storage_unittest.cc b/content/browser/notifications/notification_storage_unittest.cc
index 3f2340b..762a50a 100644
--- a/content/browser/notifications/notification_storage_unittest.cc
+++ b/content/browser/notifications/notification_storage_unittest.cc
@@ -73,7 +73,8 @@
           script_url, key, options,
           blink::mojom::FetchClientSettingsObject::New(),
           base::BindOnce(&NotificationStorageTest::DidRegisterServiceWorker,
-                         base::Unretained(this), run_loop.QuitClosure()));
+                         base::Unretained(this), run_loop.QuitClosure()),
+          /*requesting_frame_id=*/GlobalFrameRoutingId());
       run_loop.Run();
     }
 
diff --git a/content/browser/notifications/platform_notification_context_unittest.cc b/content/browser/notifications/platform_notification_context_unittest.cc
index c32ef7e..0b6a17b6 100644
--- a/content/browser/notifications/platform_notification_context_unittest.cc
+++ b/content/browser/notifications/platform_notification_context_unittest.cc
@@ -587,7 +587,8 @@
   embedded_worker_test_helper->context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
       base::BindOnce(&PlatformNotificationContextTest::DidRegisterServiceWorker,
-                     base::Unretained(this), &service_worker_registration_id));
+                     base::Unretained(this), &service_worker_registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   base::RunLoop().RunUntilIdle();
   ASSERT_NE(service_worker_registration_id,
diff --git a/content/browser/payments/payment_app_content_unittest_base.cc b/content/browser/payments/payment_app_content_unittest_base.cc
index 174ac4f8..05bfbf50 100644
--- a/content/browser/payments/payment_app_content_unittest_base.cc
+++ b/content/browser/payments/payment_app_content_unittest_base.cc
@@ -196,8 +196,9 @@
   worker_helper_->context()->RegisterServiceWorker(
       sw_script_url, key, registration_opt,
       blink::mojom::FetchClientSettingsObject::New(),
-      base::BindOnce(&RegisterServiceWorkerCallback, &called,
-                     &registration_id));
+      base::BindOnce(&RegisterServiceWorkerCallback, &called, &registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
+
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(called);
 
diff --git a/content/browser/prerender/prerender_browsertest.cc b/content/browser/prerender/prerender_browsertest.cc
index 8cf6649e..6869cbb5 100644
--- a/content/browser/prerender/prerender_browsertest.cc
+++ b/content/browser/prerender/prerender_browsertest.cc
@@ -2468,50 +2468,6 @@
       PrerenderHost::FinalStatus::kRendererProcessKilled, 1);
 }
 
-class PrerenderSingleProcessBrowserTest : public PrerenderBrowserTest {
- public:
-  PrerenderSingleProcessBrowserTest() = default;
-
-  void SetUpCommandLine(base::CommandLine* cmd_line) override {
-    PrerenderBrowserTest::SetUpCommandLine(cmd_line);
-    cmd_line->AppendSwitch("single-process");
-  }
-};
-
-IN_PROC_BROWSER_TEST_F(PrerenderSingleProcessBrowserTest,
-                       SessionStorageAfterBackNavigation) {
-  // Official Chrome builds (except Android) don't support single-process mode.
-  if (!RenderProcessHost::run_renderer_in_process())
-    return;
-
-  const GURL kInitialUrl = GetUrl("/prerender/session_storage.html");
-  const GURL kPrerenderingUrl =
-      GetUrl("/prerender/session_storage.html?prerendering=");
-
-  // Navigate to an initial page.
-  ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
-
-  AddPrerender(kPrerenderingUrl);
-  NavigatePrimaryPage(kPrerenderingUrl);
-
-  EXPECT_EQ("initial", EvalJs(current_frame_host(),
-                              "window.sessionKeysInPrerenderingchange")
-                           .ExtractString());
-  EXPECT_EQ(
-      "activated, initial",
-      EvalJs(current_frame_host(), "getSessionStorageKeys()").ExtractString());
-
-  // Navigate back to the initial page.
-  content::TestNavigationObserver observer(shell()->web_contents());
-  shell()->GoBackOrForward(-1);
-  observer.Wait();
-  EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), kInitialUrl);
-
-  EXPECT_EQ(
-      "activated, initial",
-      EvalJs(current_frame_host(), "getSessionStorageKeys()").ExtractString());
-}
-
 class PrerenderBackForwardCacheBrowserTest : public PrerenderBrowserTest {
  public:
   PrerenderBackForwardCacheBrowserTest() {
diff --git a/content/browser/prerender/prerender_navigation_throttle.cc b/content/browser/prerender/prerender_navigation_throttle.cc
index 06bf3143..4b238f4 100644
--- a/content/browser/prerender/prerender_navigation_throttle.cc
+++ b/content/browser/prerender/prerender_navigation_throttle.cc
@@ -22,13 +22,12 @@
     NavigationHandle* navigation_handle) {
   auto* navigation_request = NavigationRequest::From(navigation_handle);
   FrameTreeNode* frame_tree_node = navigation_request->frame_tree_node();
-  if (!blink::features::IsPrerender2Enabled() ||
-      !frame_tree_node->IsMainFrame() ||
-      !frame_tree_node->frame_tree()->is_prerendering()) {
-    return nullptr;
+  if (frame_tree_node->IsMainFrame() &&
+      frame_tree_node->frame_tree()->is_prerendering()) {
+    DCHECK(blink::features::IsPrerender2Enabled());
+    return base::WrapUnique(new PrerenderNavigationThrottle(navigation_handle));
   }
-
-  return base::WrapUnique(new PrerenderNavigationThrottle(navigation_handle));
+  return nullptr;
 }
 
 const char* PrerenderNavigationThrottle::GetNameForLogging() {
diff --git a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
index 927a7f4..fe5bc31 100644
--- a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
+++ b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
@@ -4,8 +4,11 @@
 
 #include "content/browser/renderer_host/back_forward_cache_can_store_document_result.h"
 
+#include "base/debug/crash_logging.h"
+#include "base/debug/dump_without_crashing.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "content/common/debug_utils.h"
 #include "third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h"
 
 namespace content {
@@ -181,12 +184,18 @@
 
 void BackForwardCacheCanStoreDocumentResult::No(
     BackForwardCacheMetrics::NotRestoredReason reason) {
-  // Callers should call NoDueToFeatures or
-  // NoDueToDisableForRenderFrameHostCalled instead.
-  DCHECK_NE(reason,
-            BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures);
-  DCHECK_NE(reason, BackForwardCacheMetrics::NotRestoredReason::
-                        kDisableForRenderFrameHostCalled);
+  if (reason ==
+          BackForwardCacheMetrics::NotRestoredReason::kBlocklistedFeatures ||
+      reason == BackForwardCacheMetrics::NotRestoredReason::
+                    kDisableForRenderFrameHostCalled) {
+    // This function should not be called if blocklisted features are there or
+    // DisableForRenderFrameHost is called. Log the reason here.
+    SCOPED_CRASH_KEY_STRING256("NotRestoredReason", "reason",
+                               NotRestoredReasonToString(reason));
+    CaptureTraceForNavigationDebugScenario(
+        DebugScenario::kDebugBackForwardCacheMetricsMismatch);
+    base::debug::DumpWithoutCrashing();
+  }
   AddNotStoredReason(reason);
 }
 
diff --git a/content/browser/renderer_host/back_forward_cache_metrics.cc b/content/browser/renderer_host/back_forward_cache_metrics.cc
index 8e9e6ce..de99eb8a 100644
--- a/content/browser/renderer_host/back_forward_cache_metrics.cc
+++ b/content/browser/renderer_host/back_forward_cache_metrics.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/renderer_host/back_forward_cache_metrics.h"
 
+#include "base/debug/crash_logging.h"
+#include "base/debug/dump_without_crashing.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/metrics_hashes.h"
 #include "base/metrics/sparse_histogram.h"
@@ -13,6 +15,7 @@
 #include "content/browser/renderer_host/navigation_request.h"
 #include "content/browser/renderer_host/should_swap_browsing_instance.h"
 #include "content/browser/site_instance_impl.h"
+#include "content/common/debug_utils.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_details.h"
 #include "content/public/browser/reload_type.h"
@@ -123,22 +126,35 @@
   if (IsHistoryNavigation(navigation)) {
     UpdateNotRestoredReasonsForNavigation(navigation);
 
-    // Check that the reasons we are about to record are consistent.
-    DCHECK_EQ(navigation->IsServedFromBackForwardCache(),
-              page_store_result_->not_stored_reasons().to_ullong() == 0ULL)
-        << page_store_result_->ToString();
-    DCHECK_EQ(page_store_result_->HasNotStoredReason(
-                  NotRestoredReason::kBrowsingInstanceNotSwapped),
-              !DidSwapBrowsingInstance())
-        << page_store_result_->ToString();
-    DCHECK_EQ(page_store_result_->HasNotStoredReason(
-                  NotRestoredReason::kDisableForRenderFrameHostCalled),
-              page_store_result_->disabled_reasons().size() != 0)
-        << page_store_result_->ToString();
-    DCHECK_EQ(page_store_result_->HasNotStoredReason(
-                  NotRestoredReason::kBlocklistedFeatures),
-              page_store_result_->blocklisted_features() != 0ULL)
-        << page_store_result_->ToString();
+    // If a navigation serves the result from back/forward cache, then it must
+    // not have logged any NotRestoredReasons. Also if it is not restored from
+    // back/forward cache, the logged reasons must match the actual condition of
+    // the navigation and other logged data.
+    bool served_from_bfcache_not_match =
+        navigation->IsServedFromBackForwardCache() &&
+        page_store_result_->not_stored_reasons().to_ullong() != 0ULL;
+    bool browsing_instance_not_swapped_not_match =
+        page_store_result_->HasNotStoredReason(
+            NotRestoredReason::kBrowsingInstanceNotSwapped) &&
+        DidSwapBrowsingInstance();
+    bool disable_for_rfh_not_match =
+        page_store_result_->HasNotStoredReason(
+            NotRestoredReason::kDisableForRenderFrameHostCalled) &&
+        page_store_result_->disabled_reasons().size() == 0;
+    bool blocklisted_features_not_match =
+        page_store_result_->HasNotStoredReason(
+            NotRestoredReason::kBlocklistedFeatures) &&
+        page_store_result_->blocklisted_features() == 0ULL;
+    if (served_from_bfcache_not_match ||
+        browsing_instance_not_swapped_not_match || disable_for_rfh_not_match ||
+        blocklisted_features_not_match) {
+      // Record if logged reasons and the situations do not match.
+      SCOPED_CRASH_KEY_STRING256("PageStoreResult", "page_store_result_",
+                                 page_store_result_->ToString());
+      CaptureTraceForNavigationDebugScenario(
+          DebugScenario::kDebugBackForwardCacheMetricsMismatch);
+      base::debug::DumpWithoutCrashing();
+    }
 
     TRACE_EVENT1("navigation", "HistoryNavigationOutcome", "outcome",
                  page_store_result_->ToString());
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 54821d8..3d769f1 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -1177,7 +1177,6 @@
       common_params_(std::move(common_params)),
       begin_params_(std::move(begin_params)),
       commit_params_(std::move(commit_params)),
-      browser_initiated_(browser_initiated),
       navigation_ui_data_(std::move(navigation_ui_data)),
       blob_url_loader_factory_(std::move(blob_url_loader_factory)),
       restore_type_(entry ? entry->restore_type() : RestoreType::kNotRestored),
@@ -1206,7 +1205,7 @@
       was_opener_suppressed_(was_opener_suppressed),
       previous_page_ukm_source_id_(
           frame_tree_node_->current_frame_host()->GetPageUkmSourceId()) {
-  DCHECK(browser_initiated_ || common_params_->initiator_origin.has_value());
+  DCHECK(browser_initiated || common_params_->initiator_origin.has_value());
   DCHECK(!blink::IsRendererDebugURL(common_params_->url));
   DCHECK(common_params_->method == "POST" || !common_params_->post_data);
   DCHECK_EQ(common_params_->url, commit_params_->original_url);
@@ -1339,9 +1338,9 @@
   // Let the NTP override the navigation params and pretend that this is a
   // browser-initiated, bookmark-like navigation.
   // TODO(crbug.com/1099431): determine why some link navigations on chrome://
-  //     pages have |browser_initiated_| set to true and others set to false.
+  //     pages have |browser_initiated| set to true and others set to false.
   if (source_site_instance_) {
-    bool is_renderer_initiated = !browser_initiated_;
+    bool is_renderer_initiated = !browser_initiated;
     Referrer referrer(*common_params_->referrer);
     GetContentClient()->browser()->OverrideNavigationParams(
         controller->GetWebContents(), source_site_instance_.get(),
@@ -1349,9 +1348,9 @@
         &common_params_->initiator_origin);
     common_params_->referrer =
         blink::mojom::Referrer::New(referrer.url, referrer.policy);
-    browser_initiated_ = !is_renderer_initiated;
-    commit_params_->is_browser_initiated = browser_initiated_;
+    browser_initiated = !is_renderer_initiated;
   }
+  commit_params_->is_browser_initiated = browser_initiated;
 
   // Update the load flags with cache information.
   UpdateLoadFlagsWithCacheFlags(&begin_params_->load_flags,
@@ -1406,11 +1405,12 @@
         frame_tree_node);
 
     if (begin_params_->is_form_submission) {
-      if (browser_initiated_ && !commit_params_->post_content_type.empty()) {
+      if (commit_params_->is_browser_initiated &&
+          !commit_params_->post_content_type.empty()) {
         // This is a form resubmit, so make sure to set the Content-Type header.
         headers.SetHeaderIfMissing(net::HttpRequestHeaders::kContentType,
                                    commit_params_->post_content_type);
-      } else if (!browser_initiated_) {
+      } else if (!commit_params_->is_browser_initiated) {
         // Save the Content-Type in case the form is resubmitted. This will get
         // sent back to the renderer in the CommitNavigation IPC. The renderer
         // will then send it back with the post body so that we can access it
@@ -1422,8 +1422,6 @@
   }
 
   begin_params_->headers = headers.ToString();
-
-  commit_params_->is_browser_initiated = browser_initiated_;
 }
 
 NavigationRequest::~NavigationRequest() {
@@ -1477,8 +1475,7 @@
     }
 
     // Abandon the prerender host reserved for activation if it exists.
-    if (blink::features::IsPrerender2Enabled() &&
-        IsPrerenderedPageActivation()) {
+    if (IsPrerenderedPageActivation()) {
       GetPrerenderHostRegistry().AbandonReservedHost(
           prerender_frame_tree_node_id_.value());
     }
@@ -1527,10 +1524,10 @@
   bool should_override_url_loading = false;
 
   if (!GetContentClient()->browser()->ShouldOverrideUrlLoading(
-          frame_tree_node_->frame_tree_node_id(), browser_initiated_,
-          commit_params_->original_url, commit_params_->original_method,
-          common_params_->has_user_gesture, false,
-          frame_tree_node_->IsMainFrame(), common_params_->transition,
+          frame_tree_node_->frame_tree_node_id(),
+          commit_params_->is_browser_initiated, commit_params_->original_url,
+          commit_params_->original_method, common_params_->has_user_gesture,
+          false, frame_tree_node_->IsMainFrame(), common_params_->transition,
           &should_override_url_loading)) {
     // A Java exception was thrown by the embedding application; we
     // need to return from this task. Specifically, it's not safe from
@@ -2057,8 +2054,9 @@
 
   bool should_override_url_loading = false;
   if (!GetContentClient()->browser()->ShouldOverrideUrlLoading(
-          frame_tree_node_->frame_tree_node_id(), browser_initiated_,
-          redirect_info.new_url, redirect_info.new_method,
+          frame_tree_node_->frame_tree_node_id(),
+          commit_params_->is_browser_initiated, redirect_info.new_url,
+          redirect_info.new_method,
           // Redirects are always not counted as from user gesture.
           false, true, frame_tree_node_->IsMainFrame(),
           common_params_->transition, &should_override_url_loading)) {
@@ -2106,7 +2104,7 @@
   // For renderer-initiated navigations we need to check if the source has
   // access to the URL. Browser-initiated navigations only rely on the
   // |CanRedirectToURL| test above.
-  if (!browser_initiated_ && GetSourceSiteInstance() &&
+  if (!commit_params_->is_browser_initiated && GetSourceSiteInstance() &&
       !ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL(
           GetSourceSiteInstance()->GetProcess()->GetID(),
           redirect_info.new_url)) {
@@ -2696,7 +2694,7 @@
   if (commit_params_->was_activated == mojom::WasActivatedOption::kUnknown) {
     commit_params_->was_activated = mojom::WasActivatedOption::kNo;
 
-    if (!browser_initiated_ &&
+    if (!commit_params_->is_browser_initiated &&
         (frame_tree_node_->HasStickyUserActivation() ||
          frame_tree_node_->has_received_user_gesture_before_nav()) &&
         ShouldPropagateUserActivation(
@@ -2706,7 +2704,8 @@
       // TODO(805871): the next check is relying on sanitized_referrer_ but
       // should ideally use a more reliable source for the originating URL when
       // the navigation is renderer initiated.
-    } else if (((common_params_->has_user_gesture && !browser_initiated_) ||
+    } else if (((common_params_->has_user_gesture &&
+                 !commit_params_->is_browser_initiated) ||
                 common_params_->started_from_context_menu) &&
                ShouldPropagateUserActivation(
                    url::Origin::Create(sanitized_referrer_->url),
@@ -2849,7 +2848,7 @@
 
   cross_origin_embedder_policy_ = cross_origin_embedder_policy;
 
-  if (!browser_initiated_ && render_frame_host_ &&
+  if (!commit_params_->is_browser_initiated && render_frame_host_ &&
       render_frame_host_ != frame_tree_node_->current_frame_host()) {
     // Allow the embedder to cancel the cross-process commit if needed.
     // TODO(clamy): Rename ShouldTransferNavigation.
@@ -4225,8 +4224,8 @@
       }
 
       // [prefetch-src]
-      if (blink::features::IsPrerender2Enabled() &&
-          frame_tree_node_->frame_tree()->is_prerendering()) {
+      if (frame_tree_node_->frame_tree()->is_prerendering()) {
+        DCHECK(blink::features::IsPrerender2Enabled());
         if (!IsAllowedByCSPDirective(
                 initiator_policies->content_security_policies,
                 &initiator_context,
@@ -5385,7 +5384,7 @@
   dict.Add("net_error", net_error_);
   dict.Add("url", common_params_->url);
   dict.Add("frame_tree_node", frame_tree_node_);
-  dict.Add("browser_initiated", browser_initiated_);
+  dict.Add("browser_initiated", commit_params_->is_browser_initiated);
   dict.Add("from_begin_navigation", from_begin_navigation_);
   dict.Add("is_for_commit", is_for_commit_);
   dict.Add("reload_type", reload_type_);
@@ -5654,7 +5653,7 @@
 }
 
 bool NavigationRequest::IsRendererInitiated() {
-  return !browser_initiated_;
+  return !commit_params_->is_browser_initiated;
 }
 
 bool NavigationRequest::IsSameOrigin() {
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index 7a78c2d..2299438 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -414,7 +414,9 @@
 
   int bindings() const { return bindings_; }
 
-  bool browser_initiated() const { return browser_initiated_; }
+  bool browser_initiated() const {
+    return commit_params_->is_browser_initiated;
+  }
 
   bool from_begin_navigation() const { return from_begin_navigation_; }
 
@@ -1344,19 +1346,21 @@
   // Note: When the navigation is ready to commit, the url in |common_params|
   // will be set to the final navigation url, obtained after following all
   // redirects.
+  //
   // Note: |common_params_| and |begin_params_| are not const as they can be
   // modified during redirects.
+  //
   // Note: |commit_params_| is not const because was_discarded will
   // be set in CreatedNavigationRequest.
-  // Note: |browser_initiated_| and |common_params_| may be mutated by
-  // ContentBrowserClient::OverrideNavigationParams at StartNavigation time
-  // (i.e. before we actually kick off the navigation). |browser_initiated|
-  // will always be true for history navigations, even if they began in the
-  // renderer using the history API.
+  //
+  // Note: |commit_params_->is_browser_initiated| and |common_params_| may be
+  // mutated by ContentBrowserClient::OverrideNavigationParams at construction
+  // time (i.e. before we actually kick off the navigation).
+  // |commit_params_->is_browser_initiated| will always be true for history
+  // navigations, even if they began in the renderer using the history API.
   mojom::CommonNavigationParamsPtr common_params_;
   mojom::BeginNavigationParamsPtr begin_params_;
   mojom::CommitNavigationParamsPtr commit_params_;
-  bool browser_initiated_;
   bool same_origin_ = false;
 
   // Stores the NavigationUIData for this navigation until the NavigationHandle
diff --git a/content/browser/renderer_host/private_network_access_browsertest.cc b/content/browser/renderer_host/private_network_access_browsertest.cc
index 0465ef18..e5bd57eb 100644
--- a/content/browser/renderer_host/private_network_access_browsertest.cc
+++ b/content/browser/renderer_host/private_network_access_browsertest.cc
@@ -2425,10 +2425,49 @@
                                            InsecureLocalURL("/image.jpg"))));
 }
 
+// This test verifies that even when the right feature is enabled, requests:
+//  - from a non-secure context in the `public` IP address space
+//  - to a subresource cached from a `local` IP address
+//  are not blocked.
+//
+// TODO(https://crbug.com/1124340): Decide whether this is bad and either change
+// this test or delete this todo.
+IN_PROC_BROWSER_TEST_F(PrivateNetworkAccessBrowserTest,
+                       FromInsecurePublicToCachedLocalIsBlocked) {
+  GURL cached_url = SecureLocalURL(kCacheablePath);
+
+  // Cache the resource first, by fetching it from a document in the same IP
+  // address space.
+  EXPECT_TRUE(NavigateToURL(shell(), SecureLocalURL(kDefaultPath)));
+  EXPECT_EQ(true,
+            EvalJs(root_frame_host(), FetchSubresourceScript(cached_url)));
+
+  // Now navigate to a document in the `public` address space belonging to the
+  // same site as the previous document (this will use the same cache key).
+  EXPECT_TRUE(
+      NavigateToURL(shell(), SecureLocalURL(kTreatAsPublicAddressPath)));
+
+  ResourceLoadObserver observer(shell());
+
+  // Check that the page can still load the subresource. This fetch would fail
+  // were the subresource not cached.
+  EXPECT_EQ(true,
+            EvalJs(root_frame_host(), FetchSubresourceScript(cached_url)));
+
+  observer.WaitForResourceCompletion(cached_url);
+
+  // And that the resource was loaded from the cache.
+  blink::mojom::ResourceLoadInfoPtr* info = observer.FindResource(cached_url);
+  ASSERT_TRUE(info);
+  ASSERT_TRUE(*info);
+  EXPECT_TRUE((*info)->was_cached);
+}
+
 // This test verifies that even with the blocking feature disabled, an insecure
 // page in the `local` address space cannot fetch a `file:` URL.
 //
-// This is relevant to CORS-RFC1918, since `file:` URLs are considered `local`.
+// This is relevant to Private Network Access, since `file:` URLs are considered
+// to be in the `local` IP address space.
 IN_PROC_BROWSER_TEST_F(PrivateNetworkAccessBrowserTestNoBlocking,
                        InsecurePageCannotRequestFile) {
   EXPECT_TRUE(NavigateToURL(shell(), InsecureLocalURL(kDefaultPath)));
@@ -2441,7 +2480,8 @@
 // This test verifies that even with the blocking feature disabled, a secure
 // page in the `local` address space cannot fetch a `file:` URL.
 //
-// This is relevant to CORS-RFC1918, since `file:` URLs are considered `local`.
+// This is relevant to Private Network Access, since `file:` URLs are considered
+// to be in the `local` IP address space.
 IN_PROC_BROWSER_TEST_F(PrivateNetworkAccessBrowserTestNoBlocking,
                        SecurePageCannotRequestFile) {
   EXPECT_TRUE(NavigateToURL(shell(), SecureLocalURL(kDefaultPath)));
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 7eb606f..1221cd602 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -1363,16 +1363,14 @@
     set_nav_entry_id(parent_->nav_entry_id());
   }
 
-  if (blink::features::IsPrerender2Enabled()) {
-    if (frame_tree_->is_prerendering()) {
-      // TODO(https://crbug.com/1132752): Check the prerendering page is
-      // same-origin to the prerender trigger page.
-      broker_.ApplyMojoBinderPolicies(
-          MojoBinderPolicyApplier::CreateForSameOriginPrerendering(
-              base::BindOnce(
-                  &RenderFrameHostImpl::CancelPrerenderingByMojoBinderPolicy,
-                  base::Unretained(this))));
-    }
+  if (frame_tree_->is_prerendering()) {
+    DCHECK(blink::features::IsPrerender2Enabled());
+    // TODO(https://crbug.com/1132752): Check the prerendering page is
+    // same-origin to the prerender trigger page.
+    broker_.ApplyMojoBinderPolicies(
+        MojoBinderPolicyApplier::CreateForSameOriginPrerendering(base::BindOnce(
+            &RenderFrameHostImpl::CancelPrerenderingByMojoBinderPolicy,
+            base::Unretained(this))));
   }
 
   if (lifecycle_state_ != LifecycleStateImpl::kSpeculative) {
@@ -4400,8 +4398,8 @@
   // TODO(crbug.com/1205359): We should defer the download until the
   // prerendering page is activated, and it will comply with the prerendering
   // spec.
-  if (blink::features::IsPrerender2Enabled() &&
-      frame_tree()->is_prerendering()) {
+  if (frame_tree()->is_prerendering()) {
+    DCHECK(blink::features::IsPrerender2Enabled());
     CancelPrerendering(PrerenderHost::FinalStatus::kDownload);
     return;
   }
@@ -5760,20 +5758,18 @@
 void RenderFrameHostImpl::BindBrowserInterfaceBrokerReceiver(
     mojo::PendingReceiver<blink::mojom::BrowserInterfaceBroker> receiver) {
   DCHECK(receiver.is_valid());
-  if (blink::features::IsPrerender2Enabled()) {
-    if (frame_tree()->is_prerendering()) {
-      // RenderFrameHostImpl will rebind the receiver end of
-      // BrowserInterfaceBroker if it receives a new one sent from renderer
-      // processes. It happens when renderer processes navigate to a new
-      // document, see RenderFrameImpl::DidCommitNavigation() and
-      // RenderFrameHostImpl::DidCommitNavigation().
-      // So before binding a new receiver end of BrowserInterfaceBroker,
-      // RenderFrameHostImpl should drop all deferred binders to avoid
-      // connecting Mojo pipes with old documents.
-      auto* applier = broker_.GetMojoBinderPolicyApplier();
-      DCHECK(applier) << "prerendering pages should have a policy applier";
-      applier->DropDeferredBinders();
-    }
+  if (frame_tree()->is_prerendering()) {
+    DCHECK(blink::features::IsPrerender2Enabled());
+    // RenderFrameHostImpl will rebind the receiver end of
+    // BrowserInterfaceBroker if it receives a new one sent from renderer
+    // processes. It happens when renderer processes navigate to a new document,
+    // see RenderFrameImpl::DidCommitNavigation() and
+    // RenderFrameHostImpl::DidCommitNavigation(). So before binding a new
+    // receiver end of BrowserInterfaceBroker, RenderFrameHostImpl should drop
+    // all deferred binders to avoid connecting Mojo pipes with old documents.
+    auto* applier = broker_.GetMojoBinderPolicyApplier();
+    DCHECK(applier) << "prerendering pages should have a policy applier";
+    applier->DropDeferredBinders();
   }
   broker_receiver_.Bind(std::move(receiver));
   broker_receiver_.SetFilter(std::make_unique<ActiveURLMessageFilter>(this));
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index a107b155..c31a6ef 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2036,12 +2036,11 @@
           kChildProcessHostRemoteAttachmentName));
 
   // Bootstrap the IPC Channel.
-  mojo::PendingRemote<IPC::mojom::ChannelBootstrap> bootstrap;
-  child_process_->BootstrapLegacyIpc(
-      bootstrap.InitWithNewPipeAndPassReceiver());
+  mojo::ScopedMessagePipeHandle bootstrap =
+      mojo_invitation_.AttachMessagePipe(kLegacyIpcBootstrapAttachmentName);
   std::unique_ptr<IPC::ChannelFactory> channel_factory =
       IPC::ChannelMojo::CreateServerFactory(
-          bootstrap.PassPipe(), io_task_runner,
+          std::move(bootstrap), io_task_runner,
           base::ThreadTaskRunnerHandle::Get());
 
   ResetChannelProxy();
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 5d481580..8c3be7d 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -68,6 +68,7 @@
 #include "content/public/test/test_utils.h"
 #include "content/public/test/url_loader_interceptor.h"
 #include "content/shell/browser/shell.h"
+#include "content/test/content_browser_test_utils_internal.h"
 #include "content/test/test_content_browser_client.h"
 #include "media/media_buildflags.h"
 #include "net/cert/cert_status_flags.h"
@@ -142,10 +143,7 @@
   WorkerStateObserver(ServiceWorkerContextWrapper* context,
                       ServiceWorkerVersion::Status target)
       : context_(context), target_(target) {}
-  void Init() {
-    RunOnCoreThread(
-        base::BindOnce(&WorkerStateObserver::InitOnCoreThread, this));
-  }
+  void Init() { context_->AddObserver(this); }
   // ServiceWorkerContextCoreObserver overrides.
   void OnVersionStateChanged(int64_t version_id,
                              const GURL& scope,
@@ -157,8 +155,7 @@
       context_->RemoveObserver(this);
       version_id_ = version_id;
       registration_id_ = version->registration_id();
-      RunOrPostTaskOnThread(FROM_HERE, BrowserThread::UI,
-                            base::BindOnce(&WorkerStateObserver::Quit, this));
+      run_loop_.Quit();
     }
   }
   void Wait() { run_loop_.Run(); }
@@ -171,9 +168,6 @@
   ~WorkerStateObserver() override = default;
 
  private:
-  void InitOnCoreThread() { context_->AddObserver(this); }
-  void Quit() { run_loop_.Quit(); }
-
   int64_t registration_id_ = blink::mojom::kInvalidServiceWorkerRegistrationId;
   int64_t version_id_ = blink::mojom::kInvalidServiceWorkerVersionId;
 
@@ -183,6 +177,30 @@
   DISALLOW_COPY_AND_ASSIGN(WorkerStateObserver);
 };
 
+class WorkerClientDestroyedObserver : public ServiceWorkerContextCoreObserver {
+ public:
+  explicit WorkerClientDestroyedObserver(ServiceWorkerContextWrapper* context) {
+    // `context` must outlive this observer.
+    scoped_observation_.Observe(context);
+  }
+  ~WorkerClientDestroyedObserver() override = default;
+
+  void WaitUntilDestroyed() { run_loop_.Run(); }
+
+  // ServiceWorkerContextCoreObserver overrides.
+  void OnClientDestroyed(ukm::SourceId client_source_id,
+                         const GURL& url,
+                         blink::mojom::ServiceWorkerClientType type) override {
+    run_loop_.Quit();
+  }
+
+ private:
+  base::RunLoop run_loop_;
+  base::ScopedObservation<ServiceWorkerContextWrapper,
+                          ServiceWorkerContextCoreObserver>
+      scoped_observation_{this};
+};
+
 std::unique_ptr<net::test_server::HttpResponse> VerifySaveDataHeaderInRequest(
     const net::test_server::HttpRequest& request) {
   if (request.relative_url != "/service_worker/generated_sw.js")
@@ -3252,10 +3270,10 @@
                          testing::Combine(testing::Bool(), testing::Bool()));
 
 // Tests with BackForwardCache and KeepActiveFreezing enabled.
-class ServiceWorkerBackForwardCacheBrowserTest
+class ServiceWorkerBackForwardCacheAndKeepActiveFreezingBrowserTest
     : public ServiceWorkerBrowserTest {
  protected:
-  ServiceWorkerBackForwardCacheBrowserTest() {
+  ServiceWorkerBackForwardCacheAndKeepActiveFreezingBrowserTest() {
     feature_list_.InitWithFeaturesAndParameters(
         {{{features::kBackForwardCache,
            {{"TimeToLiveInBackForwardCacheInSeconds", "3600"},
@@ -3299,8 +3317,9 @@
 
 // Tests that a service worker that shares a renderer process with a
 // back-forward cached page and an active page still runs normally.
-IN_PROC_BROWSER_TEST_F(ServiceWorkerBackForwardCacheBrowserTest,
-                       ShareProcessWithBackForwardCachedPageAndLivePage) {
+IN_PROC_BROWSER_TEST_F(
+    ServiceWorkerBackForwardCacheAndKeepActiveFreezingBrowserTest,
+    ShareProcessWithBackForwardCachedPageAndLivePage) {
   StartServerAndNavigateToSetup();
 
   GURL url_1(embedded_test_server()->GetURL(
@@ -3391,8 +3410,9 @@
 
 // Tests that a service worker that shares a renderer process with a
 // back-forward cached page and no active pages still runs normally.
-IN_PROC_BROWSER_TEST_F(ServiceWorkerBackForwardCacheBrowserTest,
-                       ShareProcessWithBackForwardCachedPageOnly) {
+IN_PROC_BROWSER_TEST_F(
+    ServiceWorkerBackForwardCacheAndKeepActiveFreezingBrowserTest,
+    ShareProcessWithBackForwardCachedPageOnly) {
   StartServerAndNavigateToSetup();
 
   GURL url_1(embedded_test_server()->GetURL(
@@ -3497,4 +3517,94 @@
   EXPECT_EQ(rfh_1, current_frame_host());
 }
 
+// Tests with BackForwardCache enabled.
+class ServiceWorkerBackForwardCacheBrowserTest
+    : public ServiceWorkerBrowserTest {
+ protected:
+  ServiceWorkerBackForwardCacheBrowserTest() {
+    feature_list_.InitAndEnableFeatureWithParameters(
+        features::kBackForwardCache, {{"enable_same_site", "true"}});
+  }
+
+  RenderFrameHostImpl* current_frame_host() {
+    return static_cast<WebContentsImpl*>(shell()->web_contents())
+        ->GetFrameTree()
+        ->root()
+        ->current_frame_host();
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+// Regression test for https://crbug.com/1212618.
+IN_PROC_BROWSER_TEST_F(ServiceWorkerBackForwardCacheBrowserTest,
+                       EvictionOfBackForwardCacheWithMultipleServiceWorkers) {
+  StartServerAndNavigateToSetup();
+
+  ASSERT_TRUE(NavigateToURL(shell(),
+                            embedded_test_server()->GetURL(
+                                "/service_worker/create_service_worker.html")));
+  auto rfh = RenderFrameHostImplHolder(current_frame_host());
+
+  int first_worker_version_id;
+
+  {
+    // Register the first service worker.
+    WorkerRunningStatusObserver observer(public_context());
+    EXPECT_EQ(
+        "DONE",
+        EvalJs(current_frame_host(),
+               "register('skip_waiting_and_clients_claim_worker.js', '/');"));
+    observer.WaitUntilRunning();
+    first_worker_version_id = observer.version_id();
+  }
+
+  EXPECT_TRUE(NavigateToURL(
+      shell(), embedded_test_server()->GetURL("/service_worker/"
+                                              "create_service_worker.html?1")));
+  EXPECT_TRUE(rfh->IsInBackForwardCache());
+
+  {
+    // Register the second service worker. `rfh` and the current frame host
+    // will be controlled by this new service worker. It doesn't await for
+    // navigator.serviceWorker.ready.
+    WorkerRunningStatusObserver observer(public_context());
+    EXPECT_EQ("DONE",
+              EvalJs(current_frame_host(),
+                     "registerWithoutAwaitingReady('clients_claim_worker.js', "
+                     "'/service_worker/');"));
+    observer.WaitUntilRunning();
+  }
+
+  {
+    // `update()` invokes ServiceWorkerContainerHost::UpdateController() which
+    // should updates controllees for the first service worker version and the
+    // second service worker version. It will cause the BFCache eviction and
+    // which causes the ServiceWorkerContainerHost to be destroyed.
+    WorkerClientDestroyedObserver observer(wrapper());
+    EXPECT_EQ("DONE", EvalJs(current_frame_host(), "update('/');"));
+    observer.WaitUntilDestroyed();
+  }
+
+  // Try to evict back forward cached controllees in the first service worker
+  // version. Since the ServiceWorkerContainerHost has been destroyed, it should
+  // have been removed from the first service worker's controllee map. If it
+  // hasn't, then calling version->EvictBackForwardCacheControllees() will do a
+  // UAF.
+  scoped_refptr<ServiceWorkerVersion> version =
+      wrapper()->GetLiveVersion(first_worker_version_id);
+  version->EvictBackForwardCachedControllees(
+      BackForwardCacheMetrics::NotRestoredReason::kUnknown);
+
+  {
+    base::RunLoop loop;
+    public_context()->UnregisterServiceWorker(
+        embedded_test_server()->GetURL("/"),
+        base::BindOnce(&ExpectUnregisterResultAndRun, true,
+                       loop.QuitClosure()));
+    loop.Run();
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_container_host.cc b/content/browser/service_worker/service_worker_container_host.cc
index 844d81d..6602f7b2 100644
--- a/content/browser/service_worker/service_worker_container_host.cc
+++ b/content/browser/service_worker/service_worker_container_host.cc
@@ -12,6 +12,7 @@
 #include "base/guid.h"
 #include "base/strings/stringprintf.h"
 #include "content/browser/child_process_security_policy_impl.h"
+#include "content/browser/renderer_host/frame_tree_node.h"
 #include "content/browser/service_worker/service_worker_consts.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
@@ -208,6 +209,16 @@
       std::move(callback), blink::mojom::ServiceWorkerErrorType::kUnknown,
       std::string(), nullptr);
 
+  // We record the requesting frame host and pass it down, so that we can use
+  // this context for things like printing console error if the service worker
+  // does not have a process yet.
+  GlobalFrameRoutingId requesting_frame_id;
+  FrameTreeNode* requesting_frame_tree_node =
+      FrameTreeNode::GloballyFindByID(frame_tree_node_id());
+  if (requesting_frame_tree_node)
+    requesting_frame_id = requesting_frame_tree_node->current_frame_host()
+                              ->GetGlobalFrameRoutingId();
+
   // TODO(crbug.com/1199077): Update this when ServiceWorkerContainerHost
   // implements StorageKey.
   blink::StorageKey key(url::Origin::Create(options->scope));
@@ -217,7 +228,8 @@
       base::BindOnce(&ServiceWorkerContainerHost::RegistrationComplete,
                      weak_factory_.GetWeakPtr(), GURL(script_url),
                      GURL(options->scope), std::move(wrapped_callback),
-                     trace_id, mojo::GetBadMessageCallback()));
+                     trace_id, mojo::GetBadMessageCallback()),
+      requesting_frame_id);
 }
 
 void ServiceWorkerContainerHost::GetRegistration(
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index 7f01f2df..3b0b758 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -21,7 +21,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/services/storage/public/cpp/quota_client_callback_wrapper.h"
 #include "content/browser/log_console_message.h"
-#include "content/browser/renderer_host/frame_tree_node.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/browser/service_worker/service_worker_consts.h"
@@ -43,6 +42,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/console_message.h"
+#include "content/public/browser/global_routing_id.h"
 #include "content/public/common/child_process_host.h"
 #include "content/public/common/url_utils.h"
 #include "ipc/ipc_message.h"
@@ -523,7 +523,8 @@
     const blink::mojom::ServiceWorkerRegistrationOptions& options,
     blink::mojom::FetchClientSettingsObjectPtr
         outside_fetch_client_settings_object,
-    RegistrationCallback callback) {
+    RegistrationCallback callback,
+    const GlobalFrameRoutingId& requesting_frame_id) {
   DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
   std::string error_message;
   if (!IsValidRegisterRequest(script_url, options.scope, key, &error_message)) {
@@ -535,6 +536,7 @@
   was_service_worker_registered_ = true;
   job_coordinator_->Register(
       script_url, options, std::move(outside_fetch_client_settings_object),
+      requesting_frame_id,
       base::BindOnce(&ServiceWorkerContextCore::RegistrationComplete,
                      AsWeakPtr(), options.scope, key, std::move(callback)));
 }
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index 5016d01..d0bfa82 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -40,7 +40,6 @@
 }  // namespace storage
 
 namespace content {
-
 class ServiceWorkerContextCoreObserver;
 class ServiceWorkerContextWrapper;
 class ServiceWorkerJobCoordinator;
@@ -242,7 +241,8 @@
       const blink::mojom::ServiceWorkerRegistrationOptions& options,
       blink::mojom::FetchClientSettingsObjectPtr
           outside_fetch_client_settings_object,
-      RegistrationCallback callback);
+      RegistrationCallback callback,
+      const GlobalFrameRoutingId& requesting_frame_id);
 
   // If `is_immediate` is true, unregister clears the active worker from the
   // registration without waiting for the controlled clients to unload.
diff --git a/content/browser/service_worker/service_worker_context_core_unittest.cc b/content/browser/service_worker/service_worker_context_core_unittest.cc
index db54d38..1e1962c 100644
--- a/content/browser/service_worker/service_worker_context_core_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_core_unittest.cc
@@ -76,7 +76,8 @@
               status = result_status;
               registration_id = result_registration_id;
               loop.Quit();
-            }));
+            }),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
     loop.Run();
     EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status);
     scoped_refptr<ServiceWorkerRegistration> registration =
@@ -239,7 +240,8 @@
               int64_t result_registration_id) {
             register_job_status = result_status;
             register_job_loop.Quit();
-          }));
+          }),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, DeleteForStorageKey(key));
 
@@ -286,7 +288,8 @@
               int64_t result_registration_id) {
             register_job_status = result_status;
             register_job_loop.Quit();
-          }));
+          }),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, DeleteForStorageKey(key));
 
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc
index 692e527..19ead3e8 100644
--- a/content/browser/service_worker/service_worker_context_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -407,7 +407,8 @@
   bool called = false;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &registration_id));
+      MakeRegisteredCallback(&called, &registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
   base::RunLoop().RunUntilIdle();
 
   ASSERT_TRUE(called);
@@ -563,7 +564,8 @@
   base::RunLoop run_loop;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      base::BindOnce(&RegisteredCallback, run_loop.QuitClosure()));
+      base::BindOnce(&RegisteredCallback, run_loop.QuitClosure()),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
   run_loop.Run();
 
   context_wrapper()->StopAllServiceWorkersForOrigin(url::Origin::Create(scope));
@@ -620,7 +622,8 @@
   bool called = false;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &registration_id));
+      MakeRegisteredCallback(&called, &registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   base::RunLoop().RunUntilIdle();
@@ -673,7 +676,8 @@
   bool called = false;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &registration_id));
+      MakeRegisteredCallback(&called, &registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   base::RunLoop().RunUntilIdle();
@@ -723,7 +727,8 @@
   bool called = false;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &registration_id));
+      MakeRegisteredCallback(&called, &registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   base::RunLoop().RunUntilIdle();
@@ -766,7 +771,8 @@
   context()->RegisterServiceWorker(
       GURL("https://www.example.com/service_worker.js"), key, options,
       blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &registration_id));
+      MakeRegisteredCallback(&called, &registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   base::RunLoop().RunUntilIdle();
@@ -824,7 +830,8 @@
     context()->RegisterServiceWorker(
         GURL("https://www.example.com/service_worker.js"), key1, options,
         blink::mojom::FetchClientSettingsObject::New(),
-        MakeRegisteredCallback(&called, &registration_id1));
+        MakeRegisteredCallback(&called, &registration_id1),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
     ASSERT_FALSE(called);
     base::RunLoop().RunUntilIdle();
     ASSERT_TRUE(called);
@@ -837,7 +844,8 @@
     context()->RegisterServiceWorker(
         GURL("https://www.example.com/service_worker2.js"), key1, options,
         blink::mojom::FetchClientSettingsObject::New(),
-        MakeRegisteredCallback(&called, &registration_id2));
+        MakeRegisteredCallback(&called, &registration_id2),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
     ASSERT_FALSE(called);
     base::RunLoop().RunUntilIdle();
     ASSERT_TRUE(called);
@@ -850,7 +858,8 @@
     context()->RegisterServiceWorker(
         GURL("https://www.example.com:8080/service_worker3.js"), key2, options,
         blink::mojom::FetchClientSettingsObject::New(),
-        MakeRegisteredCallback(&called, &registration_id3));
+        MakeRegisteredCallback(&called, &registration_id3),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
     ASSERT_FALSE(called);
     base::RunLoop().RunUntilIdle();
     ASSERT_TRUE(called);
@@ -863,7 +872,8 @@
     context()->RegisterServiceWorker(
         GURL("https://www.other.com/service_worker4.js"), key3, options,
         blink::mojom::FetchClientSettingsObject::New(),
-        MakeRegisteredCallback(&called, &registration_id4));
+        MakeRegisteredCallback(&called, &registration_id4),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
     ASSERT_FALSE(called);
     base::RunLoop().RunUntilIdle();
     ASSERT_TRUE(called);
@@ -955,7 +965,8 @@
   context()->RegisterServiceWorker(
       GURL("https://www.example.com/service_worker.js"), key, options,
       blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &old_registration_id));
+      MakeRegisteredCallback(&called, &old_registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   base::RunLoop().RunUntilIdle();
@@ -969,7 +980,8 @@
   context()->RegisterServiceWorker(
       GURL("https://www.example.com/service_worker_new.js"), key, options,
       blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &new_registration_id));
+      MakeRegisteredCallback(&called, &new_registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   base::RunLoop().RunUntilIdle();
@@ -1008,7 +1020,8 @@
       blink::mojom::kInvalidServiceWorkerRegistrationId;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &old_registration_id));
+      MakeRegisteredCallback(&called, &old_registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   base::RunLoop().RunUntilIdle();
@@ -1021,7 +1034,8 @@
       blink::mojom::kInvalidServiceWorkerRegistrationId;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &new_registration_id));
+      MakeRegisteredCallback(&called, &new_registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   base::RunLoop().RunUntilIdle();
@@ -1157,7 +1171,8 @@
   bool called = false;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &registration_id));
+      MakeRegisteredCallback(&called, &registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   content::RunAllTasksUntilIdle();
@@ -1193,7 +1208,8 @@
   called = false;
   context()->RegisterServiceWorker(
       script_url, key, options, blink::mojom::FetchClientSettingsObject::New(),
-      MakeRegisteredCallback(&called, &registration_id));
+      MakeRegisteredCallback(&called, &registration_id),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   ASSERT_FALSE(called);
   content::RunAllTasksUntilIdle();
diff --git a/content/browser/service_worker/service_worker_context_watcher_unittest.cc b/content/browser/service_worker/service_worker_context_watcher_unittest.cc
index a501785..98e871e 100644
--- a/content/browser/service_worker/service_worker_context_watcher_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_watcher_unittest.cc
@@ -152,7 +152,8 @@
     context()->RegisterServiceWorker(
         script_url, key, options,
         blink::mojom::FetchClientSettingsObject::New(),
-        base::BindOnce(&DidRegisterServiceWorker, &registration_id));
+        base::BindOnce(&DidRegisterServiceWorker, &registration_id),
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
     base::RunLoop().RunUntilIdle();
     return registration_id;
   }
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index 428d514f..77671b4 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -40,6 +40,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/content_browser_client.h"
+#include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/service_worker_context_observer.h"
 #include "content/public/browser/storage_usage_info.h"
 #include "content/public/common/content_client.h"
@@ -487,7 +488,8 @@
       base::BindOnce(
           [](StatusCodeCallback callback, blink::ServiceWorkerStatusCode status,
              const std::string&, int64_t) { std::move(callback).Run(status); },
-          std::move(callback)));
+          std::move(callback)),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 }
 
 void ServiceWorkerContextWrapper::UnregisterServiceWorker(
diff --git a/content/browser/service_worker/service_worker_job_coordinator.cc b/content/browser/service_worker/service_worker_job_coordinator.cc
index dd3b3b40..50d534a 100644
--- a/content/browser/service_worker/service_worker_job_coordinator.cc
+++ b/content/browser/service_worker/service_worker_job_coordinator.cc
@@ -75,11 +75,11 @@
     const blink::mojom::ServiceWorkerRegistrationOptions& options,
     blink::mojom::FetchClientSettingsObjectPtr
         outside_fetch_client_settings_object,
+    const GlobalFrameRoutingId& requesting_frame_id,
     ServiceWorkerRegisterJob::RegistrationCallback callback) {
-  std::unique_ptr<ServiceWorkerRegisterJobBase> job(
-      new ServiceWorkerRegisterJob(
-          context_, script_url, options,
-          std::move(outside_fetch_client_settings_object)));
+  auto job = std::make_unique<ServiceWorkerRegisterJob>(
+      context_, script_url, options,
+      std::move(outside_fetch_client_settings_object), requesting_frame_id);
   ServiceWorkerRegisterJob* queued_job = static_cast<ServiceWorkerRegisterJob*>(
       job_queues_[options.scope].Push(std::move(job)));
   queued_job->AddCallback(std::move(callback));
diff --git a/content/browser/service_worker/service_worker_job_coordinator.h b/content/browser/service_worker/service_worker_job_coordinator.h
index e6b66d10..47d2164a 100644
--- a/content/browser/service_worker/service_worker_job_coordinator.h
+++ b/content/browser/service_worker/service_worker_job_coordinator.h
@@ -13,6 +13,7 @@
 #include "content/browser/service_worker/service_worker_register_job.h"
 #include "content/browser/service_worker/service_worker_unregister_job.h"
 #include "content/common/content_export.h"
+#include "content/public/browser/global_routing_id.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
 #include "url/gurl.h"
 
@@ -30,6 +31,7 @@
                 const blink::mojom::ServiceWorkerRegistrationOptions& options,
                 blink::mojom::FetchClientSettingsObjectPtr
                     outside_fetch_client_settings_object,
+                const GlobalFrameRoutingId& requesting_frame_id,
                 ServiceWorkerRegisterJob::RegistrationCallback callback);
 
   // If |is_immediate| is true, unregister clears the active worker from the
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc
index ef243fc5..e2341dd 100644
--- a/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -221,6 +221,7 @@
   outside_fetch_client_settings_object->outgoing_referrer = script_url;
   job_coordinator()->Register(
       script_url, options, std::move(outside_fetch_client_settings_object),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(expected_status, &registration, run_loop.QuitClosure()));
   run_loop.Run();
   return registration;
@@ -716,12 +717,14 @@
       base::BarrierClosure(2, run_loop.QuitClosure());
   job_coordinator()->Register(
       script_url1, options1, blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(blink::ServiceWorkerStatusCode::kErrorAbort,
                        &registration1, barrier_closure));
 
   scoped_refptr<ServiceWorkerRegistration> registration2;
   job_coordinator()->Register(
       script_url2, options2, blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(blink::ServiceWorkerStatusCode::kErrorAbort,
                        &registration2, barrier_closure));
 
@@ -775,6 +778,7 @@
       base::BarrierClosure(2, run_loop.QuitClosure());
   job_coordinator()->Register(
       script_url, options, blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(blink::ServiceWorkerStatusCode::kErrorAbort,
                        &registration, barrier_closure));
 
@@ -807,12 +811,14 @@
       base::BarrierClosure(2, run_loop.QuitClosure());
   job_coordinator()->Register(
       script_url, options1, blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(blink::ServiceWorkerStatusCode::kErrorAbort,
                        &registration1, barrier_closure));
 
   scoped_refptr<ServiceWorkerRegistration> registration2;
   job_coordinator()->Register(
       script_url, options2, blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(blink::ServiceWorkerStatusCode::kOk, &registration2,
                        barrier_closure));
 
@@ -1347,6 +1353,7 @@
     job_coordinator()->Register(
         test_origin.Resolve(kScript), options,
         blink::mojom::FetchClientSettingsObject::New(),
+        /*requesting_frame_id=*/GlobalFrameRoutingId(),
         SaveRegistration(blink::ServiceWorkerStatusCode::kOk, &registration,
                          run_loop.QuitClosure()));
     run_loop.Run();
@@ -2163,6 +2170,7 @@
   job_coordinator()->Register(
       GURL("https://www.example.com/service_worker1.js"), options,
       blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(blink::ServiceWorkerStatusCode::kErrorTimeout,
                        &registration1, loop1.QuitClosure()));
 
@@ -2178,6 +2186,7 @@
   job_coordinator()->Register(
       GURL("https://www.example.com/service_worker2.js"), options,
       blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(blink::ServiceWorkerStatusCode::kOk, &registration2,
                        loop2.QuitClosure()));
 
@@ -2189,6 +2198,7 @@
   job_coordinator()->Register(
       GURL("https://www.example.com/service_worker3.js"), options,
       blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId(),
       SaveRegistration(blink::ServiceWorkerStatusCode::kOk, &registration3,
                        loop3.QuitClosure()));
 
diff --git a/content/browser/service_worker/service_worker_new_script_fetcher.cc b/content/browser/service_worker/service_worker_new_script_fetcher.cc
index 157e8b9..002e50b 100644
--- a/content/browser/service_worker/service_worker_new_script_fetcher.cc
+++ b/content/browser/service_worker/service_worker_new_script_fetcher.cc
@@ -64,12 +64,14 @@
     ServiceWorkerContextCore& context,
     scoped_refptr<ServiceWorkerVersion> version,
     scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
-    blink::mojom::FetchClientSettingsObjectPtr fetch_client_settings_object)
+    blink::mojom::FetchClientSettingsObjectPtr fetch_client_settings_object,
+    const GlobalFrameRoutingId& requesting_frame_id)
     : context_(context),
       version_(std::move(version)),
       loader_factory_(std::move(loader_factory)),
       fetch_client_settings_object_(std::move(fetch_client_settings_object)),
-      request_id_(GlobalRequestID::MakeBrowserInitiated().request_id) {}
+      request_id_(GlobalRequestID::MakeBrowserInitiated().request_id),
+      requesting_frame_id_(requesting_frame_id) {}
 
 ServiceWorkerNewScriptFetcher::~ServiceWorkerNewScriptFetcher() = default;
 
@@ -106,7 +108,7 @@
           std::move(version_), std::move(loader_factory_),
           net::MutableNetworkTrafficAnnotationTag(
               kServiceWorkerScriptLoadTrafficAnnotation),
-          resource_id, /*is_throttle_needed=*/true),
+          resource_id, /*is_throttle_needed=*/true, requesting_frame_id_),
       url_loader_remote_.BindNewPipeAndPassReceiver());
 }
 
diff --git a/content/browser/service_worker/service_worker_new_script_fetcher.h b/content/browser/service_worker/service_worker_new_script_fetcher.h
index 9032038..37555fd7 100644
--- a/content/browser/service_worker/service_worker_new_script_fetcher.h
+++ b/content/browser/service_worker/service_worker_new_script_fetcher.h
@@ -43,7 +43,8 @@
       ServiceWorkerContextCore& context,
       scoped_refptr<ServiceWorkerVersion> version,
       scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
-      blink::mojom::FetchClientSettingsObjectPtr fetch_client_settings_object);
+      blink::mojom::FetchClientSettingsObjectPtr fetch_client_settings_object,
+      const GlobalFrameRoutingId& requesting_frame_id);
   ~ServiceWorkerNewScriptFetcher() override;
 
   // Callback called when the main script load params are ready. Called with
@@ -84,6 +85,10 @@
   // Called when the header and the data pipe for the body are ready.
   StartCallback callback_;
 
+  // The global routing id of the frame that made the SW registration request.
+  // Note: This is only valid with PlzServiceWorker.
+  const GlobalFrameRoutingId requesting_frame_id_;
+
   // Mojo endpoint connected to ServiceWorkerNewScriptLoader.
   mojo::Remote<network::mojom::URLLoader> url_loader_remote_;
 
diff --git a/content/browser/service_worker/service_worker_new_script_fetcher_unittest.cc b/content/browser/service_worker/service_worker_new_script_fetcher_unittest.cc
index 2d6dcdd..6ea0a545 100644
--- a/content/browser/service_worker/service_worker_new_script_fetcher_unittest.cc
+++ b/content/browser/service_worker/service_worker_new_script_fetcher_unittest.cc
@@ -68,7 +68,8 @@
       *context(), version,
       base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
           &fake_factory),
-      blink::mojom::FetchClientSettingsObject::New());
+      blink::mojom::FetchClientSettingsObject::New(),
+      /*requesting_frame_id=*/GlobalFrameRoutingId());
 
   // Start a fetcher and wait to get the result. The script loaded from
   // `loader_factory` is set to the `main_script_load_params` through
diff --git a/content/browser/service_worker/service_worker_new_script_loader.cc b/content/browser/service_worker/service_worker_new_script_loader.cc
index 2625f45..17e65a1 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader.cc
@@ -8,8 +8,10 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/numerics/safe_conversions.h"
+#include "content/browser/devtools/devtools_instrumentation.h"
 #include "content/browser/service_worker/service_worker_cache_writer.h"
 #include "content/browser/service_worker/service_worker_consts.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
@@ -19,6 +21,7 @@
 #include "content/browser/url_loader_factory_getter.h"
 #include "content/common/service_worker/service_worker_utils.h"
 #include "content/public/browser/url_loader_throttles.h"
+#include "content/public/common/content_features.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
@@ -56,11 +59,12 @@
     scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
     const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
     int64_t cache_resource_id,
-    bool is_throttle_needed) {
+    bool is_throttle_needed,
+    const GlobalFrameRoutingId& requesting_frame_id) {
   return base::WrapUnique(new ServiceWorkerNewScriptLoader(
       request_id, options, original_request, std::move(client), version,
-      loader_factory, traffic_annotation, cache_resource_id,
-      is_throttle_needed));
+      loader_factory, traffic_annotation, cache_resource_id, is_throttle_needed,
+      requesting_frame_id));
 }
 
 // TODO(nhiroki): We're doing multiple things in the ctor. Consider factors out
@@ -74,7 +78,8 @@
     scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
     const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
     int64_t cache_resource_id,
-    bool is_throttle_needed)
+    bool is_throttle_needed,
+    const GlobalFrameRoutingId& requesting_frame_id)
     : request_url_(original_request.url),
       is_main_script_(original_request.destination ==
                           network::mojom::RequestDestination::kServiceWorker &&
@@ -86,7 +91,8 @@
                        mojo::SimpleWatcher::ArmingPolicy::MANUAL,
                        base::SequencedTaskRunnerHandle::Get()),
       loader_factory_(std::move(loader_factory)),
-      client_(std::move(client)) {
+      client_(std::move(client)),
+      requesting_frame_id_(requesting_frame_id) {
   DCHECK_NE(cache_resource_id, blink::mojom::kInvalidServiceWorkerResourceId);
 
   network::ResourceRequest resource_request(original_request);
@@ -541,12 +547,22 @@
     DCHECK(cache_writer_->did_replace());
     bytes_written = cache_writer_->bytes_written();
   } else {
-    // AddMessageConsole must be called before notifying that an error occurred
-    // because the worker stops soon after receiving the error response.
-    // TODO(nhiroki): Consider replacing this hacky way with the new error code
-    // handling mechanism in URLLoader.
-    version_->AddMessageToConsole(blink::mojom::ConsoleMessageLevel::kError,
-                                  status_message);
+    // When we fail a main script fetch with plzServiceWorker, we do not have
+    // a renderer in which to log the failure. We call into devtools with the
+    // frame id instead.
+    if (requesting_frame_id_) {
+      DCHECK(base::FeatureList::IsEnabled(features::kPlzServiceWorker));
+      devtools_instrumentation::OnServiceWorkerMainScriptFetchingFailed(
+          requesting_frame_id_, status_message);
+    } else {
+      // AddMessageConsole must be called before notifying that an error
+      // occurred because the worker stops soon after receiving the error
+      // response.
+      // TODO(nhiroki): Consider replacing this hacky way with the new error
+      // code handling mechanism in URLLoader.
+      version_->AddMessageToConsole(blink::mojom::ConsoleMessageLevel::kError,
+                                    status_message);
+    }
   }
   version_->script_cache_map()->NotifyFinishedCaching(
       request_url_, bytes_written, error_code, status_message);
diff --git a/content/browser/service_worker/service_worker_new_script_loader.h b/content/browser/service_worker/service_worker_new_script_loader.h
index 3d7e346..7fc670e 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.h
+++ b/content/browser/service_worker/service_worker_new_script_loader.h
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "content/browser/service_worker/service_worker_cache_writer.h"
 #include "content/common/content_export.h"
+#include "content/public/browser/global_routing_id.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -94,7 +95,8 @@
       scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
       int64_t cache_resource_id,
-      bool is_throttle_needed);
+      bool is_throttle_needed,
+      const GlobalFrameRoutingId& requesting_frame_id);
 
   ~ServiceWorkerNewScriptLoader() override;
 
@@ -140,7 +142,8 @@
       scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
       int64_t cache_resource_id,
-      bool is_throttle_needed);
+      bool is_throttle_needed,
+      const GlobalFrameRoutingId& requesting_frame_id);
 
   // Writes the given headers into the service worker script storage.
   void WriteHeaders(network::mojom::URLResponseHeadPtr response_head);
@@ -238,6 +241,12 @@
   //     kWriting -> kCompleted
   WriterState body_writer_state_ = WriterState::kNotStarted;
 
+  // When fetching the main script of a newly installed ServiceWorker with
+  // PlzServiceWorker, we don't have a renderer assigned yet. We could also fail
+  // the fetch and never get one. If that happens, we need to have a frame id
+  // to log the failure into devtools.
+  const GlobalFrameRoutingId requesting_frame_id_;
+
   base::WeakPtrFactory<ServiceWorkerNewScriptLoader> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerNewScriptLoader);
diff --git a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
index 6ee8d4c..795f32d 100644
--- a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
@@ -230,7 +230,8 @@
         request_id, options, request, (*out_client)->CreateRemote(), version_,
         helper_->url_loader_factory_getter()->GetNetworkFactory(),
         net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS),
-        resource_id, /*is_throttle_needed=*/false);
+        resource_id, /*is_throttle_needed=*/false,
+        /*requesting_frame_id=*/GlobalFrameRoutingId());
   }
 
   // Returns false if the entry for |url| doesn't exist in the storage.
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc
index 676f58e..4aef0fc 100644
--- a/content/browser/service_worker/service_worker_register_job.cc
+++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -48,7 +48,8 @@
     const GURL& script_url,
     const blink::mojom::ServiceWorkerRegistrationOptions& options,
     blink::mojom::FetchClientSettingsObjectPtr
-        outside_fetch_client_settings_object)
+        outside_fetch_client_settings_object,
+    const GlobalFrameRoutingId& requesting_frame_id)
     : context_(context),
       job_type_(REGISTRATION_JOB),
       scope_(options.scope),
@@ -62,7 +63,8 @@
       should_uninstall_on_failure_(false),
       force_bypass_cache_(false),
       skip_script_comparison_(false),
-      promise_resolved_status_(blink::ServiceWorkerStatusCode::kOk) {
+      promise_resolved_status_(blink::ServiceWorkerStatusCode::kOk),
+      requesting_frame_id_(requesting_frame_id) {
   DCHECK(context_);
   DCHECK(outside_fetch_client_settings_object_);
 }
@@ -466,7 +468,7 @@
 
   new_script_fetcher_ = std::make_unique<ServiceWorkerNewScriptFetcher>(
       *context_, version, std::move(loader_factory),
-      outside_fetch_client_settings_object_.Clone());
+      outside_fetch_client_settings_object_.Clone(), requesting_frame_id_);
   new_script_fetcher_->Start(
       base::BindOnce(&ServiceWorkerRegisterJob::OnScriptFetchCompleted,
                      weak_factory_.GetWeakPtr(), std::move(version)));
diff --git a/content/browser/service_worker/service_worker_register_job.h b/content/browser/service_worker/service_worker_register_job.h
index f68e564a..2a6d94f4 100644
--- a/content/browser/service_worker/service_worker_register_job.h
+++ b/content/browser/service_worker/service_worker_register_job.h
@@ -15,6 +15,7 @@
 #include "content/browser/service_worker/service_worker_register_job_base.h"
 #include "content/browser/service_worker/service_worker_registration.h"
 #include "content/browser/service_worker/service_worker_update_checker.h"
+#include "content/public/browser/global_routing_id.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
@@ -52,7 +53,8 @@
       const GURL& script_url,
       const blink::mojom::ServiceWorkerRegistrationOptions& options,
       blink::mojom::FetchClientSettingsObjectPtr
-          outside_fetch_client_settings_object);
+          outside_fetch_client_settings_object,
+      const GlobalFrameRoutingId& requesting_frame_id);
 
   // For update jobs.
   CONTENT_EXPORT ServiceWorkerRegisterJob(
@@ -204,6 +206,7 @@
   blink::ServiceWorkerStatusCode promise_resolved_status_;
   std::string promise_resolved_status_message_;
   scoped_refptr<ServiceWorkerRegistration> promise_resolved_registration_;
+  const GlobalFrameRoutingId requesting_frame_id_;
 
   base::WeakPtrFactory<ServiceWorkerRegisterJob> weak_factory_{this};
 
diff --git a/content/browser/service_worker/service_worker_script_loader_factory.cc b/content/browser/service_worker/service_worker_script_loader_factory.cc
index 575cf24..32c4fa6 100644
--- a/content/browser/service_worker/service_worker_script_loader_factory.cc
+++ b/content/browser/service_worker/service_worker_script_loader_factory.cc
@@ -287,7 +287,8 @@
       ServiceWorkerNewScriptLoader::CreateAndStart(
           request_id, options, resource_request, std::move(client),
           worker_host_->version(), loader_factory_for_new_scripts_,
-          traffic_annotation, resource_id, /*is_throttle_needed=*/false),
+          traffic_annotation, resource_id, /*is_throttle_needed=*/false,
+          /*requesting_frame_id=*/GlobalFrameRoutingId()),
       std::move(receiver));
 }
 
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc
index 160f3d9..0a7416ea 100644
--- a/content/child/child_thread_impl.cc
+++ b/content/child/child_thread_impl.cc
@@ -270,14 +270,6 @@
     receiver_.Bind(std::move(receiver));
   }
 
-  // Used in non-Service Manager IPC mode.
-  void BindChildProcessReceiverAndLegacyIpc(
-      mojo::PendingReceiver<mojom::ChildProcess> receiver,
-      mojo::PendingRemote<IPC::mojom::ChannelBootstrap> legacy_ipc_bootstrap) {
-    legacy_ipc_bootstrap_ = std::move(legacy_ipc_bootstrap);
-    receiver_.Bind(std::move(receiver));
-  }
-
   void ExposeInterfacesToBrowser(mojo::BinderMap binders) {
     DCHECK(wait_for_interface_binders_);
     wait_for_interface_binders_ = false;
@@ -346,12 +338,6 @@
     IMMEDIATE_CRASH();
   }
 
-  void BootstrapLegacyIpc(
-      mojo::PendingReceiver<IPC::mojom::ChannelBootstrap> receiver) override {
-    DCHECK(legacy_ipc_bootstrap_);
-    mojo::FusePipes(std::move(receiver), std::move(legacy_ipc_bootstrap_));
-  }
-
   void RunServiceDeprecated(
       const std::string& service_name,
       mojo::ScopedMessagePipeHandle service_pipe) override {
@@ -418,11 +404,6 @@
   bool wait_for_interface_binders_ = true;
   mojo::Receiver<mojom::ChildProcess> receiver_{this};
 
-  // The pending legacy IPC channel endpoint to fuse with one we will eventually
-  // receive on the ChildProcess interface. Only used when not in the deprecated
-  // Service Manager IPC mode.
-  mojo::PendingRemote<IPC::mojom::ChannelBootstrap> legacy_ipc_bootstrap_;
-
   // Binding requests which should be handled by |interface_binders|, but which
   // have been queued because |allow_interface_binders_| is still |false|.
   std::vector<mojo::GenericPendingReceiver> pending_binding_requests_;
@@ -575,6 +556,7 @@
 
   mojo::ScopedMessagePipeHandle child_process_pipe_for_receiver;
   mojo::ScopedMessagePipeHandle child_process_host_pipe_for_remote;
+  mojo::ScopedMessagePipeHandle legacy_ipc_bootstrap_pipe;
   if (!IsInBrowserProcess()) {
     // If using a shared Mojo Core library, IPC support is already initialized.
     if (!IsMojoCoreSharedLibraryEnabled()) {
@@ -594,6 +576,8 @@
         invitation.ExtractMessagePipe(kChildProcessReceiverAttachmentName);
     child_process_host_pipe_for_remote =
         invitation.ExtractMessagePipe(kChildProcessHostRemoteAttachmentName);
+    legacy_ipc_bootstrap_pipe =
+        invitation.ExtractMessagePipe(kLegacyIpcBootstrapAttachmentName);
   } else {
     child_process_pipe_for_receiver =
         options.mojo_invitation->ExtractMessagePipe(
@@ -601,6 +585,8 @@
     child_process_host_pipe_for_remote =
         options.mojo_invitation->ExtractMessagePipe(
             kChildProcessHostRemoteAttachmentName);
+    legacy_ipc_bootstrap_pipe = options.mojo_invitation->ExtractMessagePipe(
+        kLegacyIpcBootstrapAttachmentName);
   }
 
   // Now that we've recovered the message pipe for the ChildProcessHost, build
@@ -658,11 +644,9 @@
   }
 
   DCHECK(child_process_pipe_for_receiver.is_valid());
-  mojo::PendingRemote<IPC::mojom::ChannelBootstrap> legacy_ipc_bootstrap;
-  mojo::ScopedMessagePipeHandle legacy_ipc_channel_handle =
-      legacy_ipc_bootstrap.InitWithNewPipeAndPassReceiver().PassPipe();
+  DCHECK(legacy_ipc_bootstrap_pipe.is_valid());
   channel_->Init(IPC::ChannelMojo::CreateClientFactory(
-                     std::move(legacy_ipc_channel_handle),
+                     std::move(legacy_ipc_bootstrap_pipe),
                      ChildProcess::current()->io_task_runner(),
                      ipc_task_runner_ ? ipc_task_runner_
                                       : base::ThreadTaskRunnerHandle::Get()),
@@ -670,11 +654,9 @@
 
   ChildThreadImpl::GetIOTaskRunner()->PostTask(
       FROM_HERE,
-      base::BindOnce(&IOThreadState::BindChildProcessReceiverAndLegacyIpc,
-                     io_thread_state_,
+      base::BindOnce(&IOThreadState::BindChildProcessReceiver, io_thread_state_,
                      mojo::PendingReceiver<mojom::ChildProcess>(
-                         std::move(child_process_pipe_for_receiver)),
-                     std::move(legacy_ipc_bootstrap)));
+                         std::move(child_process_pipe_for_receiver))));
 
   int connection_timeout = kConnectionTimeoutS;
   std::string connection_override =
diff --git a/content/common/child_process.mojom b/content/common/child_process.mojom
index f797ea7..c0ba5b9 100644
--- a/content/common/child_process.mojom
+++ b/content/common/child_process.mojom
@@ -53,9 +53,6 @@
   // cleanup, generating a crash report).
   CrashHungProcess();
 
-  // Binds the legacy IPC Channel bootstrapping pipe.
-  BootstrapLegacyIpc(pending_receiver<IPC.mojom.ChannelBootstrap> receiver);
-
   // Tells the child process to run an instance of a service named
   // |service_name|, binding it to |receiver|. This is used by the browser to
   // support launching of packaged services within Utility or GPU processes.
diff --git a/content/common/child_process_host_impl.cc b/content/common/child_process_host_impl.cc
index 2166308..995f1fa1 100644
--- a/content/common/child_process_host_impl.cc
+++ b/content/common/child_process_host_impl.cc
@@ -188,11 +188,10 @@
     DCHECK_EQ(ipc_mode_, IpcMode::kNormal);
     DCHECK(child_process_);
 
-    mojo::PendingRemote<IPC::mojom::ChannelBootstrap> bootstrap;
-    auto bootstrap_receiver = bootstrap.InitWithNewPipeAndPassReceiver();
-    child_process_->BootstrapLegacyIpc(std::move(bootstrap_receiver));
+    mojo::ScopedMessagePipeHandle bootstrap =
+        mojo_invitation_->AttachMessagePipe(kLegacyIpcBootstrapAttachmentName);
     channel_ = IPC::ChannelMojo::Create(
-        bootstrap.PassPipe(), IPC::Channel::MODE_SERVER, this,
+        std::move(bootstrap), IPC::Channel::MODE_SERVER, this,
         base::ThreadTaskRunnerHandle::Get(),
         base::ThreadTaskRunnerHandle::Get(),
         mojo::internal::MessageQuotaChecker::MaybeCreate());
diff --git a/content/common/content_constants_internal.cc b/content/common/content_constants_internal.cc
index 957ecb4..58cbe47f 100644
--- a/content/common/content_constants_internal.cc
+++ b/content/common/content_constants_internal.cc
@@ -31,5 +31,6 @@
 
 const int kChildProcessReceiverAttachmentName = 0;
 const int kChildProcessHostRemoteAttachmentName = 1;
+const int kLegacyIpcBootstrapAttachmentName = 2;
 
 } // namespace content
diff --git a/content/common/content_constants_internal.h b/content/common/content_constants_internal.h
index b2eedee..945217e 100644
--- a/content/common/content_constants_internal.h
+++ b/content/common/content_constants_internal.h
@@ -45,6 +45,7 @@
 // initialize child processes.
 extern const int kChildProcessReceiverAttachmentName;
 extern const int kChildProcessHostRemoteAttachmentName;
+extern const int kLegacyIpcBootstrapAttachmentName;
 
 } // namespace content
 
diff --git a/content/common/debug_utils.h b/content/common/debug_utils.h
index 8ca913b..a57487c 100644
--- a/content/common/debug_utils.h
+++ b/content/common/debug_utils.h
@@ -30,9 +30,12 @@
   // A non-main frame navigation with old_page_info set was detected.
   kDebugNonMainFrameWithOldPageInfo = 2,
 
+  // Metrics and the bfcache situations do not match.
+  kDebugBackForwardCacheMetricsMismatch = 3,
+
   // After making changes, you MUST update the histograms xml by running:
   // "python tools/metrics/histograms/update_debug_scenarios.py"
-  kMaxValue = kDebugNonMainFrameWithOldPageInfo
+  kMaxValue = kDebugBackForwardCacheMetricsMismatch
 };
 
 // The tracing categories enabled for debugging navigation scenarios can be
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-auralinux.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-auralinux.txt
new file mode 100644
index 0000000..4fc61ca
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-auralinux.txt
@@ -0,0 +1,27 @@
+[document web]
+++[entry] name='not editable' selectable-text
+++++[paragraph]
+++++++[static] name='Foo'
+++++[entry] name='nested, not editable, rich' selectable-text
+++++++[paragraph]
+++++++++[static] name='Bar'
+++++[entry] name='nested, not editable, plain' selectable-text
+++++++[static] name='Bar'
+++++[entry] name='nested, editable, rich' editable multi-line selectable-text
+++++++[paragraph] editable
+++++++++[static] name='Baz' editable
+++++[entry] name='nested, editable, plain' editable multi-line selectable-text
+++++++[static] name='Baz' editable
+++[entry] name='editable' editable multi-line selectable-text
+++++[paragraph] editable
+++++++[static] name='Foo' editable
+++++[entry] name='nested, not editable, rich' editable selectable-text
+++++++[paragraph] editable
+++++++++[static] name='Bar' editable
+++++[entry] name='nested, not editable, plain' editable selectable-text
+++++++[static] name='Bar' editable
+++++[entry] name='nested, editable, rich' editable multi-line selectable-text
+++++++[paragraph] editable
+++++++++[static] name='Baz' editable
+++++[entry] name='nested, editable, plain' editable multi-line selectable-text
+++++++[static] name='Baz' editable
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-blink.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-blink.txt
new file mode 100644
index 0000000..41a06dd
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-blink.txt
@@ -0,0 +1,39 @@
+rootWebArea
+++genericContainer ignored
+++++genericContainer ignored
+++++++textField name='not editable' value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz' nonAtomicTextFieldRoot=true
+++++++++paragraph
+++++++++++staticText name='Foo'
+++++++++++++inlineTextBox name='Foo'
+++++++++textField name='nested, not editable, rich' value='Bar' nonAtomicTextFieldRoot=true
+++++++++++paragraph
+++++++++++++staticText name='Bar'
+++++++++++++++inlineTextBox name='Bar'
+++++++++textField name='nested, not editable, plain' value='Bar' nonAtomicTextFieldRoot=true
+++++++++++staticText name='Bar'
+++++++++++++inlineTextBox name='Bar'
+++++++++textField editable multiline richlyEditable name='nested, editable, rich' value='Baz' nonAtomicTextFieldRoot=true
+++++++++++paragraph editable richlyEditable
+++++++++++++staticText editable richlyEditable name='Baz'
+++++++++++++++inlineTextBox editable richlyEditable name='Baz'
+++++++++textField editable multiline richlyEditable name='nested, editable, plain' value='Baz' nonAtomicTextFieldRoot=true
+++++++++++staticText editable richlyEditable name='Baz'
+++++++++++++inlineTextBox editable richlyEditable name='Baz'
+++++++textField editable multiline richlyEditable name='editable' value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz' nonAtomicTextFieldRoot=true
+++++++++paragraph editable richlyEditable
+++++++++++staticText editable richlyEditable name='Foo'
+++++++++++++inlineTextBox editable richlyEditable name='Foo'
+++++++++textField editable richlyEditable name='nested, not editable, rich' value='Bar' nonAtomicTextFieldRoot=true
+++++++++++paragraph editable richlyEditable
+++++++++++++staticText editable richlyEditable name='Bar'
+++++++++++++++inlineTextBox editable richlyEditable name='Bar'
+++++++++textField editable richlyEditable name='nested, not editable, plain' value='Bar' nonAtomicTextFieldRoot=true
+++++++++++staticText editable richlyEditable name='Bar'
+++++++++++++inlineTextBox editable richlyEditable name='Bar'
+++++++++textField editable multiline richlyEditable name='nested, editable, rich' value='Baz' nonAtomicTextFieldRoot=true
+++++++++++paragraph editable richlyEditable
+++++++++++++staticText editable richlyEditable name='Baz'
+++++++++++++++inlineTextBox editable richlyEditable name='Baz'
+++++++++textField editable multiline richlyEditable name='nested, editable, plain' value='Baz' nonAtomicTextFieldRoot=true
+++++++++++staticText editable richlyEditable name='Baz'
+++++++++++++inlineTextBox editable richlyEditable name='Baz'
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-mac.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-mac.txt
new file mode 100644
index 0000000..4a33726
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-mac.txt
@@ -0,0 +1,27 @@
+AXWebArea
+++AXTextField AXDescription='not editable' AXValue='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
+++++AXGroup
+++++++AXStaticText AXValue='Foo'
+++++AXTextField AXDescription='nested, not editable, rich' AXValue='Bar'
+++++++AXGroup
+++++++++AXStaticText AXValue='Bar'
+++++AXTextField AXDescription='nested, not editable, plain' AXValue='Bar'
+++++++AXStaticText AXValue='Bar'
+++++AXTextArea AXDescription='nested, editable, rich' AXValue='Baz'
+++++++AXGroup
+++++++++AXStaticText AXValue='Baz'
+++++AXTextArea AXDescription='nested, editable, plain' AXValue='Baz'
+++++++AXStaticText AXValue='Baz'
+++AXTextArea AXDescription='editable' AXValue='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
+++++AXGroup
+++++++AXStaticText AXValue='Foo'
+++++AXTextField AXDescription='nested, not editable, rich' AXValue='Bar'
+++++++AXGroup
+++++++++AXStaticText AXValue='Bar'
+++++AXTextField AXDescription='nested, not editable, plain' AXValue='Bar'
+++++++AXStaticText AXValue='Bar'
+++++AXTextArea AXDescription='nested, editable, rich' AXValue='Baz'
+++++++AXGroup
+++++++++AXStaticText AXValue='Baz'
+++++AXTextArea AXDescription='nested, editable, plain' AXValue='Baz'
+++++++AXStaticText AXValue='Baz'
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-uia-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-uia-win.txt
new file mode 100644
index 0000000..c6d78b8cf
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-uia-win.txt
@@ -0,0 +1,27 @@
+Document
+++Edit Name='not editable' Value.Value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
+++++Group IsControlElement=false
+++++++Text Name='Foo'
+++++Edit Name='nested, not editable, rich' Value.Value='Bar'
+++++++Group IsControlElement=false
+++++++++Text Name='Bar'
+++++Edit Name='nested, not editable, plain' Value.Value='Bar'
+++++++Text Name='Bar'
+++++Edit Name='nested, editable, rich' Value.Value='Baz'
+++++++Group IsControlElement=false
+++++++++Text Name='Baz'
+++++Edit Name='nested, editable, plain' Value.Value='Baz'
+++++++Text Name='Baz'
+++Edit Name='editable' Value.Value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
+++++Group IsControlElement=false
+++++++Text Name='Foo'
+++++Edit Name='nested, not editable, rich' Value.Value='Bar'
+++++++Group IsControlElement=false
+++++++++Text Name='Bar'
+++++Edit Name='nested, not editable, plain' Value.Value='Bar'
+++++++Text Name='Bar'
+++++Edit Name='nested, editable, rich' Value.Value='Baz'
+++++++Group IsControlElement=false
+++++++++Text Name='Baz'
+++++Edit Name='nested, editable, plain' Value.Value='Baz'
+++++++Text Name='Baz'
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-win.txt
new file mode 100644
index 0000000..5a8e252
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-win.txt
@@ -0,0 +1,27 @@
+ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
+++ROLE_SYSTEM_TEXT name='not editable' value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz'
+++++IA2_ROLE_PARAGRAPH
+++++++ROLE_SYSTEM_STATICTEXT name='Foo'
+++++ROLE_SYSTEM_TEXT name='nested, not editable, rich' value='Bar'
+++++++IA2_ROLE_PARAGRAPH
+++++++++ROLE_SYSTEM_STATICTEXT name='Bar'
+++++ROLE_SYSTEM_TEXT name='nested, not editable, plain' value='Bar'
+++++++ROLE_SYSTEM_STATICTEXT name='Bar'
+++++ROLE_SYSTEM_TEXT name='nested, editable, rich' value='Baz' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
+++++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE
+++++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
+++++ROLE_SYSTEM_TEXT name='nested, editable, plain' value='Baz' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
+++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
+++ROLE_SYSTEM_TEXT name='editable' value='Foo<newline><newline>Bar<newline><newline>Bar<newline><newline>Baz<newline><newline>Baz' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
+++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE
+++++++ROLE_SYSTEM_STATICTEXT name='Foo' IA2_STATE_EDITABLE
+++++ROLE_SYSTEM_TEXT name='nested, not editable, rich' value='Bar' IA2_STATE_EDITABLE
+++++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE
+++++++++ROLE_SYSTEM_STATICTEXT name='Bar' IA2_STATE_EDITABLE
+++++ROLE_SYSTEM_TEXT name='nested, not editable, plain' value='Bar' IA2_STATE_EDITABLE
+++++++ROLE_SYSTEM_STATICTEXT name='Bar' IA2_STATE_EDITABLE
+++++ROLE_SYSTEM_TEXT name='nested, editable, rich' value='Baz' IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
+++++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE
+++++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
+++++ROLE_SYSTEM_TEXT name='nested, editable, plain' value='Baz' IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
+++++++ROLE_SYSTEM_STATICTEXT name='Baz' IA2_STATE_EDITABLE
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child.html b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child.html
new file mode 100644
index 0000000..b23aac8
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!--
+@AURALINUX-ALLOW:editable
+@AURALINUX-ALLOW:multi-line
+@BLINK-ALLOW:nonAtomicTextFieldRoot=true
+@BLINK-ALLOW:editable*
+@BLINK-ALLOW:richlyEditable*
+@WIN-ALLOW:IA2_STATE_EDITABLE
+-->
+<html>
+<body>
+<div role="textbox" aria-label="not editable">
+  <p>Foo</p>
+  <div role="textbox" aria-label="nested, not editable, rich">
+    <p>Bar</p>
+  </div>
+  <div role="textbox" aria-label="nested, not editable, plain">Bar</div>
+  <div role="textbox" contenteditable aria-label="nested, editable, rich">
+    <p>Baz</p>
+  </div>
+  <div role="textbox" contenteditable aria-label="nested, editable, plain">Baz</div>
+</div>
+<div role="textbox" contenteditable aria-label="editable">
+  <p>Foo</p>
+  <div role="textbox" aria-label="nested, not editable, rich">
+    <p>Bar</p>
+  </div>
+  <div role="textbox" aria-label="nested, not editable, plain">Bar</div>
+  <div role="textbox" contenteditable aria-label="nested, editable, rich">
+    <p>Baz</p>
+  </div>
+  <div role="textbox" contenteditable aria-label="nested, editable, plain">Baz</div>
+</div>
+</body>
+</html>
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-auralinux.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-auralinux.txt
new file mode 100644
index 0000000..2783653
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-auralinux.txt
@@ -0,0 +1,30 @@
+[document web]
+++[entry] name='not editable' selectable-text
+++++[static] name='focusable: '
+++++[push button] name='ok'
+++++[link] name='link'
+++++++[static] name='link'
+++++[static] name=' '
+++++[label] label-for
+++++++[static] name='name: '
+++++++[entry] name='name:' selectable-text labelled-by
+++[entry] name='editable' selectable-text
+++++[static] name='focusable: '
+++++[push button] name='ok'
+++++[link] name='link'
+++++++[static] name='link'
+++++[static] name=' '
+++++[label] label-for
+++++++[static] name='name: '
+++++++[entry] name='name:' selectable-text labelled-by
+++[entry] name='not editable or focusable' selectable-text
+++++[static] name='focusable: '
+++++[push button] name='ok'
+++++[link] name='link'
+++++++[static] name='link'
+++++[static] name=' '
+++++[label] label-for
+++++++[static] name='name: '
+++++++[entry] name='name:' selectable-text labelled-by
+++[entry] name='not editable, img child' selectable-text
+++++[image]
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-blink.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-blink.txt
new file mode 100644
index 0000000..b329d11
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-blink.txt
@@ -0,0 +1,53 @@
+rootWebArea
+++genericContainer ignored
+++++genericContainer ignored
+++++++textField name='not editable' value='focusable: ok link name: '
+++++++++staticText name='focusable: '
+++++++++++inlineTextBox name='focusable: '
+++++++++button name='ok'
+++++++++++staticText name='ok'
+++++++++++++inlineTextBox name='ok'
+++++++++link name='link'
+++++++++++staticText name='link'
+++++++++++++inlineTextBox name='link'
+++++++++staticText name=' '
+++++++++++inlineTextBox name=' '
+++++++++labelText
+++++++++++staticText name='name: '
+++++++++++++inlineTextBox name='name: '
+++++++++++textField name='name:'
+++++++++++++genericContainer
+++++++textField multiline name='editable' value='focusable: ok link name: '
+++++++++staticText name='focusable: '
+++++++++++inlineTextBox name='focusable: '
+++++++++button name='ok'
+++++++++++staticText name='ok'
+++++++++++++inlineTextBox name='ok'
+++++++++link name='link'
+++++++++++staticText name='link'
+++++++++++++inlineTextBox name='link'
+++++++++staticText name=' '
+++++++++++inlineTextBox name=' '
+++++++++labelText
+++++++++++staticText name='name: '
+++++++++++++inlineTextBox name='name: '
+++++++++++textField name='name:'
+++++++++++++genericContainer
+++++++textField name='not editable or focusable' value='focusable: ok link name: '
+++++++++staticText name='focusable: '
+++++++++++inlineTextBox name='focusable: '
+++++++++button name='ok'
+++++++++++staticText name='ok'
+++++++++++++inlineTextBox name='ok'
+++++++++link name='link'
+++++++++++staticText name='link'
+++++++++++++inlineTextBox name='link'
+++++++++staticText name=' '
+++++++++++inlineTextBox name=' '
+++++++++labelText
+++++++++++staticText name='name: '
+++++++++++++inlineTextBox name='name: '
+++++++++++textField name='name:'
+++++++++++++genericContainer
+++++++textField name='not editable, img child'
+++++++++image
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-mac.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-mac.txt
new file mode 100644
index 0000000..5a83dd05
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-mac.txt
@@ -0,0 +1,30 @@
+AXWebArea
+++AXTextField AXDescription='not editable' AXValue='focusable: ok link name: '
+++++AXStaticText AXValue='focusable: '
+++++AXButton AXTitle='ok'
+++++AXLink AXDescription='link'
+++++++AXStaticText AXValue='link'
+++++AXStaticText AXValue=' '
+++++AXGroup
+++++++AXStaticText AXValue='name: '
+++++++AXTextField AXTitle='name:'
+++AXTextArea AXDescription='editable' AXValue='focusable: ok link name: '
+++++AXStaticText AXValue='focusable: '
+++++AXButton AXTitle='ok'
+++++AXLink AXDescription='link'
+++++++AXStaticText AXValue='link'
+++++AXStaticText AXValue=' '
+++++AXGroup
+++++++AXStaticText AXValue='name: '
+++++++AXTextField AXTitle='name:'
+++AXTextField AXDescription='not editable or focusable' AXValue='focusable: ok link name: '
+++++AXStaticText AXValue='focusable: '
+++++AXButton AXTitle='ok'
+++++AXLink AXDescription='link'
+++++++AXStaticText AXValue='link'
+++++AXStaticText AXValue=' '
+++++AXGroup
+++++++AXStaticText AXValue='name: '
+++++++AXTextField AXTitle='name:'
+++AXTextField AXDescription='not editable, img child'
+++++AXImage
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-uia-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-uia-win.txt
new file mode 100644
index 0000000..094371e
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-uia-win.txt
@@ -0,0 +1,30 @@
+Document
+++Edit Name='not editable' Value.Value='focusable: ok link name: '
+++++Text Name='focusable: '
+++++Button Name='ok'
+++++Hyperlink Name='link'
+++++++Text Name='link' IsControlElement=false
+++++Text Name=' '
+++++Text
+++++++Text Name='name: '
+++++++Edit Name='name:'
+++Edit Name='editable' Value.Value='focusable: ok link name: '
+++++Text Name='focusable: '
+++++Button Name='ok'
+++++Hyperlink Name='link'
+++++++Text Name='link' IsControlElement=false
+++++Text Name=' '
+++++Text
+++++++Text Name='name: '
+++++++Edit Name='name:'
+++Edit Name='not editable or focusable' Value.Value='focusable: ok link name: '
+++++Text Name='focusable: '
+++++Button Name='ok'
+++++Hyperlink Name='link'
+++++++Text Name='link' IsControlElement=false
+++++Text Name=' '
+++++Text
+++++++Text Name='name: '
+++++++Edit Name='name:'
+++Edit Name='not editable, img child'
+++++Image
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-win.txt
new file mode 100644
index 0000000..bea47fd8
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children-expected-win.txt
@@ -0,0 +1,30 @@
+ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
+++ROLE_SYSTEM_TEXT name='not editable' value='focusable: ok link name: ' FOCUSABLE
+++++ROLE_SYSTEM_STATICTEXT name='focusable: '
+++++ROLE_SYSTEM_PUSHBUTTON name='ok' FOCUSABLE
+++++ROLE_SYSTEM_LINK name='link' FOCUSABLE
+++++++ROLE_SYSTEM_STATICTEXT name='link'
+++++ROLE_SYSTEM_STATICTEXT name=' '
+++++IA2_ROLE_LABEL
+++++++ROLE_SYSTEM_STATICTEXT name='name: '
+++++++ROLE_SYSTEM_TEXT name='name:' FOCUSABLE
+++ROLE_SYSTEM_TEXT name='editable' value='focusable: ok link name: ' FOCUSABLE IA2_STATE_MULTI_LINE
+++++ROLE_SYSTEM_STATICTEXT name='focusable: '
+++++ROLE_SYSTEM_PUSHBUTTON name='ok' FOCUSABLE
+++++ROLE_SYSTEM_LINK name='link'
+++++++ROLE_SYSTEM_STATICTEXT name='link'
+++++ROLE_SYSTEM_STATICTEXT name=' '
+++++IA2_ROLE_LABEL
+++++++ROLE_SYSTEM_STATICTEXT name='name: '
+++++++ROLE_SYSTEM_TEXT name='name:' FOCUSABLE
+++ROLE_SYSTEM_TEXT name='not editable or focusable' value='focusable: ok link name: '
+++++ROLE_SYSTEM_STATICTEXT name='focusable: '
+++++ROLE_SYSTEM_PUSHBUTTON name='ok' FOCUSABLE
+++++ROLE_SYSTEM_LINK name='link' FOCUSABLE
+++++++ROLE_SYSTEM_STATICTEXT name='link'
+++++ROLE_SYSTEM_STATICTEXT name=' '
+++++IA2_ROLE_LABEL
+++++++ROLE_SYSTEM_STATICTEXT name='name: '
+++++++ROLE_SYSTEM_TEXT name='name:' FOCUSABLE
+++ROLE_SYSTEM_TEXT name='not editable, img child'
+++++ROLE_SYSTEM_GRAPHIC READONLY
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-non-text-children.html b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children.html
new file mode 100644
index 0000000..63801512
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-textbox-with-non-text-children.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div role="textbox" tabindex="0" aria-label="not editable">
+  focusable:
+  <button>ok</button>
+  <a href="#">link</a>
+  <label>name: <input></label>
+</div>
+<div role="textbox" contenteditable aria-label="editable">
+  focusable:
+  <button>ok</button>
+  <a href="#">link</a>
+  <label>name: <input></label>
+</div>
+<div role="textbox" aria-label="not editable or focusable">
+  focusable:
+  <button>ok</button>
+  <a href="#">link</a>
+  <label>name: <input></label>
+</div>
+<div role="textbox" aria-label="not editable, img child"><img /></div>
+</body>
+</html>
diff --git a/content/test/data/accessibility/event/aria-textbox-children-change-expected-auralinux.txt b/content/test/data/accessibility/event/aria-textbox-children-change-expected-auralinux.txt
new file mode 100644
index 0000000..be72da9
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-children-change-expected-auralinux.txt
@@ -0,0 +1,8 @@
+CHILDREN-CHANGED:REMOVE index:1 CHILD:(role=ROLE_PUSH_BUTTON) role=ROLE_ENTRY ENABLED,SENSITIVE,SHOWING,SINGLE-LINE,VISIBLE,SELECTABLE-TEXT
+=== Start Continuation ===
+CHILDREN-CHANGED:REMOVE index:1 CHILD:(role=ROLE_PUSH_BUTTON) role=ROLE_ENTRY ENABLED,FOCUSABLE,SENSITIVE,SHOWING,SINGLE-LINE,VISIBLE,SELECTABLE-TEXT
+=== Start Continuation ===
+CHILDREN-CHANGED:REMOVE index:1 CHILD:(role=ROLE_PUSH_BUTTON) role=ROLE_ENTRY EDITABLE,ENABLED,FOCUSABLE,MULTI-LINE,SENSITIVE,SHOWING,VISIBLE,SELECTABLE-TEXT
+=== Start Continuation ===
+CHILDREN-CHANGED:ADD index:1 CHILD:(role=ROLE_PUSH_BUTTON) role=ROLE_ENTRY ENABLED,SENSITIVE,SHOWING,SINGLE-LINE,VISIBLE,SELECTABLE-TEXT
+CHILDREN-CHANGED:REMOVE index:4 CHILD:(role=ROLE_PUSH_BUTTON) role=ROLE_DOCUMENT_WEB ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE
diff --git a/content/test/data/accessibility/event/aria-textbox-children-change-expected-mac.txt b/content/test/data/accessibility/event/aria-textbox-children-change-expected-mac.txt
new file mode 100644
index 0000000..8384041
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-children-change-expected-mac.txt
@@ -0,0 +1,8 @@
+AXValueChanged on AXTextField AXDescription="role only, rich" AXValue="foo"
+=== Start Continuation ===
+AXValueChanged on AXTextField AXDescription="focusable" AXValue="foo"
+=== Start Continuation ===
+AXValueChanged on AXTextArea AXDescription="editable" AXValue="foo"
+AXValueChanged on AXWebArea
+=== Start Continuation ===
+AXValueChanged on AXTextField AXDescription="role only, plain" AXValue="foook"
diff --git a/content/test/data/accessibility/event/aria-textbox-children-change-expected-win.txt b/content/test/data/accessibility/event/aria-textbox-children-change-expected-win.txt
new file mode 100644
index 0000000..5863299
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-children-change-expected-win.txt
@@ -0,0 +1,12 @@
+EVENT_OBJECT_HIDE on <button#btn1> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE
+EVENT_OBJECT_VALUECHANGE on <div> role=ROLE_SYSTEM_TEXT name="role only, rich" value="foo" IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE
+=== Start Continuation ===
+EVENT_OBJECT_HIDE on <button#btn2> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE
+EVENT_OBJECT_VALUECHANGE on <div> role=ROLE_SYSTEM_TEXT name="focusable" value="foo" FOCUSABLE IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE
+=== Start Continuation ===
+EVENT_OBJECT_HIDE on <button#btn3> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE IA2_STATE_EDITABLE
+EVENT_OBJECT_VALUECHANGE on <div> role=ROLE_SYSTEM_TEXT name="editable" value="foo" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_MULTI_LINE,IA2_STATE_SELECTABLE_TEXT
+=== Start Continuation ===
+EVENT_OBJECT_HIDE on <button#btn4> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE
+EVENT_OBJECT_SHOW on <button#btn4> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE
+EVENT_OBJECT_VALUECHANGE on <div#txt4> role=ROLE_SYSTEM_TEXT name="role only, plain" value="foook" IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE
diff --git a/content/test/data/accessibility/event/aria-textbox-children-change.html b/content/test/data/accessibility/event/aria-textbox-children-change.html
new file mode 100644
index 0000000..71ddafd6
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-children-change.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!--
+@AURALINUX-DENY:NAME-CHANGED*
+@AURALINUX-DENY:STATE-CHANGE:DEFUNCT*
+@AURALINUX-DENY:TEXT-REMOVE*
+@WIN-DENY:EVENT_OBJECT_LOCATIONCHANGE*
+@WIN-DENY:EVENT_OBJECT_REORDER*
+@WIN-DENY:IA2_EVENT_TEXT*
+-->
+<html>
+<body>
+<div role="textbox" aria-label="role only, rich">
+  foo <button id="btn1">ok</button>
+</div>
+<div role="textbox" tabindex="0" aria-label="focusable">
+  foo <button id="btn2">ok</button>
+</div>
+<div role="textbox" contenteditable aria-label="editable">
+  foo <button id="btn3">ok</button>
+</div>
+<div id="txt4" role="textbox" aria-label="role only, plain">foo</div>
+<button id="btn4">ok</button>
+<script>
+  var go_passes = [
+    () => document.getElementById("btn1").remove(),
+    () => document.getElementById("btn2").remove(),
+    () => document.getElementById("btn3").remove(),
+    () => document.getElementById("txt4").appendChild(document.getElementById("btn4")),
+  ];
+
+  var current_pass = 0;
+  function go() {
+    go_passes[current_pass++].call();
+    return current_pass < go_passes.length;
+  }
+</script>
+</body>
+</html>
diff --git a/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-auralinux.txt b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-auralinux.txt
new file mode 100644
index 0000000..64d984f
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-auralinux.txt
@@ -0,0 +1,3 @@
+# TODO(accessibility): There should be a state-change:editable event
+=== Start Continuation ===
+# TODO(accessibility): There should be a state-change:editable event
diff --git a/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-mac.txt b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-mac.txt
new file mode 100644
index 0000000..467aeb1
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-mac.txt
@@ -0,0 +1,2 @@
+=== Start Continuation ===
+AXValueChanged on AXTextArea AXDescription="initially editable" AXValue="foo ok"
diff --git a/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-win.txt b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-win.txt
new file mode 100644
index 0000000..0c902bf
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-editability-changes-expected-win.txt
@@ -0,0 +1,8 @@
+EVENT_OBJECT_STATECHANGE on <button> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE IA2_STATE_EDITABLE
+EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_STATICTEXT name="foo " IA2_STATE_EDITABLE
+EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_STATICTEXT name="ok" IA2_STATE_EDITABLE
+=== Start Continuation ===
+EVENT_OBJECT_STATECHANGE on <button> role=ROLE_SYSTEM_PUSHBUTTON name="ok" FOCUSABLE
+EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_STATICTEXT name="foo "
+EVENT_OBJECT_STATECHANGE on role=ROLE_SYSTEM_STATICTEXT name="ok"
+EVENT_OBJECT_VALUECHANGE on <div#txt2> role=ROLE_SYSTEM_TEXT name="initially editable" value="foo ok" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_MULTI_LINE,IA2_STATE_SELECTABLE_TEXT
diff --git a/content/test/data/accessibility/event/aria-textbox-editability-changes.html b/content/test/data/accessibility/event/aria-textbox-editability-changes.html
new file mode 100644
index 0000000..1b576088
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-editability-changes.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div id="txt1" role="textbox" tabindex="0" aria-label="initially not editable">
+  foo <button>ok</button>
+</div>
+<div id="txt2" role="textbox" contenteditable aria-label="initially editable">
+  foo <button>ok</button>
+</div>
+<script>
+  var go_passes = [
+    () => document.getElementById("txt1").setAttribute("contenteditable", "true"),
+    () => document.getElementById("txt2").removeAttribute("contenteditable"),
+  ];
+
+  var current_pass = 0;
+  function go() {
+    go_passes[current_pass++].call();
+    return current_pass < go_passes.length;
+  }
+</script>
+</body>
+</html>
diff --git a/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-auralinux.txt b/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-auralinux.txt
new file mode 100644
index 0000000..830acd8
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-auralinux.txt
@@ -0,0 +1,9 @@
+FOCUS-EVENT:FALSE role=ROLE_DOCUMENT_WEB name='(null)' ENABLED,FOCUSABLE,SENSITIVE,SHOWING,VISIBLE
+FOCUS-EVENT:TRUE role=ROLE_PUSH_BUTTON name='not editable' ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE
+STATE-CHANGE:FOCUSED:FALSE role=ROLE_DOCUMENT_WEB name='(null)' ENABLED,FOCUSABLE,SENSITIVE,SHOWING,VISIBLE
+STATE-CHANGE:FOCUSED:TRUE role=ROLE_PUSH_BUTTON name='not editable' ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE
+=== Start Continuation ===
+FOCUS-EVENT:FALSE role=ROLE_PUSH_BUTTON name='not editable' ENABLED,FOCUSABLE,SENSITIVE,SHOWING,VISIBLE
+FOCUS-EVENT:TRUE role=ROLE_PUSH_BUTTON name='editable' EDITABLE,ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE
+STATE-CHANGE:FOCUSED:FALSE role=ROLE_PUSH_BUTTON name='not editable' ENABLED,FOCUSABLE,SENSITIVE,SHOWING,VISIBLE
+STATE-CHANGE:FOCUSED:TRUE role=ROLE_PUSH_BUTTON name='editable' EDITABLE,ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE
diff --git a/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-mac.txt b/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-mac.txt
new file mode 100644
index 0000000..07ef5721
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-mac.txt
@@ -0,0 +1,3 @@
+AXFocusedUIElementChanged on AXButton AXTitle="not editable"
+=== Start Continuation ===
+AXFocusedUIElementChanged on AXButton AXTitle="editable"
diff --git a/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-win.txt b/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-win.txt
new file mode 100644
index 0000000..ed2f2e9
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-with-focusable-children-expected-win.txt
@@ -0,0 +1,3 @@
+EVENT_OBJECT_FOCUS on <button#btn1> role=ROLE_SYSTEM_PUSHBUTTON name="not editable" FOCUSED,FOCUSABLE
+=== Start Continuation ===
+EVENT_OBJECT_FOCUS on <button#btn2> role=ROLE_SYSTEM_PUSHBUTTON name="editable" FOCUSED,FOCUSABLE IA2_STATE_EDITABLE
diff --git a/content/test/data/accessibility/event/aria-textbox-with-focusable-children.html b/content/test/data/accessibility/event/aria-textbox-with-focusable-children.html
new file mode 100644
index 0000000..f1f5b7c
--- /dev/null
+++ b/content/test/data/accessibility/event/aria-textbox-with-focusable-children.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div role="textbox" tabindex="0">
+  focusable:
+  <button id="btn1">not editable</button>
+</div>
+<div role="textbox" contenteditable>
+  focusable:
+  <button id="btn2">editable</button>
+</div>
+<script>
+  var go_passes = [
+    () => document.getElementById("btn1").focus(),
+    () => document.getElementById("btn2").focus(),
+  ];
+
+  var current_pass = 0;
+  function go() {
+    go_passes[current_pass++].call();
+    return current_pass < go_passes.length;
+  }
+</script>
+</body>
+</html>
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
index 0175602..4378211 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' contentEditableRoot=true
+++++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' nonAtomicTextFieldRoot=true
 ++++++++paragraph editable richlyEditable
 ++++++++++staticText editable richlyEditable name='A contenteditable with a '
 ++++++++++++inlineTextBox editable richlyEditable name='A contenteditable with a '
@@ -34,6 +34,6 @@
 ++++++paragraph
 ++++++++staticText name='Non-editable paragraph.'
 ++++++++++inlineTextBox name='Non-editable paragraph.'
-++++++paragraph editable multiline richlyEditable value='Should keep the role but change the state.' contentEditableRoot=true
+++++++paragraph editable multiline richlyEditable value='Should keep the role but change the state.' nonAtomicTextFieldRoot=true
 ++++++++staticText editable richlyEditable name='Should keep the role but change the state.'
-++++++++++inlineTextBox editable richlyEditable name='Should keep the role but change the state.'
\ No newline at end of file
+++++++++++inlineTextBox editable richlyEditable name='Should keep the role but change the state.'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
index 4bd1aba9..7901541 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' contentEditableRoot=true TreeData.textSelStartOffset=0 TreeData.textSelEndOffset=3
+++++++genericContainer editable multiline richlyEditable value='A contenteditable with a link and an  and a .<newline><newline>Always expose editable tables as tables.<newline>Editable list item.' nonAtomicTextFieldRoot=true TreeData.textSelStartOffset=0 TreeData.textSelEndOffset=3
 ++++++++paragraph editable richlyEditable
 ++++++++++staticText editable richlyEditable name='A contenteditable with a '
 ++++++++++++inlineTextBox editable richlyEditable name='A contenteditable with a '
@@ -30,4 +30,4 @@
 ++++++++++++++staticText name='1. '
 ++++++++++++++++inlineTextBox name='1. '
 ++++++++++++staticText editable richlyEditable name='Editable list item.'
-++++++++++++++inlineTextBox editable richlyEditable name='Editable list item.'
\ No newline at end of file
+++++++++++++++inlineTextBox editable richlyEditable name='Editable list item.'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection.html b/content/test/data/accessibility/html/contenteditable-descendants-with-selection.html
index 0a537aeb..8d5499f 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection.html
+++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection.html
@@ -8,7 +8,7 @@
 @WIN-ALLOW:n_selections*
 @WIN-ALLOW:selection_start*
 @WIN-ALLOW:selection_end*
-@BLINK-ALLOW:contentEditableRoot*
+@BLINK-ALLOW:nonAtomicTextFieldRoot=true
 @BLINK-ALLOW:editable*
 @BLINK-ALLOW:richlyEditable*
 @BLINK-ALLOW:*textSel*
diff --git a/content/test/data/accessibility/html/contenteditable-descendants.html b/content/test/data/accessibility/html/contenteditable-descendants.html
index b32b6f2f..52c4efc 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants.html
+++ b/content/test/data/accessibility/html/contenteditable-descendants.html
@@ -11,7 +11,7 @@
 @WIN-ALLOW:selection_start*
 @WIN-ALLOW:selection_end*
 @BLINK-ALLOW:linked
-@BLINK-ALLOW:contentEditableRoot*
+@BLINK-ALLOW:nonAtomicTextFieldRoot=true
 @BLINK-ALLOW:editable*
 @BLINK-ALLOW:richlyEditable*
 @BLINK-ALLOW:textSel*
diff --git a/content/test/data/accessibility/html/contenteditable-plaintext-with-role-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-plaintext-with-role-expected-blink.txt
index 6f39748..e8cad86 100644
--- a/content/test/data/accessibility/html/contenteditable-plaintext-with-role-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-plaintext-with-role-expected-blink.txt
@@ -1,6 +1,6 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer
-++++++menuItemRadio editable multiline name='x' value='x' checkedState=false contentEditableRoot=true
+++++++menuItemRadio editable multiline name='x' value='x' checkedState=false nonAtomicTextFieldRoot=true
 ++++++++staticText editable name='x'
 ++++++++++inlineTextBox editable name='x'
diff --git a/content/test/data/accessibility/html/contenteditable-plaintext-with-role.html b/content/test/data/accessibility/html/contenteditable-plaintext-with-role.html
index 57aaeb50..03a1e28f 100644
--- a/content/test/data/accessibility/html/contenteditable-plaintext-with-role.html
+++ b/content/test/data/accessibility/html/contenteditable-plaintext-with-role.html
@@ -1,5 +1,5 @@
 <!--
-@BLINK-ALLOW:contentEditableRoot*
+@BLINK-ALLOW:nonAtomicTextFieldRoot=true
 @BLINK-ALLOW:editable*
 @BLINK-ALLOW:richlyEditable*
 -->
diff --git a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt
index de62979..b4cd8d8b 100644
--- a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables-expected-blink.txt
@@ -1,7 +1,7 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer ignored
-++++++genericContainer editable multiline richlyEditable value='This is editable.<newline><newline>This is not editable.<newline><newline><newline>But this one is.<newline><newline>So is this one.' contentEditableRoot=true
+++++++genericContainer editable multiline richlyEditable value='This is editable.<newline><newline>This is not editable.<newline><newline><newline>But this one is.<newline><newline>So is this one.' nonAtomicTextFieldRoot=true
 ++++++++paragraph editable richlyEditable
 ++++++++++staticText editable richlyEditable name='This is editable.'
 ++++++++++++inlineTextBox editable richlyEditable name='This is editable.'
@@ -10,9 +10,9 @@
 ++++++++++++inlineTextBox name='This is not editable.'
 ++++++++++lineBreak name='<newline>'
 ++++++++++++inlineTextBox name='<newline>'
-++++++++++paragraph editable multiline richlyEditable value='But this one is.' contentEditableRoot=true
+++++++++++paragraph editable multiline richlyEditable value='But this one is.' nonAtomicTextFieldRoot=true
 ++++++++++++staticText editable richlyEditable name='But this one is.'
 ++++++++++++++inlineTextBox editable richlyEditable name='But this one is.'
-++++++++paragraph editable multiline richlyEditable value='So is this one.' contentEditableRoot=true
+++++++++paragraph editable multiline richlyEditable value='So is this one.' nonAtomicTextFieldRoot=true
 ++++++++++staticText editable richlyEditable name='So is this one.'
-++++++++++++inlineTextBox editable richlyEditable name='So is this one.'
\ No newline at end of file
+++++++++++++inlineTextBox editable richlyEditable name='So is this one.'
diff --git a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables.html b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables.html
index 9ec49dd6..72ba398 100644
--- a/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables.html
+++ b/content/test/data/accessibility/html/contenteditable-with-embedded-contenteditables.html
@@ -5,7 +5,7 @@
 @WIN-ALLOW:n_selections*
 @WIN-ALLOW:selection_start*
 @WIN-ALLOW:selection_end*
-@BLINK-ALLOW:contentEditableRoot*
+@BLINK-ALLOW:nonAtomicTextFieldRoot=true
 @BLINK-ALLOW:editable*
 @BLINK-ALLOW:richlyEditable*
 @BLINK-ALLOW:textSel*
diff --git a/content/test/data/accessibility/html/design-mode-expected-blink.txt b/content/test/data/accessibility/html/design-mode-expected-blink.txt
index 76508c3..fe54203c 100644
--- a/content/test/data/accessibility/html/design-mode-expected-blink.txt
+++ b/content/test/data/accessibility/html/design-mode-expected-blink.txt
@@ -1,6 +1,6 @@
 rootWebArea editable richlyEditable htmlTag='#document'
-++genericContainer editable ignored richlyEditable htmlTag='html' contentEditableRoot=true
-++++genericContainer editable richlyEditable htmlTag='body' contentEditableRoot=true
+++genericContainer editable ignored richlyEditable htmlTag='html' nonAtomicTextFieldRoot=true
+++++genericContainer editable richlyEditable htmlTag='body' nonAtomicTextFieldRoot=true
 ++++++paragraph editable richlyEditable htmlTag='p'
 ++++++++staticText editable richlyEditable name='Hello'
-++++++++++inlineTextBox editable richlyEditable name='Hello'
\ No newline at end of file
+++++++++++inlineTextBox editable richlyEditable name='Hello'
diff --git a/content/test/data/accessibility/html/design-mode.html b/content/test/data/accessibility/html/design-mode.html
index cfb997f..2515741fa 100644
--- a/content/test/data/accessibility/html/design-mode.html
+++ b/content/test/data/accessibility/html/design-mode.html
@@ -1,5 +1,5 @@
 <!--
-@BLINK-ALLOW:contentEditableRoot*
+@BLINK-ALLOW:nonAtomicTextFieldRoot=true
 @BLINK-ALLOW:editable*
 @BLINK-ALLOW:richlyEditable*
 @BLINK-ALLOW:htmlTag*
diff --git a/content/test/data/accessibility/html/input-types-with-value-expected-blink.txt b/content/test/data/accessibility/html/input-types-with-value-expected-blink.txt
index 49c5edb8..279b510 100644
--- a/content/test/data/accessibility/html/input-types-with-value-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-types-with-value-expected-blink.txt
@@ -63,15 +63,15 @@
 ++++++++++genericContainer editable
 ++++++++++++staticText editable name='Sometext'
 ++++++++++++++inlineTextBox editable name='Sometext'
-++++++genericContainer editable multiline value='Plain contenteditable' contentEditableRoot=true
+++++++genericContainer editable multiline value='Plain contenteditable' nonAtomicTextFieldRoot=true
 ++++++++staticText editable name='Plain contenteditable'
 ++++++++++inlineTextBox editable name='Plain contenteditable'
-++++++genericContainer editable multiline richlyEditable value='Rich contenteditable' contentEditableRoot=true
+++++++genericContainer editable multiline richlyEditable value='Rich contenteditable' nonAtomicTextFieldRoot=true
 ++++++++staticText editable richlyEditable name='Rich contenteditable'
 ++++++++++inlineTextBox editable richlyEditable name='Rich contenteditable'
-++++++textField editable multiline value='Plain contenteditable' contentEditableRoot=true
+++++++textField editable multiline value='Plain contenteditable' nonAtomicTextFieldRoot=true
 ++++++++staticText editable name='Plain contenteditable'
 ++++++++++inlineTextBox editable name='Plain contenteditable'
-++++++textField editable multiline richlyEditable value='Rich contenteditable' contentEditableRoot=true
+++++++textField editable multiline richlyEditable value='Rich contenteditable' nonAtomicTextFieldRoot=true
 ++++++++staticText editable richlyEditable name='Rich contenteditable'
-++++++++++inlineTextBox editable richlyEditable name='Rich contenteditable'
\ No newline at end of file
+++++++++++inlineTextBox editable richlyEditable name='Rich contenteditable'
diff --git a/content/test/data/accessibility/html/input-types-with-value.html b/content/test/data/accessibility/html/input-types-with-value.html
index 00d2e127..e84fbaf 100644
--- a/content/test/data/accessibility/html/input-types-with-value.html
+++ b/content/test/data/accessibility/html/input-types-with-value.html
@@ -1,5 +1,5 @@
 <!--
-@BLINK-ALLOW:contentEditableRoot*
+@BLINK-ALLOW:nonAtomicTextFieldRoot*
 @BLINK-ALLOW:editable*
 @BLINK-ALLOW:richlyEditable*
 -->
diff --git a/content/test/data/service_worker/clients_claim_worker.js b/content/test/data/service_worker/clients_claim_worker.js
new file mode 100644
index 0000000..79702b2
--- /dev/null
+++ b/content/test/data/service_worker/clients_claim_worker.js
@@ -0,0 +1,7 @@
+// 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.
+
+self.addEventListener('activate', e => {
+  e.waitUntil(clients.claim());
+});
diff --git a/content/test/data/service_worker/skip_waiting_and_clients_claim_worker.js b/content/test/data/service_worker/skip_waiting_and_clients_claim_worker.js
new file mode 100644
index 0000000..814488f8
--- /dev/null
+++ b/content/test/data/service_worker/skip_waiting_and_clients_claim_worker.js
@@ -0,0 +1,11 @@
+// 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.
+
+self.addEventListener('install', e => {
+  self.skipWaiting();
+});
+
+self.addEventListener('activate', e => {
+  e.waitUntil(clients.claim());
+});
diff --git a/content/test/data/service_worker/skip_waiting_and_clients_claim_worker.js.mock-http-headers b/content/test/data/service_worker/skip_waiting_and_clients_claim_worker.js.mock-http-headers
new file mode 100644
index 0000000..603dac83
--- /dev/null
+++ b/content/test/data/service_worker/skip_waiting_and_clients_claim_worker.js.mock-http-headers
@@ -0,0 +1,3 @@
+HTTP/1.1 200 OK
+Content-Type: text/javascript
+Service-Worker-Allowed: /
diff --git a/content/web_test/renderer/web_ax_object_proxy.cc b/content/web_test/renderer/web_ax_object_proxy.cc
index b687bae..cec19ef2 100644
--- a/content/web_test/renderer/web_ax_object_proxy.cc
+++ b/content/web_test/renderer/web_ax_object_proxy.cc
@@ -768,7 +768,8 @@
 bool WebAXObjectProxy::IsEditableRoot() {
   UpdateLayout();
   return GetAXNodeData().GetBoolAttribute(
-      ax::mojom::BoolAttribute::kContentEditableRoot);
+             ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot) &&
+         GetAXNodeData().HasState(ax::mojom::State::kEditable);
 }
 
 bool WebAXObjectProxy::IsEditable() {
diff --git a/extensions/common/api/automation.idl b/extensions/common/api/automation.idl
index e49ff6f5..18853f2 100644
--- a/extensions/common/api/automation.idl
+++ b/extensions/common/api/automation.idl
@@ -29,6 +29,7 @@
     clicked,
     collapsed,
     controlsChanged,
+    detailsChanged,
     describedByChanged,
     descriptionChanged,
     documentSelectionChanged,
@@ -1285,9 +1286,11 @@
     // Indicates the font family.
     DOMString fontFamily;
 
-    // Indicates whether the object is at the root of a content editable region,
-    // or at a <body> element that has "design-mode" set to "on".
-    boolean contentEditableRoot;
+    // Indicates whether the object functions as a text field which exposes its
+    // descendants. Use cases include the root of a content-editable region, an
+    // ARIA textbox which isn't currently editable and which has interactive
+    // descendants, and a <body> element that has "design-mode" set to "on".
+    boolean nonAtomicTextFieldRoot;
 
     // Indicates aria-current state.
     AriaCurrentState? ariaCurrentState;
diff --git a/extensions/renderer/api/automation/automation_api_util.cc b/extensions/renderer/api/automation/automation_api_util.cc
index a0fcb66..9c764bdf 100644
--- a/extensions/renderer/api/automation/automation_api_util.cc
+++ b/extensions/renderer/api/automation/automation_api_util.cc
@@ -113,6 +113,7 @@
     case ui::AXEventGenerator::Event::CLASS_NAME_CHANGED:
     case ui::AXEventGenerator::Event::COLLAPSED:
     case ui::AXEventGenerator::Event::CONTROLS_CHANGED:
+    case ui::AXEventGenerator::Event::DETAILS_CHANGED:
     case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED:
     case ui::AXEventGenerator::Event::DESCRIPTION_CHANGED:
     case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED:
diff --git a/extensions/renderer/resources/automation/automation_node.js b/extensions/renderer/resources/automation/automation_node.js
index 9fb7de0..90e4c31 100644
--- a/extensions/renderer/resources/automation/automation_node.js
+++ b/extensions/renderer/resources/automation/automation_node.js
@@ -1376,7 +1376,7 @@
 
 var boolAttributes = [
   'busy', 'clickable', 'containerLiveAtomic', 'containerLiveBusy',
-  'contentEditableRoot', 'liveAtomic', 'modal', 'notUserSelectableStyle',
+  'nonAtomicTextFieldRoot', 'liveAtomic', 'modal', 'notUserSelectableStyle',
   'scrollable', 'selected', 'supportsTextLocation'
 ];
 
diff --git a/fuchsia/engine/browser/cast_streaming_browsertest.cc b/fuchsia/engine/browser/cast_streaming_browsertest.cc
index 2da750c..fda07df 100644
--- a/fuchsia/engine/browser/cast_streaming_browsertest.cc
+++ b/fuchsia/engine/browser/cast_streaming_browsertest.cc
@@ -14,7 +14,6 @@
 #include "fuchsia/base/test/test_navigation_listener.h"
 #include "fuchsia/engine/browser/context_impl.h"
 #include "fuchsia/engine/browser/frame_impl.h"
-#include "fuchsia/engine/switches.h"
 #include "fuchsia/engine/test/test_data.h"
 #include "fuchsia/engine/test/web_engine_browser_test.h"
 #include "media/base/media_util.h"
@@ -78,7 +77,7 @@
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
     content::BrowserTestBase::SetUpCommandLine(command_line);
-    command_line->RemoveSwitch(switches::kEnableCastStreamingReceiver);
+    command_line->RemoveSwitch("enable-cast-streaming-receiver");
   }
 };
 
@@ -94,7 +93,7 @@
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
     content::BrowserTestBase::SetUpCommandLine(command_line);
-    command_line->AppendSwitch(switches::kEnableCastStreamingReceiver);
+    command_line->AppendSwitch("enable-cast-streaming-receiver");
   }
 };
 
diff --git a/fuchsia/engine/browser/content_directory_browsertest.cc b/fuchsia/engine/browser/content_directory_browsertest.cc
index ea85cfe4..b6c7167f 100644
--- a/fuchsia/engine/browser/content_directory_browsertest.cc
+++ b/fuchsia/engine/browser/content_directory_browsertest.cc
@@ -89,7 +89,7 @@
     // Set this flag early so that the fuchsia-dir:// scheme will be
     // registered at browser startup.
     base::CommandLine::ForCurrentProcess()->AppendSwitch(
-        switches::kEnableContentDirectories);
+        "enable-content-directories");
 
     // Scheme initialization for the WebEngineContentClient depends on the above
     // command line modification, which won't have been present when the schemes
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn
index 675ffb9..4b23eb0 100644
--- a/gpu/command_buffer/service/BUILD.gn
+++ b/gpu/command_buffer/service/BUILD.gn
@@ -54,6 +54,8 @@
     "memory_tracking.h",
     "scheduler.cc",
     "scheduler.h",
+    "scheduler_task_runner.cc",
+    "scheduler_task_runner.h",
     "sequence_id.h",
     "sync_point_manager.cc",
     "sync_point_manager.h",
diff --git a/gpu/command_buffer/service/scheduler_task_runner.cc b/gpu/command_buffer/service/scheduler_task_runner.cc
new file mode 100644
index 0000000..5312e85
--- /dev/null
+++ b/gpu/command_buffer/service/scheduler_task_runner.cc
@@ -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.
+
+#include "gpu/command_buffer/service/scheduler_task_runner.h"
+
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/check.h"
+#include "base/no_destructor.h"
+#include "base/threading/thread_local.h"
+#include "gpu/command_buffer/common/sync_token.h"
+#include "gpu/command_buffer/service/scheduler.h"
+
+namespace gpu {
+
+namespace {
+
+base::ThreadLocalPointer<const SchedulerTaskRunner>&
+GetCurrentTaskRunnerStorage() {
+  static base::NoDestructor<base::ThreadLocalPointer<const SchedulerTaskRunner>>
+      runner;
+  return *runner;
+}
+
+void SetCurrentTaskRunner(const SchedulerTaskRunner* runner) {
+  GetCurrentTaskRunnerStorage().Set(runner);
+}
+
+const SchedulerTaskRunner* GetCurrentTaskRunner() {
+  return GetCurrentTaskRunnerStorage().Get();
+}
+
+}  // namespace
+
+SchedulerTaskRunner::SchedulerTaskRunner(Scheduler& scheduler,
+                                         SequenceId sequence_id)
+    : scheduler_(scheduler), sequence_id_(sequence_id) {}
+
+SchedulerTaskRunner::~SchedulerTaskRunner() = default;
+
+void SchedulerTaskRunner::ShutDown() {
+  is_running_ = false;
+}
+
+bool SchedulerTaskRunner::PostDelayedTask(const base::Location& from_here,
+                                          base::OnceClosure task,
+                                          base::TimeDelta delay) {
+  return PostNonNestableDelayedTask(from_here, std::move(task), delay);
+}
+
+bool SchedulerTaskRunner::PostNonNestableDelayedTask(
+    const base::Location& from_here,
+    base::OnceClosure task,
+    base::TimeDelta delay) {
+  if (!is_running_)
+    return false;
+
+  CHECK(delay.is_zero());
+  scheduler_.ScheduleTask(Scheduler::Task(
+      sequence_id_,
+      base::BindOnce(&SchedulerTaskRunner::RunTask, this, std::move(task)),
+      std::vector<SyncToken>()));
+  return true;
+}
+
+bool SchedulerTaskRunner::RunsTasksInCurrentSequence() const {
+  const SchedulerTaskRunner* current = GetCurrentTaskRunner();
+  return current != nullptr && current->sequence_id_ == sequence_id_;
+}
+
+void SchedulerTaskRunner::RunTask(base::OnceClosure task) {
+  // Scheduler doesn't nest tasks, so we don't support nesting.
+  DCHECK(!GetCurrentTaskRunner());
+  SetCurrentTaskRunner(this);
+  std::move(task).Run();
+  SetCurrentTaskRunner(nullptr);
+}
+
+}  // namespace gpu
diff --git a/gpu/command_buffer/service/scheduler_task_runner.h b/gpu/command_buffer/service/scheduler_task_runner.h
new file mode 100644
index 0000000..c9492ac
--- /dev/null
+++ b/gpu/command_buffer/service/scheduler_task_runner.h
@@ -0,0 +1,52 @@
+// 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 GPU_COMMAND_BUFFER_SERVICE_SCHEDULER_TASK_RUNNER_H_
+#define GPU_COMMAND_BUFFER_SERVICE_SCHEDULER_TASK_RUNNER_H_
+
+#include "base/sequenced_task_runner.h"
+#include "gpu/command_buffer/service/sequence_id.h"
+#include "gpu/gpu_export.h"
+
+namespace gpu {
+
+class Scheduler;
+
+// A SequencedTaskRunner implementation to abstract task execution for a
+// specific SequenceId on the GPU Scheduler. This object does not support
+// delayed tasks, because the underlying Scheduler implementation does not
+// support scheduling delayed tasks. Also note that tasks run by this object do
+// not support running nested RunLoops.
+class GPU_EXPORT SchedulerTaskRunner : public base::SequencedTaskRunner {
+ public:
+  // Constructs a SchedulerTaskRunner that runs tasks on `scheduler`, on the
+  // sequence identified by `sequence_id`. This instance must not outlive
+  // `scheduler`.
+  SchedulerTaskRunner(Scheduler& scheduler, SequenceId sequence_id);
+
+  // Once this is called, all subsequent tasks will be rejected.
+  void ShutDown();
+
+  // base::SequencedTaskRunner:
+  bool PostDelayedTask(const base::Location& from_here,
+                       base::OnceClosure task,
+                       base::TimeDelta delay) override;
+  bool PostNonNestableDelayedTask(const base::Location& from_here,
+                                  base::OnceClosure task,
+                                  base::TimeDelta delay) override;
+  bool RunsTasksInCurrentSequence() const override;
+
+ private:
+  ~SchedulerTaskRunner() override;
+
+  void RunTask(base::OnceClosure task);
+
+  Scheduler& scheduler_;
+  const SequenceId sequence_id_;
+  bool is_running_ = true;
+};
+
+}  // namespace gpu
+
+#endif  // GPU_COMMAND_BUFFER_SERVICE_SCHEDULER_TASK_RUNNER_H_
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.cc b/gpu/ipc/client/command_buffer_proxy_impl.cc
index 4513dc9..61264c45 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.cc
+++ b/gpu/ipc/client/command_buffer_proxy_impl.cc
@@ -31,6 +31,7 @@
 #include "gpu/ipc/common/gpu_channel.mojom.h"
 #include "gpu/ipc/common/gpu_messages.h"
 #include "gpu/ipc/common/gpu_param_traits.h"
+#include "ipc/ipc_mojo_bootstrap.h"
 #include "mojo/public/cpp/bindings/sync_call_restrictions.h"
 #include "mojo/public/cpp/system/buffer.h"
 #include "mojo/public/cpp/system/platform_handle.h"
@@ -119,15 +120,23 @@
   // TODO(piman): Make this asynchronous (http://crbug.com/125248).
   ContextResult result = ContextResult::kSuccess;
   mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync;
+  IPC::ScopedAllowOffSequenceChannelAssociatedBindings allow_binding;
   bool sent = channel->GetGpuChannel().CreateCommandBuffer(
-      std::move(params), route_id_, std::move(region), &result, &capabilities_);
+      std::move(params), route_id_, std::move(region),
+      command_buffer_.BindNewEndpointAndPassReceiver(channel->io_task_runner()),
+      client_receiver_.BindNewEndpointAndPassRemote(callback_thread_), &result,
+      &capabilities_);
   if (!sent) {
+    command_buffer_.reset();
+    client_receiver_.reset();
     channel->RemoveRoute(route_id_);
     LOG(ERROR) << "ContextResult::kTransientFailure: "
                   "Failed to send GpuControl.CreateCommandBuffer.";
     return ContextResult::kTransientFailure;
   }
   if (result != ContextResult::kSuccess) {
+    command_buffer_.reset();
+    client_receiver_.reset();
     DLOG(ERROR) << "Failure processing GpuControl.CreateCommandBuffer.";
     channel->RemoveRoute(route_id_);
     return result;
@@ -142,7 +151,6 @@
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(CommandBufferProxyImpl, message)
     IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Destroyed, OnDestroyed);
-    IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_ConsoleMsg, OnConsoleMessage);
     IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_GpuSwitched, OnGpuSwitched);
     IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalAck, OnSignalAck);
     IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SwapBuffersCompleted,
@@ -185,11 +193,9 @@
   OnGpuAsyncMessageError(reason, error);
 }
 
-void CommandBufferProxyImpl::OnConsoleMessage(
-    const GPUCommandBufferConsoleMessage& message) {
+void CommandBufferProxyImpl::OnConsoleMessage(const std::string& message) {
   if (gpu_control_client_)
-    gpu_control_client_->OnGpuControlErrorMessage(message.message.c_str(),
-                                                  message.id);
+    gpu_control_client_->OnGpuControlErrorMessage(message.c_str(), /*id=*/0);
 }
 
 void CommandBufferProxyImpl::OnGpuSwitched(
@@ -359,7 +365,7 @@
   if (last_state_.error != gpu::error::kNoError)
     return;
 
-  Send(new GpuCommandBufferMsg_SetGetBuffer(route_id_, shm_id));
+  command_buffer_->SetGetBuffer(shm_id);
   last_put_offset_ = -1;
   has_buffer_ = (shm_id > 0);
 }
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.h b/gpu/ipc/client/command_buffer_proxy_impl.h
index 3a541f7..b027ccb 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.h
+++ b/gpu/ipc/client/command_buffer_proxy_impl.h
@@ -35,12 +35,14 @@
 #include "gpu/command_buffer/common/gpu_memory_allocation.h"
 #include "gpu/command_buffer/common/scheduling_priority.h"
 #include "gpu/gpu_export.h"
+#include "gpu/ipc/common/gpu_channel.mojom.h"
 #include "gpu/ipc/common/surface_handle.h"
 #include "ipc/ipc_listener.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/shared_associated_remote.h"
 #include "ui/gfx/swap_result.h"
 #include "ui/gl/gpu_preference.h"
 
-struct GPUCommandBufferConsoleMessage;
 class GURL;
 
 namespace base {
@@ -67,7 +69,8 @@
 // CommandBufferStub.
 class GPU_EXPORT CommandBufferProxyImpl : public gpu::CommandBuffer,
                                           public gpu::GpuControl,
-                                          public IPC::Listener {
+                                          public IPC::Listener,
+                                          public mojom::CommandBufferClient {
  public:
   class DeletionObserver {
    public:
@@ -183,10 +186,12 @@
   std::pair<base::UnsafeSharedMemoryRegion, base::WritableSharedMemoryMapping>
   AllocateAndMapSharedMemory(size_t size);
 
+  // mojom::CommandBufferClient:
+  void OnConsoleMessage(const std::string& message) override;
+
   // Message handlers:
   void OnDestroyed(gpu::error::ContextLostReason reason,
                    gpu::error::Error error);
-  void OnConsoleMessage(const GPUCommandBufferConsoleMessage& message);
   void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic);
   void OnSignalAck(uint32_t id, const CommandBuffer::State& state);
   void OnSwapBuffersCompleted(const SwapBuffersCompleteParams& params);
@@ -271,6 +276,9 @@
   int32_t last_put_offset_ = -1;
   bool has_buffer_ = false;
 
+  mojo::SharedAssociatedRemote<mojom::CommandBuffer> command_buffer_;
+  mojo::AssociatedReceiver<mojom::CommandBufferClient> client_receiver_{this};
+
   // Next generated fence sync.
   uint64_t next_fence_sync_release_ = 1;
 
diff --git a/gpu/ipc/client/command_buffer_proxy_impl_unittest.cc b/gpu/ipc/client/command_buffer_proxy_impl_unittest.cc
index b89a407b..3d8dc4bf 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl_unittest.cc
+++ b/gpu/ipc/client/command_buffer_proxy_impl_unittest.cc
@@ -12,6 +12,7 @@
 #include "gpu/command_buffer/common/context_creation_attribs.h"
 #include "gpu/ipc/client/gpu_channel_host.h"
 #include "gpu/ipc/common/gpu_channel.mojom.h"
+#include "gpu/ipc/common/mock_command_buffer.h"
 #include "gpu/ipc/common/mock_gpu_channel.h"
 #include "gpu/ipc/common/surface_handle.h"
 #include "ipc/ipc_test_sink.h"
@@ -83,7 +84,8 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  std::unique_ptr<CommandBufferProxyImpl> CreateAndInitializeProxy() {
+  std::unique_ptr<CommandBufferProxyImpl> CreateAndInitializeProxy(
+      MockCommandBuffer* mock_command_buffer = nullptr) {
     auto proxy = std::make_unique<CommandBufferProxyImpl>(
         channel_, nullptr /* gpu_memory_buffer_manager */, 0 /* stream_id */,
         base::ThreadTaskRunnerHandle::Get());
@@ -91,12 +93,23 @@
     // The Initialize() call below synchronously requests a new CommandBuffer
     // using the channel's GpuControl interface.  Simulate success, since we're
     // not actually talking to the service in these tests.
-    EXPECT_CALL(mock_gpu_channel_, CreateCommandBuffer(_, _, _, _, _))
+    EXPECT_CALL(mock_gpu_channel_, CreateCommandBuffer(_, _, _, _, _, _, _))
         .Times(1)
         .WillOnce(Invoke(
             [&](mojom::CreateCommandBufferParamsPtr params, int32_t routing_id,
                 base::UnsafeSharedMemoryRegion shared_state,
+                mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver,
+                mojo::PendingAssociatedRemote<mojom::CommandBufferClient>
+                    client,
                 ContextResult* result, Capabilities* capabilities) -> bool {
+              // There's no real GpuChannel pipe for this endpoint to use, so
+              // give it its own dedicated pipe for these tests. This allows the
+              // CommandBufferProxyImpl to make calls on its CommandBuffer
+              // endpoint, which will send them to `mock_command_buffer` if
+              // provided by the test.
+              receiver.EnableUnassociatedUsage();
+              if (mock_command_buffer)
+                mock_command_buffer->Bind(std::move(receiver));
               *result = ContextResult::kSuccess;
               return true;
             }));
diff --git a/gpu/ipc/client/gpu_channel_host.h b/gpu/ipc/client/gpu_channel_host.h
index 89b3b5a..e5d28cba 100644
--- a/gpu/ipc/client/gpu_channel_host.h
+++ b/gpu/ipc/client/gpu_channel_host.h
@@ -78,6 +78,10 @@
 
   int channel_id() const { return channel_id_; }
 
+  const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner() {
+    return io_thread_;
+  }
+
   // Virtual for testing.
   virtual mojom::GpuChannel& GetGpuChannel();
 
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn
index 84b67de2..4c75bd45 100644
--- a/gpu/ipc/common/BUILD.gn
+++ b/gpu/ipc/common/BUILD.gn
@@ -740,6 +740,8 @@
 source_set("test_support") {
   testonly = true
   sources = [
+    "mock_command_buffer.cc",
+    "mock_command_buffer.h",
     "mock_gpu_channel.cc",
     "mock_gpu_channel.h",
   ]
diff --git a/gpu/ipc/common/gpu_channel.mojom b/gpu/ipc/common/gpu_channel.mojom
index 20f5e88..9805e7c 100644
--- a/gpu/ipc/common/gpu_channel.mojom
+++ b/gpu/ipc/common/gpu_channel.mojom
@@ -150,7 +150,9 @@
   // will create an offscreen backbuffer of dimensions `size`.
   [Sync, NoInterrupt] CreateCommandBuffer(
       CreateCommandBufferParams params, int32 routing_id,
-      mojo_base.mojom.UnsafeSharedMemoryRegion shared_state)
+      mojo_base.mojom.UnsafeSharedMemoryRegion shared_state,
+      pending_associated_receiver<CommandBuffer> receiver,
+      pending_associated_remote<CommandBufferClient> client)
       => (ContextResult result, Capabilities capabilties);
 
   // The CommandBufferProxy sends this to the CommandBufferStub in its
@@ -198,6 +200,24 @@
       => (CommandBufferState state);
 };
 
+// Interface used to issue commands to a specific CommandBuffer instance in the
+// GPU process.
+interface CommandBuffer {
+  // Sets the shared memory buffer to use for commands. The ID given here must
+  // correspond to one registered by a prior RegisterTransferBuffer IPC to the
+  // same CommandBuffer.
+  SetGetBuffer(int32 shm_id);
+};
+
+// Interface used by the GPU process to send the client messages from a specific
+// CommandBuffer instance.
+interface CommandBufferClient {
+  // Notifies the client about a console message emitted on behalf of the
+  // command buffer. These messages are intended to be exposed by
+  // developer-facing UI such as the DevTools console.
+  OnConsoleMessage(string message);
+};
+
 // DeferredRequests are batched locally by clients and sent to the service only
 // when flushing the channel via GpuChannelHost's EnsureFlush or VerifyFlush.
 struct DeferredRequest {
diff --git a/gpu/ipc/common/gpu_messages.h b/gpu/ipc/common/gpu_messages.h
index 5947435..2b023cb 100644
--- a/gpu/ipc/common/gpu_messages.h
+++ b/gpu/ipc/common/gpu_messages.h
@@ -58,11 +58,6 @@
 
 #define IPC_MESSAGE_START GpuChannelMsgStart
 
-IPC_STRUCT_BEGIN(GPUCommandBufferConsoleMessage)
-  IPC_STRUCT_MEMBER(int32_t, id)
-  IPC_STRUCT_MEMBER(std::string, message)
-IPC_STRUCT_END()
-
 IPC_STRUCT_BEGIN(GpuCommandBufferMsg_CreateImage_Params)
   IPC_STRUCT_MEMBER(int32_t, id)
   IPC_STRUCT_MEMBER(gfx::GpuMemoryBufferHandle, gpu_memory_buffer)
@@ -139,13 +134,6 @@
 // These are messages between a renderer process to the GPU process relating to
 // a single OpenGL context.
 
-// Sets the shared memory buffer used for commands.
-IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_SetGetBuffer, int32_t /* shm_id */)
-
-// Sent by the GPU process to display messages in the console.
-IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_ConsoleMsg,
-                    GPUCommandBufferConsoleMessage /* msg */)
-
 // Sent by the GPU process to notify the renderer process of a GPU switch.
 IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_GpuSwitched,
                     gl::GpuPreference /* active_gpu_heuristic */)
diff --git a/gpu/ipc/common/mock_command_buffer.cc b/gpu/ipc/common/mock_command_buffer.cc
new file mode 100644
index 0000000..9df19a7b
--- /dev/null
+++ b/gpu/ipc/common/mock_command_buffer.cc
@@ -0,0 +1,18 @@
+// 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 "gpu/ipc/common/mock_command_buffer.h"
+
+namespace gpu {
+
+MockCommandBuffer::MockCommandBuffer() = default;
+
+MockCommandBuffer::~MockCommandBuffer() = default;
+
+void MockCommandBuffer::Bind(
+    mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver) {
+  receiver_.Bind(std::move(receiver));
+}
+
+}  // namespace gpu
diff --git a/gpu/ipc/common/mock_command_buffer.h b/gpu/ipc/common/mock_command_buffer.h
new file mode 100644
index 0000000..4b331fd
--- /dev/null
+++ b/gpu/ipc/common/mock_command_buffer.h
@@ -0,0 +1,30 @@
+// 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 GPU_IPC_COMMON_MOCK_COMMAND_BUFFER_H_
+#define GPU_IPC_COMMON_MOCK_COMMAND_BUFFER_H_
+
+#include "gpu/ipc/common/gpu_channel.mojom.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace gpu {
+
+class MockCommandBuffer : public mojom::CommandBuffer {
+ public:
+  MockCommandBuffer();
+  ~MockCommandBuffer() override;
+
+  void Bind(mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver);
+
+  // mojom::CommandBuffer:
+  MOCK_METHOD1(SetGetBuffer, void(int32_t));
+
+ private:
+  mojo::AssociatedReceiver<mojom::CommandBuffer> receiver_{this};
+};
+
+}  // namespace gpu
+
+#endif  // GPU_IPC_COMMON_MOCK_COMMAND_BUFFER_H_
diff --git a/gpu/ipc/common/mock_gpu_channel.h b/gpu/ipc/common/mock_gpu_channel.h
index 1611427..7d0620b9 100644
--- a/gpu/ipc/common/mock_gpu_channel.h
+++ b/gpu/ipc/common/mock_gpu_channel.h
@@ -20,15 +20,19 @@
   MOCK_METHOD0(TerminateForTesting, void());
   MOCK_METHOD0(Flush, bool());
   MOCK_METHOD1(Flush, void(FlushCallback));
-  MOCK_METHOD4(CreateCommandBuffer,
+  MOCK_METHOD6(CreateCommandBuffer,
                void(mojom::CreateCommandBufferParamsPtr,
                     int32_t,
                     base::UnsafeSharedMemoryRegion,
+                    mojo::PendingAssociatedReceiver<mojom::CommandBuffer>,
+                    mojo::PendingAssociatedRemote<mojom::CommandBufferClient>,
                     CreateCommandBufferCallback));
-  MOCK_METHOD5(CreateCommandBuffer,
+  MOCK_METHOD7(CreateCommandBuffer,
                bool(mojom::CreateCommandBufferParamsPtr,
                     int32_t,
                     base::UnsafeSharedMemoryRegion,
+                    mojo::PendingAssociatedReceiver<mojom::CommandBuffer>,
+                    mojo::PendingAssociatedRemote<mojom::CommandBufferClient>,
                     ContextResult*,
                     Capabilities*));
   MOCK_METHOD1(DestroyCommandBuffer, bool(int32_t));
diff --git a/gpu/ipc/service/command_buffer_stub.cc b/gpu/ipc/service/command_buffer_stub.cc
index 67589b7..9f56d20 100644
--- a/gpu/ipc/service/command_buffer_stub.cc
+++ b/gpu/ipc/service/command_buffer_stub.cc
@@ -28,6 +28,7 @@
 #include "gpu/command_buffer/service/memory_tracking.h"
 #include "gpu/command_buffer/service/query_manager.h"
 #include "gpu/command_buffer/service/scheduler.h"
+#include "gpu/command_buffer/service/scheduler_task_runner.h"
 #include "gpu/command_buffer/service/service_utils.h"
 #include "gpu/command_buffer/service/sync_point_manager.h"
 #include "gpu/config/gpu_crash_keys.h"
@@ -37,6 +38,7 @@
 #include "gpu/ipc/service/gpu_channel_manager_delegate.h"
 #include "gpu/ipc/service/gpu_watchdog_thread.h"
 #include "gpu/ipc/service/image_transport_surface.h"
+#include "ipc/ipc_mojo_bootstrap.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image.h"
@@ -50,6 +52,7 @@
 #endif
 
 namespace gpu {
+
 struct WaitForCommandState {
   using Callback = CommandBufferStub::WaitForStateCallback;
 
@@ -115,6 +118,9 @@
       use_virtualized_gl_context_(false),
       command_buffer_id_(command_buffer_id),
       sequence_id_(sequence_id),
+      scheduler_task_runner_(
+          base::MakeRefCounted<SchedulerTaskRunner>(*channel_->scheduler(),
+                                                    sequence_id_)),
       stream_id_(stream_id),
       route_id_(route_id),
       last_flush_id_(0),
@@ -187,7 +193,6 @@
   // handler can assume that the context is current (not necessary for
   // RetireSyncPoint or WaitSyncPoint).
   if (decoder_context_.get() &&
-      message.type() != GpuCommandBufferMsg_SetGetBuffer::ID &&
       message.type() != GpuCommandBufferMsg_RegisterTransferBuffer::ID &&
       message.type() != GpuCommandBufferMsg_SignalSyncToken::ID &&
       message.type() != GpuCommandBufferMsg_SignalQuery::ID) {
@@ -201,7 +206,6 @@
   if (!handled) {
     handled = true;
     IPC_BEGIN_MESSAGE_MAP(CommandBufferStub, message)
-      IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SetGetBuffer, OnSetGetBuffer);
       IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RegisterTransferBuffer,
                           OnRegisterTransferBuffer);
       IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalSyncToken,
@@ -289,7 +293,7 @@
 
 bool CommandBufferStub::HasUnprocessedCommands() {
   if (command_buffer_) {
-    CommandBuffer::State state = command_buffer_->GetState();
+    gpu::CommandBuffer::State state = command_buffer_->GetState();
     return command_buffer_->put_offset() != state.get_offset &&
            !error::IsError(state.error);
   }
@@ -358,11 +362,11 @@
   crash_keys::gpu_gl_context_is_virtual.Set(use_virtualized_gl_context_ ? "1"
                                                                         : "0");
   if (wait_for_token_) {
-    std::move(wait_for_token_->callback).Run(CommandBuffer::State());
+    std::move(wait_for_token_->callback).Run(gpu::CommandBuffer::State());
     wait_for_token_.reset();
   }
   if (wait_for_get_offset_) {
-    std::move(wait_for_get_offset_->callback).Run(CommandBuffer::State());
+    std::move(wait_for_get_offset_->callback).Run(gpu::CommandBuffer::State());
     wait_for_get_offset_.reset();
   }
 
@@ -413,12 +417,27 @@
   }
 
   command_buffer_.reset();
+
+  scheduler_task_runner_->ShutDown();
+
+  // Note: `receiver_` runs tasks on `scheduler_task_runner_`, which is not the
+  // current task runner when this method runs. Hence we must use this unsafe
+  // reset to elide sequence safety checks. Its safety is guaranteed by the
+  // above ShutDown() call which ensures no further tasks will run on the
+  // sequence.
+  receiver_.ResetFromAnotherSequenceUnsafe();
+  client_.reset();
 }
 
-void CommandBufferStub::OnSetGetBuffer(int32_t shm_id) {
-  TRACE_EVENT0("gpu", "CommandBufferStub::OnSetGetBuffer");
-  if (command_buffer_)
+void CommandBufferStub::SetGetBuffer(int32_t shm_id) {
+  TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "GPUTask",
+               "data", DevToolsChannelData::CreateForChannel(channel()));
+  UpdateActiveUrl();
+  TRACE_EVENT0("gpu", "CommandBufferStub::SetGetBuffer");
+  if (command_buffer_) {
     command_buffer_->SetGetBuffer(shm_id);
+    CheckCompleteWaits();
+  }
 }
 
 CommandBufferServiceClient::CommandBatchProcessedResult
@@ -433,7 +452,7 @@
 void CommandBufferStub::OnParseError() {
   TRACE_EVENT0("gpu", "CommandBufferStub::OnParseError");
   DCHECK(command_buffer_.get());
-  CommandBuffer::State state = command_buffer_->GetState();
+  gpu::CommandBuffer::State state = command_buffer_->GetState();
   IPC::Message* msg = new GpuCommandBufferMsg_Destroyed(
       route_id_, state.context_lost_reason, state.error);
   msg->set_unblock(true);
@@ -493,10 +512,10 @@
 void CommandBufferStub::CheckCompleteWaits() {
   bool has_wait = wait_for_token_ || wait_for_get_offset_;
   if (has_wait) {
-    CommandBuffer::State state = command_buffer_->GetState();
+    gpu::CommandBuffer::State state = command_buffer_->GetState();
     if (wait_for_token_ &&
-        (CommandBuffer::InRange(wait_for_token_->start, wait_for_token_->end,
-                                state.token) ||
+        (gpu::CommandBuffer::InRange(wait_for_token_->start,
+                                     wait_for_token_->end, state.token) ||
          state.error != error::kNoError)) {
       ReportState();
       std::move(wait_for_token_->callback).Run(state);
@@ -504,9 +523,9 @@
     }
     if (wait_for_get_offset_ &&
         (((wait_set_get_buffer_count_ == state.set_get_buffer_count) &&
-          CommandBuffer::InRange(wait_for_get_offset_->start,
-                                 wait_for_get_offset_->end,
-                                 state.get_offset)) ||
+          gpu::CommandBuffer::InRange(wait_for_get_offset_->start,
+                                      wait_for_get_offset_->end,
+                                      state.get_offset)) ||
          state.error != error::kNoError)) {
       ReportState();
       std::move(wait_for_get_offset_->callback).Run(state);
@@ -537,7 +556,7 @@
     DCHECK(!sync_point_client_state_->Wait(sync_token, base::DoNothing()));
 
   last_flush_id_ = flush_id;
-  CommandBuffer::State pre_state = command_buffer_->GetState();
+  gpu::CommandBuffer::State pre_state = command_buffer_->GetState();
   UpdateActiveUrl();
 
   {
@@ -548,7 +567,7 @@
     command_buffer_->Flush(put_offset, decoder_context_.get());
   }
 
-  CommandBuffer::State post_state = command_buffer_->GetState();
+  gpu::CommandBuffer::State post_state = command_buffer_->GetState();
 
   if (pre_state.get_offset != post_state.get_offset)
     ReportState();
@@ -600,7 +619,7 @@
 }
 
 void CommandBufferStub::OnSignalAck(uint32_t id) {
-  CommandBuffer::State state = command_buffer_->GetState();
+  gpu::CommandBuffer::State state = command_buffer_->GetState();
   ReportState();
   Send(new GpuCommandBufferMsg_SignalAck(route_id_, id, state));
 }
@@ -652,13 +671,7 @@
 
 void CommandBufferStub::OnConsoleMessage(int32_t id,
                                          const std::string& message) {
-  GPUCommandBufferConsoleMessage console_message;
-  console_message.id = id;
-  console_message.message = message;
-  IPC::Message* msg =
-      new GpuCommandBufferMsg_ConsoleMsg(route_id_, console_message);
-  msg->set_unblock(true);
-  Send(msg);
+  client_->OnConsoleMessage(message);
 }
 
 void CommandBufferStub::CacheShader(const std::string& key,
@@ -692,6 +705,17 @@
   SetOrGetMemoryTrackerFactory(factory);
 }
 
+void CommandBufferStub::BindEndpoints(
+    mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver,
+    mojo::PendingAssociatedRemote<mojom::CommandBufferClient> client) {
+  DCHECK(!receiver_);
+  DCHECK(!client_);
+
+  IPC::ScopedAllowOffSequenceChannelAssociatedBindings allow_binding;
+  receiver_.Bind(std::move(receiver), scheduler_task_runner_);
+  client_.Bind(std::move(client));
+}
+
 MemoryTracker* CommandBufferStub::GetMemoryTracker() const {
   return memory_tracker_.get();
 }
@@ -708,7 +732,7 @@
 
 void CommandBufferStub::CheckContextLost() {
   DCHECK(command_buffer_);
-  CommandBuffer::State state = command_buffer_->GetState();
+  gpu::CommandBuffer::State state = command_buffer_->GetState();
 
   // Check the error reason and robustness extension to get a better idea if the
   // GL context was lost. We might try restarting the GPU process to recover
diff --git a/gpu/ipc/service/command_buffer_stub.h b/gpu/ipc/service/command_buffer_stub.h
index a355c61..e0f820e3 100644
--- a/gpu/ipc/service/command_buffer_stub.h
+++ b/gpu/ipc/service/command_buffer_stub.h
@@ -33,6 +33,8 @@
 #include "gpu/ipc/service/gpu_ipc_service_export.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_sender.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/swap_result.h"
@@ -47,13 +49,23 @@
 struct SyncToken;
 struct WaitForCommandState;
 class GpuChannel;
+class SchedulerTaskRunner;
 class SyncPointClientState;
 
+// CommandBufferStub is a base class for different CommandBuffer backends
+// (e.g. GLES2, Raster, WebGPU) within the GPU service. Each instance lives on
+// the main thread and receives IPCs there, either dispatched to the default
+// main thread TaskRunner, or a specific main-thread sequence on the GPU
+// Scheduler.
+//
+// For every CommandBufferStub instance, there's a corresponding
+// CommandBufferProxyImpl client.
 class GPU_IPC_SERVICE_EXPORT CommandBufferStub
     : public IPC::Listener,
       public IPC::Sender,
       public CommandBufferServiceClient,
       public DecoderClient,
+      public mojom::CommandBuffer,
       public base::SupportsWeakPtr<CommandBufferStub> {
  public:
   class DestructionObserver {
@@ -84,6 +96,11 @@
       const mojom::CreateCommandBufferParams& params,
       base::UnsafeSharedMemoryRegion shared_state_shm) = 0;
 
+  // Establish Mojo bindings for the receiver and client endpoints.
+  void BindEndpoints(
+      mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver,
+      mojo::PendingAssociatedRemote<mojom::CommandBufferClient> client);
+
   MemoryTracker* GetMemoryTracker() const;
   virtual MemoryTracker* GetContextGroupMemoryTracker() const = 0;
 
@@ -96,7 +113,7 @@
   // `callback` is invoked with the last known State once this occurs, or with
   // an invalid State if the CommandBuffer is destroyed first.
   using WaitForStateCallback =
-      base::OnceCallback<void(const CommandBuffer::State&)>;
+      base::OnceCallback<void(const gpu::CommandBuffer::State&)>;
   void WaitForTokenInRange(int32_t start,
                            int32_t end,
                            WaitForStateCallback callback);
@@ -167,6 +184,9 @@
   scoped_refptr<gl::GLShareGroup> share_group() { return share_group_; }
 
  protected:
+  // mojom::CommandBuffer:
+  void SetGetBuffer(int32_t shm_id) override;
+
   virtual bool HandleMessage(const IPC::Message& message) = 0;
   virtual void OnTakeFrontBuffer(const Mailbox& mailbox) {}
   virtual void OnReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) {}
@@ -209,6 +229,7 @@
 
   const CommandBufferId command_buffer_id_;
   const SequenceId sequence_id_;
+  const scoped_refptr<SchedulerTaskRunner> scheduler_task_runner_;
   const int32_t stream_id_;
   const int32_t route_id_;
 
@@ -220,7 +241,6 @@
   gles2::ProgramCache::ScopedCacheUse CreateCacheUse();
 
   // Message handlers:
-  void OnSetGetBuffer(int32_t shm_id);
   void OnGetState(IPC::Message* reply_message);
   void OnAsyncFlush(int32_t put_offset,
                     uint32_t flush_id,
@@ -276,6 +296,9 @@
   std::unique_ptr<WaitForCommandState> wait_for_get_offset_;
   uint32_t wait_set_get_buffer_count_;
 
+  mojo::AssociatedReceiver<mojom::CommandBuffer> receiver_{this};
+  mojo::AssociatedRemote<mojom::CommandBufferClient> client_;
+
   DISALLOW_COPY_AND_ASSIGN(CommandBufferStub);
 };
 
diff --git a/gpu/ipc/service/gpu_channel.cc b/gpu/ipc/service/gpu_channel.cc
index 69bcfd5..28493f1 100644
--- a/gpu/ipc/service/gpu_channel.cc
+++ b/gpu/ipc/service/gpu_channel.cc
@@ -145,10 +145,13 @@
   void CrashForTesting() override;
   void TerminateForTesting() override;
   void Flush(FlushCallback callback) override;
-  void CreateCommandBuffer(mojom::CreateCommandBufferParamsPtr config,
-                           int32_t routing_id,
-                           base::UnsafeSharedMemoryRegion shared_state,
-                           CreateCommandBufferCallback callback) override;
+  void CreateCommandBuffer(
+      mojom::CreateCommandBufferParamsPtr config,
+      int32_t routing_id,
+      base::UnsafeSharedMemoryRegion shared_state,
+      mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver,
+      mojo::PendingAssociatedRemote<mojom::CommandBufferClient> client,
+      CreateCommandBufferCallback callback) override;
   void DestroyCommandBuffer(int32_t routing_id,
                             DestroyCommandBufferCallback callback) override;
   void ScheduleImageDecode(mojom::ScheduleImageDecodeParamsPtr params,
@@ -411,6 +414,8 @@
     mojom::CreateCommandBufferParamsPtr params,
     int32_t routing_id,
     base::UnsafeSharedMemoryRegion shared_state,
+    mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver,
+    mojo::PendingAssociatedRemote<mojom::CommandBufferClient> client,
     CreateCommandBufferCallback callback) {
   base::AutoLock auto_lock(gpu_channel_lock_);
   if (!gpu_channel_) {
@@ -422,7 +427,8 @@
       FROM_HERE,
       base::BindOnce(&gpu::GpuChannel::CreateCommandBuffer,
                      gpu_channel_->AsWeakPtr(), std::move(params), routing_id,
-                     std::move(shared_state),
+                     std::move(shared_state), std::move(receiver),
+                     std::move(client),
                      base::BindPostTask(base::ThreadTaskRunnerHandle::Get(),
                                         std::move(callback))));
 }
@@ -847,6 +853,8 @@
     mojom::CreateCommandBufferParamsPtr init_params,
     int32_t route_id,
     base::UnsafeSharedMemoryRegion shared_state_shm,
+    mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver,
+    mojo::PendingAssociatedRemote<mojom::CommandBufferClient> client,
     mojom::GpuChannel::CreateCommandBufferCallback callback) {
   ScopedCreateCommandBufferResponder responder(std::move(callback));
   TRACE_EVENT2("gpu", "GpuChannel::CreateCommandBuffer", "route_id", route_id,
@@ -944,6 +952,8 @@
     return;
   }
 
+  stub->BindEndpoints(std::move(receiver), std::move(client));
+
   responder.set_result(ContextResult::kSuccess);
   responder.set_capabilities(stub->decoder_context()->GetCapabilities());
   stubs_[route_id] = std::move(stub);
diff --git a/gpu/ipc/service/gpu_channel.h b/gpu/ipc/service/gpu_channel.h
index c821f92c..002b64c7 100644
--- a/gpu/ipc/service/gpu_channel.h
+++ b/gpu/ipc/service/gpu_channel.h
@@ -192,6 +192,8 @@
       mojom::CreateCommandBufferParamsPtr init_params,
       int32_t routing_id,
       base::UnsafeSharedMemoryRegion shared_state_shm,
+      mojo::PendingAssociatedReceiver<mojom::CommandBuffer> receiver,
+      mojo::PendingAssociatedRemote<mojom::CommandBufferClient> client,
       mojom::GpuChannel::CreateCommandBufferCallback callback);
   void DestroyCommandBuffer(int32_t routing_id);
   bool CreateStreamTexture(int32_t stream_id);
diff --git a/gpu/ipc/service/gpu_channel_test_common.cc b/gpu/ipc/service/gpu_channel_test_common.cc
index 672863a0..e89c947 100644
--- a/gpu/ipc/service/gpu_channel_test_common.cc
+++ b/gpu/ipc/service/gpu_channel_test_common.cc
@@ -20,6 +20,8 @@
 #include "gpu/ipc/service/gpu_channel.h"
 #include "gpu/ipc/service/gpu_channel_manager.h"
 #include "gpu/ipc/service/gpu_channel_manager_delegate.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
 #include "ui/gl/init/gl_factory.h"
 #include "ui/gl/test/gl_surface_test_support.h"
 #include "url/gurl.h"
@@ -126,8 +128,12 @@
     Capabilities* out_capabilities) {
   base::RunLoop loop;
   auto quit = loop.QuitClosure();
+  mojo::PendingAssociatedRemote<mojom::CommandBuffer> remote;
+  mojo::PendingAssociatedRemote<mojom::CommandBufferClient> client;
+  ignore_result(client.InitWithNewEndpointAndPassReceiver());
   channel.CreateCommandBuffer(
       std::move(init_params), routing_id, std::move(shared_state),
+      remote.InitWithNewEndpointAndPassReceiver(), std::move(client),
       base::BindLambdaForTesting(
           [&](ContextResult result, const Capabilities& capabilities) {
             *out_result = result;
diff --git a/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc b/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc
index ae11064..e939c3fd 100644
--- a/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc
+++ b/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc
@@ -325,7 +325,10 @@
         channel->LookupCommandBuffer(kCommandBufferRouteId);
     ASSERT_TRUE(command_buffer);
 
-    // Make sure there are no pending tasks before starting the test.
+    // Make sure there are no pending tasks before starting the test. Command
+    // buffer creation creates some throw-away Mojo endpoints that will post
+    // some tasks.
+    base::RunLoop().RunUntilIdle();
     ASSERT_TRUE(task_environment().MainThreadIsIdle());
   }
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index c86e32c..4d7c40cd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -211,7 +211,7 @@
 <translation id="3157387275655328056">إضافة إلى قائمة القراءة</translation>
 <translation id="3157684681743766797">وضع علامة على الكل...</translation>
 <translation id="3161291298470460782">‏سيؤدي هذا الإجراء إلى تسجيل الخروج من حسابك على Chrome وإيقاف المزامنة ومحو جميع بيانات Chrome من هذا الجهاز. وستظل البيانات المتزامنة في حسابك على Google.</translation>
-<translation id="3169472444629675720">Discover</translation>
+<translation id="3169472444629675720">اقتراحات</translation>
 <translation id="3175081911749765310">خدمات الويب</translation>
 <translation id="3178650076442119961">نشط اليوم</translation>
 <translation id="3181825792072797598">تفعيل المزامنة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index e78408a0..18f8b60 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -415,7 +415,7 @@
 <translation id="5295239312320826323">Вилучити обліковий запис <ph name="USER_EMAIL" />?</translation>
 <translation id="5300589172476337783">Показати</translation>
 <translation id="5317780077021120954">Зберегти</translation>
-<translation id="5327248766486351172">Назва</translation>
+<translation id="5327248766486351172">Ім’я</translation>
 <translation id="5339316356165661760">Увімкнути синхронізацію</translation>
 <translation id="5360976571138293719">Інші налаштування конфіденційності, безпеки та збору даних доступні в розділі <ph name="BEGIN_LINK" />Сервіси Google<ph name="END_LINK" />.</translation>
 <translation id="5388358297987318779">Відкрити зображення</translation>
diff --git a/ios/chrome/browser/signin/signin_browser_state_info_updater_unittest.mm b/ios/chrome/browser/signin/signin_browser_state_info_updater_unittest.mm
index 4adff8f..60bd04be 100644
--- a/ios/chrome/browser/signin/signin_browser_state_info_updater_unittest.mm
+++ b/ios/chrome/browser/signin/signin_browser_state_info_updater_unittest.mm
@@ -103,8 +103,8 @@
       browser_state_info()->BrowserStateIsAuthenticatedAtIndex(cache_index));
 
   // Signin.
-  AccountInfo account_info =
-      identity_test_env()->MakePrimaryAccountAvailable(kEmail);
+  AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+      kEmail, signin::ConsentLevel::kSync);
 
   EXPECT_TRUE(
       browser_state_info()->BrowserStateIsAuthenticatedAtIndex(cache_index));
@@ -129,8 +129,8 @@
       browser_state_info()->BrowserStateIsAuthenticatedAtIndex(cache_index));
 
   // Signin.
-  AccountInfo account_info =
-      identity_test_env()->MakePrimaryAccountAvailable(kEmail);
+  AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+      kEmail, signin::ConsentLevel::kSync);
 
   EXPECT_TRUE(
       browser_state_info()->BrowserStateIsAuthenticatedAtIndex(cache_index));
diff --git a/ios/chrome/browser/sync/sync_service_factory.cc b/ios/chrome/browser/sync/sync_service_factory.cc
index ed009499..fa41cb4d3 100644
--- a/ios/chrome/browser/sync/sync_service_factory.cc
+++ b/ios/chrome/browser/sync/sync_service_factory.cc
@@ -15,9 +15,9 @@
 #include "components/network_time/network_time_tracker.h"
 #include "components/policy/core/common/policy_map.h"
 #include "components/sync/base/sync_util.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
@@ -94,18 +94,18 @@
 }
 
 // static
-syncer::ProfileSyncService*
-SyncServiceFactory::GetAsProfileSyncServiceForBrowserState(
+syncer::SyncServiceImpl*
+SyncServiceFactory::GetAsSyncServiceImplForBrowserState(
     ChromeBrowserState* browser_state) {
-  return static_cast<syncer::ProfileSyncService*>(
+  return static_cast<syncer::SyncServiceImpl*>(
       GetForBrowserState(browser_state));
 }
 
 // static
-syncer::ProfileSyncService*
-SyncServiceFactory::GetAsProfileSyncServiceForBrowserStateIfExists(
+syncer::SyncServiceImpl*
+SyncServiceFactory::GetAsSyncServiceImplForBrowserStateIfExists(
     ChromeBrowserState* browser_state) {
-  return static_cast<syncer::ProfileSyncService*>(
+  return static_cast<syncer::SyncServiceImpl*>(
       GetForBrowserStateIfExists(browser_state));
 }
 
@@ -153,10 +153,10 @@
   // startup once bug has been fixed.
   ios::AboutSigninInternalsFactory::GetForBrowserState(browser_state);
 
-  syncer::ProfileSyncService::InitParams init_params;
+  syncer::SyncServiceImpl::InitParams init_params;
   init_params.identity_manager =
       IdentityManagerFactory::GetForBrowserState(browser_state);
-  init_params.start_behavior = syncer::ProfileSyncService::MANUAL_START;
+  init_params.start_behavior = syncer::SyncServiceImpl::MANUAL_START;
   init_params.sync_client =
       std::make_unique<IOSChromeSyncClient>(browser_state);
   init_params.network_time_update_callback =
@@ -170,14 +170,14 @@
   init_params.policy_service =
       policy_connector ? policy_connector->GetPolicyService() : nullptr;
 
-  auto pss =
-      std::make_unique<syncer::ProfileSyncService>(std::move(init_params));
-  pss->Initialize();
+  auto sync_service =
+      std::make_unique<syncer::SyncServiceImpl>(std::move(init_params));
+  sync_service->Initialize();
 
-  // Hook PSS into PersonalDataManager (a circular dependency).
+  // Hook |sync_service| into PersonalDataManager (a circular dependency).
   autofill::PersonalDataManager* pdm =
       autofill::PersonalDataManagerFactory::GetForBrowserState(browser_state);
-  pdm->OnSyncServiceInitialized(pss.get());
+  pdm->OnSyncServiceInitialized(sync_service.get());
 
-  return pss;
+  return sync_service;
 }
diff --git a/ios/chrome/browser/sync/sync_service_factory.h b/ios/chrome/browser/sync/sync_service_factory.h
index 8672f58..f048b17a 100644
--- a/ios/chrome/browser/sync/sync_service_factory.h
+++ b/ios/chrome/browser/sync/sync_service_factory.h
@@ -14,7 +14,7 @@
 class ChromeBrowserState;
 
 namespace syncer {
-class ProfileSyncService;
+class SyncServiceImpl;
 class SyncService;
 }  // namespace syncer
 
@@ -28,11 +28,10 @@
   static syncer::SyncService* GetForBrowserStateIfExists(
       ChromeBrowserState* browser_state);
 
-  static syncer::ProfileSyncService* GetAsProfileSyncServiceForBrowserState(
+  static syncer::SyncServiceImpl* GetAsSyncServiceImplForBrowserState(
       ChromeBrowserState* browser_state);
 
-  static syncer::ProfileSyncService*
-  GetAsProfileSyncServiceForBrowserStateIfExists(
+  static syncer::SyncServiceImpl* GetAsSyncServiceImplForBrowserStateIfExists(
       ChromeBrowserState* browser_state);
 
   static SyncServiceFactory* GetInstance();
diff --git a/ios/chrome/browser/sync/sync_service_factory_unittest.cc b/ios/chrome/browser/sync/sync_service_factory_unittest.cc
index 99d0cfc..89ca26a0 100644
--- a/ios/chrome/browser/sync/sync_service_factory_unittest.cc
+++ b/ios/chrome/browser/sync/sync_service_factory_unittest.cc
@@ -14,8 +14,8 @@
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/pref_names.h"
 #include "components/sync/driver/data_type_controller.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #include "ios/chrome/browser/favicon/favicon_service_factory.h"
 #include "ios/web/public/test/web_task_environment.h"
@@ -120,8 +120,8 @@
 // Verify that a normal (no command line flags) PSS can be created and
 // properly initialized.
 TEST_F(SyncServiceFactoryTest, CreatePSSDefault) {
-  syncer::ProfileSyncService* sync_service =
-      SyncServiceFactory::GetAsProfileSyncServiceForBrowserState(
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForBrowserState(
           chrome_browser_state());
   syncer::ModelTypeSet types = sync_service->GetRegisteredDataTypesForTest();
   EXPECT_EQ(DefaultDatatypesCount(), types.Size());
@@ -133,8 +133,8 @@
 TEST_F(SyncServiceFactoryTest, CreatePSSDisableOne) {
   syncer::ModelTypeSet disabled_types(syncer::AUTOFILL);
   SetDisabledTypes(disabled_types);
-  syncer::ProfileSyncService* sync_service =
-      SyncServiceFactory::GetAsProfileSyncServiceForBrowserState(
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForBrowserState(
           chrome_browser_state());
   syncer::ModelTypeSet types = sync_service->GetRegisteredDataTypesForTest();
   EXPECT_EQ(DefaultDatatypesCount() - disabled_types.Size(), types.Size());
@@ -147,8 +147,8 @@
   syncer::ModelTypeSet disabled_types(syncer::AUTOFILL_PROFILE,
                                       syncer::BOOKMARKS);
   SetDisabledTypes(disabled_types);
-  syncer::ProfileSyncService* sync_service =
-      SyncServiceFactory::GetAsProfileSyncServiceForBrowserState(
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForBrowserState(
           chrome_browser_state());
   syncer::ModelTypeSet types = sync_service->GetRegisteredDataTypesForTest();
   EXPECT_EQ(DefaultDatatypesCount() - disabled_types.Size(), types.Size());
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
index 113c6dfa..9739930 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
@@ -257,13 +257,11 @@
 
 void ChromeAutofillClientIOS::ConfirmAccountNameFixFlow(
     base::OnceCallback<void(const std::u16string&)> callback) {
-  absl::optional<AccountInfo> primary_account_info =
-      identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager_->GetPrimaryAccountInfo(
-              signin::ConsentLevel::kSync));
-  std::u16string account_name =
-      primary_account_info ? base::UTF8ToUTF16(primary_account_info->full_name)
-                           : std::u16string();
+  std::u16string account_name = base::UTF8ToUTF16(
+      identity_manager_
+          ->FindExtendedAccountInfo(identity_manager_->GetPrimaryAccountInfo(
+              signin::ConsentLevel::kSync))
+          .full_name);
 
   card_name_fix_flow_controller_.Show(
       // CardNameFixFlowViewBridge manages its own lifetime, so
diff --git a/ios/chrome/browser/ui/default_promo/BUILD.gn b/ios/chrome/browser/ui/default_promo/BUILD.gn
index ba3aeb9..1d0e29ef 100644
--- a/ios/chrome/browser/ui/default_promo/BUILD.gn
+++ b/ios/chrome/browser/ui/default_promo/BUILD.gn
@@ -102,9 +102,16 @@
     "//ios/chrome/app/strings:ios_google_chrome_strings_grit",
     "//ios/chrome/app/strings:ios_strings_grit",
     "//ios/chrome/browser/browser_state:test_support",
+    "//ios/chrome/browser/infobars",
+    "//ios/chrome/browser/infobars/test",
     "//ios/chrome/browser/main:test_support",
+    "//ios/chrome/browser/overlays",
+    "//ios/chrome/browser/overlays/public/common/infobars",
+    "//ios/chrome/browser/overlays/test",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/commands:commands",
+    "//ios/chrome/browser/ui/main:scene_state_header",
+    "//ios/chrome/browser/ui/main:scene_state_header",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/browser/web_state_list:test_support",
     "//ios/web/public/test/fakes",
diff --git a/ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_scheduler_unittest.mm b/ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_scheduler_unittest.mm
index ba559933..9685eadd 100644
--- a/ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_scheduler_unittest.mm
+++ b/ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_scheduler_unittest.mm
@@ -5,16 +5,29 @@
 #import "ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_scheduler.h"
 
 #include "base/ios/ios_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#include "ios/chrome/browser/infobars/infobar_ios.h"
+#include "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#import "ios/chrome/browser/infobars/test/fake_infobar_ios.h"
 #import "ios/chrome/browser/main/test_browser.h"
+#import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay_request_config.h"
+#import "ios/chrome/browser/overlays/public/overlay_presenter.h"
+#import "ios/chrome/browser/overlays/public/overlay_request.h"
+#import "ios/chrome/browser/overlays/public/overlay_request_queue.h"
+#include "ios/chrome/browser/overlays/test/fake_overlay_presentation_context.h"
+#import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_commands.h"
+#import "ios/chrome/browser/ui/default_promo/default_browser_utils.h"
+#import "ios/chrome/browser/ui/main/scene_state.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_opener.h"
+#import "ios/web/public/test/fakes/fake_navigation_manager.h"
 #import "ios/web/public/test/fakes/fake_web_state.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/gtest_mac.h"
@@ -33,6 +46,13 @@
   DefaultBrowserPromoNonModalSchedulerTest()
       : web_state_list_(&web_state_list_delegate_) {}
   void SetUp() override {
+    // Turn on instructions because that is easier to unittest.
+    const std::map<std::string, std::string> feature_params = {
+        {"instructions_enabled", "true"},
+    };
+    feature_list_.InitAndEnableFeatureWithParameters(kDefaultPromoNonModal,
+                                                     feature_params);
+
     TestChromeBrowserState::Builder test_cbs_builder;
     std::unique_ptr<TestChromeBrowserState> chrome_browser_state =
         test_cbs_builder.Build();
@@ -40,16 +60,39 @@
     browser_ = std::make_unique<TestBrowser>(chrome_browser_state.get(),
                                              &web_state_list_);
 
+    OverlayPresenter::FromBrowser(browser_.get(),
+                                  OverlayModality::kInfobarBanner)
+        ->SetPresentationContext(&overlay_presentation_context_);
+
     // Add initial web state
     auto web_state = std::make_unique<web::FakeWebState>();
     test_web_state_ = web_state.get();
+    test_web_state_->SetNavigationManager(
+        std::make_unique<web::FakeNavigationManager>());
+    InfoBarManagerImpl::CreateForWebState(test_web_state_);
     web_state_list_.InsertWebState(0, std::move(web_state),
                                    WebStateList::INSERT_ACTIVATE,
                                    WebStateOpener());
 
     ClearUserDefaults();
+
+    promo_commands_handler_ =
+        OCMStrictProtocolMock(@protocol(DefaultBrowserPromoNonModalCommands));
+    [browser_->GetCommandDispatcher()
+        startDispatchingToTarget:promo_commands_handler_
+                     forProtocol:@protocol(
+                                     DefaultBrowserPromoNonModalCommands)];
+
+    scheduler_ = [[DefaultBrowserPromoNonModalScheduler alloc] init];
+    scheduler_.browser = browser_.get();
+    scheduler_.dispatcher = browser_->GetCommandDispatcher();
   }
-  void TearDown() override { ClearUserDefaults(); }
+  void TearDown() override {
+    ClearUserDefaults();
+    OverlayPresenter::FromBrowser(browser_.get(),
+                                  OverlayModality::kInfobarBanner)
+        ->SetPresentationContext(nullptr);
+  }
 
   // Clear NSUserDefault keys used in the class.
   void ClearUserDefaults() {
@@ -65,31 +108,100 @@
 
   base::test::TaskEnvironment task_env_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  base::test::ScopedFeatureList feature_list_;
   web::FakeWebState* test_web_state_;
   FakeWebStateListDelegate web_state_list_delegate_;
   WebStateList web_state_list_;
   std::unique_ptr<Browser> browser_;
+  FakeOverlayPresentationContext overlay_presentation_context_;
+  id promo_commands_handler_;
+  DefaultBrowserPromoNonModalScheduler* scheduler_;
 };
 
 // Tests that the omnibox paste event triggers the promo to show.
 TEST_F(DefaultBrowserPromoNonModalSchedulerTest, TestOmniboxPasteShowsPromo) {
-  // Default promo is not supported on iOS versions < 14.
+  // Default promo is not supported on iOS < 14
   if (!base::ios::IsRunningOnIOS14OrLater()) {
     return;
   }
 
-  id promo_commands_handler =
-      OCMStrictProtocolMock(@protocol(DefaultBrowserPromoNonModalCommands));
-  [browser_->GetCommandDispatcher()
-      startDispatchingToTarget:promo_commands_handler
-                   forProtocol:@protocol(DefaultBrowserPromoNonModalCommands)];
+  [scheduler_ logUserPastedInOmnibox];
 
-  DefaultBrowserPromoNonModalScheduler* scheduler =
-      [[DefaultBrowserPromoNonModalScheduler alloc] init];
-  scheduler.browser = browser_.get();
-  scheduler.dispatcher = browser_->GetCommandDispatcher();
+  // Finish loading the page.
+  test_web_state_->SetLoading(true);
+  test_web_state_->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS);
+  test_web_state_->SetLoading(false);
 
-  [scheduler logUserPastedInOmnibox];
+  // First advance the timer by a small delay. This should not trigger the
+  // promo.
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(1));
+
+  // Then advance the timer by the remaining post-load delay. This should
+  // trigger the promo.
+  [[promo_commands_handler_ expect] showDefaultBrowserNonModalPromo];
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(2));
+
+  [promo_commands_handler_ verify];
+}
+
+// Tests that the entering the app via first party scheme event triggers the
+// promo.
+TEST_F(DefaultBrowserPromoNonModalSchedulerTest,
+       TestFirstPartySchemeShowsPromo) {
+  // Default promo is not supported on iOS < 14
+  if (!base::ios::IsRunningOnIOS14OrLater()) {
+    return;
+  }
+
+  [scheduler_ logUserEnteredAppViaFirstPartyScheme];
+
+  // Finish loading the page.
+  test_web_state_->SetLoading(true);
+  test_web_state_->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS);
+  test_web_state_->SetLoading(false);
+
+  // First advance the timer by a small delay. This should not trigger the
+  // promo.
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(1));
+
+  // Then advance the timer by the remaining post-load delay. This should
+  // trigger the promo.
+  [[promo_commands_handler_ expect] showDefaultBrowserNonModalPromo];
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(2));
+
+  [promo_commands_handler_ verify];
+}
+
+// Tests that the completed share event triggers the promo.
+TEST_F(DefaultBrowserPromoNonModalSchedulerTest, TestShareCompletedShowsPromo) {
+  // Default promo is not supported on iOS < 14
+  if (!base::ios::IsRunningOnIOS14OrLater()) {
+    return;
+  }
+
+  [scheduler_ logUserFinishedActivityFlow];
+
+  // Finish loading the page.
+  test_web_state_->SetLoading(true);
+  test_web_state_->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS);
+  test_web_state_->SetLoading(false);
+
+  // Advance the timer by the post-share delay. This should trigger the promo.
+  [[promo_commands_handler_ expect] showDefaultBrowserNonModalPromo];
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(1));
+
+  [promo_commands_handler_ verify];
+}
+
+// Tests that the promo dismisses automatically after the dismissal time and
+// the event is stored.
+TEST_F(DefaultBrowserPromoNonModalSchedulerTest, TestTimeoutDismissesPromo) {
+  // Default promo is not supported on iOS < 14
+  if (!base::ios::IsRunningOnIOS14OrLater()) {
+    return;
+  }
+
+  [scheduler_ logUserPastedInOmnibox];
 
   // Finish loading the page.
   test_web_state_->SetLoading(true);
@@ -97,10 +209,183 @@
   test_web_state_->SetLoading(false);
 
   // Advance the timer by the post-load delay. This should trigger the promo.
-  [[promo_commands_handler expect] showDefaultBrowserNonModalPromo];
+  [[promo_commands_handler_ expect] showDefaultBrowserNonModalPromo];
   task_env_.FastForwardBy(base::TimeDelta::FromSeconds(3));
 
-  [promo_commands_handler verify];
+  [promo_commands_handler_ verify];
+
+  // Advance the timer by the default dismissal time. This should dismiss the
+  // promo.
+  [[promo_commands_handler_ expect]
+      dismissDefaultBrowserNonModalPromoAnimated:YES];
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(15));
+  [promo_commands_handler_ verify];
+
+  // Check that NSUserDefaults has been updated.
+  EXPECT_EQ(UserInteractionWithNonModalPromoCount(), 1);
+}
+
+// Tests that if the user takes the promo action, that is handled correctly.
+TEST_F(DefaultBrowserPromoNonModalSchedulerTest, TestActionDismissesPromo) {
+  // Default promo is not supported on iOS < 14
+  if (!base::ios::IsRunningOnIOS14OrLater()) {
+    return;
+  }
+
+  [scheduler_ logUserPastedInOmnibox];
+
+  // Finish loading the page.
+  test_web_state_->SetLoading(true);
+  test_web_state_->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS);
+  test_web_state_->SetLoading(false);
+
+  // Advance the timer by the post-load delay. This should trigger the promo.
+  [[promo_commands_handler_ expect] showDefaultBrowserNonModalPromo];
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(3));
+
+  [promo_commands_handler_ verify];
+
+  id settings_commands_handler =
+      OCMStrictProtocolMock(@protocol(ApplicationSettingsCommands));
+  [browser_->GetCommandDispatcher()
+      startDispatchingToTarget:settings_commands_handler
+                   forProtocol:@protocol(ApplicationSettingsCommands)];
+  [[settings_commands_handler expect]
+      showDefaultBrowserSettingsFromViewController:nil];
+  [scheduler_ logUserPerformedPromoAction];
+  [settings_commands_handler verify];
+
+  // Check that NSUserDefaults has been updated.
+  EXPECT_EQ(UserInteractionWithNonModalPromoCount(), 1);
+}
+
+// Tests that if the user switches to a different tab before the post-load timer
+// finishes, the promo does not show.
+TEST_F(DefaultBrowserPromoNonModalSchedulerTest,
+       TestTabSwitchPreventsPromoShown) {
+  // Default promo is not supported on iOS < 14
+  if (!base::ios::IsRunningOnIOS14OrLater()) {
+    return;
+  }
+
+  [scheduler_ logUserPastedInOmnibox];
+
+  // Finish loading the page.
+  test_web_state_->SetLoading(true);
+  test_web_state_->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS);
+  test_web_state_->SetLoading(false);
+
+  // Switch to a new tab.
+  auto web_state = std::make_unique<web::FakeWebState>();
+  test_web_state_ = web_state.get();
+  web_state_list_.InsertWebState(
+      1, std::move(web_state), WebStateList::INSERT_ACTIVATE, WebStateOpener());
+
+  // Advance the timer and the mock handler should not have any interactions.
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(60));
+}
+
+// Tests that if a message is triggered on page load, the promo is not shown.
+TEST_F(DefaultBrowserPromoNonModalSchedulerTest,
+       TestMessagePreventsPromoShown) {
+  // Default promo is not supported on iOS < 14
+  if (!base::ios::IsRunningOnIOS14OrLater()) {
+    return;
+  }
+
+  [scheduler_ logUserPastedInOmnibox];
+
+  // Finish loading the page.
+  test_web_state_->SetLoading(true);
+  test_web_state_->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS);
+  test_web_state_->SetLoading(false);
+
+  InfobarType type = InfobarType::kInfobarTypePasswordSave;
+
+  std::unique_ptr<InfoBarIOS> added_infobar =
+      std::make_unique<FakeInfobarIOS>(type, u"");
+  InfoBarIOS* infobar = added_infobar.get();
+  InfoBarManagerImpl::FromWebState(test_web_state_)
+      ->AddInfoBar(std::move(added_infobar));
+
+  OverlayRequestQueue* queue = OverlayRequestQueue::FromWebState(
+      test_web_state_, OverlayModality::kInfobarBanner);
+
+  // Showing a message will also dismiss any existing promos.
+  [[promo_commands_handler_ expect]
+      dismissDefaultBrowserNonModalPromoAnimated:YES];
+  queue->AddRequest(
+      OverlayRequest::CreateWithConfig<InfobarOverlayRequestConfig>(
+          infobar, InfobarOverlayType::kBanner, infobar->high_priority()));
+
+  [promo_commands_handler_ verify];
+
+  // Advance the timer and the mock handler not have any interaction.
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(60));
+}
+
+// Tests that backgrounding the app with the promo showing hides the promo but
+// does not update the shown promo count.
+TEST_F(DefaultBrowserPromoNonModalSchedulerTest,
+       TestBackgroundingDismissesPromo) {
+  // Default promo is not supported on iOS < 14
+  if (!base::ios::IsRunningOnIOS14OrLater()) {
+    return;
+  }
+
+  [scheduler_ logUserPastedInOmnibox];
+
+  // Finish loading the page.
+  test_web_state_->SetLoading(true);
+  test_web_state_->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS);
+  test_web_state_->SetLoading(false);
+
+  // Advance the timer by the post-load delay. This should trigger the promo.
+  [[promo_commands_handler_ expect] showDefaultBrowserNonModalPromo];
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(3));
+
+  [promo_commands_handler_ verify];
+
+  // Background the app.
+  [[promo_commands_handler_ expect]
+      dismissDefaultBrowserNonModalPromoAnimated:NO];
+  [scheduler_ sceneState:nil
+      transitionedToActivationLevel:SceneActivationLevelBackground];
+  [promo_commands_handler_ verify];
+
+  // Check that NSUserDefaults has not been updated.
+  EXPECT_EQ(UserInteractionWithNonModalPromoCount(), 0);
+}
+
+// Tests that entering the tab grid with the promo showing hides the promo but
+// does not update the shown promo count.
+TEST_F(DefaultBrowserPromoNonModalSchedulerTest, TestTabGridDismissesPromo) {
+  // Default promo is not supported on iOS < 14
+  if (!base::ios::IsRunningOnIOS14OrLater()) {
+    return;
+  }
+
+  [scheduler_ logUserPastedInOmnibox];
+
+  // Finish loading the page.
+  test_web_state_->SetLoading(true);
+  test_web_state_->OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS);
+  test_web_state_->SetLoading(false);
+
+  // Advance the timer by the post-load delay. This should trigger the promo.
+  [[promo_commands_handler_ expect] showDefaultBrowserNonModalPromo];
+  task_env_.FastForwardBy(base::TimeDelta::FromSeconds(3));
+
+  [promo_commands_handler_ verify];
+
+  // Enter the tab grid.
+  [[promo_commands_handler_ expect]
+      dismissDefaultBrowserNonModalPromoAnimated:YES];
+  [scheduler_ logTabGridEntered];
+  [promo_commands_handler_ verify];
+
+  // Check that NSUserDefaults has not been updated.
+  EXPECT_EQ(UserInteractionWithNonModalPromoCount(), 0);
 }
 
 }  // namespace
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm
index 022b015..46e3d95d 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm
@@ -145,7 +145,8 @@
                       BOOL syncCompleted,
                       BOOL hasForeignSessions) {
     if (signedIn) {
-      identity_test_env_.MakePrimaryAccountAvailable("test@test.com");
+      identity_test_env_.MakePrimaryAccountAvailable(
+          "test@test.com", signin::ConsentLevel::kSync);
     } else if (identity_test_env_.identity_manager()->HasPrimaryAccount(
                    signin::ConsentLevel::kSync)) {
       auto* account_mutator =
@@ -163,8 +164,8 @@
             SessionSyncServiceFactory::GetForBrowserState(
                 chrome_browser_state_.get()));
 
-    // Needed by ProfileSyncService's initialization, triggered during
-    // initialization of SyncSetupServiceMock.
+    // Needed by SyncService's initialization, triggered during initialization
+    // of SyncSetupServiceMock.
     ON_CALL(*session_sync_service, GetControllerDelegate())
         .WillByDefault(Return(fake_controller_delegate_.GetWeakPtr()));
     ON_CALL(*session_sync_service, GetGlobalIdMapper())
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate.h b/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate.h
index 343b2383..79feb68 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate.h
+++ b/ios/chrome/browser/ui/settings/sync/utils/sync_error_infobar_delegate.h
@@ -48,7 +48,7 @@
   gfx::Image GetIcon() const override;
   bool Accept() override;
 
-  // ProfileSyncServiceObserver implementation.
+  // syncer::SyncServiceObserver implementation.
   void OnStateChanged(syncer::SyncService* sync) override;
 
  private:
diff --git a/ios/chrome/test/app/signin_test_util.h b/ios/chrome/test/app/signin_test_util.h
index 5e44b080..0ee68bb 100644
--- a/ios/chrome/test/app/signin_test_util.h
+++ b/ios/chrome/test/app/signin_test_util.h
@@ -28,6 +28,9 @@
 // and resets kIosBookmarkPromoAlreadySeen flag for bookmarks.
 void ResetSigninPromoPreferences();
 
+// Resets UserApprovedAccountListManager preferences.
+void ResetUserApprovedAccountListManager();
+
 // Revokes the Sync consent of the primary account. The user will be in the
 // signed-in state.
 void RevokeSyncConsent();
diff --git a/ios/chrome/test/app/signin_test_util.mm b/ios/chrome/test/app/signin_test_util.mm
index 0b43449..2704aef 100644
--- a/ios/chrome/test/app/signin_test_util.mm
+++ b/ios/chrome/test/app/signin_test_util.mm
@@ -119,6 +119,12 @@
   prefs->SetBoolean(prefs::kSigninShouldPromptForSigninAgain, false);
 }
 
+void ResetUserApprovedAccountListManager() {
+  ChromeBrowserState* browser_state = GetOriginalBrowserState();
+  PrefService* prefs = browser_state->GetPrefs();
+  prefs->ClearPref(prefs::kSigninLastAccounts);
+}
+
 void RevokeSyncConsent() {
   ChromeBrowserState* browser_state = GetOriginalBrowserState();
   PrefService* prefs = browser_state->GetPrefs();
diff --git a/ios/chrome/test/app/sync_test_util.h b/ios/chrome/test/app/sync_test_util.h
index 31f0692..92eb87b1 100644
--- a/ios/chrome/test/app/sync_test_util.h
+++ b/ios/chrome/test/app/sync_test_util.h
@@ -18,12 +18,12 @@
 // |SetUpFakeSyncServer()|.
 bool IsFakeSyncServerSetUp();
 
-// Sets up a fake sync server to be used by the ProfileSyncService. Must only be
+// Sets up a fake sync server to be used by the SyncServiceImpl. Must only be
 // called if |IsFakeSyncServerSetUp()| returns false.
 void SetUpFakeSyncServer();
 
-// Tears down the fake sync server used by the ProfileSyncService and restores
-// the real one. Must only be called if |IsFakeSyncServerSetUp()| is true.
+// Tears down the fake sync server used by the SyncServiceImpl and restores the
+// real one. Must only be called if |IsFakeSyncServerSetUp()| is true.
 void TearDownFakeSyncServer();
 
 // Starts the sync server. The server should not be running when calling this.
diff --git a/ios/chrome/test/app/sync_test_util.mm b/ios/chrome/test/app/sync_test_util.mm
index 8c5bc3fb..6870964 100644
--- a/ios/chrome/test/app/sync_test_util.mm
+++ b/ios/chrome/test/app/sync_test_util.mm
@@ -19,8 +19,8 @@
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/metrics/demographics/demographic_metrics_test_utils.h"
 #include "components/sync/base/pref_names.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "components/sync/engine/loopback_server/loopback_server_entity.h"
 #include "components/sync/engine/nigori/key_derivation_params.h"
 #include "components/sync/nigori/nigori_test_utils.h"
@@ -53,15 +53,15 @@
 
 NSString* const kSyncTestErrorDomain = @"SyncTestDomain";
 
-// Overrides the network callback of the current ProfileSyncService with
+// Overrides the network callback of the current SyncServiceImpl with
 // |create_http_post_provider_factory_cb|.
 void OverrideSyncNetwork(const syncer::CreateHttpPostProviderFactory&
                              create_http_post_provider_factory_cb) {
   ChromeBrowserState* browser_state =
       chrome_test_util::GetOriginalBrowserState();
   DCHECK(browser_state);
-  syncer::ProfileSyncService* service =
-      SyncServiceFactory::GetAsProfileSyncServiceForBrowserState(browser_state);
+  syncer::SyncServiceImpl* service =
+      SyncServiceFactory::GetAsSyncServiceImplForBrowserState(browser_state);
   service->OverrideNetworkForTest(create_http_post_provider_factory_cb);
 }
 
@@ -104,8 +104,8 @@
   SyncSetupService* sync_setup_service =
       SyncSetupServiceFactory::GetForBrowserState(browser_state);
   sync_setup_service->SetSyncEnabled(true);
-  syncer::ProfileSyncService* sync_service =
-      SyncServiceFactory::GetAsProfileSyncServiceForBrowserState(browser_state);
+  syncer::SyncServiceImpl* sync_service =
+      SyncServiceFactory::GetAsSyncServiceImplForBrowserState(browser_state);
   sync_service->TriggerPoliciesLoadedForTest();
 }
 
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index 9fdefdcb..7dd32de 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -199,11 +199,11 @@
                      autofillProfileName:(const std::string&)fullName
     WARN_UNUSED_RESULT;
 
-// Sets up a fake sync server to be used by the ProfileSyncService.
+// Sets up a fake sync server to be used by the SyncServiceImpl.
 - (void)setUpFakeSyncServer;
 
-// Tears down the fake sync server used by the ProfileSyncService and restores
-// the real one.
+// Tears down the fake sync server used by the SyncServiceImpl and restores the
+// real one.
 - (void)tearDownFakeSyncServer;
 
 // Gets the number of entities of the given |type|.
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
index 6bf391c4f..cd3f313e 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -369,11 +369,11 @@
 // Whether or not the fake sync server has been setup.
 + (BOOL)isFakeSyncServerSetUp;
 
-// Sets up a fake sync server to be used by the ProfileSyncService.
+// Sets up a fake sync server to be used by the SyncServiceImpl.
 + (void)setUpFakeSyncServer;
 
-// Tears down the fake sync server used by the ProfileSyncService and restores
-// the real one.
+// Tears down the fake sync server used by the SyncServiceImpl and restores the
+// real one.
 + (void)tearDownFakeSyncServer;
 
 // Gets the number of entities of the given |type|.
diff --git a/ios/chrome/test/earl_grey/chrome_test_case_app_interface.mm b/ios/chrome/test/earl_grey/chrome_test_case_app_interface.mm
index 6bdc2fd..fe8cb89 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case_app_interface.mm
@@ -32,6 +32,7 @@
 + (void)resetAuthentication {
   chrome_test_util::ResetSigninPromoPreferences();
   chrome_test_util::ResetMockAuthentication();
+  chrome_test_util::ResetUserApprovedAccountListManager();
 }
 
 + (void)removeInfoBarsAndPresentedStateWithCompletionUUID:
diff --git a/ios/components/webui/sync_internals/sync_internals_message_handler.h b/ios/components/webui/sync_internals/sync_internals_message_handler.h
index 6a6ab57..d7a43d85 100644
--- a/ios/components/webui/sync_internals/sync_internals_message_handler.h
+++ b/ios/components/webui/sync_internals/sync_internals_message_handler.h
@@ -83,7 +83,7 @@
 
   void DispatchEvent(const std::string& name, const base::Value& details_value);
 
-  // A flag used to prevent double-registration with ProfileSyncService.
+  // A flag used to prevent double-registration with SyncService.
   bool is_registered_ = false;
 
   // Whether specifics should be included when converting protocol events to a
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 49297ac9..24ee956d 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 @@
-a74cc9413758120b7bc2f7c0ecd4e992128f2609
\ No newline at end of file
+d41bfdbc57d54f93013657d39be5a9fd3dbe73e5
\ 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 514af577..40e7d46 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 @@
-5afe4773af8dc6bb2c95769478f413f5a1be81c5
\ No newline at end of file
+7f0cb44ca009d3b5053dc4e4431d064df7bf2fac
\ 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 c0a5cdb..2e07775 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 @@
-86e71244c37d9693bf9687ff78eb2b523ea48bcd
\ No newline at end of file
+9a0e26b82113051e2956f784022e584b154d0e00
\ 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 c458979..d2c2679b 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 @@
-bec573cefb452413f030cc3c8505b19836df8de9
\ No newline at end of file
+ab85ee54161345649c84a31e6e6bc89cdecdcf45
\ 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 2a015e8..0da63c0 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 @@
-1a8f6a4560d9d2f95034a69d5bcf33f39767cd74
\ No newline at end of file
+81dd2e008e897e02ee4bef8eec44349e563eb040
\ 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 d6b77300..183f6ac 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 @@
-a71129e8bed9af8e877e580cfbdb9a34734dc906
\ No newline at end of file
+0c62759a66566bf17e44e0c8ff152e2eea5acf04
\ 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 1051648..190435e 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 @@
-a613af75638e18aa756ffa4bf3f9567a248014bf
\ No newline at end of file
+8b44513084fd8c4bd2f66b57c684854a03f5b11a
\ 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 2e4a1df..ed6eb9d 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 @@
-9658304b579055f7a3fd328e820c9337319ea597
\ No newline at end of file
+6f9e7ba774085294564c3a7ee02486f7cc4739e7
\ 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 5f5c3882..83e4493 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 @@
-067f45484084e17ea599214e896b63462cdea0e3
\ No newline at end of file
+d5e9ef38e5b8a33f0403972b80da5e95d0002d81
\ 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 01ec24af..cba0d18 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 @@
-c85d87c12e09e4b0bb238ddb3fa762b0ac42df22
\ No newline at end of file
+0725216ec5f8afd8a48077d60e2646ce2a635875
\ No newline at end of file
diff --git a/ios/web/navigation/crw_wk_navigation_handler.mm b/ios/web/navigation/crw_wk_navigation_handler.mm
index 079fdec..895e0b8f 100644
--- a/ios/web/navigation/crw_wk_navigation_handler.mm
+++ b/ios/web/navigation/crw_wk_navigation_handler.mm
@@ -162,8 +162,12 @@
     web::NavigationItem* item = [[CRWNavigationItemHolder
         holderForBackForwardListItem:webView.backForwardList.currentItem]
         navigationItem];
-    if (item)
+    if (item) {
       item->SetUserAgentType(userAgentType);
+      if (web::wk_navigation_util::IsRestoreSessionUrl(item->GetURL())) {
+        self.webStateImpl->SetUserAgent(userAgentType);
+      }
+    }
   }
 
   if (userAgentType != web::UserAgentType::NONE) {
@@ -221,8 +225,12 @@
       web::NavigationItem* item = [[CRWNavigationItemHolder
           holderForBackForwardListItem:webView.backForwardList.currentItem]
           navigationItem];
-      if (item)
+      if (item) {
         item->SetUserAgentType(userAgentType);
+        if (web::wk_navigation_util::IsRestoreSessionUrl(item->GetURL())) {
+          self.webStateImpl->SetUserAgent(userAgentType);
+        }
+      }
     }
 
     if (userAgentType != web::UserAgentType::NONE) {
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm
index 458117f4..3f66a7d 100644
--- a/ios/web/navigation/navigation_manager_impl.mm
+++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -273,10 +273,15 @@
     // since it will be a duplicate.
     NavigationItemImpl* current_item =
         GetNavigationItemFromWKItem(current_wk_item);
+    ui::PageTransition transition = pending_item_->GetTransitionType();
     if (!current_item) {
       current_item = pending_item_.get();
       SetNavigationItemInWKItem(current_wk_item, std::move(pending_item_));
     }
+    // Updating the transition type of the item is needed, for example when
+    // doing a FormSubmit with a GET method on the same URL. See
+    // crbug.com/1211879.
+    current_item->SetTransitionType(transition);
 
     pending_item_.reset();
   }
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm
index 6c0aa8d..f6af7b0 100644
--- a/ios/web/navigation/navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -777,6 +777,8 @@
       /*is_using_https_as_default_scheme=*/false);
 
   [mock_wk_list_ setCurrentURL:@"http://www.existing.com"];
+  OCMStub([mock_web_view_ URL])
+      .andReturn([NSURL URLWithString:@"http://www.existing.com"]);
   navigation_manager()->CommitPendingItem();
 
   ASSERT_TRUE(navigation_manager()->GetLastCommittedItem());
@@ -807,6 +809,8 @@
       /*is_using_https_as_default_scheme=*/false);
 
   [mock_wk_list_ setCurrentURL:@"http://www.existing.com"];
+  OCMStub([mock_web_view_ URL])
+      .andReturn([NSURL URLWithString:@"http://www.existing.com"]);
   navigation_manager()->CommitPendingItem();
 
   ASSERT_TRUE(navigation_manager()->GetLastCommittedItem());
@@ -825,6 +829,8 @@
   // NavigationManagerImpl assumes that AddPendingItem() is only called for
   // new navigation, so it always creates a new pending item.
   ASSERT_TRUE(navigation_manager()->GetPendingItem());
+  EXPECT_EQ(navigation_manager()->GetPendingItem(),
+            navigation_manager()->GetLastCommittedItem());
   EXPECT_TRUE(ui::PageTransitionCoreTypeIs(
       navigation_manager()->GetPendingItem()->GetTransitionType(),
       ui::PAGE_TRANSITION_LINK));
@@ -843,6 +849,8 @@
       /*is_using_https_as_default_scheme=*/false);
 
   [mock_wk_list_ setCurrentURL:@"http://www.existing.com"];
+  OCMStub([mock_web_view_ URL])
+      .andReturn([NSURL URLWithString:@"http://www.existing.com"]);
   navigation_manager()->CommitPendingItem();
 
   ASSERT_TRUE(navigation_manager()->GetLastCommittedItem());
@@ -859,6 +867,8 @@
       /*is_post_navigation=*/false,
       /*is_using_https_as_default_scheme=*/false);
   ASSERT_TRUE(navigation_manager()->GetPendingItem());
+  EXPECT_EQ(navigation_manager()->GetPendingItem(),
+            navigation_manager()->GetLastCommittedItem());
   EXPECT_TRUE(ui::PageTransitionCoreTypeIs(
       navigation_manager()->GetPendingItem()->GetTransitionType(),
       ui::PAGE_TRANSITION_FORM_SUBMIT));
@@ -912,6 +922,8 @@
       /*is_using_https_as_default_scheme=*/false);
 
   [mock_wk_list_ setCurrentURL:@"http://www.existing.com"];
+  OCMStub([mock_web_view_ URL])
+      .andReturn([NSURL URLWithString:@"http://www.existing.com"]);
   navigation_manager()->CommitPendingItem();
 
   ASSERT_TRUE(navigation_manager()->GetLastCommittedItem());
@@ -929,6 +941,8 @@
   // NavigationManagerImpl assumes that AddPendingItem() is only called for
   // new navigation, so it always creates a new pending item.
   ASSERT_TRUE(navigation_manager()->GetPendingItem());
+  EXPECT_EQ(navigation_manager()->GetPendingItem(),
+            navigation_manager()->GetLastCommittedItem());
   EXPECT_TRUE(ui::PageTransitionCoreTypeIs(
       navigation_manager()->GetPendingItem()->GetTransitionType(),
       ui::PAGE_TRANSITION_LINK));
@@ -946,6 +960,8 @@
       /*is_using_https_as_default_scheme=*/false);
 
   [mock_wk_list_ setCurrentURL:@"http://www.existing.com"];
+  OCMStub([mock_web_view_ URL])
+      .andReturn([NSURL URLWithString:@"http://www.existing.com"]);
   navigation_manager()->CommitPendingItem();
 
   ASSERT_TRUE(navigation_manager()->GetLastCommittedItem());
@@ -961,6 +977,8 @@
       /*is_using_https_as_default_scheme=*/false);
 
   ASSERT_TRUE(navigation_manager()->GetPendingItem());
+  EXPECT_EQ(navigation_manager()->GetPendingItem(),
+            navigation_manager()->GetLastCommittedItem());
   EXPECT_TRUE(ui::PageTransitionCoreTypeIs(
       navigation_manager()->GetPendingItem()->GetTransitionType(),
       ui::PAGE_TRANSITION_RELOAD));
diff --git a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
index 346aa05..91241df8a 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
@@ -114,7 +114,8 @@
 
 TEST_F(CWVSyncControllerTest, StopSyncAndClearIdentity) {
   CoreAccountInfo account_info =
-      identity_test_environment_.MakePrimaryAccountAvailable(kTestEmail);
+      identity_test_environment_.MakePrimaryAccountAvailable(
+          kTestEmail, signin::ConsentLevel::kSync);
 
   CWVSyncController* sync_controller = [[CWVSyncController alloc]
       initWithSyncService:&sync_service_
diff --git a/ios/web_view/internal/sync/web_view_sync_service_factory.h b/ios/web_view/internal/sync/web_view_sync_service_factory.h
index 5594dbac..5fb52dd 100644
--- a/ios/web_view/internal/sync/web_view_sync_service_factory.h
+++ b/ios/web_view/internal/sync/web_view_sync_service_factory.h
@@ -18,7 +18,7 @@
 namespace ios_web_view {
 class WebViewBrowserState;
 
-// Singleton that owns all ProfileSyncService and associates them with
+// Singleton that owns all SyncService and associates them with
 // WebViewBrowserState.
 class WebViewSyncServiceFactory : public BrowserStateKeyedServiceFactory {
  public:
diff --git a/ios/web_view/internal/sync/web_view_sync_service_factory.mm b/ios/web_view/internal/sync/web_view_sync_service_factory.mm
index b0485f9..7aa2cb6 100644
--- a/ios/web_view/internal/sync/web_view_sync_service_factory.mm
+++ b/ios/web_view/internal/sync/web_view_sync_service_factory.mm
@@ -14,8 +14,8 @@
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/sync_util.h"
-#include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_service_impl.h"
 #include "ios/web/public/thread/web_thread.h"
 #include "ios/web_view/internal/app/application_context.h"
 #include "ios/web_view/internal/autofill/web_view_personal_data_manager_factory.h"
@@ -81,9 +81,9 @@
       WebViewIdentityManagerFactory::GetForBrowserState(browser_state);
   WebViewGCMProfileServiceFactory::GetForBrowserState(browser_state);
 
-  syncer::ProfileSyncService::InitParams init_params;
+  syncer::SyncServiceImpl::InitParams init_params;
   init_params.identity_manager = identity_manager;
-  init_params.start_behavior = syncer::ProfileSyncService::MANUAL_START;
+  init_params.start_behavior = syncer::SyncServiceImpl::MANUAL_START;
   init_params.sync_client = WebViewSyncClient::Create(browser_state);
   init_params.url_loader_factory = browser_state->GetSharedURLLoaderFactory();
   // ios/web_view has no need to update network time.
@@ -92,16 +92,16 @@
       ApplicationContext::GetInstance()->GetNetworkConnectionTracker();
   init_params.channel = version_info::Channel::STABLE;
 
-  auto profile_sync_service =
-      std::make_unique<syncer::ProfileSyncService>(std::move(init_params));
-  profile_sync_service->Initialize();
+  auto sync_service =
+      std::make_unique<syncer::SyncServiceImpl>(std::move(init_params));
+  sync_service->Initialize();
 
   // Hook PSS into PersonalDataManager (a circular dependency).
   autofill::PersonalDataManager* pdm =
       WebViewPersonalDataManagerFactory::GetForBrowserState(browser_state);
-  pdm->OnSyncServiceInitialized(profile_sync_service.get());
+  pdm->OnSyncServiceInitialized(sync_service.get());
 
-  return profile_sync_service;
+  return sync_service;
 }
 
 }  // namespace ios_web_view
diff --git a/ipc/ipc.mojom b/ipc/ipc.mojom
index 4606022b..753e51a6 100644
--- a/ipc/ipc.mojom
+++ b/ipc/ipc.mojom
@@ -33,5 +33,6 @@
 };
 
 // A strictly nominal interface used to identify Channel bootstrap requests.
+// This is only used in `AgentSchedulingGroup` initialization.
 interface ChannelBootstrap {};
 
diff --git a/ipc/ipc_mojo_bootstrap.cc b/ipc/ipc_mojo_bootstrap.cc
index 35d6112..9cf2ea5 100644
--- a/ipc/ipc_mojo_bootstrap.cc
+++ b/ipc/ipc_mojo_bootstrap.cc
@@ -27,6 +27,7 @@
 #include "base/synchronization/lock.h"
 #include "base/task/common/task_annotator.h"
 #include "base/threading/thread_checker.h"
+#include "base/threading/thread_local.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_allocator_dump.h"
 #include "base/trace_event/memory_dump_manager.h"
@@ -51,6 +52,15 @@
 
 class ChannelAssociatedGroupController;
 
+base::ThreadLocalBoolean& GetOffSequenceBindingAllowedFlag() {
+  static base::NoDestructor<base::ThreadLocalBoolean> flag;
+  return *flag;
+}
+
+bool CanBindOffSequence() {
+  return GetOffSequenceBindingAllowedFlag().Get();
+}
+
 // Used to track some internal Channel state in pursuit of message leaks.
 //
 // TODO(https://crbug.com/813045): Remove this.
@@ -505,40 +515,37 @@
       return task_runner_.get();
     }
 
+    bool was_bound_off_sequence() const { return was_bound_off_sequence_; }
+
     mojo::InterfaceEndpointClient* client() const {
       controller_->lock_.AssertAcquired();
       return client_;
     }
 
-    void CountDroppedMessage() {
-      controller_->lock_.AssertAcquired();
-      ++num_dropped_messages_;
-    }
-
     void AttachClient(mojo::InterfaceEndpointClient* client,
                       scoped_refptr<base::SequencedTaskRunner> runner) {
       controller_->lock_.AssertAcquired();
       DCHECK(!client_);
       DCHECK(!closed_);
-      DCHECK(runner->RunsTasksInCurrentSequence());
 
       task_runner_ = std::move(runner);
       client_ = client;
 
-      CHECK_EQ(num_dropped_messages_, 0u)
-          << "A Channel-associated interface endpoint for "
-          << client->interface_name() << " received undeliverable messages "
-          << "prior to being bound. This means the endpoint was held in a "
-          << "pending state longer than allowed. Channel-associated interface "
-          << "endpoints must be bound ASAP once received; either immediately "
-          << "on the IO or main thread, or after a single task hop from the IO "
-          << "thread to main thread where applicable.";
+      const bool binding_to_calling_sequence =
+          task_runner_->RunsTasksInCurrentSequence();
+      const bool binding_to_channel_sequence =
+          binding_to_calling_sequence &&
+          (controller_->proxy_task_runner_->RunsTasksInCurrentSequence() ||
+           controller_->task_runner_->RunsTasksInCurrentSequence());
+      const bool tried_to_bind_off_sequence =
+          !binding_to_calling_sequence || !binding_to_channel_sequence;
+      if (tried_to_bind_off_sequence && CanBindOffSequence())
+        was_bound_off_sequence_ = true;
     }
 
     void DetachClient() {
       controller_->lock_.AssertAcquired();
       DCHECK(client_);
-      DCHECK(task_runner_->RunsTasksInCurrentSequence());
       DCHECK(!closed_);
 
       task_runner_ = nullptr;
@@ -680,13 +687,13 @@
     bool closed_ = false;
     bool peer_closed_ = false;
     bool handle_created_ = false;
+    bool was_bound_off_sequence_ = false;
     absl::optional<mojo::DisconnectReason> disconnect_reason_;
     mojo::InterfaceEndpointClient* client_ = nullptr;
     scoped_refptr<base::SequencedTaskRunner> task_runner_;
     std::unique_ptr<mojo::SequenceLocalSyncEventWatcher> sync_watcher_;
     base::queue<std::pair<uint32_t, MessageWrapper>> sync_messages_;
     uint32_t next_sync_message_id_ = 0;
-    size_t num_dropped_messages_ = 0;
 
     DISALLOW_COPY_AND_ASSIGN(Endpoint);
   };
@@ -882,13 +889,34 @@
 
     mojo::InterfaceEndpointClient* client = endpoint->client();
     if (!client || !endpoint->task_runner()->RunsTasksInCurrentSequence()) {
-      // No client has been bound yet or the client runs tasks on another
-      // thread. We assume the other thread must always be the one on which
-      // |proxy_task_runner_| runs tasks, since that's the only valid scenario.
+      // The ChannelProxy for this channel is bound to `proxy_task_runner_` and
+      // by default legacy IPCs must dispatch to either the IO thread or the
+      // proxy task runner. We generally impose the same constraint on
+      // associated interface endpoints so that FIFO can be guaranteed across
+      // all interfaces without stalling any of them to wait for a pending
+      // endpoint to be bound.
       //
-      // If the client is not yet bound, it must be bound by the time this task
-      // runs or else it's programmer error.
-      DCHECK(proxy_task_runner_);
+      // This allows us to assume that if an endpoint is not yet bound when we
+      // receive a message targeting it, it *will* be bound on the proxy task
+      // runner by the time a newly posted task runs there. Hence we simply post
+      // a hopeful dispatch task to that task runner.
+      //
+      // As it turns out, there are even some instances of endpoints binding to
+      // alternative (non-IO-thread, non-proxy) task runners, but still
+      // ultimately relying on the fact that we schedule their messages on the
+      // proxy task runner. So even if the endpoint is already bound, we
+      // default to scheduling it on the proxy task runner as long as it's not
+      // bound specifically to the IO task runner.
+      // TODO(rockot): Try to sort out these cases and maybe eliminate them.
+      //
+      // Finally, it's also possible that an endpoint was bound to an
+      // alternative task runner and it really does want its messages to
+      // dispatch there. In that case `was_bound_off_sequence()` will be true to
+      // signal that we should really use that task runner.
+      const scoped_refptr<base::SequencedTaskRunner> task_runner =
+          client && endpoint->was_bound_off_sequence()
+              ? endpoint->task_runner()
+              : proxy_task_runner_.get();
 
       if (message->has_flag(mojo::Message::kFlagIsSync)) {
         MessageWrapper message_wrapper(this, std::move(*message));
@@ -899,28 +927,27 @@
         // call will dequeue the message and dispatch it.
         uint32_t message_id =
             endpoint->EnqueueSyncMessage(std::move(message_wrapper));
-        proxy_task_runner_->PostTask(
+        task_runner->PostTask(
             FROM_HERE,
             base::BindOnce(&ChannelAssociatedGroupController::AcceptSyncMessage,
                            this, id, message_id));
         return true;
       }
 
-      // If |proxy_task_runner_| has been torn down already, this PostTask will
-      // fail and destroy |message|. That operation may need to in turn destroy
+      // If |task_runner| has been torn down already, this PostTask will fail
+      // and destroy |message|. That operation may need to in turn destroy
       // in-transit associated endpoints and thus acquire |lock_|. We no longer
-      // need the lock to be held now since |proxy_task_runner_| is safe to
-      // access unguarded.
+      // need the lock to be held now, so we can release it before the PostTask.
       {
         // Grab interface name from |client| before releasing the lock to ensure
         // that |client| is safe to access.
         base::TaskAnnotator::ScopedSetIpcHash scoped_set_ipc_hash(
             client ? client->interface_name() : "unknown interface");
         locker.Release();
-        proxy_task_runner_->PostTask(
+        task_runner->PostTask(
             FROM_HERE,
             base::BindOnce(
-                &ChannelAssociatedGroupController::AcceptOnProxyThread, this,
+                &ChannelAssociatedGroupController::AcceptOnEndpointThread, this,
                 std::move(*message)));
       }
       return true;
@@ -933,10 +960,9 @@
     return client->HandleIncomingMessage(message);
   }
 
-  void AcceptOnProxyThread(mojo::Message message) {
-    DCHECK(proxy_task_runner_->BelongsToCurrentThread());
+  void AcceptOnEndpointThread(mojo::Message message) {
     TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("mojom"),
-                 "ChannelAssociatedGroupController::AcceptOnProxyThread");
+                 "ChannelAssociatedGroupController::AcceptOnEndpointThread");
 
     mojo::InterfaceId id = message.interface_id();
     DCHECK(mojo::IsValidInterfaceId(id) && !mojo::IsPrimaryInterfaceId(id));
@@ -947,15 +973,14 @@
       return;
 
     mojo::InterfaceEndpointClient* client = endpoint->client();
-    if (!client) {
-      endpoint->CountDroppedMessage();
+    if (!client)
       return;
-    }
 
     // Using client->interface_name() is safe here because this is a static
     // string defined for each mojo interface.
     TRACE_EVENT0("mojom", client->interface_name());
-    DCHECK(endpoint->task_runner()->RunsTasksInCurrentSequence());
+    DCHECK(endpoint->task_runner()->RunsTasksInCurrentSequence() ||
+           proxy_task_runner_->RunsTasksInCurrentSequence());
 
     // Sync messages should never make their way to this method.
     DCHECK(!message.has_flag(mojo::Message::kFlagIsSync));
@@ -1152,6 +1177,17 @@
 
 }  // namespace
 
+ScopedAllowOffSequenceChannelAssociatedBindings::
+    ScopedAllowOffSequenceChannelAssociatedBindings()
+    : outer_flag_(GetOffSequenceBindingAllowedFlag().Get()) {
+  GetOffSequenceBindingAllowedFlag().Set(true);
+}
+
+ScopedAllowOffSequenceChannelAssociatedBindings::
+    ~ScopedAllowOffSequenceChannelAssociatedBindings() {
+  GetOffSequenceBindingAllowedFlag().Set(outer_flag_);
+}
+
 // static
 std::unique_ptr<MojoBootstrap> MojoBootstrap::Create(
     mojo::ScopedMessagePipeHandle handle,
diff --git a/ipc/ipc_mojo_bootstrap.h b/ipc/ipc_mojo_bootstrap.h
index 8d9b5745..89af4d4 100644
--- a/ipc/ipc_mojo_bootstrap.h
+++ b/ipc/ipc_mojo_bootstrap.h
@@ -25,6 +25,66 @@
 
 namespace IPC {
 
+// Incoming legacy IPCs have always been dispatched to one of two threads: the
+// IO thread (when an installed MessageFilter handles the message), or the
+// thread which owns the corresponding ChannelProxy receiving the message. There
+// were no other places to route legacy IPC messages, so when a message arrived
+// the legacy IPC system would run through its MessageFilters and if the message
+// was still unhandled, it would be posted to the ChannelProxy thread for
+// further processing.
+//
+// Mojo on the other hand allows for mutually associated endpoints (that is,
+// endpoints which locally share the same message pipe) to span any number of
+// threads while still guaranteeing that each endpoint on a given thread
+// preserves FIFO order of messages dispatched there. This means that if a
+// message arrives carrying a PendingAssociatedRemote/Receiver endpoint, and
+// then another message arrives which targets that endpoint, the entire pipe
+// will be blocked from dispatch until the endpoint is bound: otherwise we have
+// no idea where to dispatch the message such that we can uphold the FIFO
+// guarantee between the new endpoint and any other endpoints on the thread it
+// ends up binding to.
+//
+// Channel-associated interfaces share a message pipe with the legacy IPC
+// Channel, and in order to avoid nasty surprises during the migration process
+// we decided to constrain how incoming Channel-associated endpoints could be
+// bound: you must either bind them immediately as they arrive on the IO thread,
+// or you must immediately post a task to the ChannelProxy thread to bind them.
+// This allows all aforementioned FIFO guaratees to be upheld without ever
+// stalling dispatch of legacy IPCs (particularly on the IO thread), because
+// when we see a message targeting an unbound endpoint we can safely post it to
+// the ChannelProxy's task runner before forging ahead to dispatch subsequent
+// messages. No stalling.
+//
+// As there are some cases where a Channel-associated endpoint really wants to
+// receive messages on a different TaskRunner, we want to allow that now. It's
+// safe as long as the application can guarantee that the endpoint in question
+// will be bound to a task runner *before* any messages are received for that
+// endpoint.
+//
+// HOWEVER, it turns out that we cannot simply adhere to the application's
+// wishes when an alternative TaskRunner is provided at binding time: over time
+// we have accumulated application code which binds Channel-associated endpoints
+// to task runners which -- while running tasks exclusively on the ChannelProxy
+// thread -- are not the ChannelProxy's own task runner. Such code now
+// implicitly relies on the behavior of Channel-associated interfaces always
+// dispatching their messages to the ChannelProxy task runner. This is tracked
+// by https://crbug.com/1209188.
+//
+// Finally, the point: if you really know you want to bind your endpoint to an
+// alternative task runner and you can really guarantee that no messages may
+// have already arrived for it on the IO thread, you can do the binding within
+// the extent of a ScopedAllowOffSequenceChannelAssociatedBindings. This will
+// flag the endpoint such that it honors your binding configuration, and its
+// incoming messages will actually dispatch to the task runner you provide.
+class COMPONENT_EXPORT(IPC) ScopedAllowOffSequenceChannelAssociatedBindings {
+ public:
+  ScopedAllowOffSequenceChannelAssociatedBindings();
+  ~ScopedAllowOffSequenceChannelAssociatedBindings();
+
+ private:
+  const bool outer_flag_;
+};
+
 // MojoBootstrap establishes a pair of associated interfaces between two
 // processes in Chrome.
 //
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 7c9793c..a497af84 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -315,6 +315,10 @@
 const base::Feature kMemoryPressureBasedSourceBufferGC{
     "MemoryPressureBasedSourceBufferGC", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enable binding multiple shared images to a single GpuMemoryBuffer.
+const base::Feature kMultiPlaneSharedImageVideo{
+    "MultiPlaneVideoSharedImages", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Approach original pre-REC MSE object URL autorevoking behavior, though await
 // actual attempt to use the object URL for attachment to perform revocation.
 // This will hopefully reduce runtime memory bloat for pages that do not
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 8da535d..b7c13d4 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -161,6 +161,7 @@
 MEDIA_EXPORT extern const base::Feature kMediaPowerExperiment;
 MEDIA_EXPORT extern const base::Feature kMediaSessionWebRTC;
 MEDIA_EXPORT extern const base::Feature kMemoryPressureBasedSourceBufferGC;
+MEDIA_EXPORT extern const base::Feature kMultiPlaneSharedImageVideo;
 MEDIA_EXPORT extern const base::Feature kOverlayFullscreenVideo;
 MEDIA_EXPORT extern const base::Feature kPictureInPicture;
 MEDIA_EXPORT extern const base::Feature kPlaybackSpeedButton;
diff --git a/media/gpu/chromeos/fourcc.cc b/media/gpu/chromeos/fourcc.cc
index bc689623..79bc688 100644
--- a/media/gpu/chromeos/fourcc.cc
+++ b/media/gpu/chromeos/fourcc.cc
@@ -39,6 +39,7 @@
     case NV21:
     case NM12:
     case NM21:
+    case YU16:
     case YM16:
     case MT21:
     case MM21:
@@ -75,12 +76,13 @@
         return Fourcc(NV12);
       case PIXEL_FORMAT_NV21:
         return Fourcc(NV21);
+      case PIXEL_FORMAT_I422:
+        return Fourcc(YU16);
       case PIXEL_FORMAT_P016LE:
         return Fourcc(P010);
       case PIXEL_FORMAT_UYVY:
         NOTREACHED();
         FALLTHROUGH;
-      case PIXEL_FORMAT_I422:
       case PIXEL_FORMAT_I420A:
       case PIXEL_FORMAT_I444:
       case PIXEL_FORMAT_RGB24:
@@ -175,6 +177,7 @@
     case NV21:
     case NM21:
       return PIXEL_FORMAT_NV21;
+    case YU16:
     case YM16:
       return PIXEL_FORMAT_I422;
     // V4L2_PIX_FMT_MT21C is only used for MT8173 hardware video decoder output
@@ -271,6 +274,7 @@
     case YM21:
     case NM12:
     case NM21:
+    case YU16:
     case YM16:
     case MT21:
     case MM21:
@@ -307,7 +311,9 @@
       return Fourcc(NV12);
     case NM21:
       return Fourcc(NV21);
+    case YU16:
     case YM16:
+      return Fourcc(YU16);
     case MT21:
     case MM21:
       return absl::nullopt;
@@ -330,6 +336,7 @@
     case YUYV:
     case NV12:
     case NV21:
+    case YU16:
     case P010:
       return false;
     case YM12:
@@ -368,6 +375,7 @@
 static_assert(Fourcc::NV21 == V4L2_PIX_FMT_NV21, "Mismatch Fourcc");
 static_assert(Fourcc::NM12 == V4L2_PIX_FMT_NV12M, "Mismatch Fourcc");
 static_assert(Fourcc::NM21 == V4L2_PIX_FMT_NV21M, "Mismatch Fourcc");
+static_assert(Fourcc::YU16 == V4L2_PIX_FMT_YUV422P, "Mismatch Fourcc");
 static_assert(Fourcc::YM16 == V4L2_PIX_FMT_YUV422M, "Mismatch Fourcc");
 static_assert(Fourcc::MT21 == V4L2_PIX_FMT_MT21C, "Mismatch Fourcc");
 #ifdef V4L2_PIX_FMT_MM21
diff --git a/media/gpu/chromeos/fourcc.h b/media/gpu/chromeos/fourcc.h
index 560305c..f4993b5 100644
--- a/media/gpu/chromeos/fourcc.h
+++ b/media/gpu/chromeos/fourcc.h
@@ -93,6 +93,11 @@
     // Maps to PIXEL_FORMAT_NV21, V4L2_PIX_FMT_NV21M.
     NM21 = ComposeFourcc('N', 'M', '2', '1'),
 
+    // YUV422 single-planar format.
+    // https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/pixfmt-yuv422p.html
+    // Maps to PIXEL_FORMAT_I422, V4L2_PIX_FMT_YUV422P.
+    YU16 = ComposeFourcc('4', '2', '2', 'P'),
+
     // YUV422 multi-planar format.
     // https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/pixfmt-yuv422m.html
     // Maps to PIXEL_FORMAT_I422, V4L2_PIX_FMT_YUV422M
diff --git a/media/gpu/chromeos/fourcc_unittests.cc b/media/gpu/chromeos/fourcc_unittests.cc
index 4ee99544..b9333af0 100644
--- a/media/gpu/chromeos/fourcc_unittests.cc
+++ b/media/gpu/chromeos/fourcc_unittests.cc
@@ -47,6 +47,7 @@
   CheckFromV4L2PixFmtAndBack(V4L2_PIX_FMT_NV12);
   CheckFromV4L2PixFmtAndBack(V4L2_PIX_FMT_NV21);
   CheckFromV4L2PixFmtAndBack(V4L2_PIX_FMT_NV12M);
+  CheckFromV4L2PixFmtAndBack(V4L2_PIX_FMT_YUV422P);
   CheckFromV4L2PixFmtAndBack(V4L2_PIX_FMT_YUV422M);
   CheckFromV4L2PixFmtAndBack(V4L2_PIX_FMT_MT21C);
   CheckFromV4L2PixFmtAndBack(V4L2_MM21);
@@ -75,6 +76,8 @@
             Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_YVU420M)->ToVideoPixelFormat());
 
   EXPECT_EQ(PIXEL_FORMAT_I422,
+            Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_YUV422P)->ToVideoPixelFormat());
+  EXPECT_EQ(PIXEL_FORMAT_I422,
             Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_YUV422M)->ToVideoPixelFormat());
 
   // Noted that previously in V4L2Device::V4L2PixFmtToVideoPixelFormat(),
@@ -108,6 +111,13 @@
   EXPECT_EQ(
       V4L2_PIX_FMT_YVU420M,
       Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_YV12, false)->ToV4L2PixFmt());
+
+  EXPECT_EQ(
+      V4L2_PIX_FMT_YUV422P,
+      Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_I422, true)->ToV4L2PixFmt());
+  EXPECT_EQ(
+      V4L2_PIX_FMT_YUV422M,
+      Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_I422, false)->ToV4L2PixFmt());
 }
 #endif  // BUILDFLAG(USE_V4L2_CODEC)
 
@@ -194,6 +204,8 @@
   EXPECT_EQ(Fourcc(Fourcc::YUYV).ToSinglePlanar(), Fourcc(Fourcc::YUYV));
   EXPECT_EQ(Fourcc(Fourcc::NV12).ToSinglePlanar(), Fourcc(Fourcc::NV12));
   EXPECT_EQ(Fourcc(Fourcc::NV21).ToSinglePlanar(), Fourcc(Fourcc::NV21));
+  EXPECT_EQ(Fourcc(Fourcc::YU16).ToSinglePlanar(), Fourcc(Fourcc::YU16));
+  EXPECT_EQ(Fourcc(Fourcc::YM16).ToSinglePlanar(), Fourcc(Fourcc::YU16));
   EXPECT_EQ(Fourcc(Fourcc::P010).ToSinglePlanar(), Fourcc(Fourcc::P010));
   EXPECT_EQ(Fourcc(Fourcc::YM12).ToSinglePlanar(),
             Fourcc(Fourcc::YU12).ToSinglePlanar());
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc
index 89f65952..b6f70f4 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool.cc
+++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
@@ -34,6 +34,7 @@
 #include "gpu/command_buffer/client/shared_image_interface.h"
 #include "gpu/command_buffer/common/shared_image_usage.h"
 #include "media/base/bind_to_current_loop.h"
+#include "media/base/media_switches.h"
 #include "media/video/gpu_video_accelerator_factories.h"
 #include "third_party/libyuv/include/libyuv.h"
 #include "ui/gfx/buffer_format_util.h"
@@ -47,6 +48,14 @@
 
 namespace media {
 
+namespace {
+
+bool MultiPlaneSharedImagesEnabled() {
+  return base::FeatureList::IsEnabled(kMultiPlaneSharedImageVideo);
+}
+
+}  // namespace
+
 // Implementation of a pool of GpuMemoryBuffers used to back VideoFrames.
 class GpuMemoryBufferVideoFramePool::PoolImpl
     : public base::RefCountedThreadSafe<
@@ -341,6 +350,52 @@
   return 0;
 }
 
+// The number of shared images for a given format. Note that a single
+// GpuMemoryBuffer can be mapped to several SharedImages (one for each plane).
+size_t NumSharedImages(GpuVideoAcceleratorFactories::OutputFormat format) {
+  if (MultiPlaneSharedImagesEnabled()) {
+    if (format == GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB) {
+      return 2;
+    }
+  }
+  return NumGpuMemoryBuffers(format);
+}
+
+// In the case of a format where a single GpuMemoryBuffer is used by multiple
+// planes' shared images, this function returns the index of the PlaneResource
+// in which the GpuMemoryBuffer for a plane is to be found.
+size_t GpuMemoryBufferPlaneResourceIndexForPlane(
+    GpuVideoAcceleratorFactories::OutputFormat format,
+    size_t plane) {
+  if (MultiPlaneSharedImagesEnabled()) {
+    if (format == GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB) {
+      return 0;
+    }
+  }
+  return plane;
+}
+
+// When a single plane of a GpuMemoryBuffer is to bound to a SharedImage, this
+// method will indicate that plane.
+gfx::BufferPlane GetSharedImageBufferPlane(
+    GpuVideoAcceleratorFactories::OutputFormat format,
+    size_t plane) {
+  if (MultiPlaneSharedImagesEnabled()) {
+    if (format == GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB) {
+      switch (plane) {
+        case 0:
+          return gfx::BufferPlane::Y;
+        case 1:
+          return gfx::BufferPlane::UV;
+        default:
+          NOTREACHED();
+          break;
+      }
+    }
+  }
+  return gfx::BufferPlane::DEFAULT;
+}
+
 // The number of output rows to be copied in each iteration.
 int RowsPerCopy(size_t plane, VideoPixelFormat format, int width) {
   int bytes_per_row = VideoFrame::RowBytes(plane, format, width);
@@ -991,34 +1046,42 @@
   const gfx::Size coded_size = CodedSize(video_frame.get(), output_format_);
   gpu::MailboxHolder mailbox_holders[VideoFrame::kMaxPlanes];
   // Set up the planes creating the mailboxes needed to refer to the textures.
-  for (size_t i = 0; i < NumGpuMemoryBuffers(output_format_); i++) {
-    PlaneResource& plane_resource = frame_resources->plane_resources[i];
+  for (size_t plane = 0; plane < NumSharedImages(output_format_); plane++) {
+    size_t gpu_memory_buffer_plane =
+        GpuMemoryBufferPlaneResourceIndexForPlane(output_format_, plane);
+
+    PlaneResource& plane_resource = frame_resources->plane_resources[plane];
+    gfx::GpuMemoryBuffer* gpu_memory_buffer =
+        frame_resources->plane_resources[gpu_memory_buffer_plane]
+            .gpu_memory_buffer.get();
+
     const gfx::BufferFormat buffer_format =
-        GpuMemoryBufferFormat(output_format_, i);
+        GpuMemoryBufferFormat(output_format_, plane);
     unsigned texture_target = gpu_factories_->ImageTextureTarget(buffer_format);
     // Bind the texture and create or rebind the image.
-    if (plane_resource.gpu_memory_buffer && plane_resource.mailbox.IsZero()) {
+    if (gpu_memory_buffer && plane_resource.mailbox.IsZero()) {
       uint32_t usage =
           gpu::SHARED_IMAGE_USAGE_GLES2 | gpu::SHARED_IMAGE_USAGE_RASTER |
           gpu::SHARED_IMAGE_USAGE_DISPLAY | gpu::SHARED_IMAGE_USAGE_SCANOUT;
       plane_resource.mailbox = sii->CreateSharedImage(
-          plane_resource.gpu_memory_buffer.get(),
-          gpu_factories_->GpuMemoryBufferManager(), video_frame->ColorSpace(),
-          kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, usage);
+          gpu_memory_buffer, gpu_factories_->GpuMemoryBufferManager(),
+          GetSharedImageBufferPlane(output_format_, plane),
+          video_frame->ColorSpace(), kTopLeft_GrSurfaceOrigin,
+          kPremul_SkAlphaType, usage);
     } else if (!plane_resource.mailbox.IsZero()) {
       sii->UpdateSharedImage(frame_resources->sync_token,
                              plane_resource.mailbox);
     }
-    mailbox_holders[i] = gpu::MailboxHolder(plane_resource.mailbox,
-                                            gpu::SyncToken(), texture_target);
+    mailbox_holders[plane] = gpu::MailboxHolder(
+        plane_resource.mailbox, gpu::SyncToken(), texture_target);
   }
 
   // Insert a sync_token, this is needed to make sure that the textures the
   // mailboxes refer to will be used only after all the previous commands posted
   // in the SharedImageInterface have been processed.
   gpu::SyncToken sync_token = sii->GenUnverifiedSyncToken();
-  for (size_t i = 0; i < NumGpuMemoryBuffers(output_format_); i++)
-    mailbox_holders[i].sync_token = sync_token;
+  for (size_t plane = 0; plane < NumSharedImages(output_format_); plane++)
+    mailbox_holders[plane].sync_token = sync_token;
 
   VideoPixelFormat frame_format = VideoFormat(output_format_);
 
diff --git a/mojo/public/cpp/bindings/associated_receiver.h b/mojo/public/cpp/bindings/associated_receiver.h
index 92b4c0e..82bf604 100644
--- a/mojo/public/cpp/bindings/associated_receiver.h
+++ b/mojo/public/cpp/bindings/associated_receiver.h
@@ -45,6 +45,12 @@
 
   void FlushForTesting();
 
+  // Please see comments on the same method of InterfaceEndpointClient.
+  void ResetFromAnotherSequenceUnsafe() {
+    if (endpoint_client_)
+      endpoint_client_->ResetFromAnotherSequenceUnsafe();
+  }
+
  protected:
   ~AssociatedReceiverBase();
 
diff --git a/mojo/public/cpp/bindings/interface_endpoint_client.h b/mojo/public/cpp/bindings/interface_endpoint_client.h
index 738a2ab31..71fbae16 100644
--- a/mojo/public/cpp/bindings/interface_endpoint_client.h
+++ b/mojo/public/cpp/bindings/interface_endpoint_client.h
@@ -192,6 +192,15 @@
   }
 #endif
 
+  // This allows the endpoint to be reset from a sequence other than the one on
+  // which it was bound. This should only be used with caution, and it is
+  // critical that the calling sequence cannot run tasks concurrently with the
+  // bound sequence. There's no practical way for this to be asserted, so we
+  // have to take your word for it. If this constraint is not upheld, there will
+  // be data races internal to the bindings object which can lead to UAFs or
+  // surprise message dispatches.
+  void ResetFromAnotherSequenceUnsafe();
+
  private:
   // Maps from the id of a response to the MessageReceiver that handles the
   // response.
diff --git a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
index 4ea3c21..96d43904 100644
--- a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
+++ b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
@@ -442,11 +442,6 @@
           base::BindOnce(&InterfaceEndpointClient::OnAssociationEvent,
                          weak_ptr_factory_.GetWeakPtr())));
     }
-  } else if (!task_runner_->RunsTasksInCurrentSequence()) {
-    task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&InterfaceEndpointClient::InitControllerIfNecessary,
-                       weak_ptr_factory_.GetWeakPtr()));
   } else {
     InitControllerIfNecessary();
   }
@@ -777,6 +772,17 @@
   }
 }
 
+void InterfaceEndpointClient::ResetFromAnotherSequenceUnsafe() {
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+
+  if (controller_) {
+    controller_ = nullptr;
+    handle_.group_controller()->DetachEndpointClient(handle_);
+  }
+
+  handle_.reset();
+}
+
 void InterfaceEndpointClient::InitControllerIfNecessary() {
   if (controller_ || handle_.pending_association())
     return;
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.cc b/mojo/public/cpp/bindings/lib/multiplex_router.cc
index b6b7f465..cc2c5ba 100644
--- a/mojo/public/cpp/bindings/lib/multiplex_router.cc
+++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc
@@ -90,7 +90,6 @@
     router_->AssertLockAcquired();
     DCHECK(!client_);
     DCHECK(!closed_);
-    DCHECK(runner->RunsTasksInCurrentSequence());
 
     task_runner_ = std::move(runner);
     client_ = client;
@@ -101,7 +100,6 @@
   void DetachClient() {
     router_->AssertLockAcquired();
     DCHECK(client_);
-    DCHECK(task_runner_->RunsTasksInCurrentSequence());
     DCHECK(!closed_);
 
     task_runner_ = nullptr;
diff --git a/mojo/public/cpp/bindings/shared_associated_remote.h b/mojo/public/cpp/bindings/shared_associated_remote.h
index 1b59283..4a3f3780 100644
--- a/mojo/public/cpp/bindings/shared_associated_remote.h
+++ b/mojo/public/cpp/bindings/shared_associated_remote.h
@@ -5,6 +5,7 @@
 #ifndef MOJO_PUBLIC_CPP_BINDINGS_SHARED_ASSOCIATED_REMOTE_H_
 #define MOJO_PUBLIC_CPP_BINDINGS_SHARED_ASSOCIATED_REMOTE_H_
 
+#include "base/memory/ref_counted.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
@@ -32,12 +33,10 @@
   explicit SharedAssociatedRemote(
       PendingAssociatedRemote<Interface> pending_remote,
       scoped_refptr<base::SequencedTaskRunner> bind_task_runner =
-          base::SequencedTaskRunnerHandle::Get())
-      : remote_(pending_remote.is_valid()
-                    ? SharedRemoteBase<AssociatedRemote<Interface>>::Create(
-                          std::move(pending_remote),
-                          std::move(bind_task_runner))
-                    : nullptr) {}
+          base::SequencedTaskRunnerHandle::Get()) {
+    if (pending_remote.is_valid())
+      Bind(std::move(pending_remote), std::move(bind_task_runner));
+  }
 
   bool is_bound() const { return remote_ != nullptr; }
   explicit operator bool() const { return is_bound(); }
@@ -51,6 +50,27 @@
   // reference the same underlying endpoint.
   void reset() { remote_.reset(); }
 
+  // Creates a new pair of endpoints and binds this SharedAssociatedRemote to
+  // one of them, on `task_runner`. The other is returned as a receiver.
+  mojo::PendingAssociatedReceiver<Interface> BindNewEndpointAndPassReceiver(
+      scoped_refptr<base::SequencedTaskRunner> bind_task_runner =
+          base::SequencedTaskRunnerHandle::Get()) {
+    mojo::PendingAssociatedRemote<Interface> remote;
+    auto receiver = remote.InitWithNewEndpointAndPassReceiver();
+    Bind(std::move(remote), std::move(bind_task_runner));
+    return receiver;
+  }
+
+  // Binds to `pending_remote` on `bind_task_runner`.
+  void Bind(PendingAssociatedRemote<Interface> pending_remote,
+            scoped_refptr<base::SequencedTaskRunner> bind_task_runner =
+                base::SequencedTaskRunnerHandle::Get()) {
+    DCHECK(!remote_);
+    DCHECK(pending_remote.is_valid());
+    remote_ = SharedRemoteBase<AssociatedRemote<Interface>>::Create(
+        std::move(pending_remote), std::move(bind_task_runner));
+  }
+
  private:
   scoped_refptr<SharedRemoteBase<AssociatedRemote<Interface>>> remote_;
 };
diff --git a/pdf/pdf_view_plugin_base.cc b/pdf/pdf_view_plugin_base.cc
index 0339dada..41eb62d 100644
--- a/pdf/pdf_view_plugin_base.cc
+++ b/pdf/pdf_view_plugin_base.cc
@@ -90,12 +90,9 @@
                                 const base::Value& message) {
   DCHECK_EQ(reply_type, *message.FindStringKey("type") + "Reply");
 
-  const std::string* message_id = message.FindStringKey("messageId");
-  CHECK(message_id);
-
   base::Value reply(base::Value::Type::DICTIONARY);
   reply.SetStringKey("type", reply_type);
-  reply.SetStringKey("messageId", *message_id);
+  reply.SetStringKey("messageId", *message.FindStringKey("messageId"));
   return reply;
 }
 
@@ -432,12 +429,9 @@
           {"viewport", &PdfViewPluginBase::HandleViewportMessage},
       });
 
-  const std::string* type = message.FindStringKey("type");
-  CHECK(type);
-
   // TODO(crbug.com/1109796): Use `fixed_flat_map<>::at()` when migration is
   // complete to CHECK out-of-bounds lookups.
-  const auto* it = kMessageHandlers.find(*type);
+  const auto* it = kMessageHandlers.find(*message.FindStringKey("type"));
   if (it == kMessageHandlers.end()) {
     NOTIMPLEMENTED() << message;
     return;
@@ -747,12 +741,8 @@
 
 void PdfViewPluginBase::HandleGetNamedDestinationMessage(
     const base::Value& message) {
-  const std::string* destination_name =
-      message.FindStringKey("namedDestination");
-  CHECK(destination_name);
-
   absl::optional<PDFEngine::NamedDestination> named_destination =
-      engine()->GetNamedDestination(*destination_name);
+      engine()->GetNamedDestination(*message.FindStringKey("namedDestination"));
 
   const int page_number = named_destination.has_value()
                               ? base::checked_cast<int>(named_destination->page)
@@ -779,10 +769,8 @@
 
 void PdfViewPluginBase::HandleGetPasswordCompleteMessage(
     const base::Value& message) {
-  const std::string* password = message.FindStringKey("password");
-  CHECK(password);
-  DCHECK(!password_callback_.is_null());
-  std::move(password_callback_).Run(*password);
+  DCHECK(password_callback_);
+  std::move(password_callback_).Run(*message.FindStringKey("password"));
 }
 
 void PdfViewPluginBase::HandleGetSelectedTextMessage(
diff --git a/remoting/resources/remoting_strings_uk.xtb b/remoting/resources/remoting_strings_uk.xtb
index eaefd51..afcbcd7 100644
--- a/remoting/resources/remoting_strings_uk.xtb
+++ b/remoting/resources/remoting_strings_uk.xtb
@@ -94,7 +94,7 @@
 <translation id="5222676887888702881">Вийти</translation>
 <translation id="5234764350956374838">Закрити</translation>
 <translation id="5308380583665731573">Під’єднатися</translation>
-<translation id="5327248766486351172">Назва</translation>
+<translation id="5327248766486351172">Ім’я</translation>
 <translation id="533625276787323658">Немає комп’ютерів для віддаленого доступу</translation>
 <translation id="5397086374758643919">Видалення хосту Віддаленого керування Chrome</translation>
 <translation id="5419418238395129586">Востаннє онлайн: <ph name="DATE" /></translation>
diff --git a/sandbox/linux/bpf_dsl/bpf_dsl.cc b/sandbox/linux/bpf_dsl/bpf_dsl.cc
index 82a4069..846dc7a8 100644
--- a/sandbox/linux/bpf_dsl/bpf_dsl.cc
+++ b/sandbox/linux/bpf_dsl/bpf_dsl.cc
@@ -103,8 +103,8 @@
 
 class ConstBoolExprImpl : public internal::BoolExprImpl {
  public:
-  ConstBoolExprImpl(bool value) : value_(value) {}
-  ~ConstBoolExprImpl() override {}
+  explicit ConstBoolExprImpl(bool value) : value_(value) {}
+  ~ConstBoolExprImpl() override = default;
 
   CodeGen::Node Compile(PolicyCompiler* pc,
                         CodeGen::Node then_node,
diff --git a/sandbox/linux/syscall_broker/broker_simple_message_unittest.cc b/sandbox/linux/syscall_broker/broker_simple_message_unittest.cc
index d64cba2..c3aca7d5 100644
--- a/sandbox/linux/syscall_broker/broker_simple_message_unittest.cc
+++ b/sandbox/linux/syscall_broker/broker_simple_message_unittest.cc
@@ -61,7 +61,7 @@
 
 class ExpectedResultIntValue : public ExpectedResultValue {
  public:
-  ExpectedResultIntValue(int value);
+  explicit ExpectedResultIntValue(int value);
 
   bool NextMessagePieceMatches(BrokerSimpleMessage* message) override;
   size_t Size() override;
diff --git a/sandbox/linux/tests/sandbox_test_runner_function_pointer.h b/sandbox/linux/tests/sandbox_test_runner_function_pointer.h
index f3b8d27e6..968e787a 100644
--- a/sandbox/linux/tests/sandbox_test_runner_function_pointer.h
+++ b/sandbox/linux/tests/sandbox_test_runner_function_pointer.h
@@ -12,7 +12,7 @@
 
 class SandboxTestRunnerFunctionPointer : public SandboxTestRunner {
  public:
-  SandboxTestRunnerFunctionPointer(void (*function_to_run)(void));
+  explicit SandboxTestRunnerFunctionPointer(void (*function_to_run)());
   ~SandboxTestRunnerFunctionPointer() override;
   void Run() override;
 
diff --git a/sandbox/policy/win/sandbox_win.cc b/sandbox/policy/win/sandbox_win.cc
index 3b6543c..52413e2 100644
--- a/sandbox/policy/win/sandbox_win.cc
+++ b/sandbox/policy/win/sandbox_win.cc
@@ -155,7 +155,7 @@
 // chrome.exe and chrome.dll.
 class PolicyTraceHelper : public base::trace_event::ConvertableToTraceFormat {
  public:
-  PolicyTraceHelper(TargetPolicy* policy) {
+  explicit PolicyTraceHelper(TargetPolicy* policy) {
     // |info| must live until JsonString() output is copied.
     std::unique_ptr<PolicyInfo> info = policy->GetPolicyInfo();
     json_string_ = std::string(info->JsonString());
diff --git a/sandbox/win/src/app_container_base.cc b/sandbox/win/src/app_container_base.cc
index ca9977910..9cb27f06 100644
--- a/sandbox/win/src/app_container_base.cc
+++ b/sandbox/win/src/app_container_base.cc
@@ -67,7 +67,7 @@
 
 class ScopedImpersonation {
  public:
-  ScopedImpersonation(const base::win::ScopedHandle& token) {
+  explicit ScopedImpersonation(const base::win::ScopedHandle& token) {
     BOOL result = ::ImpersonateLoggedOnUser(token.Get());
     DCHECK(result);
   }
diff --git a/sandbox/win/src/app_container_unittest.cc b/sandbox/win/src/app_container_unittest.cc
index 3f22a49..a57bd443 100644
--- a/sandbox/win/src/app_container_unittest.cc
+++ b/sandbox/win/src/app_container_unittest.cc
@@ -103,7 +103,7 @@
 
 class SECURITY_ATTRIBUTES_SDDL : public SECURITY_ATTRIBUTES {
  public:
-  SECURITY_ATTRIBUTES_SDDL(LPCWSTR sddl) : SECURITY_ATTRIBUTES() {
+  explicit SECURITY_ATTRIBUTES_SDDL(LPCWSTR sddl) : SECURITY_ATTRIBUTES() {
     nLength = sizeof(SECURITY_ATTRIBUTES);
     if (!::ConvertStringSecurityDescriptorToSecurityDescriptor(
             sddl, SDDL_REVISION_1, &lpSecurityDescriptor, nullptr)) {
diff --git a/sandbox/win/src/crosscall_client.h b/sandbox/win/src/crosscall_client.h
index af13651d..dd2974c1 100644
--- a/sandbox/win/src/crosscall_client.h
+++ b/sandbox/win/src/crosscall_client.h
@@ -58,7 +58,7 @@
 template <typename T>
 class CopyHelper {
  public:
-  CopyHelper(const T& t) : t_(t) {}
+  explicit CopyHelper(const T& t) : t_(t) {}
 
   // Returns the pointer to the start of the input.
   const void* GetStart() const { return &t_; }
@@ -91,7 +91,7 @@
 template <>
 class CopyHelper<void*> {
  public:
-  CopyHelper(void* t) : t_(t) {}
+  explicit CopyHelper(void* t) : t_(t) {}
 
   // Returns the pointer to the start of the input.
   const void* GetStart() const { return &t_; }
@@ -121,7 +121,7 @@
 template <>
 class CopyHelper<const wchar_t*> {
  public:
-  CopyHelper(const wchar_t* t) : t_(t) {}
+  explicit CopyHelper(const wchar_t* t) : t_(t) {}
 
   // Returns the pointer to the start of the string.
   const void* GetStart() const { return t_; }
@@ -169,7 +169,7 @@
 class CopyHelper<wchar_t*> : public CopyHelper<const wchar_t*> {
  public:
   typedef CopyHelper<const wchar_t*> Base;
-  CopyHelper(wchar_t* t) : Base(t) {}
+  explicit CopyHelper(wchar_t* t) : Base(t) {}
 
   const void* GetStart() const { return Base::GetStart(); }
 
@@ -189,7 +189,7 @@
  public:
   typedef const wchar_t array[n];
   typedef CopyHelper<const wchar_t*> Base;
-  CopyHelper(array t) : Base(t) {}
+  explicit CopyHelper(array t) : Base(t) {}
 
   const void* GetStart() const { return Base::GetStart(); }
 
@@ -216,7 +216,7 @@
 template <>
 class CopyHelper<InOutCountedBuffer> {
  public:
-  CopyHelper(const InOutCountedBuffer t) : t_(t) {}
+  explicit CopyHelper(const InOutCountedBuffer t) : t_(t) {}
 
   // Returns the pointer to the start of the string.
   const void* GetStart() const { return t_.Buffer(); }
diff --git a/sandbox/win/src/policy_engine_params.h b/sandbox/win/src/policy_engine_params.h
index d7ffdc4..d7d4d5c6 100644
--- a/sandbox/win/src/policy_engine_params.h
+++ b/sandbox/win/src/policy_engine_params.h
@@ -118,43 +118,49 @@
 template <typename T>
 class ParameterSetEx : public ParameterSet {
  public:
-  ParameterSetEx(const void* address);
+  explicit ParameterSetEx(const void* address);
 };
 
 template <>
 class ParameterSetEx<void const*> : public ParameterSet {
  public:
-  ParameterSetEx(const void* address) : ParameterSet(VOIDPTR_TYPE, address) {}
+  explicit ParameterSetEx(const void* address)
+      : ParameterSet(VOIDPTR_TYPE, address) {}
 };
 
 template <>
 class ParameterSetEx<void*> : public ParameterSet {
  public:
-  ParameterSetEx(const void* address) : ParameterSet(VOIDPTR_TYPE, address) {}
+  explicit ParameterSetEx(const void* address)
+      : ParameterSet(VOIDPTR_TYPE, address) {}
 };
 
 template <>
 class ParameterSetEx<wchar_t*> : public ParameterSet {
  public:
-  ParameterSetEx(const void* address) : ParameterSet(WCHAR_TYPE, address) {}
+  explicit ParameterSetEx(const void* address)
+      : ParameterSet(WCHAR_TYPE, address) {}
 };
 
 template <>
 class ParameterSetEx<wchar_t const*> : public ParameterSet {
  public:
-  ParameterSetEx(const void* address) : ParameterSet(WCHAR_TYPE, address) {}
+  explicit ParameterSetEx(const void* address)
+      : ParameterSet(WCHAR_TYPE, address) {}
 };
 
 template <>
 class ParameterSetEx<uint32_t> : public ParameterSet {
  public:
-  ParameterSetEx(const void* address) : ParameterSet(UINT32_TYPE, address) {}
+  explicit ParameterSetEx(const void* address)
+      : ParameterSet(UINT32_TYPE, address) {}
 };
 
 template <>
 class ParameterSetEx<UNICODE_STRING> : public ParameterSet {
  public:
-  ParameterSetEx(const void* address) : ParameterSet(UNISTR_TYPE, address) {}
+  explicit ParameterSetEx(const void* address)
+      : ParameterSet(UNISTR_TYPE, address) {}
 };
 
 template <typename T>
diff --git a/sandbox/win/src/sandbox_policy_diagnostic.h b/sandbox/win/src/sandbox_policy_diagnostic.h
index 89982a3f..d5ab466 100644
--- a/sandbox/win/src/sandbox_policy_diagnostic.h
+++ b/sandbox/win/src/sandbox_policy_diagnostic.h
@@ -30,7 +30,7 @@
 class PolicyDiagnostic final : public PolicyInfo {
  public:
   // This should quickly copy what it needs from PolicyBase.
-  PolicyDiagnostic(PolicyBase* policy);
+  explicit PolicyDiagnostic(PolicyBase* policy);
   ~PolicyDiagnostic() override;
   const char* JsonString() override;
 
diff --git a/sandbox/win/tests/integration_tests/integration_tests_test.cc b/sandbox/win/tests/integration_tests/integration_tests_test.cc
index 0b9662b..4968bcd 100644
--- a/sandbox/win/tests/integration_tests/integration_tests_test.cc
+++ b/sandbox/win/tests/integration_tests/integration_tests_test.cc
@@ -47,7 +47,8 @@
  public:
   TestDiagnosticsReceiver() {}
   ~TestDiagnosticsReceiver() final {}
-  TestDiagnosticsReceiver(PolicyDiagnosticsWaiter* waiter) { waiter_ = waiter; }
+  explicit TestDiagnosticsReceiver(PolicyDiagnosticsWaiter* waiter)
+      : waiter_(waiter) {}
   PolicyDiagnosticsWaiter* waiter_;
   void ReceiveDiagnostics(std::unique_ptr<PolicyList> policies) override {
     waiter_->policies = std::move(policies);
diff --git a/storage/browser/database/database_tracker.cc b/storage/browser/database/database_tracker.cc
index 45a4dc9..22c18bf9 100644
--- a/storage/browser/database/database_tracker.cc
+++ b/storage/browser/database/database_tracker.cc
@@ -85,9 +85,11 @@
     bool is_incognito,
     scoped_refptr<SpecialStoragePolicy> special_storage_policy,
     scoped_refptr<QuotaManagerProxy> quota_manager_proxy) {
-  return base::MakeRefCounted<DatabaseTracker>(
+  auto database_tracker = base::MakeRefCounted<DatabaseTracker>(
       profile_path, is_incognito, std::move(special_storage_policy),
       std::move(quota_manager_proxy), base::PassKey<DatabaseTracker>());
+  database_tracker->RegisterQuotaClient();
+  return database_tracker;
 }
 
 DatabaseTracker::DatabaseTracker(
@@ -110,7 +112,16 @@
       quota_manager_proxy_(std::move(quota_manager_proxy)),
       task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
           {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
-           base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {
+           base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {}
+
+DatabaseTracker::~DatabaseTracker() {
+  // base::RefCountedThreadSafe inserts the appropriate barriers to ensure
+  // member access in the destructor does not introduce data races.
+  DCHECK(dbs_to_be_deleted_.empty());
+  DCHECK(deletion_callbacks_.empty());
+}
+
+void DatabaseTracker::RegisterQuotaClient() {
   if (quota_manager_proxy_) {
     // TODO(crbug.com/1163048): Use mojo and switch to RegisterClient().
     quota_manager_proxy_->RegisterLegacyClient(
@@ -119,11 +130,6 @@
   }
 }
 
-DatabaseTracker::~DatabaseTracker() {
-  DCHECK(dbs_to_be_deleted_.empty());
-  DCHECK(deletion_callbacks_.empty());
-}
-
 void DatabaseTracker::DatabaseOpened(const std::string& origin_identifier,
                                      const std::u16string& database_name,
                                      const std::u16string& database_description,
diff --git a/storage/browser/database/database_tracker.h b/storage/browser/database/database_tracker.h
index 48c4eae4..752bffc 100644
--- a/storage/browser/database/database_tracker.h
+++ b/storage/browser/database/database_tracker.h
@@ -71,12 +71,14 @@
 // This class manages the main database and keeps track of open databases.
 //
 // The data in this class is not thread-safe, so all methods of this class
-// should be called on the task runner returned by |task_runner()|. The only
-// exceptions are the ctor(), the dtor() and the database_directory() and
-// quota_manager_proxy() getters.
+// should be called on the task runner returned by task_runner(). The only
+// exceptions are the constructor, the destructor, and the getters explicitly
+// marked as thread-safe.
 class COMPONENT_EXPORT(STORAGE_BROWSER) DatabaseTracker
     : public base::RefCountedThreadSafe<DatabaseTracker> {
  public:
+  REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
+
   class Observer {
    public:
     virtual void OnDatabaseSizeChanged(const std::string& origin_identifier,
@@ -106,6 +108,11 @@
   DatabaseTracker(const DatabaseTracker&) = delete;
   DatabaseTracker& operator=(const DatabaseTracker&) = delete;
 
+  // Methods not explicity marked thread-safe must be called on this sequence.
+  //
+  // Thread-safe getter.
+  base::SequencedTaskRunner* task_runner() { return task_runner_.get(); }
+
   void DatabaseOpened(const std::string& origin_identifier,
                       const std::u16string& database_name,
                       const std::u16string& database_details,
@@ -188,8 +195,6 @@
   // Disables the exit-time deletion of session-only data.
   void SetForceKeepSessionState();
 
-  base::SequencedTaskRunner* task_runner() const { return task_runner_.get(); }
-
  protected:
   // Subclasses need PassKeys to call the constructor.
   static base::PassKey<DatabaseTracker> CreatePassKey() {
@@ -228,9 +233,11 @@
     }
   };
 
-  // virtual for unit-testing only.
   virtual ~DatabaseTracker();
 
+  // Registers WebSQL's QuotaClient with the QuotaManager.
+  void RegisterQuotaClient();
+
   // Deletes the directory that stores all DBs in Incognito mode, if it
   // exists.
   void DeleteIncognitoDBDirectory();
@@ -319,8 +326,8 @@
   // Thread-safety argument: The reference is immutable.
   const scoped_refptr<QuotaManagerProxy> quota_manager_proxy_;
 
-  // The database tracker thread we're supposed to run file IO on.
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  // Sequence where file I/O is allowed.
+  const scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   // When in Incognito mode, store a DELETE_ON_CLOSE handle to each
   // main DB and journal file that was accessed. When the Incognito profile
diff --git a/testing/buildbot/chromium.angle.json b/testing/buildbot/chromium.angle.json
index e543e52f..c5ac0e54 100644
--- a/testing/buildbot/chromium.angle.json
+++ b/testing/buildbot/chromium.angle.json
@@ -1377,7 +1377,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "named_caches": [
@@ -1435,7 +1435,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "named_caches": [
@@ -3226,7 +3226,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -3251,7 +3251,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3292,7 +3292,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -3329,7 +3329,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -3366,7 +3366,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -3403,7 +3403,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -3440,7 +3440,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -3476,7 +3476,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -3508,7 +3508,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3535,7 +3535,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3562,7 +3562,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3589,7 +3589,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3616,7 +3616,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -3644,7 +3644,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -3672,7 +3672,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -3698,7 +3698,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json
index e71dd24..c944113d 100644
--- a/testing/buildbot/chromium.dawn.json
+++ b/testing/buildbot/chromium.dawn.json
@@ -1321,7 +1321,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1348,7 +1348,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1375,7 +1375,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1402,7 +1402,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1427,7 +1427,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1450,7 +1450,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1481,7 +1481,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1514,7 +1514,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1548,7 +1548,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1849,7 +1849,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1876,7 +1876,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1903,7 +1903,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1930,7 +1930,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1955,7 +1955,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1978,7 +1978,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2009,7 +2009,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2042,7 +2042,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2076,7 +2076,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index f6db2b6..6f36180 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -14947,7 +14947,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -14973,7 +14973,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -15001,7 +15001,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -15028,7 +15028,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -15052,7 +15052,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -15076,7 +15076,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -15097,7 +15097,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -15122,7 +15122,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -15143,7 +15143,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -15180,7 +15180,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15215,7 +15215,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15250,7 +15250,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15285,7 +15285,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15324,7 +15324,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15368,7 +15368,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15412,7 +15412,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15448,7 +15448,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15483,7 +15483,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15519,7 +15519,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -15556,7 +15556,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "expiration": 21600,
@@ -15665,7 +15665,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15699,7 +15699,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15736,7 +15736,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15771,7 +15771,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15806,7 +15806,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15838,7 +15838,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15870,7 +15870,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15899,7 +15899,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15932,7 +15932,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -15961,7 +15961,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16007,7 +16007,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16051,7 +16051,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16094,7 +16094,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16137,7 +16137,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16180,7 +16180,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16223,7 +16223,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16266,7 +16266,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16318,7 +16318,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16370,7 +16370,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16414,7 +16414,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16457,7 +16457,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16500,7 +16500,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16552,7 +16552,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16604,7 +16604,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16647,7 +16647,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16690,7 +16690,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16742,7 +16742,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16794,7 +16794,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16838,7 +16838,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16882,7 +16882,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16925,7 +16925,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -16970,7 +16970,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -17017,7 +17017,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -17062,7 +17062,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -17107,7 +17107,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -17152,7 +17152,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -17197,7 +17197,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             },
             {
               "cpu": "x86-64",
@@ -18572,7 +18572,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -18598,7 +18598,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -18627,7 +18627,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -18654,7 +18654,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -18681,7 +18681,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -18705,7 +18705,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -18729,7 +18729,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -18750,7 +18750,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -18775,7 +18775,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -18796,7 +18796,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -18833,7 +18833,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -18868,7 +18868,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -18903,7 +18903,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -18938,7 +18938,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -18973,7 +18973,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19008,7 +19008,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19043,7 +19043,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19087,7 +19087,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19131,7 +19131,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19167,7 +19167,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19202,7 +19202,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19237,7 +19237,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19276,7 +19276,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19320,7 +19320,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19364,7 +19364,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19399,7 +19399,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19434,7 +19434,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19478,7 +19478,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19522,7 +19522,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19549,7 +19549,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -19584,7 +19584,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19620,7 +19620,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19655,7 +19655,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19692,7 +19692,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19730,7 +19730,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19767,7 +19767,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19804,7 +19804,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19841,7 +19841,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -19877,7 +19877,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -27665,7 +27665,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -27691,7 +27691,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27712,7 +27712,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27737,7 +27737,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27758,7 +27758,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27795,7 +27795,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -27830,7 +27830,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -27865,7 +27865,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -27900,7 +27900,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -27939,7 +27939,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -27983,7 +27983,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28018,7 +28018,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28053,7 +28053,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28097,7 +28097,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28133,7 +28133,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28168,7 +28168,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28200,7 +28200,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28237,7 +28237,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28274,7 +28274,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28311,7 +28311,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -28348,7 +28348,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json
index eb4d85e..5c59ec3 100644
--- a/testing/buildbot/chromium.gpu.json
+++ b/testing/buildbot/chromium.gpu.json
@@ -1471,7 +1471,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1499,7 +1499,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1526,7 +1526,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1550,7 +1550,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1587,7 +1587,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1622,7 +1622,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1657,7 +1657,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1692,7 +1692,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1731,7 +1731,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1775,7 +1775,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1819,7 +1819,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1855,7 +1855,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1890,7 +1890,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1926,7 +1926,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1955,7 +1955,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1984,7 +1984,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2011,7 +2011,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -2038,7 +2038,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2062,7 +2062,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2099,7 +2099,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2134,7 +2134,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2169,7 +2169,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2204,7 +2204,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2243,7 +2243,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2287,7 +2287,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2331,7 +2331,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2358,7 +2358,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2393,7 +2393,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2428,7 +2428,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -2464,7 +2464,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index 6985b939..5ad6ae8c 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -1189,7 +1189,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1223,7 +1223,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1257,7 +1257,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1291,7 +1291,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1334,7 +1334,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1377,7 +1377,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1412,7 +1412,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1446,7 +1446,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1482,7 +1482,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
@@ -1518,7 +1518,7 @@
               "cpu": "x86-64",
               "display_attached": "1",
               "gpu": "8086:0a2e",
-              "os": "Mac-10.15.5"
+              "os": "Mac-10.15.5|Mac-10.15.7"
             }
           ],
           "idempotent": false,
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 402e249..98cf2d6 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -733,7 +733,7 @@
       'dimensions': {
         'cpu': 'x86-64',
         'gpu': '8086:0a2e',
-        'os': 'Mac-10.15.5',
+        'os': 'Mac-10.15.5|Mac-10.15.7',
         'display_attached': '1',
       },
     },
@@ -743,7 +743,7 @@
       'dimensions': {
         'cpu': 'x86-64',
         'gpu': '8086:0a2e',
-        'os': 'Mac-10.15.5',
+        'os': 'Mac-10.15.5|Mac-10.15.7',
         'display_attached': '1',
       },
     },
@@ -757,7 +757,7 @@
         {
           'cpu': 'x86-64',
           'gpu': '8086:0a2e',
-          'os': 'Mac-10.15.5',
+          'os': 'Mac-10.15.5|Mac-10.15.7',
           'display_attached': '1',
         },
       ],
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
index 59c92ace..617fdf6 100644
--- a/third_party/android_deps/BUILD.gn
+++ b/third_party/android_deps/BUILD.gn
@@ -138,7 +138,7 @@
   # This target does not come with most of its dependencies and is
   # only meant to be used by the resources shrinker. If you wish to use
   # this for other purposes, change buildCompileNoDeps in build.gradle.
-  visibility = [ "//build/android/unused_resources:*" ]
+  visibility = [ "//build/android/gyp/resources_shrinker:*" ]
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -150,7 +150,7 @@
   # This target does not come with most of its dependencies and is
   # only meant to be used by the resources shrinker. If you wish to use
   # this for other purposes, change buildCompileNoDeps in build.gradle.
-  visibility = [ "//build/android/unused_resources:*" ]
+  visibility = [ "//build/android/gyp/resources_shrinker:*" ]
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
@@ -162,7 +162,7 @@
   # This target does not come with most of its dependencies and is
   # only meant to be used by the resources shrinker. If you wish to use
   # this for other purposes, change buildCompileNoDeps in build.gradle.
-  visibility = [ "//build/android/unused_resources:*" ]
+  visibility = [ "//build/android/gyp/resources_shrinker:*" ]
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy b/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
index 2ca87fa9..f7c0fb16 100644
--- a/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
+++ b/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
@@ -655,7 +655,7 @@
                 sb.append('  # This target does not come with most of its dependencies and is\n')
                 sb.append('  # only meant to be used by the resources shrinker. If you wish to use\n')
                 sb.append('  # this for other purposes, change buildCompileNoDeps in build.gradle.\n')
-                sb.append('  visibility = [ "//build/android/unused_resources:*" ]\n')
+                sb.append('  visibility = [ "//build/android/gyp/resources_shrinker:*" ]\n')
                 break
             case 'org_jetbrains_kotlinx_kotlinx_coroutines_android':
                sb.append('requires_android = true')
diff --git a/third_party/blink/renderer/bindings/OWNERS b/third_party/blink/renderer/bindings/OWNERS
index c86b5f2..33e84a44 100644
--- a/third_party/blink/renderer/bindings/OWNERS
+++ b/third_party/blink/renderer/bindings/OWNERS
@@ -8,7 +8,6 @@
 marja@chromium.org
 mkwst@chromium.org
 mlippautz@chromium.org
-peria@chromium.org
 pfeldman@chromium.org
 vivekg@chromium.org
 yhirano@chromium.org
diff --git a/third_party/blink/renderer/bindings/core/v8/to_v8_traits_test.cc b/third_party/blink/renderer/bindings/core/v8/to_v8_traits_test.cc
index fe9cdf6..96600a5 100644
--- a/third_party/blink/renderer/bindings/core/v8/to_v8_traits_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/to_v8_traits_test.cc
@@ -4,12 +4,12 @@
 
 #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h"
 
-#include "third_party/blink/renderer/bindings/core/v8/file_or_usv_string_or_form_data.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_address_space.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_create_html_callback.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_dom_point_init.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_event_listener.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_file_formdata_usvstring.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
 #include "third_party/blink/renderer/core/streams/stream_promise_resolver.h"
 #include "third_party/blink/renderer/core/testing/garbage_collected_script_wrappable.h"
@@ -592,21 +592,21 @@
 
 TEST(ToV8TraitsTest, Union) {
   const V8TestingScope scope;
-  const FileOrUSVStringOrFormData usv_string =
-      FileOrUSVStringOrFormData::FromUSVString("https://example.com/");
-  TEST_TOV8_TRAITS(scope, IDLUnionNotINT<FileOrUSVStringOrFormData>,
+  const auto* usv_string =
+      MakeGarbageCollected<V8UnionFileOrFormDataOrUSVString>(
+          "https://example.com/");
+  TEST_TOV8_TRAITS(scope, V8UnionFileOrFormDataOrUSVString,
                    "https://example.com/", usv_string);
 }
 
 TEST(ToV8TraitsTest, NullableUnion) {
   const V8TestingScope scope;
-  TEST_TOV8_TRAITS(scope,
-                   IDLNullable<IDLUnionNotINT<FileOrUSVStringOrFormData>>,
-                   "null", FileOrUSVStringOrFormData());
-  const FileOrUSVStringOrFormData usv_string =
-      FileOrUSVStringOrFormData::FromUSVString("http://example.com/");
-  TEST_TOV8_TRAITS(scope,
-                   IDLNullable<IDLUnionNotINT<FileOrUSVStringOrFormData>>,
+  TEST_TOV8_TRAITS(scope, IDLNullable<V8UnionFileOrFormDataOrUSVString>, "null",
+                   nullptr);
+  const auto* usv_string =
+      MakeGarbageCollected<V8UnionFileOrFormDataOrUSVString>(
+          "http://example.com/");
+  TEST_TOV8_TRAITS(scope, IDLNullable<V8UnionFileOrFormDataOrUSVString>,
                    "http://example.com/", usv_string);
 }
 
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
index 5fd2955..33c1963a 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
@@ -9,6 +9,7 @@
 from . import name_style
 from .blink_v8_bridge import blink_class_name
 from .blink_v8_bridge import blink_type_info
+from .blink_v8_bridge import make_default_value_expr
 from .blink_v8_bridge import make_v8_to_blink_value
 from .blink_v8_bridge import make_v8_to_blink_value_variadic
 from .blink_v8_bridge import native_value_tag
@@ -96,9 +97,25 @@
 
 def callback_function_name(cg_context,
                            overload_index=None,
+                           argument_count=None,
                            for_cross_origin=False):
+    """
+    Args:
+        cg_context: A CodeGenContext of the target IDL construct.
+        overload_index: An overload index if the target is an overloaded
+            IDL operation.
+        argument_count: When the target is an IDL operation that has optional
+            arguments and is annotated with [NoAllocDirectCall], the value is
+            the number of arguments that V8 passes in (excluding the fixed
+            arguments like the receiver object and the
+            v8::FastApiCallbackOptions.)
+        for_cross_origin: True if the target is the cross origin accessible
+            version.
+    """
+
     assert isinstance(cg_context, CodeGenContext)
     assert overload_index is None or isinstance(overload_index, int)
+    assert argument_count is None or isinstance(argument_count, int)
     assert isinstance(for_cross_origin, bool)
 
     def _cxx_name(name):
@@ -149,14 +166,24 @@
     elif cg_context.stringifier:
         kind = "Operation"
 
+    if cg_context.no_alloc_direct_call:
+        nadc = "NoAllocDirectCall"
+    elif cg_context.no_alloc_direct_call_for_testing:
+        nadc = "NoAllocDirectCallForTesting"
+    else:
+        nadc = ""
+
+    overload = ""
+    if overload_index is not None and (len(cg_context.constructor_group
+                                           or cg_context.operation_group) > 1):
+        overload += "Overload{}".format(overload_index + 1)
+    if argument_count is not None:
+        overload += "Arg{}".format(argument_count)
+
     if for_cross_origin:
         suffix = "CrossOrigin"
-    elif overload_index is not None:
-        suffix = "Overload{}".format(overload_index + 1)
-    elif cg_context.no_alloc_direct_call:
-        suffix = "NoAllocDirectCallCallback"
-    elif cg_context.no_alloc_direct_call_for_testing:
-        suffix = "NoAllocDirectCallForTestingCallback"
+    elif nadc or overload:
+        suffix = nadc + overload
     else:
         suffix = "Callback"
 
@@ -2183,14 +2210,74 @@
     return SequenceNode([named_ctor_def, EmptyNode(), func_def])
 
 
-def make_no_alloc_direct_call_callback_def(cg_context, function_name):
+def list_no_alloc_direct_call_callbacks(cg_context):
+    """
+    Returns a list of [NoAllocDirectCall] callback functions to be registered
+    at V8, including all overloaded operations annotated with
+    [NoAllocDirectCall] and their variants of optional arguments.
+
+    Example:
+      Given the following Web IDL fragments,
+        void f(DOMString);                                             // (a)
+        [NoAllocDirectCall] void f(Node node);                         // (b)
+        [NoAllocDirectCall] void f(optional long a, optional long b);  // (c)
+      the following callback functions should be generated,
+        void F(v8::Local<v8::Value> node);  // (b)
+        void F();                           // (c)
+        void F(int32_t a);                  // (c)
+        void F(int32_t a, int32_t b);       // (c)
+      thus the following entries are returned.
+        [
+          Entry(operation=(b), argument_count=1),  # overload_index=2
+          Entry(operation=(c), argument_count=2),  # overload_index=3
+          Entry(operation=(c), argument_count=1),  # overload_index=3
+          Entry(operation=(c), argument_count=0),  # overload_index=3
+        ]
+    """
+    assert isinstance(cg_context, CodeGenContext)
+
+    class Entry(object):
+        def __init__(self, operation, argument_count):
+            self.operation = operation
+            self.argument_count = argument_count
+            self.callback_name = callback_function_name(
+                cg_context,
+                overload_index=self.operation.overload_index,
+                argument_count=self.argument_count)
+
+    entries = []
+    for operation in cg_context.operation_group:
+        if "NoAllocDirectCall" not in operation.extended_attributes:
+            continue
+        for argument in reversed(operation.arguments):
+            entries.append(Entry(operation, argument.index + 1))
+            if not argument.is_optional:
+                break
+        else:
+            entries.append(Entry(operation, 0))
+    return entries
+
+
+def make_no_alloc_direct_call_callback_def(cg_context, function_name,
+                                           argument_count):
+    """
+    Args:
+        cg_context: A CodeGenContext of the target IDL construct.
+        function_name: The function name to be produced.
+        argument_count: The number of arguments that the produced function
+            takes, which may be different from the number of arguments of
+            the target cg_context.function_like due to optional arguments.
+    """
     assert isinstance(cg_context, CodeGenContext)
     assert isinstance(function_name, str)
+    assert isinstance(argument_count, int)
 
     S = SymbolNode
     T = TextNode
     F = lambda *args, **kwargs: T(_format(*args, **kwargs))
 
+    function_like = cg_context.function_like
+
     class ArgumentInfo(object):
         def __init__(self, v8_type, v8_arg_name, blink_arg_name, symbol_node):
             self.v8_type = v8_type
@@ -2212,7 +2299,9 @@
                       "auto&& {} = {};".format(blink_arg_name, v8_arg_name)))
 
     arg_list = []
-    for argument in cg_context.operation.arguments:
+    for argument in function_like.arguments:
+        if not (argument.index < argument_count):
+            break
         blink_arg_name = name_style.arg_f("arg{}_{}", argument.index + 1,
                                           argument.identifier)
         v8_arg_name = name_style.arg_f("v8_arg{}_{}", argument.index + 1,
@@ -2226,8 +2315,8 @@
         map(lambda arg: "{} {}".format(arg.v8_type, arg.v8_arg_name),
             arg_list)) +
                  ["v8::FastApiCallbackOptions& v8_arg_callback_options"])
-    return_type = ("void" if cg_context.operation.return_type.is_void else
-                   blink_type_info(cg_context.operation.return_type).value_t)
+    return_type = ("void" if function_like.return_type.is_void else
+                   blink_type_info(function_like.return_type).value_t)
 
     func_def = CxxFuncDefNode(name=function_name,
                               arg_decls=arg_decls,
@@ -2266,6 +2355,20 @@
 
     blink_arguments = list(
         map(lambda arg: "${{{}}}".format(arg.blink_arg_name), arg_list))
+    # If there are following optional arguments with default values, append
+    # them filled with the default values.
+    for argument in function_like.arguments[argument_count:]:
+        if not argument.default_value:
+            break
+        blink_arg_name = name_style.arg_f("arg{}_{}", argument.index + 1,
+                                          argument.identifier)
+        default_expr = make_default_value_expr(argument.idl_type,
+                                               argument.default_value)
+        body.register_code_symbol(
+            S((blink_arg_name),
+              "auto&& {}{{{}}};".format(blink_arg_name,
+                                        default_expr.initializer_expr)))
+        blink_arguments.append("${{{}}}".format(blink_arg_name))
     if cg_context.may_throw_exception:
         blink_arguments.append("${exception_state}")
     body.append(
@@ -2318,10 +2421,10 @@
             "v8::FastApiCallbackOptions ${v8_fast_api_callback_options}"
             " = v8::FastApiCallbackOptions::CreateForTesting(${isolate});"))
     scope.extend([
-        F(
-            "{}(${info}, ${v8_fast_api_callback_options});",
-            callback_function_name(
-                cg_context.make_copy(no_alloc_direct_call_for_testing=True))),
+        F(("{}(${info}, ${v8_fast_api_callback_options});"),
+          callback_function_name(
+              cg_context.make_copy(no_alloc_direct_call_for_testing=True),
+              overload_index=cg_context.operation.overload_index)),
         CxxUnlikelyIfNode(cond="${blink_receiver}->HasDeferredActions()",
                           body=[
                               T("${blink_receiver}->FlushDeferredActions();"),
@@ -2333,6 +2436,7 @@
 
     return ListNode([
         T("#if DCHECK_IS_ON()"),
+        T("// [NoAllocDirectCall]"),
         CxxUnlikelyIfNode(cond=("RuntimeEnabledFeatures::"
                                 "FakeNoAllocDirectCallForTestingEnabled()"),
                           body=scope),
@@ -2346,12 +2450,15 @@
     if "NoAllocDirectCall" not in cg_context.operation.extended_attributes:
         return None
 
-    return CxxUnlikelyIfNode(
-        cond="UNLIKELY(${blink_receiver}->HasDeferredActions())",
-        body=[
-            TextNode("${blink_receiver}->FlushDeferredActions();"),
-            TextNode("return;"),
-        ])
+    return SequenceNode([
+        TextNode("// [NoAllocDirectCall]"),
+        CxxUnlikelyIfNode(
+            cond="UNLIKELY(${blink_receiver}->HasDeferredActions())",
+            body=[
+                TextNode("${blink_receiver}->FlushDeferredActions();"),
+                TextNode("return;"),
+            ]),
+    ])
 
 
 def make_operation_entry(cg_context):
@@ -2382,8 +2489,6 @@
         make_report_measure_as(cg_context),
         make_log_activity(cg_context),
         EmptyNode(),
-        make_no_alloc_direct_call_flush_deferred_actions(cg_context),
-        EmptyNode(),
     ])
 
     if "Custom" in cg_context.property_.extended_attributes:
@@ -2393,6 +2498,8 @@
         return func_def
 
     body.extend([
+        make_no_alloc_direct_call_flush_deferred_actions(cg_context),
+        EmptyNode(),
         make_check_argument_length(cg_context),
         EmptyNode(),
         make_steps_of_ce_reactions(cg_context),
@@ -2407,9 +2514,7 @@
     return func_def
 
 
-def make_operation_callback_def(cg_context,
-                                function_name,
-                                no_alloc_direct_callback_name=None):
+def make_operation_callback_def(cg_context, function_name):
     assert isinstance(cg_context, CodeGenContext)
     assert isinstance(function_name, str)
 
@@ -2417,48 +2522,54 @@
 
     assert (not ("Custom" in operation_group.extended_attributes)
             or len(operation_group) == 1)
-    assert (not ("NoAllocDirectCall" in operation_group.extended_attributes)
-            or len(operation_group) == 1)
 
+    nodes = SequenceNode()
     if "NoAllocDirectCall" in operation_group.extended_attributes:
-        nodes = ListNode()
-        cgc = cg_context.make_copy(operation=operation_group[0],
-                                   no_alloc_direct_call=True)
-        nodes.extend([
-            make_no_alloc_direct_call_callback_def(
-                cgc, no_alloc_direct_callback_name),
-            EmptyNode(),
-        ])
-        cgc = cg_context.make_copy(operation=operation_group[0],
-                                   no_alloc_direct_call_for_testing=True)
-        nodes.extend([
-            make_no_alloc_direct_call_for_testing_callback_def(
-                cgc, callback_function_name(cgc)),
-            EmptyNode(),
-        ])
-        cgc = cg_context.make_copy(operation=operation_group[0])
-        nodes.extend([
-            make_operation_function_def(cgc, function_name),
-        ])
-        return nodes
+        for entry in list_no_alloc_direct_call_callbacks(cg_context):
+            cgc = cg_context.make_copy(operation=entry.operation,
+                                       no_alloc_direct_call=True)
+            nodes.extend([
+                make_no_alloc_direct_call_callback_def(
+                    cgc,
+                    callback_function_name(
+                        cgc,
+                        overload_index=entry.operation.overload_index,
+                        argument_count=entry.argument_count),
+                    argument_count=entry.argument_count),
+                EmptyNode(),
+            ])
+        for operation in operation_group:
+            if "NoAllocDirectCall" not in operation.extended_attributes:
+                continue
+            cgc = cg_context.make_copy(operation=operation,
+                                       no_alloc_direct_call_for_testing=True)
+            nodes.extend([
+                make_no_alloc_direct_call_for_testing_callback_def(
+                    cgc,
+                    callback_function_name(
+                        cgc, overload_index=operation.overload_index)),
+                EmptyNode(),
+            ])
 
     if len(operation_group) == 1:
-        return make_operation_function_def(
-            cg_context.make_copy(operation=operation_group[0]), function_name)
+        nodes.append(
+            make_operation_function_def(
+                cg_context.make_copy(operation=operation_group[0]),
+                function_name))
+        return nodes
 
-    node = SequenceNode()
     for operation in operation_group:
         cgc = cg_context.make_copy(operation=operation)
-        node.extend([
+        nodes.extend([
             make_operation_function_def(
                 cgc,
                 callback_function_name(
                     cgc, overload_index=operation.overload_index)),
             EmptyNode(),
         ])
-    node.append(
+    nodes.append(
         make_overload_dispatcher_function_def(cg_context, function_name))
-    return node
+    return nodes
 
 
 def make_stringifier_callback_def(cg_context, function_name):
@@ -4632,13 +4743,6 @@
         return "unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck)"
 
 
-def _make_property_entry_v8_c_function(entry):
-    if entry.no_alloc_direct_callback_name is None:
-        return None
-    return "v8::CFunction::MakeWithFallbackSupport({})".format(
-        entry.no_alloc_direct_callback_name)
-
-
 def _make_property_entry_v8_cached_accessor(property_):
     return "unsigned(V8PrivateProperty::CachedAccessor::{})".format(
         property_.extended_attributes.value_of("CachedAccessor") or "kNone")
@@ -4686,20 +4790,20 @@
     T = TextNode
 
     entry_nodes = []
+    pattern = ("{{"
+               "\"{property_name}\", "
+               "{attribute_get_callback}, "
+               "{attribute_set_callback}, "
+               "{v8_property_attribute}, "
+               "{location}, "
+               "{world}, "
+               "{receiver_check}, "
+               "{cross_origin_check_for_get}, "
+               "{cross_origin_check_for_set}, "
+               "{v8_side_effect}, "
+               "{v8_cached_accessor}"
+               "}},")
     for entry in attribute_entries:
-        pattern = ("{{"
-                   "\"{property_name}\", "
-                   "{attribute_get_callback}, "
-                   "{attribute_set_callback}, "
-                   "{v8_property_attribute}, "
-                   "{location}, "
-                   "{world}, "
-                   "{receiver_check}, "
-                   "{cross_origin_check_for_get}, "
-                   "{cross_origin_check_for_set}, "
-                   "{v8_side_effect}, "
-                   "{v8_cached_accessor}"
-                   "}},")
         text = _format(
             pattern,
             property_name=entry.property_.identifier,
@@ -4742,8 +4846,12 @@
     T = TextNode
 
     entry_nodes = []
+    pattern = (
+        "{{"  #
+        "\"{property_name}\", "
+        "{constant_callback}"
+        "}},")
     for entry in constant_entries:
-        pattern = ("{{" "\"{property_name}\", " "{constant_callback}" "}},")
         text = _format(
             pattern,
             property_name=entry.property_.identifier,
@@ -4768,11 +4876,12 @@
     T = TextNode
 
     entry_nodes = []
+    pattern = (
+        "{{"  #
+        "\"{property_name}\", "
+        "{constant_value}"
+        "}},")
     for entry in constant_entries:
-        pattern = ("{{"
-                   "\"{property_name}\", "
-                   "{constant_value}"
-                   "}},")
         text = _format(pattern,
                        property_name=entry.property_.identifier,
                        constant_value=entry.const_constant_name)
@@ -4823,30 +4932,51 @@
         for entry in operation_entries)
 
     T = TextNode
+    F = lambda *args, **kwargs: T(_format(*args, **kwargs))
 
-    no_alloc_direct_call_count = 0
-    for entry in operation_entries:
-        if entry.no_alloc_direct_callback_name:
-            no_alloc_direct_call_count += 1
+    no_alloc_direct_call_count = len(
+        list(
+            filter(lambda entry: entry.no_alloc_direct_call_callbacks,
+                   operation_entries)))
     assert (no_alloc_direct_call_count == 0
             or no_alloc_direct_call_count == len(operation_entries))
-    no_alloc_direct_call_enabled = no_alloc_direct_call_count > 0
+    no_alloc_direct_call_enabled = bool(no_alloc_direct_call_count)
 
     entry_nodes = []
+    nadc_overload_nodes = ListNode()
+    pattern = ("{{"
+               "\"{property_name}\", "
+               "{operation_callback}, "
+               "{function_length}, "
+               "{v8_property_attribute}, "
+               "{location}, "
+               "{world}, "
+               "{receiver_check}, "
+               "{cross_origin_check}, "
+               "{v8_side_effect}"
+               "}}, ")
+    if no_alloc_direct_call_enabled:
+        pattern = ("{{" + pattern + "{v8_cfunction_table}, "
+                   "base::size({v8_cfunction_table})}}, ")
     for entry in operation_entries:
-        pattern = ("{{"
-                   "\"{property_name}\", "
-                   "{operation_callback}, "
-                   "{function_length}, "
-                   "{v8_property_attribute}, "
-                   "{location}, "
-                   "{world}, "
-                   "{receiver_check}, "
-                   "{cross_origin_check}, "
-                   "{v8_side_effect}"
-                   "}}, ")
         if no_alloc_direct_call_enabled:
-            pattern = "{{" + pattern + "{v8_c_function}}}, "
+            nadc_overload_table_name = name_style.constant(
+                "no_alloc_direct_call_overloads_of_",
+                entry.property_.identifier)
+            nadc_overload_nodes.append(
+                ListNode([
+                    T("static const v8::CFunction " +
+                      nadc_overload_table_name + "[] = {"),
+                    ListNode([
+                        F("v8::CFunctionBuilder().Fn({}).Build(),",
+                          nadc_entry.callback_name)
+                        for nadc_entry in entry.no_alloc_direct_call_callbacks
+                    ]),
+                    T("};"),
+                ]))
+        else:
+            nadc_overload_table_name = None
+
         text = _format(
             pattern,
             property_name=entry.property_.identifier,
@@ -4862,7 +4992,7 @@
                 entry.property_),
             v8_side_effect=_make_property_entry_v8_side_effect(
                 entry.property_),
-            v8_c_function=_make_property_entry_v8_c_function(entry))
+            v8_cfunction_table=nadc_overload_table_name)
         entry_nodes.append(T(text))
 
     table_decl_before_name = (
@@ -4871,11 +5001,18 @@
         table_decl_before_name = (
             "static const "
             "IDLMemberInstaller::NoAllocDirectCallOperationConfig")
-    return ListNode([
+    node = ListNode()
+    if nadc_overload_nodes:
+        node.extend([
+            nadc_overload_nodes,
+            EmptyNode(),
+        ])
+    node.extend([
         T(table_decl_before_name + " " + table_name + "[] = {"),
         ListNode(entry_nodes),
         T("};"),
     ])
+    return node
 
 
 class _PropEntryBase(object):
@@ -4944,7 +5081,7 @@
                  operation_group,
                  op_callback_name,
                  op_func_length,
-                 no_alloc_direct_callback_name=None):
+                 no_alloc_direct_call_callbacks=None):
         assert isinstance(op_callback_name, str)
         assert isinstance(op_func_length, int)
 
@@ -4952,7 +5089,7 @@
                                 exposure_conditional, world, operation_group)
         self.op_callback_name = op_callback_name
         self.op_func_length = op_func_length
-        self.no_alloc_direct_callback_name = no_alloc_direct_callback_name
+        self.no_alloc_direct_call_callbacks = no_alloc_direct_call_callbacks
 
 
 def make_property_entries_and_callback_defs(cg_context, attribute_entries,
@@ -5153,14 +5290,12 @@
         cgc = cg_context.make_copy(
             operation_group=operation_group, for_world=world)
         op_callback_name = callback_function_name(cgc)
-        no_alloc_direct_callback_name = (
-            callback_function_name(cgc.make_copy(no_alloc_direct_call=True))
+        op_callback_node = make_operation_callback_def(cgc, op_callback_name)
+        no_alloc_direct_call_callbacks = (
+            list_no_alloc_direct_call_callbacks(
+                cgc.make_copy(no_alloc_direct_call=True))
             if "NoAllocDirectCall" in operation_group.extended_attributes else
             None)
-        op_callback_node = make_operation_callback_def(
-            cgc,
-            op_callback_name,
-            no_alloc_direct_callback_name=no_alloc_direct_callback_name)
 
         callback_def_nodes.extend([
             op_callback_node,
@@ -5175,7 +5310,7 @@
                 operation_group=operation_group,
                 op_callback_name=op_callback_name,
                 op_func_length=operation_group.min_num_of_required_arguments,
-                no_alloc_direct_callback_name=no_alloc_direct_callback_name))
+                no_alloc_direct_call_callbacks=no_alloc_direct_call_callbacks))
 
     def process_stringifier(_, is_context_dependent, exposure_conditional,
                             world):
@@ -5907,12 +6042,12 @@
         install_func="IDLMemberInstaller::InstallOperations",
         table_name=table_name)
     entries = list(
-        filter(lambda entry: not entry.no_alloc_direct_callback_name,
+        filter(lambda entry: not entry.no_alloc_direct_call_callbacks,
                operation_entries))
     install_properties(table_name, entries, _make_operation_registration_table,
                        installer_call_text)
     entries = list(
-        filter(lambda entry: entry.no_alloc_direct_callback_name,
+        filter(lambda entry: entry.no_alloc_direct_call_callbacks,
                operation_entries))
     install_properties(table_name, entries, _make_operation_registration_table,
                        installer_call_text)
diff --git a/third_party/blink/renderer/core/animation/effect_input.cc b/third_party/blink/renderer/core/animation/effect_input.cc
index be3c8bca..e6b9c92e 100644
--- a/third_party/blink/renderer/core/animation/effect_input.cc
+++ b/third_party/blink/renderer/core/animation/effect_input.cc
@@ -38,6 +38,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/string_or_string_sequence.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_base_keyframe.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_base_property_indexed_keyframe.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_string_stringsequence.h"
 #include "third_party/blink/renderer/core/animation/animation_input_helpers.h"
 #include "third_party/blink/renderer/core/animation/compositor_animations.h"
 #include "third_party/blink/renderer/core/animation/css/css_animations.h"
@@ -414,17 +415,19 @@
     return {};
   }
 
-  StringOrStringSequence string_or_string_sequence;
-  V8StringOrStringSequence::ToImpl(
-      script_state->GetIsolate(), v8_value, string_or_string_sequence,
-      UnionTypeConversionMode::kNotNullable, exception_state);
+  auto* string_or_string_sequence =
+      V8UnionStringOrStringSequence::Create(isolate, v8_value, exception_state);
   if (exception_state.HadException())
     return false;
 
-  if (string_or_string_sequence.IsString())
-    result.push_back(string_or_string_sequence.GetAsString());
-  else
-    result = string_or_string_sequence.GetAsStringSequence();
+  switch (string_or_string_sequence->GetContentType()) {
+    case V8UnionStringOrStringSequence::ContentType::kString:
+      result.push_back(string_or_string_sequence->GetAsString());
+      break;
+    case V8UnionStringOrStringSequence::ContentType::kStringSequence:
+      result = string_or_string_sequence->GetAsStringSequence();
+      break;
+  }
 
   return true;
 }
@@ -657,6 +660,7 @@
   }
   return false;
 }
+
 }  // namespace
 
 KeyframeEffectModelBase* EffectInput::Convert(
@@ -751,4 +755,5 @@
   }
   return result;
 }
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/container_query.cc b/third_party/blink/renderer/core/css/container_query.cc
index 6b75aa2..a39850fb 100644
--- a/third_party/blink/renderer/core/css/container_query.cc
+++ b/third_party/blink/renderer/core/css/container_query.cc
@@ -26,8 +26,10 @@
 
 }  // namespace
 
-ContainerQuery::ContainerQuery(scoped_refptr<MediaQuerySet> media_queries)
-    : media_queries_(media_queries),
+ContainerQuery::ContainerQuery(const AtomicString& name,
+                               scoped_refptr<MediaQuerySet> media_queries)
+    : name_(name),
+      media_queries_(media_queries),
       queried_axes_(ComputeQueriedAxes(*media_queries)) {}
 
 ContainerQuery::ContainerQuery(const ContainerQuery& other)
diff --git a/third_party/blink/renderer/core/css/container_query.h b/third_party/blink/renderer/core/css/container_query.h
index cbbe74ff..3acdcbb 100644
--- a/third_party/blink/renderer/core/css/container_query.h
+++ b/third_party/blink/renderer/core/css/container_query.h
@@ -14,9 +14,10 @@
 class CORE_EXPORT ContainerQuery final
     : public GarbageCollected<ContainerQuery> {
  public:
-  explicit ContainerQuery(scoped_refptr<MediaQuerySet>);
+  ContainerQuery(const AtomicString& name, scoped_refptr<MediaQuerySet>);
   ContainerQuery(const ContainerQuery&);
 
+  const AtomicString& Name() const { return name_; }
   PhysicalAxes QueriedAxes() const { return queried_axes_; }
 
   String ToString() const;
@@ -30,6 +31,7 @@
 
   scoped_refptr<MediaQuerySet> MediaQueries() const { return media_queries_; }
 
+  AtomicString name_;
   // TODO(crbug.com/1214810): Refactor to avoid internal MediaQuerySet.
   scoped_refptr<MediaQuerySet> media_queries_;
   PhysicalAxes queried_axes_{kPhysicalAxisNone};
diff --git a/third_party/blink/renderer/core/css/container_query_evaluator.cc b/third_party/blink/renderer/core/css/container_query_evaluator.cc
index aee25f87..d663fd6 100644
--- a/third_party/blink/renderer/core/css/container_query_evaluator.cc
+++ b/third_party/blink/renderer/core/css/container_query_evaluator.cc
@@ -34,22 +34,24 @@
   results_.Set(&query, result);
 }
 
-bool ContainerQueryEvaluator::ContainerChanged(PhysicalSize size,
-                                               PhysicalAxes contained_axes) {
+ContainerQueryEvaluator::Change ContainerQueryEvaluator::ContainerChanged(
+    PhysicalSize size,
+    PhysicalAxes contained_axes) {
   if (size_ == size && contained_axes_ == contained_axes)
-    return false;
+    return Change::kNone;
 
   SetData(size, contained_axes);
 
-  if (!ResultsChanged())
-    return false;
+  Change change = ComputeChange();
 
   // We can clear the results here because we will always recaculate the style
   // of all descendants which depend on this evaluator whenever we return
-  // 'true' from this function, so the results will always be repopulated.
-  results_.clear();
+  // something other than kNone from this function, so the results will always
+  // be repopulated.
+  if (change != Change::kNone)
+    results_.clear();
 
-  return true;
+  return change;
 }
 
 void ContainerQueryEvaluator::Trace(Visitor* visitor) const {
@@ -68,12 +70,18 @@
       MakeGarbageCollected<MediaQueryEvaluator>(*cached_values);
 }
 
-bool ContainerQueryEvaluator::ResultsChanged() const {
+ContainerQueryEvaluator::Change ContainerQueryEvaluator::ComputeChange() const {
+  Change change = Change::kNone;
+
   for (const auto& result : results_) {
-    if (Eval(*result.key) != result.value)
-      return true;
+    if (Eval(*result.key) != result.value) {
+      change =
+          std::max(change, result.key->Name() == g_null_atom ? Change::kUnnamed
+                                                             : Change::kNamed);
+    }
   }
-  return false;
+
+  return change;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/container_query_evaluator.h b/third_party/blink/renderer/core/css/container_query_evaluator.h
index 939d0488..4c3893c8 100644
--- a/third_party/blink/renderer/core/css/container_query_evaluator.h
+++ b/third_party/blink/renderer/core/css/container_query_evaluator.h
@@ -33,25 +33,32 @@
     return result;
   }
 
+  enum class Change {
+    // The update has no effect on the evaluation of queries associated with
+    // this evaluator, and therefore we do not need to perform style recalc of
+    // any elements which depend on this evaluator.
+    kNone,
+    // The update changed unnamed queries only. We must therefore perform style
+    // recalc on dependent elements within the container, but we can skip nested
+    // container.
+    kUnnamed,
+    // The update changed at least one named query. We must therefore perform
+    // style
+    // recalc on dependent elements, including those in nested containers.
+    kNamed,
+  };
+
   // Update the size/axis information of the evaluator.
   //
-  // A return value of 'false' means that the update has no effect on the
-  // evaluation of queries associated with this evaluator, and therefore we do
-  // not need to perform style recalc of any elements which depend on this
-  // evaluator.
-  //
-  // A return value of 'true' means that the update *may* have an effect, and
-  // therefore elements that depends on this evaluator need style recalc.
-  //
-  // Dependent queries are cleared when 'true' is returned (and left unchanged
-  // otherwise).
-  bool ContainerChanged(PhysicalSize, PhysicalAxes contained_axes);
+  // Dependent queries are cleared when kUnnamed/kNamed is returned (and left
+  // unchanged otherwise).
+  Change ContainerChanged(PhysicalSize, PhysicalAxes contained_axes);
 
   void Trace(Visitor*) const;
 
  private:
   void SetData(PhysicalSize, PhysicalAxes contained_axes);
-  bool ResultsChanged() const;
+  Change ComputeChange() const;
 
   // TODO(crbug.com/1145970): Don't lean on MediaQueryEvaluator.
   Member<MediaQueryEvaluator> media_query_evaluator_;
diff --git a/third_party/blink/renderer/core/css/container_query_evaluator_test.cc b/third_party/blink/renderer/core/css/container_query_evaluator_test.cc
index 8c79745a..3e83b62b 100644
--- a/third_party/blink/renderer/core/css/container_query_evaluator_test.cc
+++ b/third_party/blink/renderer/core/css/container_query_evaluator_test.cc
@@ -40,6 +40,13 @@
     return evaluator->Eval(*container_query);
   }
 
+  bool ContainerChanged(ContainerQueryEvaluator* evaluator,
+                        PhysicalSize size,
+                        PhysicalAxes axes) {
+    return evaluator->ContainerChanged(size, axes) !=
+           ContainerQueryEvaluator::Change::kNone;
+  }
+
   const PhysicalAxes none{kPhysicalAxisNone};
   const PhysicalAxes both{kPhysicalAxisBoth};
   const PhysicalAxes horizontal{kPhysicalAxisHorizontal};
@@ -92,19 +99,19 @@
   EXPECT_TRUE(evaluator->EvalAndAdd(*container_query_100));
   EXPECT_FALSE(evaluator->EvalAndAdd(*container_query_200));
 
-  EXPECT_FALSE(evaluator->ContainerChanged(size_100, horizontal));
+  EXPECT_FALSE(ContainerChanged(evaluator, size_100, horizontal));
   EXPECT_TRUE(evaluator->EvalAndAdd(*container_query_100));
   EXPECT_FALSE(evaluator->EvalAndAdd(*container_query_200));
 
-  EXPECT_TRUE(evaluator->ContainerChanged(size_200, horizontal));
+  EXPECT_TRUE(ContainerChanged(evaluator, size_200, horizontal));
   EXPECT_TRUE(evaluator->EvalAndAdd(*container_query_100));
   EXPECT_TRUE(evaluator->EvalAndAdd(*container_query_200));
 
-  EXPECT_FALSE(evaluator->ContainerChanged(size_200, horizontal));
+  EXPECT_FALSE(ContainerChanged(evaluator, size_200, horizontal));
   EXPECT_TRUE(evaluator->EvalAndAdd(*container_query_100));
   EXPECT_TRUE(evaluator->EvalAndAdd(*container_query_200));
 
-  EXPECT_TRUE(evaluator->ContainerChanged(size_200, vertical));
+  EXPECT_TRUE(ContainerChanged(evaluator, size_200, vertical));
   EXPECT_FALSE(evaluator->EvalAndAdd(*container_query_100));
   EXPECT_FALSE(evaluator->EvalAndAdd(*container_query_200));
 }
@@ -185,23 +192,23 @@
   evaluator->EvalAndAdd(*query_max_300px);
   // Updating with the same size as we initially had should not invalidate
   // any query results.
-  EXPECT_FALSE(evaluator->ContainerChanged(size_100, horizontal));
+  EXPECT_FALSE(ContainerChanged(evaluator, size_100, horizontal));
 
   // Makes no difference for either of (min-width: 200px), (max-width: 300px):
-  EXPECT_FALSE(evaluator->ContainerChanged(size_150, horizontal));
+  EXPECT_FALSE(ContainerChanged(evaluator, size_150, horizontal));
 
   // (min-width: 200px) becomes true:
-  EXPECT_TRUE(evaluator->ContainerChanged(size_200, horizontal));
+  EXPECT_TRUE(ContainerChanged(evaluator, size_200, horizontal));
 
   evaluator->EvalAndAdd(*query_min_200px);
   evaluator->EvalAndAdd(*query_max_300px);
-  EXPECT_FALSE(evaluator->ContainerChanged(size_200, horizontal));
+  EXPECT_FALSE(ContainerChanged(evaluator, size_200, horizontal));
 
   // Makes no difference for either of (min-width: 200px), (max-width: 300px):
-  EXPECT_FALSE(evaluator->ContainerChanged(size_300, horizontal));
+  EXPECT_FALSE(ContainerChanged(evaluator, size_300, horizontal));
 
   // (max-width: 300px) becomes false:
-  EXPECT_TRUE(evaluator->ContainerChanged(size_400, horizontal));
+  EXPECT_TRUE(ContainerChanged(evaluator, size_400, horizontal));
 }
 
 TEST_F(ContainerQueryEvaluatorTest, EvaluatorOnDetachLayoutTree) {
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.cc b/third_party/blink/renderer/core/css/element_rule_collector.cc
index ae08bd5..a37e7dc 100644
--- a/third_party/blink/renderer/core/css/element_rule_collector.cc
+++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -44,6 +44,8 @@
 #include "third_party/blink/renderer/core/css/resolver/style_resolver_stats.h"
 #include "third_party/blink/renderer/core/css/resolver/style_rule_usage_tracker.h"
 #include "third_party/blink/renderer/core/css/style_engine.h"
+#include "third_party/blink/renderer/core/dom/layout_tree_builder_traversal.h"
+#include "third_party/blink/renderer/core/dom/node_computed_style.h"
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 
@@ -58,6 +60,30 @@
   return link_match_type;
 }
 
+ContainerQueryEvaluator* FindContainerQueryEvaluator(
+    const AtomicString& name,
+    const StyleRecalcContext& style_recalc_context) {
+  Element* container = style_recalc_context.container;
+  if (!container)
+    return nullptr;
+
+  if (name == g_null_atom)
+    return container->GetContainerQueryEvaluator();
+
+  // TODO(crbug.com/1213888): Cache results.
+  for (Element* element = container; element;
+       element = LayoutTreeBuilderTraversal::ParentElement(*element)) {
+    if (auto* evaluator = element->GetContainerQueryEvaluator()) {
+      if (const ComputedStyle* style = element->GetComputedStyle()) {
+        if (style->ContainerName() == name)
+          return evaluator;
+      }
+    }
+  }
+
+  return nullptr;
+}
+
 }  // namespace
 
 ElementRuleCollector::ElementRuleCollector(
@@ -198,7 +224,8 @@
     if (auto* container_query = rule_data->GetContainerQuery()) {
       result_.SetDependsOnContainerQueries();
 
-      auto* evaluator = style_recalc_context_.cq_evaluator;
+      auto* evaluator = FindContainerQueryEvaluator(container_query->Name(),
+                                                    style_recalc_context_);
 
       if (!evaluator || !evaluator->EvalAndAdd(*container_query)) {
         rejected++;
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
index 0e9f3645..c9cf388 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -62,6 +62,14 @@
   return uri.Value().ToAtomicString();
 }
 
+AtomicString ConsumeContainerName(CSSParserTokenRange& range,
+                                  const CSSParserContext& context) {
+  CSSValue* name = css_parsing_utils::ConsumeContainerName(range, context);
+  if (auto* custom_ident = DynamicTo<CSSCustomIdentValue>(name))
+    return custom_ident->Value();
+  return g_null_atom;
+}
+
 }  // namespace
 
 CSSParserImpl::CSSParserImpl(const CSSParserContext* context,
@@ -999,6 +1007,8 @@
     observer_->StartRuleBody(stream.Offset());
   }
 
+  AtomicString name = ConsumeContainerName(prelude, *context_);
+
   // TODO(crbug.com/1145970): Restrict what is allowed by @container.
   scoped_refptr<MediaQuerySet> media_queries =
       MediaQueryParser::ParseMediaQuerySet(prelude,
@@ -1006,7 +1016,7 @@
   if (!media_queries)
     return nullptr;
   ContainerQuery* container_query =
-      MakeGarbageCollected<ContainerQuery>(media_queries);
+      MakeGarbageCollected<ContainerQuery>(name, media_queries);
 
   HeapVector<Member<StyleRuleBase>> rules;
   ConsumeRuleList(stream, kRegularRuleList,
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index ea89d4e8..078fc86 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -812,8 +812,24 @@
     if (IsA<SVGTextElement>(*element))
       style.ClearMultiCol();
 
-    // TODO(crbug.com/1179585): Copy DominantBaseline to CssDominantBaseline
-    // with some adjustments.
+    // Copy DominantBaseline to CssDominantBaseline without 'no-change',
+    // 'reset-size', and 'use-script'.
+    auto baseline = style.DominantBaseline();
+    if (baseline == EDominantBaseline::kUseScript) {
+      // TODO(fs): The dominant-baseline and the baseline-table components
+      // are set by determining the predominant script of the character data
+      // content.
+      baseline = EDominantBaseline::kAlphabetic;
+    } else {
+      const ContainerNode* parent = element;
+      while (baseline == EDominantBaseline::kNoChange ||
+             baseline == EDominantBaseline::kResetSize) {
+        parent = LayoutTreeBuilderTraversal::Parent(*parent);
+        baseline = parent ? parent->GetComputedStyle()->DominantBaseline()
+                          : EDominantBaseline::kAuto;
+      }
+    }
+    style.SetCssDominantBaseline(baseline);
   } else if (element && element->IsMathMLElement()) {
     if (style.Display() == EDisplay::kContents) {
       // https://drafts.csswg.org/css-display/#unbox-mathml
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc
index 26ee306..2ec91f94 100644
--- a/third_party/blink/renderer/core/css/style_engine.cc
+++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -2019,24 +2019,31 @@
   base::AutoReset<bool> cq_recalc(&in_container_query_style_recalc_, true);
 
   DCHECK(container.GetLayoutObject()) << "Containers must have a LayoutObject";
-  WritingMode writing_mode =
-      container.GetLayoutObject()->StyleRef().GetWritingMode();
+  const ComputedStyle& style = container.GetLayoutObject()->StyleRef();
+  WritingMode writing_mode = style.GetWritingMode();
   PhysicalSize physical_size = ToPhysicalSize(logical_size, writing_mode);
   PhysicalAxes physical_axes = ToPhysicalAxes(contained_axes, writing_mode);
 
+  StyleRecalcChange::Propagate propagate =
+      StyleRecalcChange::kRecalcContainerQueryDependent;
+
   if (auto* evaluator = container.GetContainerQueryEvaluator()) {
-    if (!evaluator->ContainerChanged(physical_size, physical_axes))
+    auto change = evaluator->ContainerChanged(physical_size, physical_axes);
+    if (change == ContainerQueryEvaluator::Change::kNone)
       return;
+    if (change == ContainerQueryEvaluator::Change::kNamed)
+      propagate = StyleRecalcChange::kRecalcDescendantContainerQueryDependent;
   } else {
     container.SetContainerQueryEvaluator(
         MakeGarbageCollected<ContainerQueryEvaluator>(physical_size,
                                                       physical_axes));
+    if (!style.ContainerName().IsNull())
+      propagate = StyleRecalcChange::kRecalcDescendantContainerQueryDependent;
   }
 
   NthIndexCache nth_index_cache(GetDocument());
   style_recalc_root_.Update(nullptr, &container);
-  RecalcStyle({StyleRecalcChange::kRecalcContainerQueryDependent},
-              StyleRecalcContext());
+  RecalcStyle({propagate}, StyleRecalcContext());
 
   // Nodes are marked for whitespace reattachment for DOM removal only. This set
   // should have been cleared before layout.
diff --git a/third_party/blink/renderer/core/css/style_recalc.cc b/third_party/blink/renderer/core/css/style_recalc.cc
index c92bb6f2..e8cc694 100644
--- a/third_party/blink/renderer/core/css/style_recalc.cc
+++ b/third_party/blink/renderer/core/css/style_recalc.cc
@@ -56,20 +56,32 @@
          pseudo_element.ComputedStyleRef().DependsOnContainerQueries();
 }
 
-bool StyleRecalcChange::RecalcContainerQueryDependentChildren(
+StyleRecalcChange::ContainerQueryDependentFlag
+StyleRecalcChange::ContainerQueryDependentFlagForChildren(
     const Element& element) const {
-  // We are at the container root for a container query recalc.
+  // kRecalc[Descendant]ContainerQueryDependent means we are at the container
+  // root for a container query recalc.
   if (propagate_ == kRecalcContainerQueryDependent)
-    return true;
-  if (!RecalcContainerQueryDependent())
-    return false;
-  // Don't traverse into children if we hit a descendant container while
-  // recalculating container queries. If the queries for this container also
-  // changes, we will enter another container query recalc for this subtree from
-  // layout.
-  if (LayoutObject* layout_object = element.GetLayoutObject())
-    return !layout_object->IsContainerForContainerQueries();
-  return true;
+    return kRecalcContainer;
+  if (propagate_ == kRecalcDescendantContainerQueryDependent)
+    return kRecalcDescendantContainers;
+
+  switch (container_query_dependent_flag_) {
+    case kNoContainerRecalc:
+      return kNoContainerRecalc;
+    case kRecalcContainer: {
+      // Don't traverse into children if we hit a descendant container while
+      // recalculating container queries. If the queries for this container also
+      // changes, we will enter another container query recalc for this subtree
+      // from layout.
+      LayoutObject* layout_object = element.GetLayoutObject();
+      if (layout_object && layout_object->IsContainerForContainerQueries())
+        return kNoContainerRecalc;
+      return kRecalcContainer;
+    }
+    case kRecalcDescendantContainers:
+      return kRecalcDescendantContainers;
+  }
 }
 
 StyleRecalcContext StyleRecalcContext::FromAncestors(Element& element) {
@@ -77,10 +89,10 @@
   // TODO(crbug.com/1145970): Avoid this work if we're not inside a container.
   while ((ancestor = DynamicTo<Element>(
               LayoutTreeBuilderTraversal::Parent(*ancestor)))) {
-    ContainerQueryEvaluator* evaluator = ancestor->GetContainerQueryEvaluator();
-    if (evaluator)
-      return StyleRecalcContext{evaluator};
+    if (ancestor->GetContainerQueryEvaluator())
+      return StyleRecalcContext{ancestor};
   }
+
   return StyleRecalcContext();
 }
 
diff --git a/third_party/blink/renderer/core/css/style_recalc.h b/third_party/blink/renderer/core/css/style_recalc.h
index 6c958c9..77667e9 100644
--- a/third_party/blink/renderer/core/css/style_recalc.h
+++ b/third_party/blink/renderer/core/css/style_recalc.h
@@ -9,7 +9,6 @@
 
 namespace blink {
 
-class ContainerQueryEvaluator;
 class Element;
 class Node;
 class PseudoElement;
@@ -18,6 +17,17 @@
 // recompute their computed styles, and marking nodes for layout tree re-
 // attachment during the style recalc phase.
 class StyleRecalcChange {
+ private:
+  enum ContainerQueryDependentFlag {
+    kNoContainerRecalc,
+    // Recalc container query dependent elements within this container,
+    // but not in nested containers.
+    kRecalcContainer,
+    // Recalc container query dependent elements within this container,
+    // and also in nested containers.
+    kRecalcDescendantContainers,
+  };
+
  public:
   enum Propagate {
     // No need to update style of any children.
@@ -30,6 +40,9 @@
     // recalc_container_query_dependent_=true for descendants. We should not
     // recalc style for the container itself.
     kRecalcContainerQueryDependent,
+    // Like kRecalcContainerQueryDependent, but we do not stop traversal on
+    // descendant containers.
+    kRecalcDescendantContainerQueryDependent,
     // Need to update existence and style for pseudo elements.
     kUpdatePseudoElements,
     // Need to recalculate style for children for inheritance. All changed
@@ -48,23 +61,23 @@
 
   StyleRecalcChange ForChildren(const Element& element) const {
     return {RecalcDescendants() ? kRecalcDescendants : kNo, reattach_,
-            RecalcContainerQueryDependentChildren(element)};
+            ContainerQueryDependentFlagForChildren(element)};
   }
   StyleRecalcChange ForPseudoElement() const {
     if (propagate_ == kUpdatePseudoElements)
-      return {kRecalcChildren, reattach_, recalc_container_query_dependent_};
+      return {kRecalcChildren, reattach_, container_query_dependent_flag_};
     return *this;
   }
   StyleRecalcChange EnsureAtLeast(Propagate propagate) const {
     if (propagate > propagate_)
-      return {propagate, reattach_, recalc_container_query_dependent_};
-    return {propagate_, reattach_, recalc_container_query_dependent_};
+      return {propagate, reattach_, container_query_dependent_flag_};
+    return {propagate_, reattach_, container_query_dependent_flag_};
   }
   StyleRecalcChange ForceRecalcDescendants() const {
-    return {kRecalcDescendants, reattach_, recalc_container_query_dependent_};
+    return {kRecalcDescendants, reattach_, container_query_dependent_flag_};
   }
   StyleRecalcChange ForceReattachLayoutTree() const {
-    return {propagate_, true, recalc_container_query_dependent_};
+    return {propagate_, true, container_query_dependent_flag_};
   }
 
   bool ReattachLayoutTree() const { return reattach_; }
@@ -81,22 +94,24 @@
  private:
   StyleRecalcChange(Propagate propagate,
                     bool reattach,
-                    bool recalc_container_query_dependent)
+                    ContainerQueryDependentFlag container_query_dependent_flag)
       : propagate_(propagate),
         reattach_(reattach),
-        recalc_container_query_dependent_(recalc_container_query_dependent) {}
+        container_query_dependent_flag_(container_query_dependent_flag) {}
 
   bool RecalcContainerQueryDependent() const {
-    return recalc_container_query_dependent_;
+    return container_query_dependent_flag_ != kNoContainerRecalc;
   }
-  bool RecalcContainerQueryDependentChildren(const Element&) const;
+  ContainerQueryDependentFlag ContainerQueryDependentFlagForChildren(
+      const Element&) const;
 
   // To what extent do we need to update style for children.
   Propagate propagate_ = kNo;
   // Need to reattach layout tree if true.
   bool reattach_ = false;
   // Force recalc of elements depending on container queries.
-  bool recalc_container_query_dependent_ = false;
+  ContainerQueryDependentFlag container_query_dependent_flag_ =
+      kNoContainerRecalc;
 };
 
 // StyleRecalcContext is an object that is passed on the stack during
@@ -113,10 +128,9 @@
   // resolving the style of the given Element.
   static StyleRecalcContext FromAncestors(Element&);
 
-  // If style is being calculated for an element inside a container,
-  // this ContainerQueryEvaluator may be used to evaluate @container
-  // rules against that container.
-  ContainerQueryEvaluator* cq_evaluator = nullptr;
+  // Set to the nearest container (for container queries), if any.
+  // This is used to evaluate container queries in ElementRuleCollector.
+  Element* container = nullptr;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 788cc641..e5a5a33 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -94,7 +94,9 @@
 #include "third_party/blink/renderer/core/dom/space_split_string.h"
 #include "third_party/blink/renderer/core/dom/text.h"
 #include "third_party/blink/renderer/core/dom/whitespace_attacher.h"
+#include "third_party/blink/renderer/core/editing/commands/undo_stack.h"
 #include "third_party/blink/renderer/core/editing/editing_utilities.h"
+#include "third_party/blink/renderer/core/editing/editor.h"
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
 #include "third_party/blink/renderer/core/editing/ime/edit_context.h"
@@ -2685,8 +2687,11 @@
     DCHECK(!data->HasPseudoElements());
   }
 
-  if (GetDocument().GetFrame())
-    GetDocument().GetFrame()->GetEventHandler().ElementRemoved(this);
+  if (auto* const frame = GetDocument().GetFrame()) {
+    if (UNLIKELY(HasUndoStack()))
+      frame->GetEditor().GetUndoStack().ElementRemoved(this);
+    frame->GetEventHandler().ElementRemoved(this);
+  }
 }
 
 void Element::AttachLayoutTree(AttachContext& context) {
@@ -2923,7 +2928,7 @@
 
   if (LayoutObject* layout_object = GetLayoutObject()) {
     if (layout_object->IsContainerForContainerQueries())
-      child_recalc_context.cq_evaluator = GetContainerQueryEvaluator();
+      child_recalc_context.container = this;
   }
 
   if (child_change.TraversePseudoElements(*this)) {
@@ -2996,7 +3001,7 @@
   if (change.RecalcDescendants() ||
       diff < ComputedStyle::Difference::kPseudoElementStyle)
     return change;
-  if (diff == ComputedStyle::Difference::kDisplayAffectingDescendantStyles)
+  if (diff == ComputedStyle::Difference::kDescendantAffecting)
     return change.ForceRecalcDescendants();
   if (diff == ComputedStyle::Difference::kInherited)
     return change.EnsureAtLeast(StyleRecalcChange::kRecalcChildren);
@@ -3064,7 +3069,7 @@
   SetComputedStyle(new_style);
 
   if (!child_change.ReattachLayoutTree() &&
-      (GetForceReattachLayoutTree() ||
+      (GetForceReattachLayoutTree() || NeedsReattachLayoutTree() ||
        ComputedStyle::NeedsReattachLayoutTree(*this, old_style.get(),
                                               new_style.get()))) {
     child_change = child_change.ForceReattachLayoutTree();
@@ -3109,8 +3114,10 @@
     if (old_style && !child_change.RecalcChildren() &&
         old_style->HasChildDependentFlags())
       new_style->CopyChildDependentFlagsFrom(*old_style);
-    if (RuntimeEnabledFeatures::LayoutNGEnabled())
-      UpdateForceLegacyLayout(*new_style, old_style.get());
+    if (RuntimeEnabledFeatures::LayoutNGEnabled()) {
+      if (UpdateForceLegacyLayout(*new_style, old_style.get()))
+        child_change = child_change.ForceReattachLayoutTree();
+    }
   }
 
   if (child_change.ReattachLayoutTree()) {
@@ -3119,6 +3126,11 @@
     return child_change;
   }
 
+  DCHECK(!NeedsReattachLayoutTree())
+      << "If we need to reattach the layout tree we should have returned "
+         "above. Updating and diffing the style of a LayoutObject which is "
+         "about to be deleted is a waste.";
+
   if (LayoutObject* layout_object = GetLayoutObject()) {
     DCHECK(new_style);
     scoped_refptr<const ComputedStyle> layout_style(std::move(new_style));
@@ -4271,7 +4283,15 @@
   EnsureElementRareData().SetShouldForceLegacyLayoutForChild(force);
 }
 
-void Element::UpdateForceLegacyLayout(const ComputedStyle& new_style,
+bool Element::HasUndoStack() const {
+  return HasRareData() && GetElementRareData()->HasUndoStack();
+}
+
+void Element::SetHasUndoStack(bool value) {
+  EnsureElementRareData().SetHasUndoStack(value);
+}
+
+bool Element::UpdateForceLegacyLayout(const ComputedStyle& new_style,
                                       const ComputedStyle* old_style) {
   // ::first-letter may cause structure discrepancies between DOM and layout
   //  tree (in layout the layout object will be wrapped around the actual text
@@ -4282,7 +4302,8 @@
   //  ::first-letter pseudo element cannot introduce the need for legacy layout
   //  on its own, so just bail. We'll do whatever the parent layout object does.
   if (IsFirstLetterPseudoElement())
-    return;
+    return false;
+  bool needs_reattach = false;
   bool old_force = old_style && ShouldForceLegacyLayout();
   SetStyleShouldForceLegacyLayout(
       CalculateStyleShouldForceLegacyLayout(*this, new_style));
@@ -4294,13 +4315,14 @@
         // check with the LayoutObject whether this is news and that it really
         // needs to be reattached.
         if (!layout_object->ForceLegacyLayout())
-          SetNeedsReattachLayoutTree();
+          needs_reattach = true;
       }
     }
     // Even if we also previously forced legacy layout, we may need to introduce
     // forced legacy layout in the ancestry, e.g. if this element no longer
     // establishes a new formatting context.
-    ForceLegacyLayoutInFormattingContext(new_style);
+    if (ForceLegacyLayoutInFormattingContext(new_style))
+      needs_reattach = true;
 
     // If we're inside an NG fragmentation context, we also need the entire
     // fragmentation context to fall back to legacy layout. Note that once this
@@ -4308,19 +4330,23 @@
     // even if all the reasons for requiring it in the first place disappear
     // (e.g. if the only reason was a table, and that table is removed, we'll
     // still be using legacy layout).
-    if (new_style.InsideNGFragmentationContext())
+    if (new_style.InsideNGFragmentationContext()) {
       ForceLegacyLayoutInFragmentationContext(new_style);
+      needs_reattach = true;
+    }
   } else if (old_force) {
     // TODO(mstensho): If we have ancestors that got legacy layout just because
     // of this child, we should clean it up, and switch the subtree back to NG,
     // rather than being stuck with legacy forever.
-    SetNeedsReattachLayoutTree();
+    needs_reattach = true;
   }
+  return needs_reattach;
 }
 
-void Element::ForceLegacyLayoutInFormattingContext(
+bool Element::ForceLegacyLayoutInFormattingContext(
     const ComputedStyle& new_style) {
   bool found_fc = DefinitelyNewFormattingContext(*this, new_style);
+  bool needs_reattach = false;
 
   for (Element* ancestor = this; !found_fc;) {
     ancestor =
@@ -4342,7 +4368,9 @@
     found_fc = DefinitelyNewFormattingContext(*ancestor, *style);
     ancestor->SetShouldForceLegacyLayoutForChild(true);
     ancestor->SetNeedsReattachLayoutTree();
+    needs_reattach = true;
   }
+  return needs_reattach;
 }
 
 void Element::ForceLegacyLayoutInFragmentationContext(
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index 657f3c9..45b061c1 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -54,6 +54,7 @@
 class AccessibleNode;
 class Attr;
 class Attribute;
+class ContainerQueryEvaluator;
 class CSSPropertyValueSet;
 class CSSStyleDeclaration;
 class CustomElementDefinition;
@@ -956,6 +957,10 @@
   // information.
   bool ShouldCompositeForDocumentTransition() const;
 
+  // For undo stack cleanup
+  bool HasUndoStack() const;
+  void SetHasUndoStack(bool);
+
  protected:
   const ElementData* GetElementData() const { return element_data_.Get(); }
   UniqueElementData& EnsureUniqueElementData();
@@ -1273,7 +1278,8 @@
   // Update ForceLegacyLayout flags for this element, and for ancestors, if
   // necessary. We cannot establish a ForceLegacyLayout subtree at an arbitrary
   // element; it needs to be a block formatting context root.
-  void UpdateForceLegacyLayout(const ComputedStyle& new_style,
+  // Returns true if we need to reattach this element or any ancestor element.
+  bool UpdateForceLegacyLayout(const ComputedStyle& new_style,
                                const ComputedStyle* old_style);
 
   // If this element requires legacy layout, and we can't tell for sure that it
@@ -1281,7 +1287,8 @@
   // layout on ancestors until we reach one that we're sure that will establish
   // a new formatting context. LayoutNG and legacy layout cannot cooperate
   // within a formatting context.
-  void ForceLegacyLayoutInFormattingContext(const ComputedStyle& new_style);
+  // Returns true if we need to reattach this element or any ancestor element.
+  bool ForceLegacyLayoutInFormattingContext(const ComputedStyle& new_style);
 
   // If this element requires legacy layout, and we're inside a fragmentation
   // context, we need to force legacy layout for the entire fragmentation
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h
index f82d673..a11c868 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data.h
+++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -158,6 +158,8 @@
   bool ShouldForceLegacyLayoutForChild() const {
     return should_force_legacy_layout_for_child_;
   }
+  bool HasUndoStack() const { return has_undo_stack_; }
+  void SetHasUndoStack(bool value) { has_undo_stack_ = value; }
 
   AccessibleNode* GetAccessibleNode() const { return accessible_node_.Get(); }
   AccessibleNode* EnsureAccessibleNode(Element* owner_element) {
@@ -246,6 +248,7 @@
   bool did_attach_internals_ = false;
   bool should_force_legacy_layout_for_child_ = false;
   bool style_should_force_legacy_layout_ = false;
+  bool has_undo_stack_ = false;
 };
 
 inline LayoutSize DefaultMinimumSizeForResizing() {
diff --git a/third_party/blink/renderer/core/editing/commands/composite_edit_command.cc b/third_party/blink/renderer/core/editing/commands/composite_edit_command.cc
index b0955da..1f8e05d 100644
--- a/third_party/blink/renderer/core/editing/commands/composite_edit_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/composite_edit_command.cc
@@ -2122,6 +2122,8 @@
         EnsureUndoStep()->EndingSelection());
     last_edit_command->GetUndoStep()->SetSelectionIsDirectional(
         GetUndoStep()->SelectionIsDirectional());
+    editor.GetUndoStack().DidSetEndingSelection(
+        last_edit_command->GetUndoStep());
     last_edit_command->AppendCommandToUndoStep(this);
   } else {
     // Only register a new undo command if the command passed in is
diff --git a/third_party/blink/renderer/core/editing/commands/undo_stack.cc b/third_party/blink/renderer/core/editing/commands/undo_stack.cc
index d41997e..b499ea0 100644
--- a/third_party/blink/renderer/core/editing/commands/undo_stack.cc
+++ b/third_party/blink/renderer/core/editing/commands/undo_stack.cc
@@ -41,7 +41,6 @@
 UndoStack::UndoStack() = default;
 
 void UndoStack::RegisterUndoStep(UndoStep* step) {
-  EnsureListeningMemoryPressure();
   if (!undo_stack_.IsEmpty())
     DCHECK_GE(step->SequenceNumber(), undo_stack_.back()->SequenceNumber());
   if (undo_stack_.size() == kMaximumUndoStackDepth) {
@@ -51,10 +50,14 @@
   if (!in_redo_)
     redo_stack_.clear();
   undo_stack_.push_back(step);
+  DidSetEndingSelection(step);
 }
 
 void UndoStack::RegisterRedoStep(UndoStep* step) {
-  EnsureListeningMemoryPressure();
+#if DCHECK_IS_ON()
+  if (auto* element = step->EndingRootEditableElement())
+    DCHECK(element->HasUndoStack()) << element;
+#endif
   redo_stack_.push_back(step);
 }
 
@@ -90,7 +93,6 @@
 void UndoStack::Clear() {
   undo_stack_.clear();
   redo_stack_.clear();
-  StopListeningMemoryPressure();
 }
 
 void UndoStack::Trace(Visitor* visitor) const {
@@ -109,24 +111,13 @@
   return UndoStepRange(undo_stack_);
 }
 
-void UndoStack::EnsureListeningMemoryPressure() {
-  if (is_listen_memory_pressure_)
-    return;
-  MemoryPressureListenerRegistry::Instance().RegisterClient(this);
-  is_listen_memory_pressure_ = true;
+void UndoStack::DidSetEndingSelection(UndoStep* step) {
+  if (auto* element = step->EndingRootEditableElement())
+    element->SetHasUndoStack(true);
 }
 
-void UndoStack::StopListeningMemoryPressure() {
-  if (!is_listen_memory_pressure_)
-    return;
-  DCHECK(undo_stack_.IsEmpty());
-  DCHECK(redo_stack_.IsEmpty());
-  MemoryPressureListenerRegistry::Instance().UnregisterClient(this);
-  is_listen_memory_pressure_ = false;
-}
-
-void UndoStack::OnMemoryPressure(
-    base::MemoryPressureListener::MemoryPressureLevel) {
+void UndoStack::ElementRemoved(Element* element) {
+  DCHECK(element->HasUndoStack()) << element;
   // In design mode, every root editable elements can be reinserted.
   if (!undo_stack_.IsEmpty() &&
       undo_stack_.front()->GetDocument().InDesignMode())
@@ -135,17 +126,19 @@
       redo_stack_.front()->GetDocument().InDesignMode())
     return;
 
-  const auto is_disconnected = [](const UndoStep* undo_step) {
-    return !undo_step->IsConnected();
+  const auto should_be_erased = [&element](const UndoStep* undo_step) {
+    return undo_step->IsOwnedBy(*element);
   };
 
   undo_stack_.erase(
-      std::remove_if(undo_stack_.begin(), undo_stack_.end(), is_disconnected),
+      std::remove_if(undo_stack_.begin(), undo_stack_.end(), should_be_erased),
       undo_stack_.end());
 
   redo_stack_.erase(
-      std::remove_if(redo_stack_.begin(), redo_stack_.end(), is_disconnected),
+      std::remove_if(redo_stack_.begin(), redo_stack_.end(), should_be_erased),
       redo_stack_.end());
+
+  element->SetHasUndoStack(false);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/commands/undo_stack.h b/third_party/blink/renderer/core/editing/commands/undo_stack.h
index 4f3727b..c017ec7 100644
--- a/third_party/blink/renderer/core/editing/commands/undo_stack.h
+++ b/third_party/blink/renderer/core/editing/commands/undo_stack.h
@@ -34,19 +34,17 @@
 #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/instrumentation/memory_pressure_listener.h"
-#include "third_party/blink/renderer/platform/wtf/deque.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
 
 namespace blink {
 
+class Element;
 class LocalFrame;
 class UndoStep;
 
 // |UndoStack| is owned by and always 1:1 to |Editor|. Since |Editor| is 1:1 to
 // |LocalFrame|, |UndoStack| is also 1:1 to |LocalFrame|.
-class CORE_EXPORT UndoStack final : public GarbageCollected<UndoStack>,
-                                    public MemoryPressureListener {
+class CORE_EXPORT UndoStack final : public GarbageCollected<UndoStack> {
   using UndoStepStack = HeapVector<Member<UndoStep>>;
 
  public:
@@ -77,20 +75,19 @@
   UndoStepRange RedoSteps() const;
   UndoStepRange UndoSteps() const;
 
-  void Trace(Visitor*) const final;
+  // Called when set ending selection inf |undo_step|.
+  void DidSetEndingSelection(UndoStep* step);
+
+  // Called when |element| is removed by |Node::RemovedFrom()|. |element|
+  // should be root editable element and be in undo/redo stack.
+  void ElementRemoved(Element* element);
+
+  void Trace(Visitor*) const;
 
  private:
-  void EnsureListeningMemoryPressure();
-  void StopListeningMemoryPressure();
-
-  // Implementation of MemoryPressureListener
-  void OnMemoryPressure(
-      base::MemoryPressureListener::MemoryPressureLevel) final;
-
   UndoStepStack undo_stack_;
   UndoStepStack redo_stack_;
   bool in_redo_ = false;
-  bool is_listen_memory_pressure_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(UndoStack);
 };
diff --git a/third_party/blink/renderer/core/editing/commands/undo_step.cc b/third_party/blink/renderer/core/editing/commands/undo_step.cc
index 8f7fca43..b6b97b0 100644
--- a/third_party/blink/renderer/core/editing/commands/undo_step.cc
+++ b/third_party/blink/renderer/core/editing/commands/undo_step.cc
@@ -33,9 +33,8 @@
   // See |TypingCommand::ForwardDeleteKeyPressed()|
 }
 
-bool UndoStep::IsConnected() const {
-  return EndingRootEditableElement() &&
-         EndingRootEditableElement()->isConnected();
+bool UndoStep::IsOwnedBy(const Element& element) const {
+  return EndingRootEditableElement() == &element;
 }
 
 void UndoStep::Unapply() {
diff --git a/third_party/blink/renderer/core/editing/commands/undo_step.h b/third_party/blink/renderer/core/editing/commands/undo_step.h
index 3d8fbf386..62a60ab2 100644
--- a/third_party/blink/renderer/core/editing/commands/undo_step.h
+++ b/third_party/blink/renderer/core/editing/commands/undo_step.h
@@ -45,8 +45,8 @@
            const SelectionForUndoStep& starting_selection,
            const SelectionForUndoStep& ending_selection);
 
-  // Returns true if associated root editable elements are connected.
-  bool IsConnected() const;
+  // Returns true if is owned by |element|
+  bool IsOwnedBy(const Element& element) const;
   void Unapply();
   void Reapply();
   void Append(SimpleEditCommand*);
diff --git a/third_party/blink/renderer/core/editing/editor_test.cc b/third_party/blink/renderer/core/editing/editor_test.cc
index 781a8a53..709b216 100644
--- a/third_party/blink/renderer/core/editing/editor_test.cc
+++ b/third_party/blink/renderer/core/editing/editor_test.cc
@@ -13,7 +13,6 @@
 #include "third_party/blink/renderer/core/editing/testing/editing_test_base.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/forms/html_input_element.h"
-#include "third_party/blink/renderer/platform/instrumentation/memory_pressure_listener.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
 
 namespace blink {
@@ -140,14 +139,7 @@
   ASSERT_EQ(1, SizeOfRedoStack());
   ASSERT_EQ(0, SizeOfUndoStack());
 
-  MemoryPressureListenerRegistry::Instance().OnMemoryPressure(
-      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
-  ASSERT_EQ(1, SizeOfRedoStack());
-  ASSERT_EQ(0, SizeOfUndoStack());
-
   target.remove();
-  MemoryPressureListenerRegistry::Instance().OnMemoryPressure(
-      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
   EXPECT_EQ(0, SizeOfRedoStack())
       << "We don't need to have redo steps for removed <input>";
   EXPECT_EQ(0, SizeOfUndoStack());
@@ -167,14 +159,7 @@
   ASSERT_EQ(1, SizeOfRedoStack());
   ASSERT_EQ(0, SizeOfUndoStack());
 
-  MemoryPressureListenerRegistry::Instance().OnMemoryPressure(
-      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
-  ASSERT_EQ(1, SizeOfRedoStack());
-  ASSERT_EQ(0, SizeOfUndoStack());
-
   input.remove();
-  MemoryPressureListenerRegistry::Instance().OnMemoryPressure(
-      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
   EXPECT_EQ(0, SizeOfRedoStack())
       << "We don't need to have redo steps for removed <input>";
   EXPECT_EQ(0, SizeOfUndoStack());
@@ -191,14 +176,7 @@
   ASSERT_EQ(0, SizeOfRedoStack());
   ASSERT_EQ(1, SizeOfUndoStack());
 
-  MemoryPressureListenerRegistry::Instance().OnMemoryPressure(
-      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
-  ASSERT_EQ(0, SizeOfRedoStack());
-  ASSERT_EQ(1, SizeOfUndoStack());
-
   target.remove();
-  MemoryPressureListenerRegistry::Instance().OnMemoryPressure(
-      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
   EXPECT_EQ(0, SizeOfRedoStack());
   EXPECT_EQ(0, SizeOfUndoStack())
       << "We don't need to have undo steps for removed editable";
@@ -214,14 +192,8 @@
   ASSERT_EQ(0, SizeOfRedoStack());
   ASSERT_EQ(1, SizeOfUndoStack());
 
-  MemoryPressureListenerRegistry::Instance().OnMemoryPressure(
-      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
-  ASSERT_EQ(0, SizeOfRedoStack());
-  ASSERT_EQ(1, SizeOfUndoStack());
 
   input.remove();
-  MemoryPressureListenerRegistry::Instance().OnMemoryPressure(
-      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
   EXPECT_EQ(0, SizeOfRedoStack());
   EXPECT_EQ(0, SizeOfUndoStack())
       << "We don't need to have undo steps for removed <input>";
diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc
index 9f7cf511..b2cb666 100644
--- a/third_party/blink/renderer/core/layout/layout_view.cc
+++ b/third_party/blink/renderer/core/layout/layout_view.cc
@@ -779,11 +779,6 @@
   return LayoutUnit(ViewLogicalHeight());
 }
 
-float LayoutView::ZoomFactor() const {
-  NOT_DESTROYED();
-  return frame_view_->GetFrame().PageZoomFactor();
-}
-
 const LayoutBox& LayoutView::RootBox() const {
   NOT_DESTROYED();
   Element* document_element = GetDocument().documentElement();
diff --git a/third_party/blink/renderer/core/layout/layout_view.h b/third_party/blink/renderer/core/layout/layout_view.h
index ff7eed3..7da0732 100644
--- a/third_party/blink/renderer/core/layout/layout_view.h
+++ b/third_party/blink/renderer/core/layout/layout_view.h
@@ -134,8 +134,6 @@
 
   LayoutUnit ViewLogicalHeightForPercentages() const;
 
-  float ZoomFactor() const;
-
   LocalFrameView* GetFrameView() const {
     NOT_DESTROYED();
     return frame_view_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index ebe2899..7ff7ca6 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -811,8 +811,7 @@
       // |SideEffectsDisabled| so that |Layout| does not update the
       // |LayoutObject| tree and other global states.
       NGConstraintSpace side_effects_disabled =
-          NGConstraintSpaceBuilder::CloneWithSideEffectsDisabled(
-              constraint_space);
+          constraint_space.CloneWithSideEffectsDisabled();
       layout_result = Layout(side_effects_disabled);
     }
     DCHECK_EQ(layout_result->Status(), NGLayoutResult::kSuccess);
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 33f37af..8594faf 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
@@ -151,6 +151,20 @@
     return *this;
   }
 
+  NGConstraintSpace CloneWithoutFragmentation() const {
+    DCHECK(HasBlockFragmentation());
+    NGConstraintSpace copy = *this;
+    DCHECK(copy.rare_data_);
+    copy.rare_data_->block_direction_fragmentation_type = kFragmentNone;
+    return copy;
+  }
+
+  NGConstraintSpace CloneWithSideEffectsDisabled() const {
+    NGConstraintSpace copy = *this;
+    copy.DisableSideEffects();
+    return copy;
+  }
+
   ~NGConstraintSpace() {
     if (HasRareData())
       delete rare_data_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
index 2e7c85f..f8595270 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
@@ -474,22 +474,6 @@
     return std::move(space_);
   }
 
-  static NGConstraintSpace CloneWithoutFragmentation(
-      const NGConstraintSpace& other) {
-    DCHECK(other.HasBlockFragmentation());
-    NGConstraintSpace copy = other;
-    DCHECK(copy.rare_data_);
-    copy.rare_data_->block_direction_fragmentation_type = kFragmentNone;
-    return copy;
-  }
-
-  static NGConstraintSpace CloneWithSideEffectsDisabled(
-      const NGConstraintSpace& other) {
-    NGConstraintSpace copy = other;
-    copy.DisableSideEffects();
-    return copy;
-  }
-
  private:
   NGConstraintSpace space_;
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc b/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
index 2c79e2be..2c22d828 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
@@ -378,7 +378,7 @@
   // so compute text decoration overflow first.
   if (!style.AppliedTextDecorations().IsEmpty() && font.PrimaryFont()) {
     LayoutRect decoration_rect =
-        ComputeTextDecorationOverflow(text_info, style, ink_overflow);
+        ComputeTextDecorationOverflow(style, ink_overflow);
     ink_overflow.Unite(decoration_rect);
   }
 
@@ -422,7 +422,6 @@
 }
 
 LayoutRect NGInkOverflow::ComputeTextDecorationOverflow(
-    const NGTextFragmentPaintInfo& text_info,
     const ComputedStyle& style,
     const LayoutRect& ink_overflow) {
   // TODO(https://crbug.com/1145160): Reduce code duplication between here and
diff --git a/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.h b/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.h
index c626f0a..57aa2797 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.h
@@ -135,7 +135,6 @@
 
  private:
   static LayoutRect ComputeTextDecorationOverflow(
-      const NGTextFragmentPaintInfo& text_info,
       const ComputedStyle& style,
       const LayoutRect& ink_overflow);
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
index 218d070..e881e9e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
@@ -167,8 +167,7 @@
     // right thing, since, as far as input is concerned, this node is meant to
     // perform block fragmentation (and it may already have produced multiple
     // fragment, but this one will be the last).
-    NGConstraintSpace new_space =
-        NGConstraintSpaceBuilder::CloneWithoutFragmentation(ConstraintSpace());
+    NGConstraintSpace new_space = ConstraintSpace().CloneWithoutFragmentation();
 
     NGLayoutAlgorithmParams params(Node(),
                                    container_builder_.InitialFragmentGeometry(),
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
index 80ec1f9..df644fd 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -728,7 +728,11 @@
 PhysicalRect NGPhysicalBoxFragment::ScrollableOverflow(
     TextHeightType height_type) const {
   DCHECK(GetLayoutObject());
-  DCHECK_EQ(PostLayout(), this);
+  // TODO(kojii): Scrollable overflow is computed after layout, and that the
+  // tree needs to be consistent, except for Ruby where it is computed during
+  // layout. It might be that |ComputeAnnotationOverflow| should move to layout
+  // overflow recalc, but it is to be thought out.
+  DCHECK(height_type == TextHeightType::kEmHeight || PostLayout() == this);
   if (UNLIKELY(IsLayoutObjectDestroyedOrMoved())) {
     NOTREACHED();
     return PhysicalRect();
@@ -762,7 +766,8 @@
 
 PhysicalRect NGPhysicalBoxFragment::ScrollableOverflowFromChildren(
     TextHeightType height_type) const {
-  DCHECK_EQ(PostLayout(), this);
+  // TODO(kojii): See |ScrollableOverflow|.
+  DCHECK(height_type == TextHeightType::kEmHeight || PostLayout() == this);
   const NGFragmentItems* items = Items();
   if (Children().empty() && !items)
     return PhysicalRect();
diff --git a/third_party/blink/renderer/core/paint/selection_bounds_recorder.cc b/third_party/blink/renderer/core/paint/selection_bounds_recorder.cc
index 58c5409..411f20eb 100644
--- a/third_party/blink/renderer/core/paint/selection_bounds_recorder.cc
+++ b/third_party/blink/renderer/core/paint/selection_bounds_recorder.cc
@@ -3,12 +3,13 @@
 // found in the LICENSE file.
 
 #include "third_party/blink/renderer/core/paint/selection_bounds_recorder.h"
+
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/forms/text_control_element.h"
 #include "third_party/blink/renderer/core/layout/api/selection_state.h"
 #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h"
 #include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_view.h"
 #include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h"
 
 namespace blink {
@@ -189,7 +190,7 @@
     return true;
 
   const PhysicalOffset sample_point = GetSamplePointForVisibility(
-      edge_start, edge_end, rect_layout_object.View()->ZoomFactor());
+      edge_start, edge_end, rect_layout_object.GetFrame()->PageZoomFactor());
 
   auto* const text_control_object = To<LayoutBox>(layout_object);
   const PhysicalOffset position_in_input =
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc
index cccc323..b4db189 100644
--- a/third_party/blink/renderer/core/style/computed_style.cc
+++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -302,7 +302,12 @@
   DCHECK_NE(&old_style, &new_style);
   if (old_style.Display() != new_style.Display() &&
       old_style.BlockifiesChildren() != new_style.BlockifiesChildren())
-    return Difference::kDisplayAffectingDescendantStyles;
+    return Difference::kDescendantAffecting;
+  // TODO(crbug.com/1213888): Only recalc affected descendants.
+  if ((old_style.ContainerName() != new_style.ContainerName()) ||
+      (old_style.ContainerType() != new_style.ContainerType())) {
+    return Difference::kDescendantAffecting;
+  }
   if (!old_style.NonIndependentInheritedEqual(new_style))
     return Difference::kInherited;
   if (old_style.JustifyItems() != new_style.JustifyItems())
@@ -1690,6 +1695,9 @@
 }
 
 FontBaseline ComputedStyle::GetFontBaseline() const {
+  // CssDominantBaseline() always returns kAuto for non-SVG elements,
+  // and never returns kUseScript, kNoChange, and kResetSize.
+  // See StyleAdjuster::AdjustComputedStyle().
   switch (CssDominantBaseline()) {
     case EDominantBaseline::kAuto:
       break;
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index 4365e066..467e9b0 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -327,11 +327,17 @@
     // Inherited properties are different which means we need to recalc style
     // for children.
     kInherited,
+    // Properties which can affect descendants changed. This can happen the
+    // following ways:
+    //
     // Display type changes for flex/grid/custom layout affects computed style
     // adjustments for descendants. For instance flex/grid items are blockified
     // at computed style time and such items can be arbitrarily deep down the
     // flat tree in the presence of display:contents.
-    kDisplayAffectingDescendantStyles,
+    //
+    // The container-name property affects which container is queried by
+    // rules matching descedant elements.
+    kDescendantAffecting,
   };
   CORE_EXPORT static Difference ComputeDifference(
       const ComputedStyle* old_style,
diff --git a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
index 57a895c..e49b726 100644
--- a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
+++ b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
@@ -231,9 +231,9 @@
         fields_to_diff: ["width", "min-width", "max-width", "height", "min-height",
                 "max-height", "VerticalAlignLength", "box-sizing", "align-content",
                 "align-items", "align-self", "justify-content", "justify-items",
-                "justify-self", "contain", "contain-intrinsic-size", "aspect-ratio",
-                "overflow-clip-margin", "-internal-align-self-block", "orphans",
-                "widows"],
+                "justify-self", "contain", "contain-intrinsic-size", "container-type",
+                "aspect-ratio", "overflow-clip-margin", "-internal-align-self-block",
+                "orphans", "widows"],
         methods_to_diff: [
           {
             method: "VerticalAlign()",
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
index 259c1052..d1a4e9a 100644
--- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
+++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -1083,11 +1083,12 @@
       // For now ComputedStyle for non-SVG elemnts always have the initial value
       // in order to disable the feature.
       name: "CssDominantBaseline",
-      field_group: "svg->misc",
+      field_group: "svg",
       field_template: "primitive",
       field_size: 4,
       type_name: "EDominantBaseline",
       default_value: "EDominantBaseline::kAuto",
+      inherited: true,
     },
     {
       name: "DependsOnContainerQueries",
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index fd893bc..75089339 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1031,17 +1031,26 @@
     node_data->AddState(ax::mojom::blink::State::kInvisible);
 
   if (is_visible || is_focusable) {
+    // If the author applied the ARIA "textbox" role on something that is not
+    // (currently) editable, this may be read-only rich-text object. Or it
+    // might just be bad authoring. Either way, we want to expose its
+    // descendants, especially the interactive ones which might gain focus.
+    bool is_non_atomic_textfield_root = IsARIATextField();
+
     // Preserve continuity in subtrees of richly editable content by including
     // richlyEditable state even if ignored.
     if (IsEditable()) {
       node_data->AddState(ax::mojom::blink::State::kEditable);
-      if (IsEditableRoot()) {
-        node_data->AddBoolAttribute(
-            ax::mojom::blink::BoolAttribute::kContentEditableRoot, true);
-      }
+      if (!is_non_atomic_textfield_root)
+        is_non_atomic_textfield_root = IsEditableRoot();
+
       if (IsRichlyEditable())
         node_data->AddState(ax::mojom::blink::State::kRichlyEditable);
     }
+    if (is_non_atomic_textfield_root) {
+      node_data->AddBoolAttribute(
+          ax::mojom::blink::BoolAttribute::kNonAtomicTextFieldRoot, true);
+    }
   }
 
   if (accessibility_mode.has_mode(ui::AXMode::kHTML))
diff --git a/third_party/blink/renderer/modules/compression/deflate_transformer.cc b/third_party/blink/renderer/modules/compression/deflate_transformer.cc
index 5c4601dc..1c17bd5 100644
--- a/third_party/blink/renderer/modules/compression/deflate_transformer.cc
+++ b/third_party/blink/renderer/modules/compression/deflate_transformer.cc
@@ -4,17 +4,18 @@
 
 #include "third_party/blink/renderer/modules/compression/deflate_transformer.h"
 
-#include <string.h>
 #include <algorithm>
+#include <cstring>
 #include <limits>
 
-#include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_uint8_array.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/core/streams/transform_stream_default_controller.h"
 #include "third_party/blink/renderer/core/streams/transform_stream_transformer.h"
 #include "third_party/blink/renderer/core/typed_arrays/array_buffer_view_helpers.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
 #include "third_party/blink/renderer/modules/compression/compression_format.h"
 #include "third_party/blink/renderer/modules/compression/zlib_partition_alloc.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -56,38 +57,19 @@
     v8::Local<v8::Value> chunk,
     TransformStreamDefaultController* controller,
     ExceptionState& exception_state) {
-  ArrayBufferOrArrayBufferView buffer_source;
-  V8ArrayBufferOrArrayBufferView::ToImpl(
-      script_state_->GetIsolate(), chunk, buffer_source,
-      UnionTypeConversionMode::kNotNullable, exception_state);
-  if (exception_state.HadException()) {
+  auto* buffer_source = V8BufferSource::Create(script_state_->GetIsolate(),
+                                               chunk, exception_state);
+  if (exception_state.HadException())
     return ScriptPromise();
-  }
-  if (buffer_source.IsArrayBufferView()) {
-    const auto* view = buffer_source.GetAsArrayBufferView().Get();
-    const uint8_t* start = static_cast<const uint8_t*>(view->BaseAddress());
-    size_t length = view->byteLength();
-    if (length > std::numeric_limits<wtf_size_t>::max()) {
-      exception_state.ThrowRangeError(
-          "Buffer size exceeds maximum heap object size.");
-      return ScriptPromise();
-    }
-    Deflate(start, static_cast<wtf_size_t>(length), IsFinished(false),
-            controller, exception_state);
-    return ScriptPromise::CastUndefined(script_state_);
-  }
-  DCHECK(buffer_source.IsArrayBuffer());
-  const auto* array_buffer = buffer_source.GetAsArrayBuffer();
-  const uint8_t* start = static_cast<const uint8_t*>(array_buffer->Data());
-  size_t length = array_buffer->ByteLength();
-  if (length > std::numeric_limits<wtf_size_t>::max()) {
+  DOMArrayPiece array_piece(buffer_source);
+  if (array_piece.ByteLength() > std::numeric_limits<wtf_size_t>::max()) {
     exception_state.ThrowRangeError(
         "Buffer size exceeds maximum heap object size.");
     return ScriptPromise();
   }
-  Deflate(start, static_cast<wtf_size_t>(length), IsFinished(false), controller,
-          exception_state);
-
+  Deflate(array_piece.Bytes(),
+          static_cast<wtf_size_t>(array_piece.ByteLength()), IsFinished(false),
+          controller, exception_state);
   return ScriptPromise::CastUndefined(script_state_);
 }
 
diff --git a/third_party/blink/renderer/modules/compression/deflate_transformer.h b/third_party/blink/renderer/modules/compression/deflate_transformer.h
index 16d70ae..26d40a2 100644
--- a/third_party/blink/renderer/modules/compression/deflate_transformer.h
+++ b/third_party/blink/renderer/modules/compression/deflate_transformer.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_COMPRESSION_DEFLATE_TRANSFORMER_H_
 
 #include "base/types/strong_alias.h"
-
 #include "third_party/blink/renderer/core/streams/transform_stream_transformer.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
diff --git a/third_party/blink/renderer/modules/compression/inflate_transformer.cc b/third_party/blink/renderer/modules/compression/inflate_transformer.cc
index b052abe..f4ba1bc 100644
--- a/third_party/blink/renderer/modules/compression/inflate_transformer.cc
+++ b/third_party/blink/renderer/modules/compression/inflate_transformer.cc
@@ -4,17 +4,18 @@
 
 #include "third_party/blink/renderer/modules/compression/inflate_transformer.h"
 
-#include <string.h>
 #include <algorithm>
+#include <cstring>
 #include <limits>
 
-#include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_uint8_array.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/core/streams/transform_stream_default_controller.h"
 #include "third_party/blink/renderer/core/streams/transform_stream_transformer.h"
 #include "third_party/blink/renderer/core/typed_arrays/array_buffer_view_helpers.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
 #include "third_party/blink/renderer/modules/compression/compression_format.h"
 #include "third_party/blink/renderer/modules/compression/zlib_partition_alloc.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -54,39 +55,19 @@
     v8::Local<v8::Value> chunk,
     TransformStreamDefaultController* controller,
     ExceptionState& exception_state) {
-  // TODO(canonmukai): Support SharedArrayBuffer.
-  ArrayBufferOrArrayBufferView buffer_source;
-  V8ArrayBufferOrArrayBufferView::ToImpl(
-      script_state_->GetIsolate(), chunk, buffer_source,
-      UnionTypeConversionMode::kNotNullable, exception_state);
-  if (exception_state.HadException()) {
+  auto* buffer_source = V8BufferSource::Create(script_state_->GetIsolate(),
+                                               chunk, exception_state);
+  if (exception_state.HadException())
     return ScriptPromise();
-  }
-  if (buffer_source.IsArrayBufferView()) {
-    const auto* view = buffer_source.GetAsArrayBufferView().Get();
-    const uint8_t* start = static_cast<const uint8_t*>(view->BaseAddress());
-    size_t length = view->byteLength();
-    if (length > std::numeric_limits<wtf_size_t>::max()) {
-      exception_state.ThrowRangeError(
-          "Buffer size exceeds maximum heap object size.");
-      return ScriptPromise();
-    }
-    Inflate(start, static_cast<wtf_size_t>(length), IsFinished(false),
-            controller, exception_state);
-    return ScriptPromise::CastUndefined(script_state_);
-  }
-  DCHECK(buffer_source.IsArrayBuffer());
-  const auto* array_buffer = buffer_source.GetAsArrayBuffer();
-  const uint8_t* start = static_cast<const uint8_t*>(array_buffer->Data());
-  size_t length = array_buffer->ByteLength();
-  if (length > std::numeric_limits<wtf_size_t>::max()) {
+  DOMArrayPiece array_piece(buffer_source);
+  if (array_piece.ByteLength() > std::numeric_limits<wtf_size_t>::max()) {
     exception_state.ThrowRangeError(
         "Buffer size exceeds maximum heap object size.");
     return ScriptPromise();
   }
-  Inflate(start, static_cast<wtf_size_t>(length), IsFinished(false), controller,
-          exception_state);
-
+  Inflate(array_piece.Bytes(),
+          static_cast<wtf_size_t>(array_piece.ByteLength()), IsFinished(false),
+          controller, exception_state);
   return ScriptPromise::CastUndefined(script_state_);
 }
 
diff --git a/third_party/blink/renderer/modules/compression/inflate_transformer.h b/third_party/blink/renderer/modules/compression/inflate_transformer.h
index ac01659f..b602cdc 100644
--- a/third_party/blink/renderer/modules/compression/inflate_transformer.h
+++ b/third_party/blink/renderer/modules/compression/inflate_transformer.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_COMPRESSION_INFLATE_TRANSFORMER_H_
 
 #include "base/types/strong_alias.h"
-
 #include "third_party/blink/renderer/core/streams/transform_stream_transformer.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.cc
index afcc7df9..5bbcd123a0 100644
--- a/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.cc
@@ -4,11 +4,13 @@
 
 #include "third_party/blink/renderer/modules/direct_sockets/tcp_writable_stream_wrapper.h"
 
-#include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/streams/underlying_sink_base.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
 #include "third_party/blink/renderer/platform/bindings/exception_code.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
@@ -204,32 +206,15 @@
     return ScriptPromise();
   }
 
-  auto* isolate = script_state->GetIsolate();
-
-  ArrayBufferOrArrayBufferView buffer_source;
-  V8ArrayBufferOrArrayBufferView::ToImpl(
-      isolate, chunk.V8Value(), buffer_source,
-      UnionTypeConversionMode::kNotNullable, exception_state);
+  auto* buffer_source = V8BufferSource::Create(
+      script_state_->GetIsolate(), chunk.V8Value(), exception_state);
   if (exception_state.HadException())
     return ScriptPromise();
+  DCHECK(buffer_source);
 
-  DCHECK(!buffer_source.IsNull());
-
-  // |data| will not be valid when this function returns.
-  base::span<const uint8_t> data;
-  if (buffer_source.IsArrayBuffer()) {
-    const auto* array_buffer = buffer_source.GetAsArrayBuffer();
-    data = base::make_span(static_cast<const uint8_t*>(array_buffer->Data()),
-                           array_buffer->ByteLength());
-  } else {
-    DCHECK(buffer_source.IsArrayBufferView());
-    const auto* array_buffer_view = buffer_source.GetAsArrayBufferView().Get();
-    data = base::make_span(
-        static_cast<const uint8_t*>(array_buffer_view->BaseAddress()),
-        array_buffer_view->byteLength());
-  }
-
-  return WriteOrCacheData(script_state, data);
+  DOMArrayPiece array_piece(buffer_source);
+  return WriteOrCacheData(script_state,
+                          {array_piece.Bytes(), array_piece.ByteLength()});
 }
 
 // Attempt to write |data|. Cache anything that could not be written
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc b/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
index b8bddfc..b02958e 100644
--- a/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
+++ b/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
@@ -7,12 +7,14 @@
 #include <memory>
 #include <utility>
 
-#include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_text_decoder_options.h"
 #include "third_party/blink/renderer/core/streams/transform_stream_default_controller.h"
 #include "third_party/blink/renderer/core/streams/transform_stream_transformer.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
 #include "third_party/blink/renderer/modules/encoding/encoding.h"
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
@@ -42,42 +44,23 @@
   ScriptPromise Transform(v8::Local<v8::Value> chunk,
                           TransformStreamDefaultController* controller,
                           ExceptionState& exception_state) override {
-    ArrayBufferOrArrayBufferView bufferSource;
-    V8ArrayBufferOrArrayBufferView::ToImpl(
-        script_state_->GetIsolate(), chunk, bufferSource,
-        UnionTypeConversionMode::kNotNullable, exception_state);
+    auto* buffer_source = V8BufferSource::Create(script_state_->GetIsolate(),
+                                                 chunk, exception_state);
     if (exception_state.HadException())
       return ScriptPromise();
 
     // This implements the "get a copy of the bytes held by the buffer source"
     // algorithm (https://heycam.github.io/webidl/#dfn-get-buffer-source-copy).
-    if (bufferSource.IsArrayBufferView()) {
-      const auto* view = bufferSource.GetAsArrayBufferView().Get();
-      const char* start = static_cast<const char*>(view->BaseAddress());
-      size_t length = view->byteLength();
-      if (length > std::numeric_limits<uint32_t>::max()) {
-        exception_state.ThrowRangeError(
-            "Buffer size exceeds maximum heap object size.");
-        return ScriptPromise();
-      }
-      DecodeAndEnqueue(start, static_cast<uint32_t>(length),
-                       WTF::FlushBehavior::kDoNotFlush, controller,
-                       exception_state);
-      return ScriptPromise::CastUndefined(script_state_);
-    }
-    DCHECK(bufferSource.IsArrayBuffer());
-    const auto* array_buffer = bufferSource.GetAsArrayBuffer();
-    const char* start = static_cast<const char*>(array_buffer->Data());
-    size_t length = array_buffer->ByteLength();
-    if (length > std::numeric_limits<uint32_t>::max()) {
+    DOMArrayPiece array_piece(buffer_source);
+    if (array_piece.ByteLength() > std::numeric_limits<uint32_t>::max()) {
       exception_state.ThrowRangeError(
           "Buffer size exceeds maximum heap object size.");
       return ScriptPromise();
     }
-    DecodeAndEnqueue(start, static_cast<uint32_t>(length),
+    DecodeAndEnqueue(static_cast<char*>(array_piece.Data()),
+                     static_cast<uint32_t>(array_piece.ByteLength()),
                      WTF::FlushBehavior::kDoNotFlush, controller,
                      exception_state);
-
     return ScriptPromise::CastUndefined(script_state_);
   }
 
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_elements_helper.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_elements_helper.cc
index f59c8bd..f3057f3 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_elements_helper.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_elements_helper.cc
@@ -7,9 +7,10 @@
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/events/keyboard_event.h"
 #include "third_party/blink/renderer/core/events/touch_event.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/html_div_element.h"
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
-#include "third_party/blink/renderer/core/layout/layout_view.h"
+#include "third_party/blink/renderer/core/layout/layout_box.h"
 #include "third_party/blink/renderer/modules/media_controls/elements/media_control_div_element.h"
 #include "third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.h"
 #include "third_party/blink/renderer/modules/media_controls/media_controls_impl.h"
@@ -95,8 +96,8 @@
     height = box->LogicalHeight().Round();
   }
 
-  if (element.GetDocument().GetLayoutView())
-    zoom_factor = element.GetDocument().GetLayoutView()->ZoomFactor();
+  if (const LocalFrame* frame = element.GetDocument().GetFrame())
+    zoom_factor = frame->PageZoomFactor();
 
   return gfx::Size(round(width / zoom_factor), round(height / zoom_factor));
 }
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
index 94e25c14..716a5c4 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
@@ -4,12 +4,13 @@
 
 #include "third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h"
 
+#include "third_party/blink/renderer/core/dom/shadow_root.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/html_div_element.h"
 #include "third_party/blink/renderer/core/html/shadow/shadow_element_names.h"
 #include "third_party/blink/renderer/core/input_type_names.h"
 #include "third_party/blink/renderer/core/layout/layout_box.h"
 #include "third_party/blink/renderer/core/layout/layout_box_model_object.h"
-#include "third_party/blink/renderer/core/layout/layout_view.h"
 #include "third_party/blink/renderer/core/resize_observer/resize_observer.h"
 #include "third_party/blink/renderer/core/resize_observer/resize_observer_entry.h"
 #include "third_party/blink/renderer/modules/media_controls/elements/media_control_elements_helper.h"
@@ -153,9 +154,8 @@
 }
 
 float MediaControlSliderElement::ZoomFactor() const {
-  if (!GetDocument().GetLayoutView())
-    return 1;
-  return GetDocument().GetLayoutView()->ZoomFactor();
+  const LocalFrame* frame = GetDocument().GetFrame();
+  return frame ? frame->PageZoomFactor() : 1;
 }
 
 void MediaControlSliderElement::NotifyElementSizeChanged() {
diff --git a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
index 6e431ccb..08ab2c7 100644
--- a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
+++ b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
@@ -5,7 +5,9 @@
 #include "third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h"
 
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
 #include "third_party/blink/renderer/modules/serial/serial_port.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 
@@ -36,7 +38,7 @@
     WritableStreamDefaultController* controller,
     ExceptionState& exception_state) {
   // There can only be one call to write() in progress at a time.
-  DCHECK(buffer_source_.IsNull());
+  DCHECK(!buffer_source_);
   DCHECK_EQ(0u, offset_);
   DCHECK(!pending_operation_);
 
@@ -48,9 +50,8 @@
     return ScriptPromise();
   }
 
-  V8ArrayBufferOrArrayBufferView::ToImpl(
-      script_state->GetIsolate(), chunk.V8Value(), buffer_source_,
-      UnionTypeConversionMode::kNotNullable, exception_state);
+  buffer_source_ = V8BufferSource::Create(script_state->GetIsolate(),
+                                          chunk.V8Value(), exception_state);
   if (exception_state.HadException())
     return ScriptPromise();
 
@@ -168,27 +169,17 @@
 void SerialPortUnderlyingSink::WriteData() {
   DCHECK(data_pipe_);
   DCHECK(pending_operation_);
-  DCHECK(!buffer_source_.IsNull());
+  DCHECK(buffer_source_);
 
-  const uint8_t* data = nullptr;
-  uint32_t length = 0;
-  size_t byte_size = 0;
-  if (buffer_source_.IsArrayBuffer()) {
-    DOMArrayBuffer* array = buffer_source_.GetAsArrayBuffer();
-    byte_size = array->ByteLength();
-    data = static_cast<const uint8_t*>(array->Data());
-  } else {
-    DOMArrayBufferView* view = buffer_source_.GetAsArrayBufferView().Get();
-    byte_size = view->byteLength();
-    data = static_cast<const uint8_t*>(view->BaseAddress());
-  }
-  if (byte_size > std::numeric_limits<uint32_t>::max()) {
+  DOMArrayPiece array_piece(buffer_source_);
+  if (array_piece.ByteLength() > std::numeric_limits<uint32_t>::max()) {
     pending_exception_ = DOMException::Create(
         "Buffer size exceeds maximum heap object size.", "DataError");
     PipeClosed();
     return;
   }
-  length = static_cast<uint32_t>(byte_size);
+  const uint8_t* data = array_piece.Bytes();
+  const uint32_t length = static_cast<uint32_t>(array_piece.ByteLength());
 
   DCHECK_LT(offset_, length);
   data += offset_;
@@ -200,7 +191,7 @@
     case MOJO_RESULT_OK:
       offset_ += num_bytes;
       if (offset_ == length) {
-        buffer_source_ = ArrayBufferOrArrayBufferView();
+        buffer_source_ = nullptr;
         offset_ = 0;
         pending_operation_->Resolve();
         pending_operation_ = nullptr;
diff --git a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
index ca45ab6..bd56041 100644
--- a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
+++ b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
@@ -7,7 +7,7 @@
 
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "mojo/public/cpp/system/simple_watcher.h"
-#include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
 #include "third_party/blink/renderer/core/streams/underlying_sink_base.h"
 
 namespace blink {
@@ -50,7 +50,7 @@
   Member<SerialPort> serial_port_;
   Member<DOMException> pending_exception_;
 
-  ArrayBufferOrArrayBufferView buffer_source_;
+  Member<V8BufferSource> buffer_source_;
   uint32_t offset_ = 0;
 
   // Only one outstanding call to write(), close() or abort() is allowed at a
diff --git a/third_party/blink/renderer/modules/webtransport/outgoing_stream.cc b/third_party/blink/renderer/modules/webtransport/outgoing_stream.cc
index d8b0d6e8..5bbb61e 100644
--- a/third_party/blink/renderer/modules/webtransport/outgoing_stream.cc
+++ b/third_party/blink/renderer/modules/webtransport/outgoing_stream.cc
@@ -4,20 +4,22 @@
 
 #include "third_party/blink/renderer/modules/webtransport/outgoing_stream.h"
 
-#include <string.h>
+#include <cstring>
 #include <utility>
 
 #include "base/allocator/partition_allocator/partition_alloc.h"
 #include "base/numerics/safe_conversions.h"
 #include "mojo/public/cpp/system/simple_watcher.h"
-#include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_stream_abort_info.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/streams/underlying_sink_base.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
 #include "third_party/blink/renderer/core/streams/writable_stream_transferring_optimizer.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
 #include "third_party/blink/renderer/modules/webtransport/web_transport_stream.h"
 #include "third_party/blink/renderer/platform/bindings/exception_code.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -234,38 +236,20 @@
   DCHECK(!write_promise_resolver_);
   DCHECK_EQ(0u, offset_);
 
-  auto* isolate = script_state->GetIsolate();
-
-  ArrayBufferOrArrayBufferView buffer_source;
-  V8ArrayBufferOrArrayBufferView::ToImpl(
-      isolate, chunk.V8Value(), buffer_source,
-      UnionTypeConversionMode::kNotNullable, exception_state);
+  auto* buffer_source = V8BufferSource::Create(
+      script_state_->GetIsolate(), chunk.V8Value(), exception_state);
   if (exception_state.HadException())
     return ScriptPromise();
-
-  DCHECK(!buffer_source.IsNull());
-
-  // |data| will not be valid when this function returns.
-  base::span<const uint8_t> data;
-  if (buffer_source.IsArrayBuffer()) {
-    const auto* array_buffer = buffer_source.GetAsArrayBuffer();
-    data = base::span<const uint8_t>(
-        static_cast<const uint8_t*>(array_buffer->Data()),
-        array_buffer->ByteLength());
-  } else {
-    DCHECK(buffer_source.IsArrayBufferView());
-    const auto* array_buffer_view = buffer_source.GetAsArrayBufferView().Get();
-    data = base::span<const uint8_t>(
-        static_cast<const uint8_t*>(array_buffer_view->BaseAddress()),
-        array_buffer_view->byteLength());
-  }
+  DCHECK(buffer_source);
 
   if (!data_pipe_) {
     return ScriptPromise::Reject(script_state,
                                  CreateAbortException(IsLocalAbort(false)));
   }
 
-  return WriteOrCacheData(script_state, data);
+  DOMArrayPiece array_piece(buffer_source);
+  return WriteOrCacheData(script_state,
+                          {array_piece.Bytes(), array_piece.ByteLength()});
 }
 
 // Attempt to write |data|. Cache anything that could not be written
diff --git a/third_party/blink/renderer/modules/webtransport/outgoing_stream.h b/third_party/blink/renderer/modules/webtransport/outgoing_stream.h
index ec71cd30..2adbde2 100644
--- a/third_party/blink/renderer/modules/webtransport/outgoing_stream.h
+++ b/third_party/blink/renderer/modules/webtransport/outgoing_stream.h
@@ -5,8 +5,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBTRANSPORT_OUTGOING_STREAM_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBTRANSPORT_OUTGOING_STREAM_H_
 
-#include <stddef.h>
-#include <stdint.h>
+#include <cstddef>
+#include <cstdint>
 
 #include "base/containers/span.h"
 #include "base/types/strong_alias.h"
@@ -17,10 +17,7 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/heap/thread_state.h"
-
-namespace v8 {
-class Isolate;
-}
+#include "v8/include/v8.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/platform/bindings/exception_state.cc b/third_party/blink/renderer/platform/bindings/exception_state.cc
index 790fc6515..1b3afbf 100644
--- a/third_party/blink/renderer/platform/bindings/exception_state.cc
+++ b/third_party/blink/renderer/platform/bindings/exception_state.cc
@@ -194,7 +194,7 @@
 }
 
 void ExceptionState::PopContextScope() {
-  DCHECK(!context_stack_top_);
+  DCHECK(context_stack_top_);
   context_stack_top_ = context_stack_top_->GetParent();
 }
 
diff --git a/third_party/blink/renderer/platform/bindings/idl_member_installer.cc b/third_party/blink/renderer/platform/bindings/idl_member_installer.cc
index 1f6f792d..90a743b2 100644
--- a/third_party/blink/renderer/platform/bindings/idl_member_installer.cc
+++ b/third_party/blink/renderer/platform/bindings/idl_member_installer.cc
@@ -137,7 +137,8 @@
     v8::Local<v8::Signature> signature,
     v8::Local<v8::String> name,
     const Config& config,
-    const v8::CFunction* v8_c_function = nullptr) {
+    const v8::CFunction* v8_cfunction_table_data = nullptr,
+    uint32_t v8_cfunction_table_size = 0) {
   v8::FunctionCallback callback = GetConfigCallback<kind>(config);
   if (!callback)
     return v8::Local<v8::FunctionTemplate>();
@@ -152,9 +153,10 @@
       (v8_cached_accessor ==
            V8PrivateProperty::CachedAccessor::kWindowDocument &&
        !world.IsMainWorld())) {
-    function_template = v8::FunctionTemplate::New(
+    function_template = v8::FunctionTemplate::NewWithCFunctionOverloads(
         isolate, callback, v8::Local<v8::Value>(), signature, length,
-        v8::ConstructorBehavior::kThrow, v8_side_effect, v8_c_function);
+        v8::ConstructorBehavior::kThrow, v8_side_effect,
+        {v8_cfunction_table_data, v8_cfunction_table_size});
   } else {
     function_template = v8::FunctionTemplate::NewWithCache(
         isolate, callback,
@@ -180,12 +182,14 @@
     v8::Local<v8::Signature> signature,
     v8::Local<v8::String> name,
     const Config& config,
-    const v8::CFunction* v8_c_function = nullptr) {
+    const v8::CFunction* v8_cfunction_table_data = nullptr,
+    uint32_t v8_cfunction_table_size = 0) {
   if (!GetConfigCallback<kind>(config))
     return v8::Local<v8::Function>();
 
   return CreateFunctionTemplate<kind>(isolate, world, signature, name, config,
-                                      v8_c_function)
+                                      v8_cfunction_table_data,
+                                      v8_cfunction_table_size)
       ->GetFunction(context)
       .ToLocalChecked();
 }
@@ -298,7 +302,8 @@
                       v8::Local<v8::Template> interface_template,
                       v8::Local<v8::Signature> signature,
                       const IDLMemberInstaller::OperationConfig& config,
-                      const v8::CFunction* v8_c_function = nullptr) {
+                      const v8::CFunction* v8_cfunction_table_data = nullptr,
+                      uint32_t v8_cfunction_table_size = 0) {
   if (!DoesWorldMatch(config, world))
     return;
 
@@ -313,7 +318,8 @@
   v8::Local<v8::String> name = V8AtomicString(isolate, config.name);
   v8::Local<v8::FunctionTemplate> func =
       CreateFunctionTemplate<FunctionKind::kOperation>(
-          isolate, world, signature, name, config, v8_c_function);
+          isolate, world, signature, name, config, v8_cfunction_table_data,
+          v8_cfunction_table_size);
 
   v8::Local<v8::Template> target_template;
   switch (location) {
@@ -342,7 +348,8 @@
                       v8::Local<v8::Object> interface_object,
                       v8::Local<v8::Signature> signature,
                       const IDLMemberInstaller::OperationConfig& config,
-                      const v8::CFunction* v8_c_function = nullptr) {
+                      const v8::CFunction* v8_cfunction_table_data = nullptr,
+                      uint32_t v8_cfunction_table_size = 0) {
   if (!DoesWorldMatch(config, world))
     return;
 
@@ -356,7 +363,8 @@
 
   v8::Local<v8::String> name = V8AtomicString(isolate, config.name);
   v8::Local<v8::Function> func = CreateFunction<FunctionKind::kOperation>(
-      isolate, context, world, signature, name, config, v8_c_function);
+      isolate, context, world, signature, name, config, v8_cfunction_table_data,
+      v8_cfunction_table_size);
 
   v8::Local<v8::Object> target_object;
   switch (location) {
@@ -511,7 +519,8 @@
   for (const auto& config : configs) {
     InstallOperation(isolate, world, instance_template, prototype_template,
                      interface_template, signature, config.operation_config,
-                     &config.v8_c_function);
+                     config.v8_cfunction_table_data,
+                     config.v8_cfunction_table_size);
   }
 }
 
@@ -528,7 +537,8 @@
   for (const auto& config : configs) {
     InstallOperation(isolate, context, world, instance_object, prototype_object,
                      interface_object, signature, config.operation_config,
-                     &config.v8_c_function);
+                     config.v8_cfunction_table_data,
+                     config.v8_cfunction_table_size);
   }
 }
 
diff --git a/third_party/blink/renderer/platform/bindings/idl_member_installer.h b/third_party/blink/renderer/platform/bindings/idl_member_installer.h
index 434d246..2d09b2f3 100644
--- a/third_party/blink/renderer/platform/bindings/idl_member_installer.h
+++ b/third_party/blink/renderer/platform/bindings/idl_member_installer.h
@@ -138,7 +138,8 @@
 
   struct NoAllocDirectCallOperationConfig {
     OperationConfig operation_config;
-    v8::CFunction v8_c_function;
+    const v8::CFunction* v8_cfunction_table_data;
+    uint32_t v8_cfunction_table_size;
   };
   static void InstallOperations(
       v8::Isolate* isolate,
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
index 8ba7c1c54..9c3e41cc 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
@@ -31,6 +31,7 @@
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
 #include "media/base/bind_to_current_loop.h"
 #include "media/base/limits.h"
+#include "media/base/media_switches.h"
 #include "media/base/video_frame.h"
 #include "media/capture/mojom/video_capture_types.mojom-blink.h"
 #include "media/video/gpu_video_accelerator_factories.h"
@@ -48,9 +49,6 @@
 const base::Feature kTimeoutHangingVideoCaptureStarts{
     "TimeoutHangingVideoCaptureStarts", base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kMultiPlaneSharedImageCapture{
-    "MultiPlaneSharedImageCapture", base::FEATURE_DISABLED_BY_DEFAULT};
-
 using VideoFrameBufferHandleType = media::mojom::blink::VideoBufferHandle::Tag;
 
 // A collection of all types of handles that we use to reference a camera buffer
@@ -451,7 +449,7 @@
           gpu_memory_buffer_->GetFormat());
 
   std::vector<gfx::BufferPlane> planes;
-  if (base::FeatureList::IsEnabled(kMultiPlaneSharedImageCapture)) {
+  if (base::FeatureList::IsEnabled(media::kMultiPlaneSharedImageVideo)) {
     planes.push_back(gfx::BufferPlane::Y);
     planes.push_back(gfx::BufferPlane::UV);
   } else {
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 2ecac5e..af102ae 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -3936,7 +3936,6 @@
 crbug.com/1108097 virtual/layout-ng-grid/external/wpt/css/css-grid/grid-model/grid-areas-overflowing-grid-container-005.html [ Failure ]
 
 ### Tests failing with SVGTextNG enabled:
-crbug.com/1179585 virtual/layout_ng_svg_text/external/wpt/svg/embedded/image-embedding-svg-with-auto-height.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/external/wpt/svg/extensibility/foreignObject/will-change-in-foreign-object-paint-order.html [ Pass Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/external/wpt/svg/interact/manual/event-attribute-001-manual.svg [ Skip ]
 crbug.com/1179585 virtual/layout_ng_svg_text/external/wpt/svg/linking/reftests/href-filter-element.html [ Failure ]
@@ -4017,9 +4016,7 @@
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/batik/text/smallFonts.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/batik/text/textDecoration.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/batik/text/textDecoration2.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/batik/text/textEffect.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/batik/text/textEffect2.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/batik/text/textEffect3.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/batik/text/textFeatures.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/batik/text/textProperties.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/clip-path/clip-path-text.svg [ Failure ]
@@ -4029,12 +4026,9 @@
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/clip-path/clip-path-use-referencing-clipped-text.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/clip-path/clip-path-use-referencing-text.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/clip-path/clip-path-with-text-clipped.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/css/text-gradient-shadow.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/css/text-shadow-multiple.xhtml [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/acid3-test-77.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/alignment-baseline-modes.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/dominant-baseline-hanging.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/dominant-baseline-modes.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/empty-mask.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/focus-ring.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/focus-ring-text.svg [ Failure ]
@@ -4044,7 +4038,6 @@
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/mouse-move-on-svg-container.xhtml [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/mouse-move-on-svg-container-standalone.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/path-textPath-simulation.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/pattern-with-transformation.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/pointer-events-text.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/pointer-events-text-css-transform.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/selectSubString.html [ Failure ]
@@ -4052,9 +4045,7 @@
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/text-dom-01-f.svg [ Failure Crash ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/text-hit-test.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/text-match-highlight.html [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/text-rotated-gradient.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/transformed-outlines.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/use-on-text.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/visibility-collapse.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/zoomed-alignment-baseline.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/zoomed-baseline-shift.html [ Failure ]
@@ -4082,10 +4073,6 @@
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/hittest/text-with-text-path.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/hixie/perf/004.xml [ Pass Timeout Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/masking/mask-of-root.html [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/paintorder/paintorder-text-decorations.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/paintorder/paintorder-text.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/stroke/dasharray-dashoffset-text.html [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/stroke/dasharray-text.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/stroke/non-scaling-stroke-text-decoration.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/stroke/non-scaling-stroke-text-decoration-dashed.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/bbox-with-glyph-overflow.html [ Failure ]
@@ -4103,7 +4090,6 @@
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/lengthAdjust-text-metrics.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/ligature-queries.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/non-invertible-matrix-text.svg [ Pass Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/obb-paintserver.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/selection-background-color.xhtml [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/selection-doubleclick.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/selection-dragging-outside-1.html [ Failure ]
@@ -4175,69 +4161,11 @@
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/tspan-multiple-outline-vertical.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/tspan-outline.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/transforms/text-with-mask-with-svg-transform.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/transforms/transformed-text-fill-pattern.html [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirLTR-ubNone.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirLTR-ubOverride.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorEnd.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorMiddle.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorStart.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorEnd.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorMiddle.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorStart.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorEnd.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorMiddle.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorStart.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorEnd.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorMiddle.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorStart.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorEnd.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorMiddle.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorStart.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-no-markup.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirLTR-ubNone.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirLTR-ubOverride.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubOverride.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-ltr.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubEmbed-in-rtl-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubNone-in-rtl-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-default-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-ltr-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-rtl-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-default-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-ltr-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-rtl-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-rtl-context.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-39-t.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/filters-example-01-b.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/fonts-elem-07-b.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/masking-mask-01-b.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/masking-path-04-b.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-grad-08-b.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-grad-11-b.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-pattern-01-b.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-deco-01-b.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-03-b.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-08-b.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-03-f.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/pservers-pattern-03-f.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/struct-use-14-f.svg [ Failure ]
-crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/svgdom-over-01-f.svg [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/zoom/page/zoom-zoom-coords.xhtml [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/zoom/text/lowdpi-zoom-text.html [ Failure ]
 crbug.com/1179585 virtual/layout_ng_svg_text/svg/zoom/zoomed-text-in-clippath.html [ Failure ]
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png
new file mode 100644
index 0000000..af0bb173
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png
new file mode 100644
index 0000000..81979d9f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png
new file mode 100644
index 0000000..af0bb173
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png
new file mode 100644
index 0000000..66d9c73
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png
new file mode 100644
index 0000000..66d9c73
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png
new file mode 100644
index 0000000..8d3d739
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png
new file mode 100644
index 0000000..8d3d739
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png
new file mode 100644
index 0000000..a1228072
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png
new file mode 100644
index 0000000..a1228072
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png
new file mode 100644
index 0000000..45af865
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png
new file mode 100644
index 0000000..2803bba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-39-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-39-t-expected.png
new file mode 100644
index 0000000..c0275e7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-39-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png
new file mode 100644
index 0000000..96c9fb4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png
new file mode 100644
index 0000000..b2a6bd2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-08-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-08-b-expected.png
new file mode 100644
index 0000000..74fe08d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-08-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png
new file mode 100644
index 0000000..86043573
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
new file mode 100644
index 0000000..92a0044
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png
new file mode 100644
index 0000000..0fcde98
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirLTR-ubNone-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirLTR-ubNone-expected.png
new file mode 100644
index 0000000..91ad234
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirLTR-ubNone-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirLTR-ubOverride-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirLTR-ubOverride-expected.png
new file mode 100644
index 0000000..c0d526b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirLTR-ubOverride-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png
new file mode 100644
index 0000000..2f6bbe6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png
new file mode 100644
index 0000000..eabf1ed
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorEnd-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorEnd-expected.png
new file mode 100644
index 0000000..9b949ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorEnd-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorMiddle-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorMiddle-expected.png
new file mode 100644
index 0000000..9e48cb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorMiddle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorStart-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorStart-expected.png
new file mode 100644
index 0000000..2629278bd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirLTR-anchorStart-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorEnd-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorEnd-expected.png
new file mode 100644
index 0000000..9b949ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorEnd-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorMiddle-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorMiddle-expected.png
new file mode 100644
index 0000000..9e48cb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorMiddle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorStart-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorStart-expected.png
new file mode 100644
index 0000000..2629278bd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirNone-anchorStart-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorEnd-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorEnd-expected.png
new file mode 100644
index 0000000..2629278bd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorEnd-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorMiddle-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorMiddle-expected.png
new file mode 100644
index 0000000..9e48cb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorMiddle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorStart-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorStart-expected.png
new file mode 100644
index 0000000..9b949ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-dirRTL-anchorStart-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorEnd-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorEnd-expected.png
new file mode 100644
index 0000000..9b949ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorEnd-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorMiddle-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorMiddle-expected.png
new file mode 100644
index 0000000..9e48cb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorMiddle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorStart-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorStart-expected.png
new file mode 100644
index 0000000..2629278bd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorStart-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorEnd-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorEnd-expected.png
new file mode 100644
index 0000000..2629278bd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorEnd-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorMiddle-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorMiddle-expected.png
new file mode 100644
index 0000000..9e48cb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorMiddle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorStart-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorStart-expected.png
new file mode 100644
index 0000000..9b949ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorStart-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-no-markup-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-no-markup-expected.png
new file mode 100644
index 0000000..2629278bd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-anchor-no-markup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirLTR-ubNone-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirLTR-ubNone-expected.png
new file mode 100644
index 0000000..91ad234
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirLTR-ubNone-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirLTR-ubOverride-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirLTR-ubOverride-expected.png
new file mode 100644
index 0000000..48e077b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirLTR-ubOverride-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png
new file mode 100644
index 0000000..2f6bbe6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubOverride-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubOverride-expected.png
new file mode 100644
index 0000000..df4244ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubOverride-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubEmbed-in-rtl-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubEmbed-in-rtl-context-expected.png
new file mode 100644
index 0000000..e15a63f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubEmbed-in-rtl-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubNone-in-rtl-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubNone-in-rtl-context-expected.png
new file mode 100644
index 0000000..1375311
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubNone-in-rtl-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-default-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-default-context-expected.png
new file mode 100644
index 0000000..47d7f071
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-ltr-context-expected.png
new file mode 100644
index 0000000..47d7f071
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-rtl-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-rtl-context-expected.png
new file mode 100644
index 0000000..bb051add
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-rtl-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-default-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-default-context-expected.png
new file mode 100644
index 0000000..ea2f8ca0
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-ltr-context-expected.png
new file mode 100644
index 0000000..ea2f8ca0
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-rtl-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-rtl-context-expected.png
new file mode 100644
index 0000000..b62e2cc2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirNone-ubOverride-in-rtl-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png
new file mode 100644
index 0000000..54ae34f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png
new file mode 100644
index 0000000..54ae34f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png
new file mode 100644
index 0000000..9afc294
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png
new file mode 100644
index 0000000..9afc294
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png
new file mode 100644
index 0000000..1e127eb5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png
new file mode 100644
index 0000000..1e127eb5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-rtl-context-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-rtl-context-expected.png
new file mode 100644
index 0000000..830ccae
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-rtl-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-ltr-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-ltr-expected.png
new file mode 100644
index 0000000..5f04d52
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-ltr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png
new file mode 100644
index 0000000..41721be2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
new file mode 100644
index 0000000..3b919ce
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/pservers-pattern-03-f-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/pservers-pattern-03-f-expected.png
new file mode 100644
index 0000000..c05443a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/pservers-pattern-03-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/struct-use-14-f-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/struct-use-14-f-expected.png
new file mode 100644
index 0000000..c0d67f0
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/struct-use-14-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/svgdom-over-01-f-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/svgdom-over-01-f-expected.png
new file mode 100644
index 0000000..038c0d8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/svgdom-over-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png
new file mode 100644
index 0000000..a90388b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-39-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-39-t-expected.png
new file mode 100644
index 0000000..8ffe2417
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-39-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-grad-08-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-grad-08-b-expected.png
new file mode 100644
index 0000000..a2bbc3f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-grad-08-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-grad-11-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-grad-11-b-expected.png
new file mode 100644
index 0000000..17351075
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-grad-11-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-pattern-01-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-pattern-01-b-expected.png
new file mode 100644
index 0000000..81466b9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/pservers-pattern-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png
new file mode 100644
index 0000000..11f8f3e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png
new file mode 100644
index 0000000..c46d7e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-08-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-08-b-expected.png
new file mode 100644
index 0000000..500b8f3
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-08-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/batik/text/textEffect-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/batik/text/textEffect-expected.png
new file mode 100644
index 0000000..7a5f290d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/batik/text/textEffect-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png
new file mode 100644
index 0000000..d377417
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/dominant-baseline-hanging-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/dominant-baseline-hanging-expected.png
new file mode 100644
index 0000000..74d531f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/dominant-baseline-hanging-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/text-rotated-gradient-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/text-rotated-gradient-expected.png
new file mode 100644
index 0000000..65faa102
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/text-rotated-gradient-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
new file mode 100644
index 0000000..7f08712
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png
new file mode 100644
index 0000000..8bf272da
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png
new file mode 100644
index 0000000..9ec59ab
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubNone-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png
new file mode 100644
index 0000000..7fd693b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/g-dirRTL-ubOverride-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png
new file mode 100644
index 0000000..9ec59ab
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/text-dirRTL-ubNone-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png
new file mode 100644
index 0000000..d4922ed
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png
new file mode 100644
index 0000000..d4922ed
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubEmbed-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png
new file mode 100644
index 0000000..7123132
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png
new file mode 100644
index 0000000..7123132
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubNone-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png
new file mode 100644
index 0000000..03fab13
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png
new file mode 100644
index 0000000..03fab13
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png
new file mode 100644
index 0000000..45ea98e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-I18N/tspan-direction-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png
new file mode 100644
index 0000000..eb34ad18
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png
new file mode 100644
index 0000000..81caeac
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-07-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png
new file mode 100644
index 0000000..3e682247
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/render-elems-08-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png
new file mode 100644
index 0000000..800893a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/batik/text/textEffect3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
new file mode 100644
index 0000000..84ade05
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png
new file mode 100644
index 0000000..304e570
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/transforms/text-with-pattern-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/plz-service-worker/http/tests/devtools/console/console-uncaught-promise-expected.txt b/third_party/blink/web_tests/virtual/plz-service-worker/http/tests/devtools/console/console-uncaught-promise-expected.txt
deleted file mode 100644
index 18f157ef..0000000
--- a/third_party/blink/web_tests/virtual/plz-service-worker/http/tests/devtools/console/console-uncaught-promise-expected.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-Tests that uncaught promise rejections are logged into console.
-
-console-uncaught-promise.js:26 Uncaught (in promise) Error: err1
-promiseTest1 @ console-uncaught-promise.js:26
-timeout @ console-uncaught-promise.js:19
-Promise.then (async)
-promiseTest1 @ console-uncaught-promise.js:29
-timeout @ console-uncaught-promise.js:19
-setTimeout (async)
-runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:100
-console-uncaught-promise.js:47 Uncaught (in promise) Error: err2
-promiseTest2 @ console-uncaught-promise.js:47
-timeout @ console-uncaught-promise.js:19
-Promise.then (async)
-(anonymous) @ console-uncaught-promise.js:43
-Promise.catch (async)
-(anonymous) @ console-uncaught-promise.js:42
-Promise.catch (async)
-(anonymous) @ console-uncaught-promise.js:41
-Promise.catch (async)
-promiseTest2 @ console-uncaught-promise.js:40
-timeout @ console-uncaught-promise.js:19
-setTimeout (async)
-runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:100
-console-uncaught-promise.js:65 Uncaught (in promise) DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
-throwDOMException @ console-uncaught-promise.js:65
-catcher @ console-uncaught-promise.js:57
-Promise.catch (async)
-promiseTest3 @ console-uncaught-promise.js:56
-timeout @ console-uncaught-promise.js:19
-setTimeout (async)
-runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:100
-console-uncaught-promise.js:71 Uncaught (in promise) 42
-promiseTest4 @ console-uncaught-promise.js:71
-timeout @ console-uncaught-promise.js:19
-setTimeout (async)
-runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:100
-console-uncaught-promise.js:76 Uncaught (in promise) 1e+100
-promiseTest5 @ console-uncaught-promise.js:76
-timeout @ console-uncaught-promise.js:19
-setTimeout (async)
-runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:100
-console-uncaught-promise.js:81 Uncaught (in promise) foo
-promiseTest6 @ console-uncaught-promise.js:81
-timeout @ console-uncaught-promise.js:19
-setTimeout (async)
-runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:100
-console-uncaught-promise.js:86 Uncaught (in promise) {foo: 42}
-    foo: 42
-    [[Prototype]]: Object
-promiseTest7 @ console-uncaught-promise.js:86
-timeout @ console-uncaught-promise.js:19
-setTimeout (async)
-runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:100
-console-uncaught-promise.js:91 Uncaught (in promise) undefined
-promiseTest8 @ console-uncaught-promise.js:91
-timeout @ console-uncaught-promise.js:19
-setTimeout (async)
-runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:100
-inspected-page.html:1 Uncaught (in promise) TypeError: Failed to register a ServiceWorker for scope ('http://127.0.0.1:8000/devtools/console/') with script ('http://127.0.0.1:8000/devtools/console/404'): A bad HTTP response code (404) was received when fetching the script.
-
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-008.html b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-008.html
new file mode 100644
index 0000000..ad205b3
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-008.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<title>Basic named @container</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  div {
+    color: black;
+  }
+  #container1 {
+    container-name: c1;
+    container-type: inline-size;
+    width: 400px;
+  }
+  #container2 {
+    container-name: c2;
+    container-type: inline-size;
+    width: 300px;
+  }
+  #container3 {
+    container-name: c3;
+    container-type: inline-size;
+    width: 200px;
+  }
+
+  @container (width: 200px) { #unnamed .w200 { color:green; } }
+  @container (width: 300px) { #unnamed .w300 { color:red !important; } }
+  @container (width: 400px) { #unnamed .w400 { color:red !important; } }
+
+  @container c3 (width: 200px) { #q3 .w200 { color:green; } }
+  @container c3 (width: 300px) { #q3 .w300 { color:red !important; } }
+  @container c3 (width: 400px) { #q3 .w400 { color:red !important; } }
+
+  @container c2 (width: 200px) { #q2 .w200 { color:red !important; } }
+  @container c2 (width: 300px) { #q2 .w300 { color:green; } }
+  @container c2 (width: 400px) { #q2 .w400 { color:red !important; } }
+
+  @container c1 (width: 200px) { #q1 .w200 { color:red !important; } }
+  @container c1 (width: 300px) { #q1 .w300 { color:red !important; } }
+  @container c1 (width: 400px) { #q1 .w400 { color:green; } }
+
+</style>
+<div id=container1>
+  <div id=container2>
+    <div id=container3>
+      <div id=unnamed>
+        <div class=w200>unnamed, w200</div>
+        <div class=w300>unnamed, w300</div>
+        <div class=w400>unnamed, w400</div>
+      </div>
+      <div id=q3>
+        <div class=w200>c3, w200</div>
+        <div class=w300>c3, w300</div>
+        <div class=w400>c3, w400</div>
+      </div>
+      <div id=q2>
+        <div class=w200>c2, w200</div>
+        <div class=w300>c2, w300</div>
+        <div class=w400>c2, w400</div>
+      </div>
+      <div id=q1>
+        <div class=w200>c1, w200</div>
+        <div class=w300>c1, w300</div>
+        <div class=w400>c1, w400</div>
+      </div>
+    </div>
+  </div>
+</div>
+<script>
+  function computedColor(selector) {
+    return getComputedStyle(document.querySelector(selector)).color;
+  }
+
+  test(function() {
+    assert_equals(computedColor('#unnamed > .w200'), 'rgb(0, 128, 0)');
+    assert_equals(computedColor('#unnamed > .w300'), 'rgb(0, 0, 0)');
+    assert_equals(computedColor('#unnamed > .w400'), 'rgb(0, 0, 0)');
+  }, 'Querying nearest (unnamed) container');
+
+  test(function() {
+    assert_equals(computedColor('#q3 > .w200'), 'rgb(0, 128, 0)');
+    assert_equals(computedColor('#q3 > .w300'), 'rgb(0, 0, 0)');
+    assert_equals(computedColor('#q3 > .w400'), 'rgb(0, 0, 0)');
+  }, 'Querying nearest container by name');
+
+  test(function() {
+    assert_equals(computedColor('#q2 > .w200'), 'rgb(0, 0, 0)');
+    assert_equals(computedColor('#q2 > .w300'), 'rgb(0, 128, 0)');
+    assert_equals(computedColor('#q2 > .w400'), 'rgb(0, 0, 0)');
+  }, 'Querying intermediate container by name');
+
+  test(function() {
+    assert_equals(computedColor('#q1 > .w200'), 'rgb(0, 0, 0)');
+    assert_equals(computedColor('#q1 > .w300'), 'rgb(0, 0, 0)');
+    assert_equals(computedColor('#q1 > .w400'), 'rgb(0, 128, 0)');
+  }, 'Querying topmost container by name');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-009.html b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-009.html
new file mode 100644
index 0000000..765549b
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-009.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<title>container-name invalidation</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  div {
+    color: black;
+  }
+  #outer {
+    container-name: c1;
+    container-type: inline-size;
+    width: 300px;
+  }
+
+  #inner {
+    container-name: c2;
+    container-type: inline-size;
+    width: 200px;
+  }
+
+  #intermediate {
+    width: 250px;
+  }
+
+  @container c1 (width: 250px) {
+    #child {
+      color: green;
+    }
+  }
+</style>
+<div id=outer>
+  <div id=intermediate>
+    <div id=inner>
+      <div id=child>Test</div>
+    </div>
+  </div>
+</div>
+<script>
+  test(function(t) {
+    t.add_cleanup(() => { outer.style = ''; });
+
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 0, 0)');
+
+    outer.style.width = '250px';
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 128, 0)');
+
+    outer.style.width = '251px';
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 0, 0)');
+  }, 'Changing a named container invalidates relevant descendants');
+
+  test(function(t) {
+    t.add_cleanup(() => {
+      outer.style = '';
+      intermediate.style = '';
+    });
+
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 0, 0)');
+
+    // #intermediate becomes the new container.
+    intermediate.style = 'container-name:c1; container-type:inline-size';
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 128, 0)');
+
+    // #outer becomes the container again.
+    intermediate.style = '';
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 0, 0)');
+
+    outer.style.width = '250px';
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 128, 0)');
+  }, 'Changing container-name invalidates relevant descendants');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-010.html b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-010.html
new file mode 100644
index 0000000..15a8ed0
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-010.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>container-name does not establish a container</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  div {
+    color: black;
+  }
+
+  #outer {
+    container-name: c1;
+    container-type: inline-size;
+    width: 300px;
+  }
+
+  #inner {
+    container-name: c1;
+    width: 200px;
+  }
+
+  @container c1 (min-width: 300px) {
+    #child { color: green; }
+  }
+
+</style>
+<div id=outer>
+  <div id=inner>
+    <div id=child>Test</div>
+  </div>
+</div>
+<script>
+  test(function(t) {
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 128, 0)');
+  }, 'container-name does not establish a container');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-011.html b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-011.html
new file mode 100644
index 0000000..12deac3
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-011.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<title>container-type invalidation</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  div {
+    color: black;
+  }
+  #outer {
+    width: 300px;
+  }
+
+  #intermediate {
+    width: 250px;
+  }
+
+  #inner {
+    width: 200px;
+  }
+
+  .container {
+    container-type: inline-size;
+  }
+
+  @container (max-width: 200px), (min-width: 300px) {
+    #child { color: green; }
+  }
+
+</style>
+<div id=outer>
+  <div id=intermediate>
+    <div id=inner>
+      <div id=child>Test</div>
+    </div>
+  </div>
+</div>
+<script>
+  test(function(t) {
+    t.add_cleanup(() => {
+      for (let e of [outer, intermediate, inner])
+        e.classList.remove('container');
+    });
+
+    // No container.
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 0, 0)');
+
+    outer.classList.add('container');
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 128, 0)');
+
+    // The container query does not match widths in the range [201, 299],
+    // and #intermediate has width:250px.
+    intermediate.classList.add('container');
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 0, 0)');
+
+    inner.classList.add('container');
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 128, 0)');
+
+    // Should have no effect, #inner is the container.
+    outer.classList.remove('container');
+    intermediate.classList.remove('container');
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 128, 0)');
+
+    inner.classList.remove('container');
+    assert_equals(getComputedStyle(child).color, 'rgb(0, 0, 0)');
+  }, 'Changing the container type invalidates relevant descendants');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-012.html b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-012.html
new file mode 100644
index 0000000..d857abb6
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-conditional/container-queries/at-container-012.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>container-type layout invalidation</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  #div {
+    width: fit-content;
+  }
+</style>
+<div id=div>
+  content
+</div>
+<script>
+  test(function(t) {
+    t.add_cleanup(() => { div.style = ''; });
+
+    assert_greater_than(div.offsetWidth, 0);
+    assert_greater_than(div.offsetHeight, 0);
+
+    div.style.containerType = 'inline-size block-size';
+
+    assert_equals(div.offsetWidth, 0);
+    assert_equals(div.offsetHeight, 0);
+  }, 'Changing container-type invalidates layout');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/webgpu/cts.html b/third_party/blink/web_tests/wpt_internal/webgpu/cts.html
index 619aed08..9ab9620 100644
--- a/third_party/blink/web_tests/wpt_internal/webgpu/cts.html
+++ b/third_party/blink/web_tests/wpt_internal/webgpu/cts.html
@@ -40,6 +40,7 @@
 
 <!-- Variant list is auto-generated below this line: -->
 
+<meta name=variant content='?q=webgpu:api,operation,adapter,requestDevice:request_default_after_error:*'>
 <meta name=variant content='?q=webgpu:api,operation,buffers,map:mapAsync,write:*'>
 <meta name=variant content='?q=webgpu:api,operation,buffers,map:mapAsync,read:*'>
 <meta name=variant content='?q=webgpu:api,operation,buffers,map:mappedAtCreation:*'>
diff --git a/third_party/closure_compiler/externs/automation.js b/third_party/closure_compiler/externs/automation.js
index c903798..85f6f1c 100644
--- a/third_party/closure_compiler/externs/automation.js
+++ b/third_party/closure_compiler/externs/automation.js
@@ -35,6 +35,7 @@
   CLICKED: 'clicked',
   COLLAPSED: 'collapsed',
   CONTROLS_CHANGED: 'controlsChanged',
+  DETAILS_CHANGED: 'detailsChanged',
   DESCRIBED_BY_CHANGED: 'describedByChanged',
   DESCRIPTION_CHANGED: 'descriptionChanged',
   DOCUMENT_SELECTION_CHANGED: 'documentSelectionChanged',
@@ -2017,11 +2018,11 @@
 chrome.automation.AutomationNode.prototype.fontFamily;
 
 /**
- * Indicates whether the object is at the root of a content editable region, or at a <body> element that has "design-mode" set to "on".
+ * Indicates whether the object functions as a text field which exposes its descendants. Use cases include the root of a content-editable region, an ARIA textbox which isn't currently editable and which has interactive descendants, and a <body> element that has "design-mode" set to "on".
  * @type {boolean}
- * @see https://developer.chrome.com/extensions/automation#type-contentEditableRoot
+ * @see https://developer.chrome.com/extensions/automation#type-nonAtomicTextFieldRoot
  */
-chrome.automation.AutomationNode.prototype.contentEditableRoot;
+chrome.automation.AutomationNode.prototype.nonAtomicTextFieldRoot;
 
 /**
  * Indicates aria-current state.
diff --git a/third_party/libaddressinput/chromium/resources/address_input_strings_uk.xtb b/third_party/libaddressinput/chromium/resources/address_input_strings_uk.xtb
index a673fca4..71b50ffb 100644
--- a/third_party/libaddressinput/chromium/resources/address_input_strings_uk.xtb
+++ b/third_party/libaddressinput/chromium/resources/address_input_strings_uk.xtb
@@ -15,7 +15,7 @@
 <translation id="4518701284698680367">Потрібно вказати поштовий індекс, наприклад, <ph name="EXAMPLE" />. Не знаєте свій поштовий індекс? Знайдіть його <ph name="BEGIN_LINK" />тут<ph name="END_LINK" />.</translation>
 <translation id="5089810972385038852">Штат/провінція</translation>
 <translation id="5095208057601539847">Провінція</translation>
-<translation id="5327248766486351172">Назва</translation>
+<translation id="5327248766486351172">Ім’я</translation>
 <translation id="5937097533660449554">Область</translation>
 <translation id="6132429659673988671">Передмістя</translation>
 <translation id="6207937957461833379">Країна або регіон</translation>
diff --git a/third_party/mako/OWNERS b/third_party/mako/OWNERS
index 74ffea4..442975a 100644
--- a/third_party/mako/OWNERS
+++ b/third_party/mako/OWNERS
@@ -1,3 +1,2 @@
-yukishiino@chromium.org
-peria@chromium.org
 haraken@chromium.org
+yukishiino@chromium.org
diff --git a/third_party/wayland-protocols/README.chromium b/third_party/wayland-protocols/README.chromium
index d3d44e1b..e48df24 100644
--- a/third_party/wayland-protocols/README.chromium
+++ b/third_party/wayland-protocols/README.chromium
@@ -1,18 +1,21 @@
 Name: wayland-protocols
 URL: http://wayland.freedesktop.org/
-Version: 1.20
+Version: 1.21
 License: MIT
 License File: src/COPYING
 Security Critical: yes
 
 Description:
-wayland-protocols contains Wayland protocols that adds functionality not
-available in the Wayland core protocol. Such protocols either adds
-completely new functionality, or extends the functionality of some other
-protocol either in Wayland core, or some other protocol in
-wayland-protocols.
+wayland-protocols/src contains Wayland protocols that add functionality not
+available in the Wayland core protocol.  Such protocols either add completely
+new functionality, or extend the functionality of some other protocol either in
+Wayland core, or some other protocol in wayland-protocols.
 
-To import a new snapshot of wayland-protocols:
-- Checkout the latest version: git checkout 57423eac60cc234ebfad15f394488a47f69afe16
-- Change the DEPS entry to the newly checked out commit.
+This component is fetched from the external repository.  To upgrade it to a new
+version:
+- Find the commit hash of that version in the project's git repository, which is
+  gitlab.freedesktop.org:wayland/wayland-protocols.git.
+- Update the DEPS entry to the commit found above with this command:
+  $ roll-dep --roll-to=<commit> src/third_party/wayland-protocols/src
+- Run gclient sync to update the local working copy with the new version.
 - Update this README to reflect the new version number.
diff --git a/third_party/webgpu-cts/ts_sources.txt b/third_party/webgpu-cts/ts_sources.txt
index 238be98d..7903194 100644
--- a/third_party/webgpu-cts/ts_sources.txt
+++ b/third_party/webgpu-cts/ts_sources.txt
@@ -74,6 +74,7 @@
 src/webgpu/api/operation/labels.spec.ts
 src/webgpu/api/operation/onSubmittedWorkDone.spec.ts
 src/webgpu/api/operation/uncapturederror.spec.ts
+src/webgpu/api/operation/adapter/requestDevice.spec.ts
 src/webgpu/api/operation/buffers/mapping_test.ts
 src/webgpu/api/operation/buffers/map.spec.ts
 src/webgpu/api/operation/buffers/map_detach.spec.ts
diff --git a/tools/ipc_fuzzer/message_replay/replay_process.cc b/tools/ipc_fuzzer/message_replay/replay_process.cc
index fd3d90f..a985a25 100644
--- a/tools/ipc_fuzzer/message_replay/replay_process.cc
+++ b/tools/ipc_fuzzer/message_replay/replay_process.cc
@@ -18,6 +18,7 @@
 #include "build/build_config.h"
 #include "chrome/common/chrome_switches.h"
 #include "content/common/child_process.mojom-test-utils.h"
+#include "content/common/content_constants_internal.h"
 #include "content/public/common/content_switches.h"
 #include "ipc/ipc.mojom.h"
 #include "ipc/ipc_channel_mojo.h"
@@ -46,9 +47,7 @@
 class FakeChildProcessImpl
     : public content::mojom::ChildProcessInterceptorForTesting {
  public:
-  explicit FakeChildProcessImpl(
-      mojo::PendingRemote<IPC::mojom::ChannelBootstrap> legacy_ipc_bootstrap)
-      : legacy_ipc_bootstrap_(std::move(legacy_ipc_bootstrap)) {
+  FakeChildProcessImpl() {
     ignore_result(disconnected_process_.BindNewPipeAndPassReceiver());
   }
 
@@ -57,13 +56,7 @@
     return disconnected_process_.get();
   }
 
-  void BootstrapLegacyIpc(
-      mojo::PendingReceiver<IPC::mojom::ChannelBootstrap> receiver) override {
-    mojo::FusePipes(std::move(receiver), std::move(legacy_ipc_bootstrap_));
-  }
-
  private:
-  mojo::PendingRemote<IPC::mojom::ChannelBootstrap> legacy_ipc_bootstrap_;
   mojo::Remote<content::mojom::ChildProcess> disconnected_process_;
 };
 
@@ -143,15 +136,19 @@
 
 void ReplayProcess::OpenChannel() {
   DCHECK(mojo_invitation_);
-  mojo::PendingRemote<IPC::mojom::ChannelBootstrap> bootstrap;
-  auto bootstrap_receiver = bootstrap.InitWithNewPipeAndPassReceiver();
+  mojo::ScopedMessagePipeHandle child_process_pipe_for_receiver =
+      mojo_invitation_->ExtractMessagePipe(
+          content::kChildProcessReceiverAttachmentName);
+  mojo::ScopedMessagePipeHandle legacy_ipc_bootstrap_pipe =
+      mojo_invitation_->ExtractMessagePipe(
+          content::kLegacyIpcBootstrapAttachmentName);
   mojo::MakeSelfOwnedReceiver(
-      std::make_unique<FakeChildProcessImpl>(std::move(bootstrap)),
+      std::make_unique<FakeChildProcessImpl>(),
       mojo::PendingReceiver<content::mojom::ChildProcess>(
-          mojo_invitation_->ExtractMessagePipe(0)));
+          std::move(child_process_pipe_for_receiver)));
   channel_ = IPC::ChannelProxy::Create(
       IPC::ChannelMojo::CreateClientFactory(
-          bootstrap_receiver.PassPipe(), io_thread_.task_runner(),
+          std::move(legacy_ipc_bootstrap_pipe), io_thread_.task_runner(),
           base::ThreadTaskRunnerHandle::Get()),
       this, io_thread_.task_runner(), base::ThreadTaskRunnerHandle::Get());
 }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 29cf4f68..d072335 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -17918,6 +17918,7 @@
 
   <int value="1" label="kDebugSameDocNavigationDocIdMismatch"/>
   <int value="2" label="kDebugNonMainFrameWithOldPageInfo"/>
+  <int value="3" label="kDebugBackForwardCacheMetricsMismatch"/>
 </enum>
 
 <enum name="DeclarativeAPIFunctionType">
@@ -23860,6 +23861,21 @@
   <int value="1" label="Reused lock"/>
 </enum>
 
+<enum name="EnterpriseFilesystemUploadAttemptCount">
+  <int value="0" label="File not renamed"/>
+  <int value="1" label="Appended with suffix (1)"/>
+  <int value="2" label="Appended with suffix (2)"/>
+  <int value="3" label="Appended with suffix (3)"/>
+  <int value="4" label="Appended with suffix (4)"/>
+  <int value="5" label="Appended with suffix (5)"/>
+  <int value="6" label="Appended with suffix (6)"/>
+  <int value="7" label="Appended with suffix (7)"/>
+  <int value="8" label="Appended with suffix (8)"/>
+  <int value="9" label="Appended with suffix (9)"/>
+  <int value="1000" label="Appended timestamp to name"/>
+  <int value="2000" label="Abandoned upload"/>
+</enum>
+
 <enum name="EnterpriseInitialEnrollmentRequirement">
   <obsolete>
     Removed in M91 since the data is not monitored.
diff --git a/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml b/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml
index 966724b7a2..ba799be9 100644
--- a/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml
@@ -1450,6 +1450,10 @@
 
 <histogram name="ChromeOS.Sharesheet.AppCount.{AppType}" units="apps"
     expires_after="M95">
+  <obsolete>
+    Replaced with pattern histogram ChromeOS.Sharesheet.AppCount2.{AppType}.
+    (2021-06)
+  </obsolete>
   <owner>dominickn@chromium.org</owner>
   <owner>melzhang@chromium.org</owner>
   <summary>
@@ -1463,6 +1467,32 @@
   </token>
 </histogram>
 
+<histogram name="ChromeOS.Sharesheet.AppCount2.{AppType}" units="apps"
+    expires_after="M95">
+  <owner>dominickn@chromium.org</owner>
+  <owner>melzhang@chromium.org</owner>
+  <summary>
+    Records number of {AppType} apps found for a given intent in the Sharesheet
+    when the sharesheet is invoked. Has 100 exponential buckets. (The original
+    histogram had 1000 linear buckets).
+  </summary>
+  <token key="AppType">
+    <variant name="All" summary="all apps"/>
+    <variant name="Arc" summary="arc app"/>
+    <variant name="Web" summary="web app"/>
+  </token>
+</histogram>
+
+<histogram name="ChromeOS.Sharesheet.FileCount" units="files"
+    expires_after="M97">
+  <owner>dominickn@chromium.org</owner>
+  <owner>melzhang@chromium.org</owner>
+  <summary>
+    Records the number of files a user is trying to share from the Sharesheet
+    when the sharesheet is invoked.
+  </summary>
+</histogram>
+
 <histogram name="ChromeOS.Sharesheet.FormFactor"
     enum="ChromeOSSharesheetFormFactor" expires_after="M95">
   <owner>dominickn@chromium.org</owner>
@@ -1470,6 +1500,26 @@
   <summary>Records the form factor when the Sharesheet is invoked.</summary>
 </histogram>
 
+<histogram name="ChromeOS.Sharesheet.IsDriveFolder" enum="Boolean"
+    expires_after="M97">
+  <owner>dominickn@chromium.org</owner>
+  <owner>melzhang@chromium.org</owner>
+  <summary>
+    If the value is true, the data being shared from the Sharesheet is a folder
+    from Drive. Recorded when the sharesheet is invoked.
+  </summary>
+</histogram>
+
+<histogram name="ChromeOS.Sharesheet.IsImagePreviewPressed"
+    enum="BooleanSelected" expires_after="M97">
+  <owner>dominickn@chromium.org</owner>
+  <owner>melzhang@chromium.org</owner>
+  <summary>
+    If the value is true, the image preview was pressed during the current
+    invocation. Recorded when the sharesheet closes.
+  </summary>
+</histogram>
+
 <histogram name="ChromeOS.Sharesheet.LaunchSource"
     enum="ChromeOSSharesheetLaunchSource" expires_after="M95">
   <owner>dominickn@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/enterprise/histograms.xml b/tools/metrics/histograms/histograms_xml/enterprise/histograms.xml
index 9d9d9dac..1bb750b 100644
--- a/tools/metrics/histograms/histograms_xml/enterprise/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/enterprise/histograms.xml
@@ -1042,6 +1042,22 @@
   </summary>
 </histogram>
 
+<histogram name="Enterprise.FileSystem.Uniquifier"
+    enum="EnterpriseFilesystemUploadAttemptCount" expires_after="2021-11-18">
+  <owner>alicego@google.com</owner>
+  <owner>mad@google.com</owner>
+  <owner>rogerta@google.com</owner>
+  <owner>xanth@google.com</owner>
+  <summary>
+    The number of alternate filenames tried to avoid a filename collision when
+    uploading to the cloud storage provider. If there is a collision filenames
+    of the form &quot;filename (%d).ext&quot; are used for
+    &quot;filename.ext&quot;, and after 10 retries we fallback to a timestamp
+    based name &quot;filename - YYYY-MM-ddTHHMMss.SSS UTC+HHmm.ext&quot;, and
+    abandon if that fails.
+  </summary>
+</histogram>
+
 <histogram name="Enterprise.FirstRun.AppRestrictionLoadTime" units="ms"
     expires_after="2021-11-07">
   <owner>wenyufu@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/optimization/histograms.xml b/tools/metrics/histograms/histograms_xml/optimization/histograms.xml
index 2369d28..9b319dd 100644
--- a/tools/metrics/histograms/histograms_xml/optimization/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/optimization/histograms.xml
@@ -317,6 +317,10 @@
     Records whether the model file for {OptimizationTarget} is available on disk
     at the time when it needs to be loaded into memory for a requested
     execution. Recorded once per model load attempt for {OptimizationTarget}.
+    Note that callers may separately check whether a model is available before
+    calling the code path where this histogram is recorded. If this histogram
+    has 100% of samples in the true bucket, make sure to double-check that there
+    isn't a separate histogram specific to the model.
   </summary>
   <token key="OptimizationTarget" variants="OptimizationTarget"/>
 </histogram>
@@ -447,6 +451,18 @@
   </summary>
 </histogram>
 
+<histogram
+    name="OptimizationGuide.PageContentAnnotationsService.ModelAvailable"
+    enum="BooleanAvailable" expires_after="M94">
+  <owner>robertogden@chromium.org</owner>
+  <owner>chrome-intelligence-core@google.com</owner>
+  <summary>
+    Whether the page topics model was available to execute when requested.
+    Recorded once per execution attempt. Note that this histogram supersedes
+    OptimizationGuide.ModelExecutor.ModelAvailableToLoad.PageTopics.
+  </summary>
+</histogram>
+
 <histogram name="OptimizationGuide.PageTextDump.AbandonedRequests"
     units="count" expires_after="M94">
   <owner>robertogden@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/password/histograms.xml b/tools/metrics/histograms/histograms_xml/password/histograms.xml
index 80872886..bb8368f3 100644
--- a/tools/metrics/histograms/histograms_xml/password/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/password/histograms.xml
@@ -810,6 +810,9 @@
 
 <histogram name="PasswordManager.BulkCheck.CanceledCredentials"
     units="credentials" expires_after="2021-07-01">
+  <obsolete>
+    Deprecated in M93.
+  </obsolete>
   <owner>vasilii@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index ea94ebb..41b6853 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -65,10 +65,18 @@
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-class-deep.html [ Skip ]
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-deep.html [ Skip ]
 crbug.com/966613 [ android-pixel-2 ] blink_perf.parser/query-selector-all-id-deep.html [ Skip ]
+crbug.com/1216353 [ android ] blink_perf.parser/html-parser-threaded.html [ Skip ]
+crbug.com/1216353 [ linux ] blink_perf.parser/html-parser-threaded.html [ Skip ]
+crbug.com/1216353 [ mac ] blink_perf.parser/html-parser-threaded.html [ Skip ]
+crbug.com/1216353 [ win ] blink_perf.parser/html-parser-threaded.html [ Skip ]
 
 # Benchmark: blink_perf.shadow_dom
 crbug.com/702319 [ android-nexus-5x ] blink_perf.shadow_dom/* [ Skip ]
 
+# Benchmark: desktop_ui
+crbug.com/1216362 [ win-laptop ] desktop_ui/tab_search:close_and_open:2020 [ Skip ]
+crbug.com/1210302 [ mac-10.12 ] desktop_ui/download_shelf* [ Skip ]
+
 # Benchmark: dromaeo
 crbug.com/1050065 [ android-pixel-2 ] dromaeo/http://dromaeo.com?dom-modify [ Skip ]
 
@@ -398,6 +406,7 @@
 crbug.com/1173972 [ linux ] system_health.memory_desktop/browse:news:nytimes:2020 [ Skip ]
 crbug.com/903417 [ mac ] system_health.memory_desktop/long_running:tools:gmail-background [ Skip ]
 crbug.com/903417 [ mac ] system_health.memory_desktop/long_running:tools:gmail-foreground [ Skip ]
+crbug.com/1216366 [ win-laptop ] system_health.memory_desktop/load:tools:drive:2019 [ Skip ]
 
 # Memory dumps don't work at the moment for Google Earth and AutoCAD, see the issue.
 crbug.com/1057035 system_health.memory_desktop/browse:tools:earth:2020 [ Skip ]
@@ -426,6 +435,9 @@
 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 ]
@@ -501,6 +513,9 @@
 
 # Benchmark: wasmpspdfkit
 crbug.com/1211795 [ mac ] wasmpspdfkit/https://pspdfkit.com/webassembly-benchmark/ [ Skip ]
+crbug.com/1216340 [ win ] wasmpspdfkit/https://pspdfkit.com/webassembly-benchmark/ [ Skip ]
+crbug.com/1216340 [ android ] wasmpspdfkit/https://pspdfkit.com/webassembly-benchmark/ [ Skip ]
+crbug.com/1216340 [ linux ] wasmpspdfkit/https://pspdfkit.com/webassembly-benchmark/ [ Skip ]
 
 # Benchmark: webrtc
 crbug.com/1051644 [ win ] webrtc/pause_play_peerconnections [ Skip ]
diff --git a/tools/v8_context_snapshot/OWNERS b/tools/v8_context_snapshot/OWNERS
index 7c41267..442975a 100644
--- a/tools/v8_context_snapshot/OWNERS
+++ b/tools/v8_context_snapshot/OWNERS
@@ -1,3 +1,2 @@
 haraken@chromium.org
-peria@chromium.org
 yukishiino@chromium.org
diff --git a/ui/accessibility/ax_enum_util.cc b/ui/accessibility/ax_enum_util.cc
index 8d652c05..b87993e 100644
--- a/ui/accessibility/ax_enum_util.cc
+++ b/ui/accessibility/ax_enum_util.cc
@@ -973,8 +973,8 @@
       return "none";
     case ax::mojom::BoolAttribute::kBusy:
       return "busy";
-    case ax::mojom::BoolAttribute::kContentEditableRoot:
-      return "contentEditableRoot";
+    case ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot:
+      return "nonAtomicTextFieldRoot";
     case ax::mojom::BoolAttribute::kContainerLiveAtomic:
       return "containerLiveAtomic";
     case ax::mojom::BoolAttribute::kContainerLiveBusy:
diff --git a/ui/accessibility/ax_enums.mojom b/ui/accessibility/ax_enums.mojom
index f695a6b..e34f4dbcb 100644
--- a/ui/accessibility/ax_enums.mojom
+++ b/ui/accessibility/ax_enums.mojom
@@ -737,9 +737,11 @@
   // Generic busy state, does not have to be on a live region.
   kBusy = 1,
 
-  // The object is at the root of a content editable region, or at a <body>
-  // element that has "design-mode" set to "on".
-  kContentEditableRoot = 2,
+  // The object functions as a text field which exposes its descendants.
+  // Use cases include the root of a content-editable region, an ARIA
+  // textbox which isn't currently editable and which has interactive
+  // descendants, and a <body> element that has "design-mode" set to "on".
+  kNonAtomicTextFieldRoot = 2,
 
   // Live region attributes.
   kContainerLiveAtomic = 3,
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc
index 59f84ad..9ceb69b7 100644
--- a/ui/accessibility/ax_event_generator.cc
+++ b/ui/accessibility/ax_event_generator.cc
@@ -640,6 +640,9 @@
     case ax::mojom::IntListAttribute::kControlsIds:
       AddEvent(node, Event::CONTROLS_CHANGED);
       break;
+    case ax::mojom::IntListAttribute::kDetailsIds:
+      AddEvent(node, Event::DETAILS_CHANGED);
+      break;
     case ax::mojom::IntListAttribute::kDescribedbyIds:
       AddEvent(node, Event::DESCRIBED_BY_CHANGED);
       break;
@@ -1141,6 +1144,8 @@
       return "collapsed";
     case AXEventGenerator::Event::CONTROLS_CHANGED:
       return "controlsChanged";
+    case AXEventGenerator::Event::DETAILS_CHANGED:
+      return "detailsChanged";
     case AXEventGenerator::Event::DESCRIBED_BY_CHANGED:
       return "describedByChanged";
     case AXEventGenerator::Event::DESCRIPTION_CHANGED:
diff --git a/ui/accessibility/ax_event_generator.h b/ui/accessibility/ax_event_generator.h
index 71d124e1..7f2bb762 100644
--- a/ui/accessibility/ax_event_generator.h
+++ b/ui/accessibility/ax_event_generator.h
@@ -44,6 +44,7 @@
     CLASS_NAME_CHANGED,
     COLLAPSED,
     CONTROLS_CHANGED,
+    DETAILS_CHANGED,
     DESCRIBED_BY_CHANGED,
     DESCRIPTION_CHANGED,
     DOCUMENT_SELECTION_CHANGED,
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc
index cc7383e..f4a1aef5 100644
--- a/ui/accessibility/ax_node_data.cc
+++ b/ui/accessibility/ax_node_data.cc
@@ -1033,17 +1033,20 @@
 }
 
 bool AXNodeData::IsAtomicTextField() const {
-  // ARIA-based textboxes or searchboxes could mistakenly be identified as
-  // atomic text fields, i.e. be identified as an <input> or a <textarea>. This
-  // can only occur when the web author hasn't specified the "contenteditable"
-  // attribute. Since these kinds of text fields are not really usable, we
-  // decide not to support them.
+  // The ARIA spec suggests a textbox is a simple text field, like an <input> or
+  // <textarea> depending on aria-multiline. However there is nothing to stop
+  // an author from adding the textbox role to a non-contenteditable element,
+  // or from adding or removing non-plain-text nodes. If we treat the textbox
+  // role as atomic when contenteditable is not set, it can break accessibility
+  // by pruning interactive elements from the accessibility tree. Therefore,
+  // until we have a reliable means to identify truly atomic ARIA textboxes,
+  // treat them as non-atomic.
   return ui::IsTextField(role) &&
-         !HasBoolAttribute(ax::mojom::BoolAttribute::kContentEditableRoot);
+         !GetBoolAttribute(ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot);
 }
 
 bool AXNodeData::IsNonAtomicTextField() const {
-  return HasBoolAttribute(ax::mojom::BoolAttribute::kContentEditableRoot);
+  return GetBoolAttribute(ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot);
 }
 
 bool AXNodeData::IsReadOnlyOrDisabled() const {
@@ -1591,8 +1594,8 @@
        bool_attributes) {
     std::string value = bool_attribute.second ? "true" : "false";
     switch (bool_attribute.first) {
-      case ax::mojom::BoolAttribute::kContentEditableRoot:
-        result += " contentEditable_root=" + value;
+      case ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot:
+        result += " non_atomic_text_field_root=" + value;
         break;
       case ax::mojom::BoolAttribute::kLiveAtomic:
         result += " atomic=" + value;
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index bb3af12..c1c52a7 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -3773,7 +3773,8 @@
   if (GetAtkRole() == ATK_ROLE_DOCUMENT_WEB)
     return *this;
   if (GetData().GetBoolAttribute(
-          ax::mojom::BoolAttribute::kContentEditableRoot))
+          ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot) &&
+      GetData().HasState(ax::mojom::State::kEditable))
     return *this;
   if (auto* parent = FromAtkObject(GetParent()))
     return parent->FindEditableRootOrDocument();
diff --git a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
index ffe744e..b00fb34 100644
--- a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
@@ -3681,7 +3681,7 @@
   generic_container_2.AddState(ax::mojom::State::kEditable);
   generic_container_2.AddState(ax::mojom::State::kRichlyEditable);
   generic_container_2.AddBoolAttribute(
-      ax::mojom::BoolAttribute::kContentEditableRoot, true);
+      ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true);
   generic_container_2.child_ids = {static_text_3.id, static_text_6.id,
                                    static_text_7.id, button_8.id};
 
@@ -3698,9 +3698,10 @@
   static_text_7.AddState(ax::mojom::State::kIgnored);
 
   button_8.role = ax::mojom::Role::kButton;
-  // Hack: The kEditableRoot attribute is needed to get a text range provider
-  // located on this element (see AXPlatformNodeWin::GetPatternProvider).
-  button_8.AddBoolAttribute(ax::mojom::BoolAttribute::kContentEditableRoot,
+  // Hack: The kNonAtomicTextFieldRoot attribute is needed to get a text range
+  // provider located on this element (see
+  // AXPlatformNodeWin::GetPatternProvider).
+  button_8.AddBoolAttribute(ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot,
                             true);
   // When kEditableRoot is set, kEditable is also expected.
   button_8.AddState(ax::mojom::State::kEditable);
@@ -5666,7 +5667,7 @@
   tree_update.nodes[1].AddState(ax::mojom::State::kEditable);
   tree_update.nodes[1].AddState(ax::mojom::State::kRichlyEditable);
   tree_update.nodes[1].AddBoolAttribute(
-      ax::mojom::BoolAttribute::kContentEditableRoot, true);
+      ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true);
   tree_update.nodes[1].role = ax::mojom::Role::kGenericContainer;
 
   tree_update.nodes[2].id = 3;
diff --git a/ui/accessibility/platform/ax_platform_node_unittest.cc b/ui/accessibility/platform/ax_platform_node_unittest.cc
index 99b9dd5c..a3aaa53 100644
--- a/ui/accessibility/platform/ax_platform_node_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_unittest.cc
@@ -103,7 +103,7 @@
   content_editable_node.AddState(ax::mojom::State::kEditable);
   content_editable_node.AddState(ax::mojom::State::kRichlyEditable);
   content_editable_node.AddBoolAttribute(
-      ax::mojom::BoolAttribute::kContentEditableRoot, true);
+      ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true);
   content_editable_node.SetValue("How now brown cow.");
 
   AXTreeUpdate update;
@@ -123,7 +123,7 @@
   content_editable_node.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected,
                                          true);
   content_editable_node.AddBoolAttribute(
-      ax::mojom::BoolAttribute::kContentEditableRoot, true);
+      ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true);
   content_editable_node.SetValue("How now brown cow.");
 
   AXTreeUpdate update;
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index 8de0faf..d9b762f 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -5827,7 +5827,7 @@
       // enable paste operations. Eventually this need should go away once IE11
       // support is no longer needed and Slides instead relies on paste events.
       if (!data.HasState(ax::mojom::State::kFocusable) ||
-          GetBoolAttribute(ax::mojom::BoolAttribute::kContentEditableRoot))
+          GetBoolAttribute(ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot))
         break;  // Not used with activedescendant, so preserve editable state.
       FALLTHROUGH;  // Will clear editable state.
     case ax::mojom::Role::kMenuListPopup:
@@ -7406,7 +7406,7 @@
     // Doing so helps Narrator find all the content of live regions.
     if (!data.GetBoolAttribute(ax::mojom::BoolAttribute::kHasAriaAttribute) &&
         !data.GetBoolAttribute(
-            ax::mojom::BoolAttribute::kContentEditableRoot) &&
+            ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot) &&
         GetName().empty() &&
         data.GetStringAttribute(ax::mojom::StringAttribute::kDescription)
             .empty() &&
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index f235aad..03aaf35 100644
--- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -4747,7 +4747,7 @@
   update.nodes[12].AddState(ax::mojom::State::kEditable);
   update.nodes[12].AddState(ax::mojom::State::kRichlyEditable);
   update.nodes[12].AddBoolAttribute(
-      ax::mojom::BoolAttribute::kContentEditableRoot, true);
+      ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true);
   update.nodes[13].id = 14;
   update.nodes[13].role = ax::mojom::Role::kGenericContainer;
   update.nodes[13].SetName("name");
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
index 29141fb..c1c7069 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -426,7 +426,7 @@
 <translation id="5317780077021120954">Зберегти</translation>
 <translation id="5318819489018851358">Надати доступ додаткам Linux</translation>
 <translation id="5323213332664049067">латиноамериканська</translation>
-<translation id="5327248766486351172">Назва</translation>
+<translation id="5327248766486351172">Ім’я</translation>
 <translation id="5330145655348521461">Ці файли відкрито на іншому комп’ютері. Перейдіть до <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />), щоб переглянути їх.</translation>
 <translation id="5330512191124428349">Отримати інформацію</translation>
 <translation id="5335458522276292100">Резервне копіювання на <ph name="BEGIN_LINK" />Google Диск<ph name="END_LINK" />: <ph name="FILE_COUNT" /></translation>
diff --git a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.d.ts b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.d.ts
index 0b23524..97e09df 100644
--- a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.d.ts
+++ b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.d.ts
@@ -7,14 +7,14 @@
 
 interface CrDialogElement extends CrContainerShadowBehavior, LegacyElementMixin,
                                   HTMLElement {
-  open: boolean|null|undefined;
+  open: boolean;
   closeText: string|null|undefined;
-  ignorePopstate: boolean|null|undefined;
-  ignoreEnterKey: boolean|null|undefined;
-  consumeKeydownEvent: boolean|null|undefined;
-  noCancel: boolean|null|undefined;
-  showCloseButton: boolean|null|undefined;
-  showOnAttach: boolean|null|undefined;
+  ignorePopstate: boolean;
+  ignoreEnterKey: boolean;
+  consumeKeydownEvent: boolean;
+  noCancel: boolean;
+  showCloseButton: boolean;
+  showOnAttach: boolean;
   showModal(): void;
   cancel(): void;
   close(): void;
diff --git a/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html b/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html
index 3b51d90..a3cb9266 100644
--- a/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html
+++ b/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html
@@ -7,7 +7,6 @@
         font-size: var(--cr-tabs-font-size, 14px);
         font-weight: 500;
         height: var(--cr-tabs-height);
-        position: relative;
         user-select: none;
       }
 
@@ -19,6 +18,7 @@
         height: 100%;
         justify-content: center;
         opacity: .8;
+        position: relative;
         transition: opacity 100ms cubic-bezier(.4, 0, 1, 1);
       }
 
@@ -41,38 +41,45 @@
         font-weight: 700;
       }
 
-      #selectionBar {
-        --cr-tabs-selection-bar-width: 2px;
-        border-bottom-color: var(--google-blue-600);
-        border-bottom-style: solid;
-        border-bottom-width: var(--cr-tabs-selection-bar-width);
-        height: 0;
-        left: 0;
+      .tab-indicator {
+        background: var(--google-blue-600);
+        bottom: 0;
+        height: var(--cr-tabs-selection-bar-width, 2px);
+        opacity: 0;
         position: absolute;
-        right: 0;
-        top: calc(var(--cr-tabs-height) - var(--cr-tabs-selection-bar-width));
-        transform: scale(0);
         transform-origin: left center;
         transition: transform;
+        width: 100%;
       }
 
-      @media (prefers-color-scheme: dark) {
-        #selectionBar {
-          border-bottom-color: var(--google-blue-refresh-300);
-        }
+      .selected .tab-indicator {
+        opacity: 1;
       }
 
-      #selectionBar.expand {
+      .tab-indicator.expand {
         transition-duration: 150ms;
         transition-timing-function: cubic-bezier(.4, 0, 1, 1);
       }
 
-      #selectionBar.contract {
+      .tab-indicator.contract {
         transition-duration: 180ms;
         transition-timing-function: cubic-bezier(0, 0, .2, 1);
       }
+
+      @media (prefers-color-scheme: dark) {
+        .tab-indicator {
+          background: var(--google-blue-refresh-300);
+        }
+      }
     </style>
-    <template is="dom-repeat" items="[[tabNames]]" on-dom-change="updateUi_">
-      <div class="tab" role="tab" on-click="onTabClick_">[[item]]</div>
+    <template is="dom-repeat" items="[[tabNames]]">
+      <div
+          role="tab"
+          class$="tab [[getSelectedClass_(index, selected)]]"
+          on-click="onTabClick_"
+          aria-selected$="[[getAriaSelected_(index, selected)]]"
+          tabindex$="[[getTabindex_(index, selected)]]">
+        [[item]]
+        <div class="tab-indicator"></div>
+      </div>
     </template>
-    <div id="selectionBar"></div>
diff --git a/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.js b/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.js
index 68075f6..73d2922 100644
--- a/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.js
+++ b/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.js
@@ -49,7 +49,7 @@
       selected: {
         type: Number,
         notify: true,
-        observer: 'updateUi_',
+        observer: 'onSelectedChanged_',
       },
     };
   }
@@ -80,6 +80,69 @@
     this.addEventListener('mousedown', this.onMouseDown_);
   }
 
+  /**
+   * @param {number} index
+   * @return {string}
+   * @private
+   */
+  getAriaSelected_(index) {
+    return index === this.selected ? 'true' : 'false';
+  }
+
+  /**
+   * @param {number} index
+   * @return {string}
+   * @private
+   */
+  getTabindex_(index) {
+    return index === this.selected ? '0' : '-1';
+  }
+
+  /**
+   * @param {number} index
+   * @return {string}
+   * @private
+   */
+  getSelectedClass_(index) {
+    return index === this.selected ? 'selected' : '';
+  }
+
+  /**
+   * @param {number} newSelected
+   * @param {number} oldSelected
+   * @private
+   */
+  onSelectedChanged_(newSelected, oldSelected) {
+    const tabs = this.shadowRoot.querySelectorAll('.tab');
+    if (tabs.length === 0 || oldSelected === undefined) {
+      // Tabs are not rendered yet.
+      return;
+    }
+
+    const oldTabRect = tabs[oldSelected].getBoundingClientRect();
+    const newTabRect = tabs[newSelected].getBoundingClientRect();
+
+    const newIndicator = /** @type {!HTMLElement} */ (
+        tabs[newSelected].querySelector('.tab-indicator'));
+    newIndicator.classList.remove('expand', 'contract');
+
+    // Make new indicator look like it is the old indicator.
+    this.updateIndicator_(
+        newIndicator, newTabRect, oldTabRect.left, oldTabRect.width);
+    newIndicator.getBoundingClientRect();  // Force repaint.
+
+    // Expand to cover both the previous selected tab, the newly selected tab,
+    // and everything in between.
+    newIndicator.classList.add('expand');
+    newIndicator.addEventListener(
+        'transitionend', e => this.onIndicatorTransitionEnd_(e), {once: true});
+    const leftmostEdge = Math.min(oldTabRect.left, newTabRect.left);
+    const fullWidth = newTabRect.left > oldTabRect.left ?
+        newTabRect.right - oldTabRect.left :
+        oldTabRect.right - newTabRect.left;
+    this.updateIndicator_(newIndicator, newTabRect, leftmostEdge, fullWidth);
+  }
+
   /** @private */
   onMouseDown_() {
     this.classList.remove('keyboard-focus');
@@ -107,18 +170,17 @@
     e.preventDefault();
     e.stopPropagation();
     this.selected = newSelection;
+    this.shadowRoot.querySelector('.tab.selected').focus();
   }
 
-  /** @private */
-  onSelectionBarTransitionEnd_() {
-    this.$.selectionBar.classList.replace('expand', 'contract');
-    const tab =
-        this.shadowRoot.querySelector(`.tab:nth-of-type(${this.selected + 1})`);
-    if (!tab) {
-      this.$.selectionBar.style.transform = 'scaleX(0)';
-      return;
-    }
-    this.updateSelectionBar_(tab.offsetLeft, tab.offsetWidth);
+  /**
+   * @param {!Event} event
+   * @private
+   */
+  onIndicatorTransitionEnd_(event) {
+    const indicator = event.target;
+    indicator.classList.replace('expand', 'contract');
+    indicator.style.transform = `translateX(0) scaleX(1)`;
   }
 
   /**
@@ -130,85 +192,17 @@
   }
 
   /**
-   * @param {number} left
-   * @param {number} width
+   * @param {!HTMLElement} indicator
+   * @param {!ClientRect} originRect
+   * @param {number} newLeft
+   * @param {number} newWidth
    * @private
    */
-  updateSelectionBar_(left, width) {
-    const containerWidth = this.offsetWidth;
-    const leftPercent = 100 * left / containerWidth;
-    const widthRatio = width / containerWidth;
-
-    // When there are two tabs, the selection bar will expand to underline both
-    // tabs. If a user quickly changes tabs multiple times, the selection bar
-    // will no longer have any room to expand the transitionend event will be
-    // fired only after the unerline is fully expanded. The underline will
-    // freeze in an expanded state since no transitionend events will be fired
-    // for subsequent selection changes. Call transition end method to prevent
-    // this.
-    if (this.$.selectionBar.style.transform === 'translateX(0%) scaleX(1)' &&
-        leftPercent === 0 && widthRatio === 1) {
-      this.onSelectionBarTransitionEnd_();
-      return;
-    }
-
-    this.$.selectionBar.style.transform =
-        `translateX(${leftPercent}%) scaleX(${widthRatio})`;
-  }
-
-  /** @private */
-  updateUi_() {
-    const tabs = this.shadowRoot.querySelectorAll('.tab');
-    // Tabs are not rendered yet by dom-repeat. Skip this update since
-    // dom-repeat will fire a dom-change event when it is ready.
-    if (tabs.length === 0) {
-      return;
-    }
-
-    tabs.forEach((tab, i) => {
-      const isSelected = this.selected === i;
-      if (isSelected) {
-        tab.focus();
-      }
-      tab.classList.toggle('selected', isSelected);
-      tab.setAttribute('aria-selected', isSelected);
-      tab.setAttribute('tabindex', isSelected ? 0 : -1);
-    });
-
-    if (this.selected === undefined) {
-      return;
-    }
-
-    this.$.selectionBar.classList.remove('expand', 'contract');
-    const oldValue = this.lastSelected_;
-    this.lastSelected_ = this.selected;
-
-    // If there is no previously selected tab or the tab has not changed,
-    // underline the selected tab instantly.
-    if (oldValue === null || oldValue === this.selected) {
-      // When handling the initial 'dom-change' event, it's possible for the
-      // selected tab to exist and not yet be fully rendered. This will result
-      // in the selection bar not rendering correctly.
-      setTimeout(() => {
-        const {offsetLeft, offsetWidth} = tabs[this.selected];
-        this.updateSelectionBar_(offsetLeft, offsetWidth);
-      });
-      return;
-    }
-
-    // Expand bar to underline the last selected tab, the newly selected tab and
-    // everything in between. After expansion is complete, contract bar to
-    // underline the selected tab.
-    this.$.selectionBar.classList.add('expand');
-    this.$.selectionBar.addEventListener(
-        'transitionend', () => this.onSelectionBarTransitionEnd_(),
-        {once: true});
-
-    const {offsetLeft: newLeft, offsetWidth: newWidth} = tabs[this.selected];
-    const {offsetLeft: oldLeft, offsetWidth: oldWidth} = tabs[oldValue];
-    const left = Math.min(newLeft, oldLeft);
-    const right = Math.max(newLeft + newWidth, oldLeft + oldWidth);
-    this.updateSelectionBar_(left, right - left);
+  updateIndicator_(indicator, originRect, newLeft, newWidth) {
+    const leftDiff = 100 * (newLeft - originRect.left) / originRect.width;
+    const widthRatio = newWidth / originRect.width;
+    const transform = `translateX(${leftDiff}%) scaleX(${widthRatio})`;
+    indicator.style.transform = transform;
   }
 }
 
diff --git a/weblayer/BUILD.gn b/weblayer/BUILD.gn
index 6d9964c..3441291 100644
--- a/weblayer/BUILD.gn
+++ b/weblayer/BUILD.gn
@@ -699,7 +699,6 @@
       "//components/resources:android_resources",
       "//components/safe_browsing/android:remote_database_manager",
       "//components/safe_browsing/android:safe_browsing_api_handler",
-      "//components/safe_browsing/content",
       "//components/safe_browsing/content/browser",
       "//components/safe_browsing/content/browser:client_side_model_loader",
       "//components/safe_browsing/core:client_model_proto",
diff --git a/weblayer/browser/safe_browsing/safe_browsing_blocking_page.h b/weblayer/browser/safe_browsing/safe_browsing_blocking_page.h
index 09b4f89f..035d149 100644
--- a/weblayer/browser/safe_browsing/safe_browsing_blocking_page.h
+++ b/weblayer/browser/safe_browsing/safe_browsing_blocking_page.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "components/safe_browsing/content/base_blocking_page.h"
+#include "components/safe_browsing/content/browser/base_blocking_page.h"
 #include "components/security_interstitials/content/security_interstitial_page.h"
 #include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
 #include "components/security_interstitials/core/unsafe_resource.h"
diff --git a/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc b/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc
index a80c064..9ae9d91b7 100644
--- a/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc
+++ b/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc
@@ -6,7 +6,7 @@
 
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/android/safe_browsing_api_handler.h"
-#include "components/safe_browsing/content/base_blocking_page.h"
+#include "components/safe_browsing/content/browser/base_blocking_page.h"
 #include "components/safe_browsing/core/browser/safe_browsing_token_fetcher.h"
 #include "components/safe_browsing/core/db/v4_protocol_manager_util.h"
 #include "components/security_interstitials/content/security_interstitial_page.h"
diff --git a/weblayer/browser/safe_browsing/safe_browsing_service.h b/weblayer/browser/safe_browsing/safe_browsing_service.h
index 2c006d07..8ace2aaf 100644
--- a/weblayer/browser/safe_browsing/safe_browsing_service.h
+++ b/weblayer/browser/safe_browsing/safe_browsing_service.h
@@ -5,7 +5,7 @@
 #ifndef WEBLAYER_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_
 #define WEBLAYER_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_
 
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
diff --git a/weblayer/browser/safe_browsing/safe_browsing_ui_manager.h b/weblayer/browser/safe_browsing/safe_browsing_ui_manager.h
index f14fc1b..87727a1 100644
--- a/weblayer/browser/safe_browsing/safe_browsing_ui_manager.h
+++ b/weblayer/browser/safe_browsing/safe_browsing_ui_manager.h
@@ -5,7 +5,7 @@
 #ifndef WEBLAYER_BROWSER_SAFE_BROWSING_SAFE_BROWSING_UI_MANAGER_H_
 #define WEBLAYER_BROWSER_SAFE_BROWSING_SAFE_BROWSING_UI_MANAGER_H_
 
-#include "components/safe_browsing/content/base_ui_manager.h"
+#include "components/safe_browsing/content/browser/base_ui_manager.h"
 #include "components/security_interstitials/core/unsafe_resource.h"
 
 namespace content {
diff --git a/weblayer/test/BUILD.gn b/weblayer/test/BUILD.gn
index a926e262..ce19220 100644
--- a/weblayer/test/BUILD.gn
+++ b/weblayer/test/BUILD.gn
@@ -240,7 +240,7 @@
       "//components/page_info",
       "//components/page_info/android",
       "//components/safe_browsing/android:safe_browsing_api_handler",
-      "//components/safe_browsing/content",
+      "//components/safe_browsing/content/browser",
       "//components/safe_browsing/content/browser:client_side_detection",
       "//components/safe_browsing/content/browser:client_side_model_loader",
       "//components/safe_browsing/content/common:interfaces",