diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index 7e85b4f..26c6060 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -657,3 +657,11 @@
 54e115d50c6a0e1ab081225d18ebf818c22545d4
 ac1325bf4f1dac784b2b83c2a20d264bad406adc
 8a0bb051183c9a410b3126112dd3b0bd214c5fe9
+
+# Move partition_alloc into a "partition_alloc" dir
+0bcc023b8cdbc073aa5c48db373810db3f765c87
+
+# Rename {absl => std}::optional
+59ac8227c5dd59754331b3f7f9f85e1a947f1242
+ca067f2604f9bf0ff2fa070eafeed664698d819a
+0b20ccad48bc63b0e6bf07b8511b32b8e3d963b1
diff --git a/DEPS b/DEPS
index 1289524..2e17040 100644
--- a/DEPS
+++ b/DEPS
@@ -306,15 +306,15 @@
   # 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': '5c037eed36a24d282a03bd1f03d2dff74ff69410',
+  'skia_revision': '5f0832787d0fb817d5a94261123448fb52c41e6b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '802e4aead6e7cf7f12b406e2cdb389334f7d3e3d',
+  'v8_revision': 'f5a2f13d0f1ece6975deeec43fd83a937bad0cb1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '9a70fc9046644c2a3b4bb1ea9f0e56fe19473941',
+  'angle_revision': 'ea8238935e4db0ec0d67460d402b1866d3f9ef26',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -397,7 +397,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': 'd52a3791eb93361fa24825670284e7bcfb520403',
+  'devtools_frontend_revision': 'ced63bcacbb1ba3576b352e147174f139f44e102',
   # 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.
@@ -421,7 +421,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': '9ffc1d92cb4b6a599dc8803a9d84f28821c5b27d',
+  'dawn_revision': '571cc4420ff93b2ff9ed49ef2c076191563c87df',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -473,7 +473,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.
-  'libcxxabi_revision':    'e6a7fd81edcf7c3effe2a815a1d7937cbeaacc59',
+  'libcxxabi_revision':    'b90fa05c8949d3634ee48ebe90b1a2bfd56498e5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -821,7 +821,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '3e758b938a904b48f4618173377ce9ad2c6ba408',
+    '116890a11c4b85dd9bf6604fe4a1e690db8d5834',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1202,7 +1202,7 @@
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
       'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'ba5195aeb44e0f6659b10c7463f6f2c355fad2dc',
-      'condition': 'checkout_linux',
+      'condition': 'checkout_linux or checkout_chromeos',
   },
 
   'src/third_party/crossbench':
@@ -1215,13 +1215,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '25b4354fadce5fc7d318e18bef43e6dc8e68e10d',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '9c44fe5fca957f65f36b5a5f2b375c2ad95b83dc',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'beef3c68361522775e89249acd82afb5e576b8c4',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'e526a89d9a3184fa6219961a2dbd310b58a50986',
     'condition': 'checkout_src_internal',
   },
 
@@ -1871,7 +1871,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6e75f19212e3deaebd5bd8542fe10a6fdedc0cdf',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '2561dd307eaedb9baa8c0cde1fec26d627b777cf',
+    Var('webrtc_git') + '/src.git' + '@' + '9fdceb80b5f7c36cdbcd5861c737b40a73b430f6',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -2038,7 +2038,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'Tf7tTFqaVGMj9g4gukXW1U76mI_hVII_fp4C9L2g5c8C',
+        'version': '3-6KvmU_6jq9fdIlQmhaYg8sX4M0OUJPF78PvFKgNDwC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3819,7 +3819,7 @@
 
   'src/chrome/app/theme/google_chrome': {
       'url': Var('chrome_git') + '/chrome/theme/google_chrome.git' + '@' +
-        'b466d65ecc143b93cfb78e0089591c4360c1d0dc',
+        'd66f472d926cf161410d302354f9f26656b38f9e',
       'condition': 'checkout_src_internal',
   },
 
@@ -4028,7 +4028,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'df56fdc8c9370dae4b8e7fc0f07d8c8b5a74d6b5',
+        '816c744389d305f55fb19490d84f6ecfbb0660cb',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/ash/components/arc/arc_features.cc b/ash/components/arc/arc_features.cc
index 59a40c0..6523644 100644
--- a/ash/components/arc/arc_features.cc
+++ b/ash/components/arc/arc_features.cc
@@ -225,6 +225,10 @@
              "ArcPictureInPicture",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kResizeCompat,
+             "ArcResizeCompat",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kRoundedWindowCompat,
              "ArcRoundedWindowCompat",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/ash/components/arc/arc_features.h b/ash/components/arc/arc_features.h
index 3693879..f5f8f8da 100644
--- a/ash/components/arc/arc_features.h
+++ b/ash/components/arc/arc_features.h
@@ -52,6 +52,7 @@
 BASE_DECLARE_FEATURE(kOutOfProcessVideoDecoding);
 BASE_DECLARE_FEATURE(kPerAppLanguage);
 BASE_DECLARE_FEATURE(kPictureInPictureFeature);
+BASE_DECLARE_FEATURE(kResizeCompat);
 BASE_DECLARE_FEATURE(kRoundedWindowCompat);
 extern const char kRoundedWindowCompatStrategy[];
 extern const char kRoundedWindowCompatStrategy_BottomOnlyGesture[];
diff --git a/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge.cc b/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge.cc
index 72e304d..8f1e44ff 100644
--- a/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge.cc
+++ b/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge.cc
@@ -92,6 +92,7 @@
   flags->render_arc_notifications_by_chrome =
       ash::features::IsRenderArcNotificationsByChromeEnabled();
   flags->game_dashboard = ash::features::IsGameDashboardEnabled();
+  flags->resize_compat = base::FeatureList::IsEnabled(arc::kResizeCompat);
 
   chrome_feature_flags_instance->NotifyFeatureFlags(std::move(flags));
 }
diff --git a/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge_unittest.cc b/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge_unittest.cc
index 5d54cfb..6ecbf29 100644
--- a/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge_unittest.cc
+++ b/ash/components/arc/chrome_feature_flags/arc_chrome_feature_flags_bridge_unittest.cc
@@ -180,5 +180,17 @@
   EXPECT_FALSE(instance()->flags_called_value()->game_dashboard);
 }
 
+TEST_F(ArcChromeFeatureFlagsBridgeTest, NotifyResizeCompat_Enabled) {
+  scoped_feature_list()->InitAndEnableFeature(arc::kResizeCompat);
+  Connect();
+  EXPECT_TRUE(instance()->flags_called_value()->resize_compat);
+}
+
+TEST_F(ArcChromeFeatureFlagsBridgeTest, NotifyResizeCompat_Disabled) {
+  scoped_feature_list()->InitAndDisableFeature(arc::kResizeCompat);
+  Connect();
+  EXPECT_FALSE(instance()->flags_called_value()->resize_compat);
+}
+
 }  // namespace
 }  // namespace arc
diff --git a/ash/components/arc/mojom/chrome_feature_flags.mojom b/ash/components/arc/mojom/chrome_feature_flags.mojom
index c483cc5..b3ac530 100644
--- a/ash/components/arc/mojom/chrome_feature_flags.mojom
+++ b/ash/components/arc/mojom/chrome_feature_flags.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Next MinVersion: 8
+// Next MinVersion: 9
 
 module arc.mojom;
 
@@ -37,6 +37,8 @@
   [MinVersion=6] bool render_arc_notifications_by_chrome;
   // ash::features::IsGameDashboardEnabled
   [MinVersion=7] bool game_dashboard;
+  // chrome://flags#arc-resize-compat;
+  [MinVersion=8] bool resize_compat;
 };
 
 // This interface provides methods to propagate the feature flag status to
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb
index ee390da..df99d8cd 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">Kan nie opname begin nie</translation>
 <translation id="8880167521484863515">4 tot 3</translation>
 <translation id="8903921497873541725">Zoem in</translation>
+<translation id="8926890870105777777">Sluit by “<ph name="WIFINAME" />”-netwerk aan</translation>
 <translation id="9045010116236796332">Plaas al die kante van die dokument binne die raam</translation>
 <translation id="9045155556724273246">10 sekondes</translation>
 <translation id="906331135292332864">Verwerk tans prent …</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb
index 2c5ceb74..96aaf58 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">Записването не може да се стартира</translation>
 <translation id="8880167521484863515">4:3</translation>
 <translation id="8903921497873541725">Увеличаване на мащаба</translation>
+<translation id="8926890870105777777">Присъединяване към мрежата „<ph name="WIFINAME" />“</translation>
 <translation id="9045010116236796332">Поставете документа изцяло в рамката</translation>
 <translation id="9045155556724273246">10 секунди</translation>
 <translation id="906331135292332864">Изображението се обработва...</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb
index 15faf22..1046eda 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">No es pot iniciar la gravació</translation>
 <translation id="8880167521484863515">4:3</translation>
 <translation id="8903921497873541725">Amplia</translation>
+<translation id="8926890870105777777">Uneix-te a la xarxa "<ph name="WIFINAME" />"</translation>
 <translation id="9045010116236796332">Col·loca totes les vores del document dins del marc</translation>
 <translation id="9045155556724273246">10 segons</translation>
 <translation id="906331135292332864">S'està processant la imatge...</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb
index 578df999..152db3e 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">Nahrávání se nepodařilo zahájit</translation>
 <translation id="8880167521484863515">4 : 3</translation>
 <translation id="8903921497873541725">Přiblížit</translation>
+<translation id="8926890870105777777">Připojte se k síti <ph name="WIFINAME" /></translation>
 <translation id="9045010116236796332">Umístěte všechny okraje dokumentu do rámečku.</translation>
 <translation id="9045155556724273246">10 sekund</translation>
 <translation id="906331135292332864">Zpracování obrázku…</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb
index 44316d2f..d97374ae 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">Nem sikerült elindítani a felvételt.</translation>
 <translation id="8880167521484863515">4:3</translation>
 <translation id="8903921497873541725">Nagyítás</translation>
+<translation id="8926890870105777777">Csatlakozás a(z) „<ph name="WIFINAME" />” hálózathoz</translation>
 <translation id="9045010116236796332">A dokumentum összes szélének a kereten belül kell lennie</translation>
 <translation id="9045155556724273246">10 másodperc</translation>
 <translation id="906331135292332864">Kép feldolgozása…</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb
index 272dbc54..dd54616 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">Nepavyko pradėti įrašymo</translation>
 <translation id="8880167521484863515">4 ir 3</translation>
 <translation id="8903921497873541725">Artinti</translation>
+<translation id="8926890870105777777">Prisijungti prie tinklo „<ph name="WIFINAME" />“</translation>
 <translation id="9045010116236796332">Visi dokumento kraštai turi būti rėmelyje.</translation>
 <translation id="9045155556724273246">10 sek.</translation>
 <translation id="906331135292332864">Apdorojamas vaizdas...</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb
index 49fcbe5..d7ed16bb 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">Tidak dapat memulakan rakaman</translation>
 <translation id="8880167521484863515">4 nisbah 3</translation>
 <translation id="8903921497873541725">Zum masuk</translation>
+<translation id="8926890870105777777">Sertai Rangkaian "<ph name="WIFINAME" />"</translation>
 <translation id="9045010116236796332">Pastikan keempat-empat sisi dokumen berada dalam bingkai</translation>
 <translation id="9045155556724273246">10 saat</translation>
 <translation id="906331135292332864">Memproses imej...</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
index 9d08db0..baae865 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">Nie udało się rozpocząć nagrywania</translation>
 <translation id="8880167521484863515">4 na 3</translation>
 <translation id="8903921497873541725">Powiększ</translation>
+<translation id="8926890870105777777">Dołącz do sieci „<ph name="WIFINAME" />”</translation>
 <translation id="9045010116236796332">Wszystkie krawędzie dokumentu muszą znaleźć się wewnątrz ramki</translation>
 <translation id="9045155556724273246">10 sekund</translation>
 <translation id="906331135292332864">Przetwarzam obraz...</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
index 4cf747a..1be7d47f 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -163,6 +163,7 @@
 <translation id="8870695351537079478">Imeshindwa kuanza kurekodi</translation>
 <translation id="8880167521484863515">4 kwa 3</translation>
 <translation id="8903921497873541725">Kuza karibu</translation>
+<translation id="8926890870105777777">Jiunge kwenye Mtandao wa "<ph name="WIFINAME" />"</translation>
 <translation id="9045010116236796332">Weka kingo zote za hati ndani ya fremu</translation>
 <translation id="9045155556724273246">Sekunde 10</translation>
 <translation id="906331135292332864">Inachakata picha...</translation>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn b/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn
index fc5af0e..e43f13ec 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn
+++ b/base/allocator/partition_allocator/src/partition_alloc/BUILD.gn
@@ -25,6 +25,79 @@
   ]
 }
 
+# Enable more warnings that were found when using PartitionAlloc in other
+# projects.
+#
+# This list was initially copied from Dawn, who gathered this list from its own
+# dependants.
+config("dependants_extra_warnings") {
+  # Add them only when building PartitionAlloc as part of Chrome, because we
+  # control which clang version we use. Otherwise we risk breaking dependants
+  # when they use a different clang version.
+  #
+  # Fuchsia has been excluded from the extra warnings: Dependency over
+  # fuchsia.kernel involves too many warning. This is not a real issue, because
+  # the header is only used by PartitionAlloc internally. The dependants do not
+  # include it transitively.
+  if (build_with_chromium && is_clang && !is_fuchsia) {
+    cflags = [
+      "-Wc++11-narrowing",
+      "-Wconditional-uninitialized",
+      "-Wcstring-format-directive",
+      "-Wctad-maybe-unsupported",
+      "-Wdeprecated-copy",
+      "-Wdeprecated-copy-dtor",
+      "-Wduplicate-enum",
+      "-Wextra-semi",
+      "-Wextra-semi-stmt",
+      "-Wimplicit-fallthrough",
+      "-Winconsistent-missing-destructor-override",
+      "-Winvalid-offsetof",
+      "-Wmissing-field-initializers",
+      "-Wnon-c-typedef-for-linkage",
+      "-Wpessimizing-move",
+      "-Wrange-loop-analysis",
+      "-Wredundant-move",
+      "-Wshadow-field",
+      "-Wstrict-prototypes",
+      "-Wsuggest-destructor-override",
+      "-Wsuggest-override",
+      "-Wtautological-unsigned-zero-compare",
+      "-Wunreachable-code-aggressive",
+      "-Wunused-but-set-variable",
+      "-Wunused-macros",
+    ]
+
+    # clang-cl doesn't know -pedantic, pass it explicitly to the clang driver
+    if (is_win) {
+      cflags += [ "/clang:-pedantic" ]
+    } else {
+      cflags += [ "-pedantic" ]
+    }
+
+    # TODO(https://crbug.com/1464560) Get rid of those warning exceptions.
+    # This is blocking using PartitionAlloc in Dawn. Most fixes have been
+    # prototyped in:
+    # https://chromium-review.googlesource.com/c/chromium/src/+/5057762
+    cflags -= [
+      "-Wextra-semi-stmt",
+      "-Wmissing-field-initializers",
+      "-Wunused-macros",
+    ]
+    cflags += [
+      # Those are compiler extension banned by -pedantic.
+      "-Wno-import-preprocessor-directive-pedantic",
+      "-Wno-embedded-directive",
+      "-Wno-gnu-statement-expression-from-macro-expansion",
+      "-Wno-gnu-zero-variadic-macro-arguments",
+      "-Wno-invalid-offsetof",
+      "-Wno-language-extension-token",
+      "-Wno-nested-anon-types",
+      "-Wno-zero-length-array",
+    ]
+  }
+}
+
 _remove_configs = []
 _add_configs = []
 if (!is_debug || partition_alloc_optimized_debug) {
@@ -81,6 +154,7 @@
 
   configs -= _remove_configs
   configs += _add_configs
+  configs += [ ":dependants_extra_warnings" ]
 }
 
 # Changes the freelist implementation to use pointer offsets in lieu
@@ -517,6 +591,7 @@
 
     configs -= _remove_configs
     configs += _add_configs
+    configs += [ ":dependants_extra_warnings" ]
 
     # We want to be able to test pkey mode without access to the default pkey.
     # This is incompatible with stack protectors since the TLS won't be pkey-tagged.
@@ -715,6 +790,7 @@
 
     configs -= _remove_configs
     configs += _add_configs
+    configs += [ ":dependants_extra_warnings" ]
   }
 
   component("allocator_shim") {
@@ -732,6 +808,7 @@
 
     configs -= _remove_configs
     configs += _add_configs
+    configs += [ ":dependants_extra_warnings" ]
 
     shim_headers = []
     shim_sources = []
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc b/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc
index f05060f3..35b686d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc
@@ -287,6 +287,13 @@
   internal::SetSystemPagesAccessInternal(address, length, accessibility);
 }
 
+void SetSystemPagesAccess(void* address,
+                          size_t length,
+                          PageAccessibilityConfiguration accessibility) {
+  SetSystemPagesAccess(reinterpret_cast<uintptr_t>(address), length,
+                       accessibility);
+}
+
 void DecommitSystemPages(
     uintptr_t address,
     size_t length,
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_page.h b/base/allocator/partition_allocator/src/partition_alloc/partition_page.h
index 4a77782..0536081 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_page.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_page.h
@@ -915,8 +915,8 @@
       Page::FromAddr(SuperPagePayloadBegin(super_page, with_quarantine));
   auto* const last_page =
       Page::FromAddr(SuperPagePayloadEnd(super_page) - PartitionPageSize());
-  Page* page;
-  SlotSpan* slot_span;
+  Page* page = nullptr;
+  SlotSpan* slot_span = nullptr;
   for (page = first_page; page <= last_page;) {
     PA_DCHECK(!page->slot_span_metadata_offset);  // Ensure slot span beginning.
     if (!page->is_valid) {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
index ed7c7000..422fdf4f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
@@ -1318,7 +1318,7 @@
   // statistics (and cookie, if present).
   if (slot_span->CanStoreRawSize()) {
 #if BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT) && BUILDFLAG(PA_DCHECK_IS_ON)
-    internal::PartitionRefCount* old_ref_count;
+    internal::PartitionRefCount* old_ref_count = nullptr;
     if (brp_enabled()) {
       old_ref_count = internal::PartitionRefCountPointer(slot_start);
     }
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc
index 55491f7..6b83265 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc
@@ -7,6 +7,7 @@
 #if BUILDFLAG(ENABLE_THREAD_ISOLATION)
 
 #include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/page_allocator.h"
 #include "partition_alloc/partition_alloc_check.h"
 #include "partition_alloc/partition_alloc_constants.h"
 #include "partition_alloc/reservation_offset_table.h"
@@ -23,9 +24,19 @@
 
 void WriteProtectThreadIsolatedMemory(ThreadIsolationOption thread_isolation,
                                       void* address,
-                                      size_t size) {
+                                      size_t size,
+                                      bool read_only = false) {
   PA_DCHECK((reinterpret_cast<uintptr_t>(address) &
              PA_THREAD_ISOLATED_ALIGN_OFFSET_MASK) == 0);
+  if (read_only) {
+    SetSystemPagesAccess(
+        address, size,
+        PageAccessibilityConfiguration(
+            thread_isolation.enabled
+                ? PageAccessibilityConfiguration::Permissions::kRead
+                : PageAccessibilityConfiguration::Permissions::kReadWrite));
+    return;
+  }
 #if BUILDFLAG(ENABLE_PKEYS)
   partition_alloc::internal::TagMemoryWithPkey(
       thread_isolation.enabled ? thread_isolation.pkey : kDefaultPkey, address,
@@ -38,9 +49,10 @@
 template <typename T>
 void WriteProtectThreadIsolatedVariable(ThreadIsolationOption thread_isolation,
                                         T& var,
-                                        size_t offset = 0) {
+                                        size_t offset = 0,
+                                        bool read_only = false) {
   WriteProtectThreadIsolatedMemory(thread_isolation, (char*)&var + offset,
-                                   sizeof(T) - offset);
+                                   sizeof(T) - offset, read_only);
 }
 
 int MprotectWithThreadIsolation(void* addr,
@@ -54,7 +66,7 @@
 
 void WriteProtectThreadIsolatedGlobals(ThreadIsolationOption thread_isolation) {
   WriteProtectThreadIsolatedVariable(thread_isolation,
-                                     PartitionAddressSpace::setup_);
+                                     PartitionAddressSpace::setup_, 0, true);
 
   AddressPoolManager::Pool* pool =
       AddressPoolManager::GetInstance().GetPool(kThreadIsolatedPoolHandle);
diff --git a/base/containers/lru_cache.h b/base/containers/lru_cache.h
index efe58c9e..243a86c4 100644
--- a/base/containers/lru_cache.h
+++ b/base/containers/lru_cache.h
@@ -222,7 +222,8 @@
       const LruCacheType&);
 
   ValueList ordering_;
-  KeyIndex index_;
+  // TODO(crbug.com/1472363): Remove annotation once crbug.com/1472363 is fixed.
+  __attribute__((annotate("blink_gc_plugin_ignore"))) KeyIndex index_;
 
   size_type max_size_;
 };
diff --git a/build/install-build-deps.py b/build/install-build-deps.py
index 29eb63cf..e534017 100755
--- a/build/install-build-deps.py
+++ b/build/install-build-deps.py
@@ -875,7 +875,7 @@
 def install_locales():
   print("Installing locales.", file=sys.stderr)
   CHROMIUM_LOCALES = [
-      "da_DK.UTF-8", "en_US.UTF8", "fr_FR.UTF-8", "he_IL.UTF-8", "zh_TW.UTF-8"
+      "da_DK.UTF-8", "en_US.UTF-8", "fr_FR.UTF-8", "he_IL.UTF-8", "zh_TW.UTF-8"
   ]
   LOCALE_GEN = "/etc/locale.gen"
   if os.path.exists(LOCALE_GEN):
diff --git a/cc/raster/one_copy_raster_buffer_provider.cc b/cc/raster/one_copy_raster_buffer_provider.cc
index bdf880c7..1408013 100644
--- a/cc/raster/one_copy_raster_buffer_provider.cc
+++ b/cc/raster/one_copy_raster_buffer_provider.cc
@@ -372,8 +372,7 @@
       }
     }
 
-    mapping =
-        sii->MapSharedImage(staging_buffer->client_shared_image->mailbox());
+    mapping = sii->MapSharedImage(staging_buffer->client_shared_image);
     if (!mapping) {
       LOG(ERROR) << "MapSharedImage Failed.";
       return false;
diff --git a/cc/raster/zero_copy_raster_buffer_provider.cc b/cc/raster/zero_copy_raster_buffer_provider.cc
index 7b832cb..845397f 100644
--- a/cc/raster/zero_copy_raster_buffer_provider.cc
+++ b/cc/raster/zero_copy_raster_buffer_provider.cc
@@ -62,8 +62,7 @@
       if (!shared_image) {
         return;
       }
-      auto mapping =
-          shared_image_interface->MapSharedImage(shared_image->mailbox());
+      auto mapping = shared_image_interface->MapSharedImage(shared_image);
       if (!mapping) {
         return;
       }
@@ -182,7 +181,7 @@
         }
       }
 
-      mapping = sii->MapSharedImage(backing_->shared_image->mailbox());
+      mapping = sii->MapSharedImage(backing_->shared_image);
       if (!mapping) {
         LOG(ERROR) << "MapSharedImage Failed.";
         sii->DestroySharedImage(gpu::SyncToken(),
diff --git a/chrome/VERSION b/chrome/VERSION
index 0924428..efe00be 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=121
 MINOR=0
-BUILD=6152
+BUILD=6153
 PATCH=0
diff --git a/chrome/android/features/keyboard_accessory/BUILD.gn b/chrome/android/features/keyboard_accessory/BUILD.gn
index 1472813..fd621e1 100644
--- a/chrome/android/features/keyboard_accessory/BUILD.gn
+++ b/chrome/android/features/keyboard_accessory/BUILD.gn
@@ -63,7 +63,6 @@
     "javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetViewTest.java",
     "javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java",
     "javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryTestHelper.java",
-    "javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java",
     "javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetRenderTest.java",
     "javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewTest.java",
     "javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java",
diff --git a/chrome/android/features/keyboard_accessory/internal/BUILD.gn b/chrome/android/features/keyboard_accessory/internal/BUILD.gn
index d68a4914..042ecb49 100644
--- a/chrome/android/features/keyboard_accessory/internal/BUILD.gn
+++ b/chrome/android/features/keyboard_accessory/internal/BUILD.gn
@@ -89,7 +89,6 @@
     "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java",
     "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java",
     "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryView.java",
-    "java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java",
     "java/src/org/chromium/chrome/browser/keyboard_accessory/data/CachedProviderAdapter.java",
     "java/src/org/chromium/chrome/browser/keyboard_accessory/data/ConditionalProviderAdapter.java",
     "java/src/org/chromium/chrome/browser/keyboard_accessory/helper/FaviconHelper.java",
@@ -135,17 +134,14 @@
 
 android_resources("java_resources") {
   sources = [
-    "java/res/drawable/autofill_chip_inset.xml",
     "java/res/drawable/ic_vpn_key_off.xml",
     "java/res/layout/accessory_sheet_header.xml",
     "java/res/layout/address_accessory_sheet.xml",
     "java/res/layout/all_passwords_bottom_sheet.xml",
     "java/res/layout/credit_card_accessory_sheet.xml",
     "java/res/layout/keyboard_accessory.xml",
-    "java/res/layout/keyboard_accessory_action.xml",
     "java/res/layout/keyboard_accessory_action_modern.xml",
     "java/res/layout/keyboard_accessory_buttons.xml",
-    "java/res/layout/keyboard_accessory_chip.xml",
     "java/res/layout/keyboard_accessory_modern.xml",
     "java/res/layout/keyboard_accessory_sheet.xml",
     "java/res/layout/keyboard_accessory_sheet_tab_address_info.xml",
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml b/chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml
deleted file mode 100644
index 2cd5426..0000000
--- a/chrome/android/features/keyboard_accessory/internal/java/res/drawable/autofill_chip_inset.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2015 The Chromium Authors
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
--->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item>
-        <shape>
-            <solid android:color="@macro/default_bg_color" />
-            <corners android:radius="@dimen/keyboard_accessory_bar_item_height" />
-        </shape>
-    </item>
-</layer-list>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_action.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_action.xml
deleted file mode 100644
index daf8783..0000000
--- a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_action.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2018 The Chromium Authors
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
--->
-
-<org.chromium.ui.widget.ButtonCompat
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:gravity="center"
-    android:layout_height="wrap_content"
-    android:layout_width="wrap_content"
-    android:paddingEnd="@dimen/keyboard_accessory_suggestion_padding"
-    android:paddingStart="@dimen/keyboard_accessory_suggestion_padding"
-    android:textAlignment="center"
-    style="@style/FilledButton.Flat" />
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_chip.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_chip.xml
deleted file mode 100644
index ee5416b..0000000
--- a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_chip.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2018 The Chromium Authors
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
--->
-
-<!-- TODO(fhorschig): android:elevation has no effect pre-Lollipop. Possibly, using a CardView or
-     holo drawables could create compatibility - if this becomes the final design.-->
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:gravity="center"
-    android:layout_height="@dimen/keyboard_accessory_bar_item_height"
-    android:layout_width="wrap_content"
-    android:minHeight="0dp"
-    android:minWidth="0dp"
-    android:paddingBottom="0dp"
-    android:paddingEnd="@dimen/keyboard_accessory_horizontal_padding"
-    android:paddingStart="@dimen/keyboard_accessory_horizontal_padding"
-    android:paddingTop="0dp"
-    android:layout_marginBottom="@dimen/keyboard_accessory_chip_vertical_margin"
-    android:layout_marginTop="@dimen/keyboard_accessory_chip_vertical_margin"
-    android:elevation="2dp"
-    android:textAppearance="@style/TextAppearance.TextMediumThick.Primary"
-    android:background="@drawable/autofill_chip_inset"/>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/values/dimens.xml b/chrome/android/features/keyboard_accessory/internal/java/res/values/dimens.xml
index 3b72526..2f500956 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/res/values/dimens.xml
+++ b/chrome/android/features/keyboard_accessory/internal/java/res/values/dimens.xml
@@ -7,14 +7,12 @@
 
 <resources xmlns:tools="http://schemas.android.com/tools">
     <!-- Autofill keyboard accessory dimensions -->
-    <dimen name="keyboard_accessory_bar_item_height">36dp</dimen>
     <dimen name="keyboard_accessory_bar_item_padding">8dp</dimen>
     <dimen name="keyboard_accessory_horizontal_padding">6dp</dimen>
     <dimen name="keyboard_accessory_height">48dp</dimen>
     <!--dimen name="keyboard_accessory_height_with_shadow">56dp</dimen-->
     <dimen name="keyboard_accessory_image_top_padding">12dp</dimen>
     <dimen name="keyboard_accessory_shadow">5dp</dimen>
-    <dimen name="keyboard_accessory_chip_vertical_margin">8dp</dimen>
     <!--dimen name="keyboard_accessory_sheet_height">330dp</dimen-->
     <dimen name="keyboard_accessory_sheet_divider_margin">24dp</dimen>
     <dimen name="keyboard_accessory_sheet_footer_trailing_margin">64dp</dimen>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java
index 8c8b325b..e9ef4bc 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java
@@ -747,8 +747,12 @@
 
         int minimumVerticalSpacePx = Math.round(density * MINIMAL_AVAILABLE_VERTICAL_SPACE);
 
-        if (visibleViewportHeightPx >= minimumVerticalSpacePx)
+        // TODO(crbug.com/1491626): google-java-format did not introduce '{}'s as expected in the if
+        // construct below (see crbug.com/1505284 for failure). Investigate why and fix it or file a
+        // corresponding bug.
+        if (visibleViewportHeightPx >= minimumVerticalSpacePx) {
             return; // Sheet height needs no adjustment!
+        }
 
         // Adjust the height such that the new visible height will be exactly
         // MINIMAL_AVAILABLE_VERTICAL_SPACE.
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
index 6e8e6a3..f9162fd 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
@@ -16,8 +16,8 @@
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.keyboard_accessory.R;
+import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryModernViewBinder.BarItemViewHolder;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryViewBinder.BarItemViewHolder;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
 import org.chromium.chrome.browser.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
@@ -29,9 +29,7 @@
 import org.chromium.ui.ViewProvider;
 import org.chromium.ui.modelutil.LazyConstructionPropertyMcp;
 import org.chromium.ui.modelutil.ListModel;
-import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
-import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 import org.chromium.ui.modelutil.RecyclerViewAdapter;
 
 /**
@@ -42,9 +40,6 @@
 public class KeyboardAccessoryCoordinator {
     private final KeyboardAccessoryMediator mMediator;
     private final KeyboardAccessoryTabLayoutCoordinator mTabLayout;
-    private final PropertyModelChangeProcessor.ViewBinder<
-                    PropertyModel, KeyboardAccessoryView, PropertyKey>
-            mViewBinder;
     private final PropertyModel mModel;
     private KeyboardAccessoryView mView;
 
@@ -154,11 +149,8 @@
         viewProvider.whenLoaded(view -> mView = view);
 
         mTabLayout.setTabObserver(mMediator);
-        mViewBinder =
-                ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)
-                        ? KeyboardAccessoryModernViewBinder::bind
-                        : KeyboardAccessoryViewBinder::bind;
-        LazyConstructionPropertyMcp.create(mModel, VISIBLE, viewProvider, mViewBinder);
+        LazyConstructionPropertyMcp.create(
+                mModel, VISIBLE, viewProvider, KeyboardAccessoryModernViewBinder::bind);
         KeyboardAccessoryMetricsRecorder.registerKeyboardAccessoryModelMetricsObserver(mModel);
     }
 
@@ -170,18 +162,13 @@
      */
     static RecyclerViewAdapter<BarItemViewHolder, Void> createBarItemsAdapter(
             ListModel<BarItem> barItems) {
-        RecyclerViewAdapter.ViewHolderFactory<BarItemViewHolder> factory =
-                KeyboardAccessoryViewBinder::create;
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)) {
-            factory = KeyboardAccessoryModernViewBinder::create;
-        }
         return new RecyclerViewAdapter<>(
                 new KeyboardAccessoryRecyclerViewMcp<>(
                         barItems,
                         BarItem::getViewType,
                         BarItemViewHolder::bind,
                         BarItemViewHolder::recycle),
-                factory);
+                KeyboardAccessoryModernViewBinder::create);
     }
 
     public void closeActiveTab() {
@@ -249,7 +236,9 @@
         mMediator.skipClosingAnimationOnce();
         // TODO(fhorschig): Consider allow LazyConstructionPropertyMcp to propagate updates once the
         // view exists. Currently it doesn't, so we need this ugly explicit binding.
-        if (mView != null) mViewBinder.bind(mModel, mView, SKIP_CLOSING_ANIMATION);
+        if (mView != null) {
+            KeyboardAccessoryModernViewBinder.bind(mModel, mView, SKIP_CLOSING_ANIMATION);
+        }
     }
 
     /**
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
index c6fd207..7e0ca01 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
@@ -7,12 +7,24 @@
 import static org.chromium.chrome.browser.autofill.AutofillUiUtils.getCardIcon;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryIPHUtils.hasShownAnyAutofillIphBefore;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryIPHUtils.showHelpBubble;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.ANIMATION_LISTENER;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BOTTOM_OFFSET_PX;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.DISABLE_ANIMATIONS_FOR_TESTING;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.HAS_SUGGESTIONS;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.OBFUSCATED_CHILD_AT_CALLBACK;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_OPENER_ITEM;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_SWIPING_IPH;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SKIP_CLOSING_ANIMATION;
+import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.LayoutRes;
+import androidx.recyclerview.widget.RecyclerView;
 
 import org.chromium.base.TraceEvent;
 import org.chromium.chrome.browser.autofill.AutofillUiUtils;
@@ -21,7 +33,6 @@
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SheetOpenerBarItem;
-import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryViewBinder.BarItemViewHolder;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
 import org.chromium.components.autofill.AutofillSuggestion;
@@ -33,8 +44,8 @@
 import org.chromium.ui.widget.RectProvider;
 
 /**
- * Observes {@link KeyboardAccessoryProperties} changes (like a newly available tab) and triggers
- * the {@link KeyboardAccessoryViewBinder} which will modify the view accordingly.
+ * Observes {@link KeyboardAccessoryProperties} changes (like a newly available tab) and modifies
+ * the view accordingly.
  */
 class KeyboardAccessoryModernViewBinder {
     static BarItemViewHolder create(ViewGroup parent, @BarItem.Type int viewType) {
@@ -44,12 +55,37 @@
             case BarItem.Type.TAB_LAYOUT:
                 return new SheetOpenerViewHolder(parent);
             case BarItem.Type.ACTION_BUTTON:
-                return new KeyboardAccessoryViewBinder.BarItemTextViewHolder(
-                        parent, R.layout.keyboard_accessory_action_modern);
+                return new BarItemTextViewHolder(parent, R.layout.keyboard_accessory_action_modern);
             case BarItem.Type.ACTION_CHIP:
                 return new BarItemActionChipViewHolder(parent);
         }
-        return KeyboardAccessoryViewBinder.create(parent, viewType);
+        assert false : "Action type " + viewType + " was not handled!";
+        return null;
+    }
+
+    abstract static class BarItemViewHolder<T extends BarItem, V extends View>
+            extends RecyclerView.ViewHolder {
+        BarItemViewHolder(ViewGroup parent, @LayoutRes int layout) {
+            super(LayoutInflater.from(parent.getContext()).inflate(layout, parent, false));
+        }
+
+        @SuppressWarnings("unchecked")
+        void bind(BarItem barItem) {
+            bind((T) barItem, (V) itemView);
+        }
+
+        /**
+         * Called when the ViewHolder is bound.
+         *
+         * @param item The {@link BarItem} that this ViewHolder represents.
+         * @param view The {@link View} that this ViewHolder binds the bar item to.
+         */
+        protected abstract void bind(T item, V view);
+
+        /**
+         * The opposite of {@link #bind}. Use this to free expensive resources or reset observers.
+         */
+        protected void recycle() {}
     }
 
     static class BarItemChipViewHolder extends BarItemViewHolder<AutofillBarItem, ChipView> {
@@ -153,6 +189,20 @@
         }
     }
 
+    static class BarItemTextViewHolder extends BarItemViewHolder<BarItem, TextView> {
+        BarItemTextViewHolder(ViewGroup parent, @LayoutRes int layout) {
+            super(parent, layout);
+        }
+
+        @Override
+        public void bind(BarItem barItem, TextView textView) {
+            KeyboardAccessoryData.Action action = barItem.getAction();
+            assert action != null : "Tried to bind item without action. Chose a wrong ViewHolder?";
+            textView.setText(barItem.getCaptionId());
+            textView.setOnClickListener(view -> action.getCallback().onResult(action));
+        }
+    }
+
     static class BarItemActionChipViewHolder extends BarItemViewHolder<BarItem, ChipView> {
         BarItemActionChipViewHolder(ViewGroup parent) {
             super(parent, R.layout.keyboard_accessory_suggestion);
@@ -187,11 +237,31 @@
         }
     }
 
+    /**
+     * Tries to bind the given property to the given view by using the value in the given model.
+     *
+     * @param model A {@link PropertyModel}.
+     * @param view A {@link KeyboardAccessoryView}.
+     * @param propertyKey A {@link PropertyKey}.
+     */
     static void bind(PropertyModel model, KeyboardAccessoryView view, PropertyKey propertyKey) {
         assert view instanceof KeyboardAccessoryModernView;
         KeyboardAccessoryModernView modernView = (KeyboardAccessoryModernView) view;
-        boolean wasBound = KeyboardAccessoryViewBinder.bindInternal(model, modernView, propertyKey);
-        if (propertyKey == OBFUSCATED_CHILD_AT_CALLBACK) {
+        if (propertyKey == BAR_ITEMS) {
+            view.setBarItemsAdapter(
+                    KeyboardAccessoryCoordinator.createBarItemsAdapter(model.get(BAR_ITEMS)));
+        } else if (propertyKey == DISABLE_ANIMATIONS_FOR_TESTING) {
+            if (model.get(DISABLE_ANIMATIONS_FOR_TESTING)) view.disableAnimationsForTesting();
+        } else if (propertyKey == VISIBLE) {
+            view.setVisible(model.get(VISIBLE));
+        } else if (propertyKey == SKIP_CLOSING_ANIMATION) {
+            view.setSkipClosingAnimation(model.get(SKIP_CLOSING_ANIMATION));
+            if (!model.get(VISIBLE)) view.setVisible(false); // Update to cancel any animation.
+        } else if (propertyKey == BOTTOM_OFFSET_PX) {
+            view.setBottomOffset(model.get(BOTTOM_OFFSET_PX));
+        } else if (propertyKey == ANIMATION_LISTENER) {
+            view.setAnimationListener(model.get(ANIMATION_LISTENER));
+        } else if (propertyKey == OBFUSCATED_CHILD_AT_CALLBACK) {
             modernView.setObfuscatedLastChildAt(model.get(OBFUSCATED_CHILD_AT_CALLBACK));
         } else if (propertyKey == SHOW_SWIPING_IPH) {
             RectProvider swipingIphRectProvider = modernView.getSwipingIphRect();
@@ -206,8 +276,10 @@
             }
         } else if (propertyKey == HAS_SUGGESTIONS) {
             modernView.setAccessibilityMessage(model.get(HAS_SUGGESTIONS));
+        } else if (propertyKey == SHEET_OPENER_ITEM) {
+            // No binding required.
         } else {
-            assert wasBound : "Every possible property update needs to be handled!";
+            assert false : "Every possible property update needs to be handled!";
         }
     }
 
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
deleted file mode 100644
index fbe6571..0000000
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.keyboard_accessory.bar_component;
-
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.ANIMATION_LISTENER;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BOTTOM_OFFSET_PX;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.DISABLE_ANIMATIONS_FOR_TESTING;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.HAS_SUGGESTIONS;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.OBFUSCATED_CHILD_AT_CALLBACK;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_OPENER_ITEM;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_SWIPING_IPH;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SKIP_CLOSING_ANIMATION;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
-
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import androidx.annotation.LayoutRes;
-import androidx.recyclerview.widget.RecyclerView;
-
-import org.chromium.chrome.browser.keyboard_accessory.R;
-import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.ui.modelutil.PropertyKey;
-import org.chromium.ui.modelutil.PropertyModel;
-
-/**
- * Observes {@link KeyboardAccessoryProperties} changes (like a newly available tab) and triggers
- * the {@link KeyboardAccessoryViewBinder} which will modify the view accordingly.
- */
-class KeyboardAccessoryViewBinder {
-    static BarItemViewHolder create(ViewGroup parent, @BarItem.Type int viewType) {
-        switch (viewType) {
-            case BarItem.Type.ACTION_BUTTON:
-            case BarItem.Type.ACTION_CHIP:
-                return new BarItemTextViewHolder(parent, R.layout.keyboard_accessory_action);
-            case BarItem.Type.SUGGESTION:
-                return new BarItemTextViewHolder(parent, R.layout.keyboard_accessory_chip);
-            case BarItem.Type.TAB_LAYOUT: // Intentional fallthrough. Not supported.
-                assert false : "Type " + viewType + " is not a valid accessory bar action!";
-        }
-        assert false : "Action type " + viewType + " was not handled!";
-        return null;
-    }
-
-    abstract static class BarItemViewHolder<T extends BarItem, V extends View>
-            extends RecyclerView.ViewHolder {
-        BarItemViewHolder(ViewGroup parent, @LayoutRes int layout) {
-            super(LayoutInflater.from(parent.getContext()).inflate(layout, parent, false));
-        }
-
-        @SuppressWarnings("unchecked")
-        void bind(BarItem barItem) {
-            bind((T) barItem, (V) itemView);
-        }
-
-        /**
-         * Called when the ViewHolder is bound.
-         * @param item The {@link BarItem} that this ViewHolder represents.
-         * @param view The {@link View} that this ViewHolder binds the bar item to.
-         */
-        protected abstract void bind(T item, V view);
-
-        /**
-         * The opposite of {@link #bind}. Use this to free expensive resources or reset observers.
-         */
-        protected void recycle() {}
-    }
-
-    static class BarItemTextViewHolder extends BarItemViewHolder<BarItem, TextView> {
-        BarItemTextViewHolder(ViewGroup parent, @LayoutRes int layout) {
-            super(parent, layout);
-        }
-
-        @Override
-        public void bind(BarItem barItem, TextView textView) {
-            KeyboardAccessoryData.Action action = barItem.getAction();
-            assert action != null : "Tried to bind item without action. Chose a wrong ViewHolder?";
-            textView.setText(barItem.getCaptionId());
-            textView.setOnClickListener(view -> action.getCallback().onResult(action));
-        }
-    }
-
-    static void bind(PropertyModel model, KeyboardAccessoryView view, PropertyKey propertyKey) {
-        boolean wasBound = bindInternal(model, view, propertyKey);
-        assert wasBound : "Every possible property update needs to be handled!";
-    }
-
-    /**
-     * Tries to bind the given property to the given view by using the value in the given model.
-     * @param model       A {@link PropertyModel}.
-     * @param view        A {@link KeyboardAccessoryView}.
-     * @param propertyKey A {@link PropertyKey}.
-     * @return True if the given propertyKey was bound to the given view.
-     */
-    protected static boolean bindInternal(
-            PropertyModel model, KeyboardAccessoryView view, PropertyKey propertyKey) {
-        if (propertyKey == BAR_ITEMS) {
-            view.setBarItemsAdapter(
-                    KeyboardAccessoryCoordinator.createBarItemsAdapter(model.get(BAR_ITEMS)));
-        } else if (propertyKey == DISABLE_ANIMATIONS_FOR_TESTING) {
-            if (model.get(DISABLE_ANIMATIONS_FOR_TESTING)) view.disableAnimationsForTesting();
-        } else if (propertyKey == VISIBLE) {
-            view.setVisible(model.get(VISIBLE));
-        } else if (propertyKey == SKIP_CLOSING_ANIMATION) {
-            view.setSkipClosingAnimation(model.get(SKIP_CLOSING_ANIMATION));
-            if (!model.get(VISIBLE)) view.setVisible(false); // Update to cancel any animation.
-        } else if (propertyKey == BOTTOM_OFFSET_PX) {
-            view.setBottomOffset(model.get(BOTTOM_OFFSET_PX));
-        } else if (propertyKey == ANIMATION_LISTENER) {
-            view.setAnimationListener(model.get(ANIMATION_LISTENER));
-        } else if (propertyKey == SHEET_OPENER_ITEM
-                || propertyKey == OBFUSCATED_CHILD_AT_CALLBACK
-                || propertyKey == SHOW_SWIPING_IPH
-                || propertyKey == HAS_SUGGESTIONS) {
-            // No binding required.
-        } else {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
index 6f23c335..2e95d074 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewTest.java
@@ -7,8 +7,10 @@
 import static androidx.test.espresso.Espresso.onView;
 import static androidx.test.espresso.action.ViewActions.click;
 import static androidx.test.espresso.action.ViewActions.longClick;
+import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
 import static androidx.test.espresso.assertion.ViewAssertions.matches;
 import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
 import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
 import static androidx.test.espresso.matcher.ViewMatchers.isSelected;
 import static androidx.test.espresso.matcher.ViewMatchers.withChild;
@@ -25,12 +27,17 @@
 import static org.mockito.Mockito.when;
 
 import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.AUTOFILL_SUGGESTION;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.CREDMAN_CONDITIONAL_UI_REENTRY;
+import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.DISABLE_ANIMATIONS_FOR_TESTING;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.OBFUSCATED_CHILD_AT_CALLBACK;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_OPENER_ITEM;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHOW_SWIPING_IPH;
 import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
+import static org.chromium.ui.test.util.ViewUtils.VIEW_GONE;
+import static org.chromium.ui.test.util.ViewUtils.VIEW_INVISIBLE;
+import static org.chromium.ui.test.util.ViewUtils.VIEW_NULL;
 import static org.chromium.ui.test.util.ViewUtils.onViewWaiting;
 
 import android.content.pm.ActivityInfo;
@@ -68,7 +75,6 @@
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
 import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SheetOpenerBarItem;
-import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
 import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryButtonGroupView;
 import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
@@ -312,6 +318,74 @@
 
     @Test
     @MediumTest
+    public void testCanAddSingleButtons() {
+        BarItem generatePasswordItem =
+                new BarItem(
+                        BarItem.Type.ACTION_BUTTON,
+                        new Action(GENERATE_PASSWORD_AUTOMATIC, unused -> {}),
+                        R.string.password_generation_accessory_button);
+        BarItem credmanItem =
+                new BarItem(
+                        BarItem.Type.ACTION_CHIP,
+                        new Action(CREDMAN_CONDITIONAL_UI_REENTRY, unused -> {}),
+                        R.string.more_passkeys);
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    mModel.set(VISIBLE, true);
+                    mModel.get(BAR_ITEMS)
+                            .set(
+                                    new BarItem[] {
+                                        generatePasswordItem, credmanItem, createSheetOpener()
+                                    });
+                });
+
+        onViewWaiting(withText(R.string.password_generation_accessory_button));
+        onViewWaiting(withText(R.string.more_passkeys));
+        onView(withText(R.string.password_generation_accessory_button))
+                .check(matches(isDisplayed()));
+        onView(withText(R.string.more_passkeys)).check(matches(isDisplayed()));
+    }
+
+    @Test
+    @MediumTest
+    public void testCanRemoveSingleButtons() {
+        BarItem generatePasswordsItem =
+                new BarItem(
+                        BarItem.Type.ACTION_BUTTON,
+                        new Action(GENERATE_PASSWORD_AUTOMATIC, unused -> {}),
+                        R.string.password_generation_accessory_button);
+        BarItem credmanItem =
+                new BarItem(
+                        BarItem.Type.ACTION_CHIP,
+                        new Action(CREDMAN_CONDITIONAL_UI_REENTRY, unused -> {}),
+                        R.string.more_passkeys);
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    mModel.set(VISIBLE, true);
+                    mModel.get(BAR_ITEMS)
+                            .set(
+                                    new BarItem[] {
+                                        generatePasswordsItem, credmanItem, createSheetOpener()
+                                    });
+                });
+
+        onViewWaiting(withText(R.string.password_generation_accessory_button));
+        onView(withText(R.string.password_generation_accessory_button))
+                .check(matches(isDisplayed()));
+        onView(withText(R.string.more_passkeys)).check(matches(isDisplayed()));
+
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> mModel.get(BAR_ITEMS).remove(mModel.get(BAR_ITEMS).get(1)));
+
+        ViewUtils.waitForViewCheckingState(
+                withText(R.string.more_passkeys), VIEW_INVISIBLE | VIEW_GONE | VIEW_NULL);
+        onView(withText(R.string.password_generation_accessory_button))
+                .check(matches(isDisplayed()));
+        onView(withText(R.string.more_passkeys)).check(doesNotExist());
+    }
+
+    @Test
+    @MediumTest
     public void testUpdatesKeyPaddingAfterRotation() throws InterruptedException {
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> {
@@ -346,7 +420,7 @@
                                 .setPopupItemId(PopupItemId.PASSWORD_ENTRY)
                                 .setFeatureForIPH("")
                                 .build(),
-                        new KeyboardAccessoryData.Action(AUTOFILL_SUGGESTION, unused -> {}));
+                        new Action(AUTOFILL_SUGGESTION, unused -> {}));
         itemWithIPH.setFeatureForIPH(FeatureConstants.KEYBOARD_ACCESSORY_PASSWORD_FILLING_FEATURE);
 
         TestTracker tracker = new TestTracker();
@@ -382,7 +456,7 @@
                                 .setPopupItemId(PopupItemId.ADDRESS_ENTRY)
                                 .setFeatureForIPH("")
                                 .build(),
-                        new KeyboardAccessoryData.Action(AUTOFILL_SUGGESTION, unused -> {}));
+                        new Action(AUTOFILL_SUGGESTION, unused -> {}));
         itemWithIPH.setFeatureForIPH(FeatureConstants.KEYBOARD_ACCESSORY_ADDRESS_FILL_FEATURE);
 
         TestTracker tracker = new TestTracker();
@@ -416,7 +490,7 @@
                                 .setPopupItemId(PopupItemId.CREDIT_CARD_ENTRY)
                                 .setFeatureForIPH("")
                                 .build(),
-                        new KeyboardAccessoryData.Action(AUTOFILL_SUGGESTION, unused -> {}));
+                        new Action(AUTOFILL_SUGGESTION, unused -> {}));
         itemWithIPH.setFeatureForIPH(FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_FILLING_FEATURE);
 
         TestTracker tracker = new TestTracker();
@@ -487,7 +561,7 @@
                                 .setPopupItemId(PopupItemId.CREDIT_CARD_ENTRY)
                                 .setFeatureForIPH("")
                                 .build(),
-                        new KeyboardAccessoryData.Action(AUTOFILL_SUGGESTION, unused -> {}));
+                        new Action(AUTOFILL_SUGGESTION, unused -> {}));
         itemWithIPH.setFeatureForIPH(FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_OFFER_FEATURE);
 
         TestTracker tracker = new TestTracker();
@@ -562,7 +636,7 @@
                         getDefaultAutofillSuggestionBuilder()
                                 .setCustomIconUrl(customIconUrl)
                                 .build(),
-                        new KeyboardAccessoryData.Action(AUTOFILL_SUGGESTION, unused -> {}));
+                        new Action(AUTOFILL_SUGGESTION, unused -> {}));
 
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> {
@@ -598,7 +672,7 @@
                         getDefaultAutofillSuggestionBuilder()
                                 .setCustomIconUrl(customIconUrl)
                                 .build(),
-                        new KeyboardAccessoryData.Action(AUTOFILL_SUGGESTION, unused -> {}));
+                        new Action(AUTOFILL_SUGGESTION, unused -> {}));
 
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> {
@@ -625,7 +699,7 @@
         AutofillBarItem itemWithoutCustomIconUrl =
                 new AutofillBarItem(
                         getDefaultAutofillSuggestionBuilder().build(),
-                        new KeyboardAccessoryData.Action(AUTOFILL_SUGGESTION, unused -> {}));
+                        new Action(AUTOFILL_SUGGESTION, unused -> {}));
 
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> {
@@ -715,7 +789,7 @@
                         .setPopupItemId(PopupItemId.ADDRESS_ENTRY)
                         .setFeatureForIPH("")
                         .build(),
-                new KeyboardAccessoryData.Action(AUTOFILL_SUGGESTION, chipCallback));
+                new Action(AUTOFILL_SUGGESTION, chipCallback));
     }
 
     private SheetOpenerBarItem createSheetOpener() {
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
deleted file mode 100644
index 2085429..0000000
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.keyboard_accessory.bar_component;
-
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.action.ViewActions.click;
-import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static androidx.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.CREDMAN_CONDITIONAL_UI_REENTRY;
-import static org.chromium.chrome.browser.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BAR_ITEMS;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.DISABLE_ANIMATIONS_FOR_TESTING;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_OPENER_ITEM;
-import static org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
-import static org.chromium.ui.test.util.ViewUtils.VIEW_GONE;
-import static org.chromium.ui.test.util.ViewUtils.VIEW_INVISIBLE;
-import static org.chromium.ui.test.util.ViewUtils.VIEW_NULL;
-import static org.chromium.ui.test.util.ViewUtils.onViewWaiting;
-
-import android.view.View;
-
-import androidx.test.filters.MediumTest;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
-import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.browser.keyboard_accessory.R;
-import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
-import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SheetOpenerBarItem;
-import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Action;
-import org.chromium.chrome.browser.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
-import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
-import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
-import org.chromium.content_public.browser.test.util.TestThreadUtils;
-import org.chromium.ui.AsyncViewProvider;
-import org.chromium.ui.AsyncViewStub;
-import org.chromium.ui.ViewProvider;
-import org.chromium.ui.modelutil.LazyConstructionPropertyMcp;
-import org.chromium.ui.modelutil.PropertyModel;
-import org.chromium.ui.test.util.ViewUtils;
-
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.atomic.AtomicReference;
-
-/** View tests for the keyboard accessory component. */
-@RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-@DisableFeatures(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)
-public class KeyboardAccessoryViewTest {
-    private PropertyModel mModel;
-    private BlockingQueue<KeyboardAccessoryView> mKeyboardAccessoryView;
-
-    @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
-
-    @Before
-    public void setUp() throws InterruptedException {
-        mActivityTestRule.startMainActivityOnBlankPage();
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    mModel =
-                            KeyboardAccessoryProperties.defaultModelBuilder()
-                                    .with(
-                                            SHEET_OPENER_ITEM,
-                                            new SheetOpenerBarItem(
-                                                    new KeyboardAccessoryTabLayoutCoordinator
-                                                            .SheetOpenerCallbacks() {
-                                                        @Override
-                                                        public void onViewBound(View tabs) {}
-
-                                                        @Override
-                                                        public void onViewUnbound(View tabs) {}
-                                                    }))
-                                    .with(DISABLE_ANIMATIONS_FOR_TESTING, true)
-                                    .build();
-                    AsyncViewStub viewStub =
-                            mActivityTestRule
-                                    .getActivity()
-                                    .findViewById(R.id.keyboard_accessory_stub);
-
-                    mKeyboardAccessoryView = new ArrayBlockingQueue<>(1);
-                    ViewProvider<KeyboardAccessoryView> provider =
-                            AsyncViewProvider.of(viewStub, R.id.keyboard_accessory);
-                    LazyConstructionPropertyMcp.create(
-                            mModel, VISIBLE, provider, KeyboardAccessoryViewBinder::bind);
-                    provider.whenLoaded(mKeyboardAccessoryView::add);
-                });
-    }
-
-    @Test
-    @MediumTest
-    public void testAccessoryVisibilityChangedByModel() throws InterruptedException {
-        // Initially, there shouldn't be a view yet.
-        assertNull(mKeyboardAccessoryView.poll());
-
-        // After setting the visibility to true, the view should exist and be visible.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    mModel.set(VISIBLE, true);
-                });
-        KeyboardAccessoryView view = mKeyboardAccessoryView.take();
-        assertEquals(view.getVisibility(), View.VISIBLE);
-
-        // After hiding the view, the view should still exist but be invisible.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    mModel.set(VISIBLE, false);
-                });
-        assertNotEquals(view.getVisibility(), View.VISIBLE);
-    }
-
-    @Test
-    @MediumTest
-    public void testClickableActionAddedWhenChangingModel() {
-        final AtomicReference<Boolean> buttonClicked = new AtomicReference<>();
-        final BarItem testItem =
-                new BarItem(
-                        BarItem.Type.ACTION_BUTTON,
-                        new Action(GENERATE_PASSWORD_AUTOMATIC, action -> buttonClicked.set(true)),
-                        R.string.password_generation_accessory_button);
-
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    mModel.set(VISIBLE, true);
-                    mModel.get(BAR_ITEMS).add(testItem);
-                });
-
-        onViewWaiting(withText(R.string.password_generation_accessory_button)).perform(click());
-
-        assertTrue(buttonClicked.get());
-    }
-
-    @Test
-    @MediumTest
-    public void testCanAddSingleButtons() {
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    mModel.set(VISIBLE, true);
-                    mModel.get(BAR_ITEMS)
-                            .set(
-                                    new BarItem[] {
-                                        new BarItem(
-                                                BarItem.Type.ACTION_BUTTON,
-                                                new Action(
-                                                        GENERATE_PASSWORD_AUTOMATIC, action -> {}),
-                                                R.string.password_generation_accessory_button)
-                                    });
-                });
-
-        onViewWaiting(withText(R.string.password_generation_accessory_button));
-        onView(withText(R.string.password_generation_accessory_button))
-                .check(matches(isDisplayed()));
-
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    mModel.get(BAR_ITEMS)
-                            .add(
-                                    new BarItem(
-                                            BarItem.Type.ACTION_CHIP,
-                                            new Action(
-                                                    CREDMAN_CONDITIONAL_UI_REENTRY, action -> {}),
-                                            R.string.more_passkeys));
-                });
-
-        onViewWaiting(withText(R.string.more_passkeys));
-        onView(withText(R.string.password_generation_accessory_button))
-                .check(matches(isDisplayed()));
-        onView(withText(R.string.more_passkeys)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    @MediumTest
-    public void testCanRemoveSingleButtons() {
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    mModel.set(VISIBLE, true);
-                    mModel.get(BAR_ITEMS)
-                            .set(
-                                    new BarItem[] {
-                                        new BarItem(
-                                                BarItem.Type.ACTION_BUTTON,
-                                                new Action(
-                                                        GENERATE_PASSWORD_AUTOMATIC, action -> {}),
-                                                R.string.password_generation_accessory_button),
-                                        new BarItem(
-                                                BarItem.Type.ACTION_CHIP,
-                                                new Action(
-                                                        CREDMAN_CONDITIONAL_UI_REENTRY,
-                                                        action -> {}),
-                                                R.string.more_passkeys),
-                                    });
-                });
-
-        onViewWaiting(withText(R.string.password_generation_accessory_button));
-        onView(withText(R.string.password_generation_accessory_button))
-                .check(matches(isDisplayed()));
-        onView(withText(R.string.more_passkeys)).check(matches(isDisplayed()));
-
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> mModel.get(BAR_ITEMS).remove(mModel.get(BAR_ITEMS).get(1)));
-
-        ViewUtils.waitForViewCheckingState(
-                withText(R.string.more_passkeys), VIEW_INVISIBLE | VIEW_GONE | VIEW_NULL);
-        onView(withText(R.string.password_generation_accessory_button))
-                .check(matches(isDisplayed()));
-        onView(withText(R.string.more_passkeys)).check(doesNotExist());
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUninstallUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUninstallUmaTracker.java
index e56b46de..54ae399 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUninstallUmaTracker.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/WebApkUninstallUmaTracker.java
@@ -13,6 +13,7 @@
 import org.chromium.chrome.browser.webapps.WebappDataStorage;
 import org.chromium.chrome.browser.webapps.WebappRegistry;
 import org.chromium.components.webapps.WebApkDistributor;
+import org.chromium.components.webapps.WebappsUtils;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -28,6 +29,7 @@
 
         long fallbackUninstallTimestamp = System.currentTimeMillis();
         WebappRegistry.warmUpSharedPrefs();
+        WebappsUtils.prepareIsRequestPinShortcutSupported();
         for (String uninstalledPackage : uninstalledPackages) {
             RecordHistogram.recordBooleanHistogram("WebApk.Uninstall.Browser", true);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationServiceImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationServiceImpl.java
index 125cda09..fbaa699 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationServiceImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationServiceImpl.java
@@ -19,6 +19,7 @@
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.webapps.WebappRegistry;
 import org.chromium.components.background_task_scheduler.TaskIds;
+import org.chromium.components.webapps.WebappsUtils;
 
 /**
  * The Notification service receives intents fired as responses to user actions issued on Android
@@ -80,6 +81,12 @@
                 () -> {
                     dispatchIntentOnUIThread(intent);
                 });
+
+        PostTask.runOrPostTask(
+                TaskTraits.BEST_EFFORT,
+                () -> {
+                    WebappsUtils.prepareIsRequestPinShortcutSupported();
+                });
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java
index 79e1a09..e4b9f57 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java
@@ -12,6 +12,7 @@
 import org.chromium.components.background_task_scheduler.NativeBackgroundTask;
 import org.chromium.components.background_task_scheduler.TaskIds;
 import org.chromium.components.background_task_scheduler.TaskParameters;
+import org.chromium.components.webapps.WebappsUtils;
 
 import java.lang.ref.WeakReference;
 import java.util.List;
@@ -36,6 +37,8 @@
             WebappRegistry.warmUpSharedPrefs();
         }
 
+        WebappsUtils.prepareIsRequestPinShortcutSupported();
+
         List<String> ids = WebappRegistry.getInstance().findWebApksWithPendingUpdate();
         for (String id : ids) {
             WebappDataStorage storage = WebappRegistry.getInstance().getWebappDataStorage(id);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
index 65fab01..00b95892 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
@@ -318,14 +318,14 @@
     @Test
     @SmallTest
     public void testSyncRowSummaryWhenNoDataTypeSynced() {
+        CoreAccountInfo account = mSyncTestRule.addTestAccount();
         final SyncService syncService =
                 TestThreadUtils.runOnUiThreadBlockingNoException(SyncServiceFactory::get);
+        SigninTestUtil.signinAndEnableSync(account, syncService);
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> {
                     syncService.setSelectedTypes(false, new HashSet<>());
                 });
-        CoreAccountInfo account = mSyncTestRule.addTestAccount();
-        SigninTestUtil.signinAndEnableSync(account, syncService);
 
         launchSettingsActivity();
 
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index b36cf90c..e4124303 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-121.0.6148.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-121.0.6149.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb
index b79e1307..686389c 100644
--- a/chrome/app/resources/chromium_strings_az.xtb
+++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -38,7 +38,9 @@
 <translation id="1715127912119967311">Bu funksiyaları təkmilləşdirmək üçün Chromium interaksiyaları Google-a göndərir. Bu datanı insan redaktorlar oxuya, emal edə və ona annotasiya əlavə edə bilər.</translation>
 <translation id="17264556997921157">Saytların sizə reklam göstərmək üçün istifadə etdiyi maraqlı mövzuları görə və silə bilərsiniz. Chromium son baxış tarixçənizə əsasən maraqlarınızı təxmin edir.</translation>
 <translation id="1733725117201708356">Chromium tezliklə baxış datasını siləcək</translation>
+<translation id="1736443181683099871">Chromium naviqasiyaları HTTPS-ə təkmilləşdirməyə cəhd edəcək</translation>
 <translation id="1745121272106313518">Chromium <ph name="REMAINING_TIME" /> sonra yenidən başladılacaq</translation>
+<translation id="1749104137266986751">HTTPS əlçatan olmadıqda Chromium xəbərdarlıq etmədən təhlükəli bağlantı istifadə edəcək</translation>
 <translation id="1774152462503052664">Chromium'a fonda işləməyə icazə verin</translation>
 <translation id="1779356040007214683">Chromium'u güvənli etmək üçün,  <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> siyahısında olmayan və xəbəriniz olmadan əlavə edilən bəzi artırmaları deaktiv etdik.</translation>
 <translation id="1808667845054772817">Chromium'u yenidən quraşdırın</translation>
@@ -124,6 +126,7 @@
 <translation id="3286538390144397061">İndi yenidən başladın</translation>
 <translation id="328888136576916638">Google API açarları çatışmır. Chromium'un bəzi funksionallığı deaktiv ediləcək.</translation>
 <translation id="3296368748942286671">Chromium bağlı olduqda arxa fon tətbiqləri işləsin?</translation>
+<translation id="3313189106987092621">Chromium təhlükəli bağlantı ilə sayt yükləməzdən əvvəl xəbərdarlıq edəcək</translation>
 <translation id="3350761136195634146">Bu hesab ilə Chromium profili artıq mövcuddur</translation>
 <translation id="3387527074123400161">ChromiumOS</translation>
 <translation id="3406848076815591792">Mövcud Chromium profilinə keçirilsin?</translation>
@@ -221,6 +224,7 @@
 <translation id="5224391634244552924">Yadda saxlanmış parol yoxdur. Parollarınızı yadda saxladıqda Chromium onları yoxlaya bilər.</translation>
 <translation id="5252179775517634216"><ph name="EXISTING_USER" /> artıq bu Chromium profilinə daxil olub. Bununla <ph name="USER_EMAIL_ADDRESS" /> üçün yeni Chromium profili yaradılacaq</translation>
 <translation id="5277894862589591112">Dəyişiklikləri tətbiq etmək üçün Chromium'u yenidən başladın</translation>
+<translation id="5294316920224716406">Anonim rejimdə nəzər saldıqda Chromium təhlükəli bağlantı ilə sayt yükləməzdən əvvəl xəbərdarlıq edəcək</translation>
 <translation id="5296845517486664001">Sınaqlar aktiv olduqda və Chromium təsadüfi olaraq sizi aktiv sınağa təyin edibsə, baxış tarixçəniz gördüyünüz reklamlara və aşağıda təxmin edilən maraqlara təsir edir. Məxfiliyinizi qorumaq üçün Chromium hər ay maraqlarınızı növbəlilik əsasında silir.</translation>
 <translation id="5352264705793813212">Chromium nəzərdən keçirilməli güvənlik tövsiyələri tapdı</translation>
 <translation id="5358375970380395591">İdarə olunan hesabla daxil olursnuz və onun inzibati idarəetməsini Chromium profilinizə verirsiniz. Tətbiqləriniz, əlfəcinləriniz, tarixçəniz və digər ayarlarınız Chromimum datanızla birlikdə <ph name="USER_NAME" /> üzərinə həmişəlik bənd olacaq. Bu datanı Google Hesabları Paneli vasitəsilə silə bilərsiniz, lakin bu datanı digər hesabla əlaqəli edə bilməzsiniz. Mövcud Chrome datanızı ayrı saxlamaq üçün yeni profil yarada bilərsiniz. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb
index 83c962bd..42a4310 100644
--- a/chrome/app/resources/chromium_strings_bs.xtb
+++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -38,7 +38,9 @@
 <translation id="1715127912119967311">Radi poboljšanja ovih funkcija Chromium šalje vaše interakcije s njima Googleu. Ove podatke će možda čitati, obrađivati i komentirati osobe koje vrše pregled.</translation>
 <translation id="17264556997921157">Možete vidjeti i uklanjati teme koje vas zanimaju, a koje web lokacije koriste da vam prikazuju oglase. Chromium procjenjuje vaša interesovanja na osnovu vaše nedavne historije pregledanja.</translation>
 <translation id="1733725117201708356">Chromium će uskoro izbrisati podatke o pregledanju</translation>
+<translation id="1736443181683099871">Chromium će pokušati nadograditi kretanja na HTTPS</translation>
 <translation id="1745121272106313518">Chromium će se ponovo pokrenuti za <ph name="REMAINING_TIME" /></translation>
+<translation id="1749104137266986751">Kad HTTPS nije dostupan, Chromium će upotrebljavati nesigurnu vezu bez upozorenja</translation>
 <translation id="1774152462503052664">Chromium može raditi u pozadini</translation>
 <translation id="1779356040007214683">Kako bi Chromium bio sigurniji, onemogućili smo neke ekstenzije koje nisu navedene u <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> i koje su možda dodane bez vašeg znanja.</translation>
 <translation id="1808667845054772817">Ponovo instaliraj Chromium</translation>
@@ -126,6 +128,7 @@
 <translation id="3286538390144397061">Ponovo pokreni sada</translation>
 <translation id="328888136576916638">Nedostaju ključevi za Google API. Neke funkcionalnosti Google Chromea će se onemogućiti.</translation>
 <translation id="3296368748942286671">Ostavi aplikacije da rade u pozadini kada se zatvori Chromium</translation>
+<translation id="3313189106987092621">Chromium će vas upozoriti prije učitavanja bilo koje web-lokacije putem nesigurne veze</translation>
 <translation id="3350761136195634146">Chromium profil s ovim računom već postoji</translation>
 <translation id="3387527074123400161">ChromiumOS</translation>
 <translation id="3406848076815591792">Želite li se prebaciti na Chromium profil?</translation>
@@ -223,6 +226,7 @@
 <translation id="5224391634244552924">Nema sačuvanih lozinki. Chromium može provjeravati vaše lozinke kada ih sačuvate.</translation>
 <translation id="5252179775517634216"><ph name="EXISTING_USER" /> je već prijavljen/a na ovom Chromium profilu. Ovim će se kreirati novi Chromium profil za korisnika <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="5277894862589591112">Za primjenu promjena, ponovo pokrenite Chromium</translation>
+<translation id="5294316920224716406">Kad pregledavate u anonimnom načinu, Chromium će vas upozoriti prije nego što učita web-lokaciju putem nesigurne veze</translation>
 <translation id="5296845517486664001">Tokom probnog perioda i ako vas je Chromium nasumično ubacio u aktivni probni period, vaša historija pregledanja utiče na oglase koje vidite i interesovanja, kao što je procijenjeno u nastavku. Da zaštiti vašu privatnost, Chromium automatski briše interesovanja na mjesečnoj osnovi.</translation>
 <translation id="5352264705793813212">Chromium je pronašao neke sigurnosne preporuke koje trebate pregledati</translation>
 <translation id="5358375970380395591">Prijavljujete se s upravljanim računom i dajete njegovom administratoru kontrolu nad svojim Chromium profilom. Vaši podaci iz Chromiuma, kao što su vaše aplikacije, oznake, historija, lozinke i druge postavke, trajno će se vezati za račun <ph name="USER_NAME" />. Moći ćete izbrisati ove podatke na kontrolnoj tabli Google računa, ali nećete moći povezati ove podatke s drugim računom. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index 5b4e3c9..4d41400 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -38,7 +38,9 @@
 <translation id="1715127912119967311">Para makatulong na pahusayin ang mga feature na ito, ipinapadala ng Chromium sa Google ang iyong mga interaction dito. Posibleng basahin, iproseso, at i-annotate ang data na ito ng mga taong tagasuri.</translation>
 <translation id="17264556997921157">Makikita at maaalis mo ang mga paksa ng interes na ginagamit ng mga site para magpakita sa iyo ng mga ad. Tinataya ng Chromium ang iyong mga interes batay sa iyong kamakailang history ng pag-browse.</translation>
 <translation id="1733725117201708356">Ide-delete na ng Chromium ang data mula sa pag-browse sa ilang saglit</translation>
+<translation id="1736443181683099871">Susubukan ng Chromium na i-upgrade ang mga pag-navigate sa HTTPS</translation>
 <translation id="1745121272106313518">Magre-restart ang Chromium sa <ph name="REMAINING_TIME" /></translation>
+<translation id="1749104137266986751">Kapag hindi available ang HTTPS, gagamit ang Chromium ng hindi secure na koneksyon nang hindi ka binabalaan</translation>
 <translation id="1774152462503052664">Hayaang tumakbo ang Chromium sa background</translation>
 <translation id="1779356040007214683">Upang gawing mas ligtas ang Chromium, nag-disable kami ng ilang extension na hindi nakalista sa <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> at maaaring naidagdag nang hindi mo nalalaman.</translation>
 <translation id="1808667845054772817">Muling i-install ang Chromium</translation>
@@ -126,6 +128,7 @@
 <translation id="3286538390144397061">I-restart Ngayon</translation>
 <translation id="328888136576916638">Nawawala ang mga Google API key. Madi-disable ang ilang pagpapagana ng Chromium.</translation>
 <translation id="3296368748942286671">Patuloy na magpatakbo ng background na apps kapag nakasara ang Chromium</translation>
+<translation id="3313189106987092621">Bibigyan ka ng babala ng Chromium bago nito i-load ang anumang site na gumagamit ng hindi secure na koneksyon</translation>
 <translation id="3350761136195634146">Mayroon nang profile sa Chromium na gumagamit ng account na ito</translation>
 <translation id="3387527074123400161">ChromiumOS</translation>
 <translation id="3406848076815591792">Lumipat sa kasalukuyang profile sa Chromium?</translation>
@@ -223,6 +226,7 @@
 <translation id="5224391634244552924">Walang naka-save na password. Masusuri ng Chromium ang iyong mga password kapag na-save mo ang mga ito.</translation>
 <translation id="5252179775517634216">Naka-sign in na si <ph name="EXISTING_USER" /> sa profile sa Chromium na ito. Gagawa ito ng bagong profile sa Chromium para sa <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="5277894862589591112">Para ilapat ang iyong mga pagbabago, muling ilunsad ang Chromium</translation>
+<translation id="5294316920224716406">Kapag nagba-browse sa Incognito mode, bibigyan ka ng babala ng Chromium bago nito i-load ang isang site na gumagamit ng hindi secure na koneksyon</translation>
 <translation id="5296845517486664001">Kapag naka-on ang mga trial at kung random kang inilagay ng Chromium sa isang aktibong trial, maaapektuhan ng iyong history ng pag-browse ang mga ad na makikita mo at ang mga interes tulad ng itinantya sa ibaba. Para protektahan ang iyong privacy, ide-delete ng Chromium ang mga interes mo sa rolling na paraan bawat buwan.</translation>
 <translation id="5352264705793813212">Nakakita ang Chromium ng ilang rekomendasyon sa kaligtasan para sa pagsusuri mo</translation>
 <translation id="5358375970380395591">Nagsa-sign in ka gamit ang isang pinamamahalaang account at nagbibigay sa administrator nito ng kontrol sa iyong profile sa Chromium. Permanenteng mauugnay ang iyong data sa Chromium, gaya ng iyong apps, mga bookmark, kasaysayan, password, at iba pang mga setting sa <ph name="USER_NAME" />. Matatanggal mo ang data na ito sa Google Accounts Dashboard, ngunit hindi mo maiuugnay ang data na ito sa isa pang account. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb
index 28b4bb7..37705d22 100644
--- a/chrome/app/resources/chromium_strings_gu.xtb
+++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -38,7 +38,9 @@
 <translation id="1715127912119967311">આ સુવિધાઓને બહેતર બનાવવામાં સહાય કરવા માટે, Chromium તેની સાથેની તમારી ક્રિયાપ્રતિક્રિયાઓ Googleને મોકલે છે. માનવ રિવ્યૂઅર દ્વારા આ ડેટા વાંચવામાં આવી શકે છે તેમજ તેના પર પ્રક્રિયા અને ટીકાટિપ્પણી કરવામાં આવી શકે છે.</translation>
 <translation id="17264556997921157">તમે રુચિના એ વિષયોને જોઈ અને કાઢી નાખી શકો છો કે જેનો ઉપયોગ સાઇટ તમને જાહેરાતો બતાવવા માટે કરે છે. Chromium તમારા તાજેતરના બ્રાઉઝિંગ ઇતિહાસના આધારે તમારી રુચિઓનું અનુમાન લગાવે છે.</translation>
 <translation id="1733725117201708356">Chromium ટૂંક સમયમાં જ બ્રાઉઝિંગ ડેટા ડિલીટ કરશે</translation>
+<translation id="1736443181683099871">Chromium નૅવિગેશનને HTTPS પર અપગ્રેડ કરવાનો પ્રયાસ કરશે</translation>
 <translation id="1745121272106313518">Chromium <ph name="REMAINING_TIME" />માં ફરી શરૂ થશે</translation>
+<translation id="1749104137266986751">જ્યારે HTTPS ઉપલબ્ધ ન હોય, ત્યારે Chromium તમને ચેતવણી આપ્યા વિના અસુરક્ષિત કનેક્શનનો ઉપયોગ કરશે</translation>
 <translation id="1774152462503052664">Chromiumને બૅકગ્રાઉન્ડમાં ચાલવા દો</translation>
 <translation id="1779356040007214683">Chromium ને સુરક્ષિત બનાવવા માટે, અમે <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> માં સૂચિબદ્ધ નથી અને તમારી જાણ વિના ઉમેરવામાં આવ્યાં હોઈ શકે છે તેવા કેટલાક એક્સ્ટેન્શન્સને અક્ષમ કર્યા છે.</translation>
 <translation id="1808667845054772817">Chromium ફરીથી ઇન્સ્ટોલ કરો</translation>
@@ -126,6 +128,7 @@
 <translation id="3286538390144397061">હવે ફરીથી પ્રારંભ કરો</translation>
 <translation id="328888136576916638">Google API કીઝ ખૂટે છે. Chromium ની કેટલીક કાર્યક્ષમતા અક્ષમ થશે.</translation>
 <translation id="3296368748942286671">જ્યારે Chromium બંધ થાય ત્યારે બૅકગ્રાઉન્ડ ઍપ ચલાવવાનું ચાલુ રાખો</translation>
+<translation id="3313189106987092621">અસુરક્ષિત કનેક્શનનો ઉપયોગ કરીને કોઈપણ સાઇટ લોડ કરતા પહેલાં Chromium તમને ચેતવણી આપશે</translation>
 <translation id="3350761136195634146">આ એકાઉન્ટ સાથેની Chromium પ્રોફાઇલ પહેલેથી અસ્તિત્વમાં છે</translation>
 <translation id="3387527074123400161">ChromiumOS</translation>
 <translation id="3406848076815591792">વર્તમાન Chromium પ્રોફાઇલ પર સ્વિચ કરીએ?</translation>
@@ -223,6 +226,7 @@
 <translation id="5224391634244552924">કોઈ સાચવેલા પાસવર્ડ નથી. જ્યારે તમે તમારા પાસવર્ડ સાચવો ત્યારે Chromium તેને ચેક કરી શકે છે.</translation>
 <translation id="5252179775517634216"><ph name="EXISTING_USER" /> આ Chromium પ્રોફાઇલમાં પહેલેથી સાઇન ઇન છે. આને લીધે <ph name="USER_EMAIL_ADDRESS" /> માટે નવી Chromium પ્રોફાઇલ બનશે</translation>
 <translation id="5277894862589591112">તમારા ફેરફારો લાગુ કરવા માટે, Chromiumને ફરી લૉન્ચ કરો</translation>
+<translation id="5294316920224716406">છૂપા મોડમાં બ્રાઉઝ કરતી વખતે, અસુરક્ષિત કનેક્શનનો ઉપયોગ કરીને સાઇટ લોડ કરતા પહેલાં Chromium તમને ચેતવણી આપશે</translation>
 <translation id="5296845517486664001">જ્યારે અજમાયશો ચાલુ હોય અને જો Chromium કોઈ સક્રિય અજમાયશમાં કોઈપણ ક્રમમાં તમારી ગોઠવણ કરી લે, તો તમારો બ્રાઉઝિંગ ઇતિહાસ તમને દેખાતી જાહેરાતો અને નીચે જણાવેલી અનુમાનિત રુચિઓને અસર કરે છે. તમારી પ્રાઇવસીની સુરક્ષા કરવા માટે Chromium નવા વિષયો આવતા જાય, તેના આધારે દર મહિને તમારી રુચિના વિષયોને ડિલીટ કરે છે.</translation>
 <translation id="5352264705793813212">Chromiumને તમારા રિવ્યૂ માટે કેટલાક સલામતી સંબંધિત સુઝાવો મળ્યા છે</translation>
 <translation id="5358375970380395591">તમે મેનેજ કરેલા એકાઉન્ટ સાથે સાઇન ઇન કરી રહ્યાં છો અને તમારી Chromium પ્રોફાઇલ પર ઍડમિનને એનું નિયંત્રણ આપી રહ્યાં છો. તમારો Chromium ડેટા, જેમ કે ઍપ, બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને બીજા સેટિંગ, કાયમ માટે <ph name="USER_NAME" />થી જોડાયેલા રહેશે. તમે Google એકાઉન્ટ ડૅશબોર્ડથી આ ડેટાને ડિલીટ કરી શકશો, પરંતુ તમે આ ડેટાને બીજા એકાઉન્ટ સાથે સાંકળી શકશો નહીં. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb
index 32aaff6a..96bcf29 100644
--- a/chrome/app/resources/chromium_strings_hr.xtb
+++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -36,7 +36,9 @@
 <translation id="1715127912119967311">Radi poboljšanja tih značajki Chromium šalje Googleu vaše interakcije s njim. Pregledatelji te podatke mogu čitati, obrađivati i označavati.</translation>
 <translation id="17264556997921157">Možete vidjeti i ukloniti teme koje web-lokacije koriste da bi vam prikazivale oglase. Chromium procjenjuje vaše interese na temelju vaše nedavne povijesti pregledavanja.</translation>
 <translation id="1733725117201708356">Chromium će uskoro izbrisati podatke o pregledavanju</translation>
+<translation id="1736443181683099871">Chromium će pokušati nadograditi kretanja na HTTPS</translation>
 <translation id="1745121272106313518">Chromium će se ponovo pokrenuti za <ph name="REMAINING_TIME" /></translation>
+<translation id="1749104137266986751">Kad HTTPS nije dostupan, Chromium će upotrebljavati nesigurnu vezu bez upozorenja</translation>
 <translation id="1774152462503052664">Neka Chromium radi u pozadini</translation>
 <translation id="1779356040007214683">Kako bismo Chromium učinili sigurnijim, onemogućili smo neka proširenja koja nisu navedena u trgovini <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> i možda su dodana bez vašeg znanja.</translation>
 <translation id="1808667845054772817">Ponovo instaliraj Chromium</translation>
@@ -124,6 +126,7 @@
 <translation id="3286538390144397061">Ponovo pokreni sad</translation>
 <translation id="328888136576916638">Nedostaju ključevi Google API-ja. Neke funkcije Chromiuma bit će onemogućene.</translation>
 <translation id="3296368748942286671">Nastavi izvršavati ​​pozadinske aplikacije po zatvaranju preglednika Chromium</translation>
+<translation id="3313189106987092621">Chromium će vas upozoriti prije učitavanja bilo koje web-lokacije putem nesigurne veze</translation>
 <translation id="3350761136195634146">Već postoji profil u Chromiumu s tim računom</translation>
 <translation id="3387527074123400161">Chromium OS</translation>
 <translation id="3406848076815591792">Želite li prijeći na postojeći profil u Chromiumu?</translation>
@@ -221,6 +224,7 @@
 <translation id="5224391634244552924">Nema nijedne spremljene zaporke. Chromium može provjeriti vaše zaporke kad ih spremite.</translation>
 <translation id="5252179775517634216">Korisnik <ph name="EXISTING_USER" /> već je prijavljen na taj profil u Chromiumu. Izradit će se novi profil u Chromiumu za <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="5277894862589591112">Da bi se vaše promjene primijenile, ponovo pokrenite Chromium</translation>
+<translation id="5294316920224716406">Kad pregledavate u anonimnom načinu, Chromium će vas upozoriti prije nego što učita web-lokaciju putem nesigurne veze</translation>
 <translation id="5296845517486664001">Tijekom eksperimenata i ako vas je Chromium nasumično rasporedio u aktivni eksperiment, vaša povijest pregledavanja utječe na oglase koji vam se prikazuju i interese procijenjene u nastavku. Da bi zaštitio vašu privatnost, Chromium kontinuirano briše vaše interese svakog mjeseca.</translation>
 <translation id="5352264705793813212">Chromium je pronašao neke sigurnosne preporuke za vaš pregled</translation>
 <translation id="5358375970380395591">Prijavljujete se upravljanim računom i dajete administratoru kontrolu nad svojim profilom u sustavu Chromium. Vaši podaci u sustavu Chromium, primjerice, aplikacije, oznake, povijest, zaporke i ostale postavke, trajno će se povezati s korisnikom <ph name="USER_NAME" />. Moći ćete izbrisati te podatke putem Nadzorne ploče Google računa, ali ih nećete moći povezati s nekim drugim računom. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb
index 92b8436..28297a9 100644
--- a/chrome/app/resources/chromium_strings_hu.xtb
+++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -36,7 +36,9 @@
 <translation id="1715127912119967311">A funkciók továbbfejlesztése érdekében a Chromium elküldi a velük végzett műveleteket a Google-nak. Ezeket az adatokat ellenőreink elolvashatják, feldolgozhatják és megjegyzésekkel láthatják el.</translation>
 <translation id="17264556997921157">Megtekintheti és eltávolíthatja azokat a témaköröket, amelyeket a webhelyek hirdetések megjelenítésére használnak. A Chromium az Önt esetlegesen érdeklő témaköröket a legutóbbi böngészési előzményei alapján határozza meg.</translation>
 <translation id="1733725117201708356">A Chromium hamarosan törli a böngészési adatokat</translation>
+<translation id="1736443181683099871">A Chromium megpróbálja HTTPS-re frissíteni a navigációt</translation>
 <translation id="1745121272106313518">A Chromium <ph name="REMAINING_TIME" /> múlva újraindul</translation>
+<translation id="1749104137266986751">Ha a HTTPS nem áll rendelkezésre, a Chromium nem biztonságos kapcsolatot fog használni anélkül, hogy figyelmeztetné Önt</translation>
 <translation id="1774152462503052664">A Chromium fusson a háttérben</translation>
 <translation id="1779356040007214683">A Chromium biztonságosabbá tétele érdekében kikapcsoltunk néhány bővítményt, amelyek nem a(z) <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> szolgáltatásból származnak, és előfordulhat, hogy az Ön tudta nélkül lettek telepítve.</translation>
 <translation id="1808667845054772817">A Chromium újratelepítése</translation>
@@ -124,6 +126,7 @@
 <translation id="3286538390144397061">Újraindítás most</translation>
 <translation id="328888136576916638">Hiányoznak Google API-kulcsok. A Chromium egyes funkciói kikapcsolnak.</translation>
 <translation id="3296368748942286671">A háttéralkalmazások továbbfuttatása, ha a Chromiumot bezárják</translation>
+<translation id="3313189106987092621">A Chromium figyelmezteti Önt a nem biztonságos kapcsolatot használó webhelyek betöltése előtt</translation>
 <translation id="3350761136195634146">Már létezik Chromium-profil ezzel a fiókkal</translation>
 <translation id="3387527074123400161">ChromiumOS</translation>
 <translation id="3406848076815591792">Szeretne a meglévő Chromium-profilra váltani?</translation>
@@ -221,6 +224,7 @@
 <translation id="5224391634244552924">Nincsenek mentett jelszavak. A Chromium képes a jelszavak ellenőrzésére, ha Ön elmenti őket.</translation>
 <translation id="5252179775517634216"><ph name="EXISTING_USER" /> már be van jelentkezve ebbe a Chromium-profilba. Ezzel új Chromium-profilt hoz létre a(z) <ph name="USER_EMAIL_ADDRESS" /> fiókhoz.</translation>
 <translation id="5277894862589591112">A módosítások alkalmazásához indítsa újra a Chromiumot</translation>
+<translation id="5294316920224716406">Inkognitó módban való böngészéskor a Chromium figyelmezteti Önt a nem biztonságos kapcsolatot használó webhelyek betöltése előtt</translation>
 <translation id="5296845517486664001">A próbaidőszakok során, ha a Chromium véletlenszerű módon regisztrálta Önt egy próbaidőszakra, az Ön böngészési előzményei hatással vannak a megjelenő hirdetésekre és a becslések szerinti érdeklődési körökre. Adatai védelme érdekében a Chromium havi rendszerességgel törli az Ön érdeklődési köreit.</translation>
 <translation id="5352264705793813212">A Chromium talált néhány áttekintésre érdemes biztonsági javaslatot</translation>
 <translation id="5358375970380395591">Kezelt fiókkal jelentkezik be, és annak adminisztrátora számára hozzáférést biztosít Chromium-profiljához. Chromium-adatait – például alkalmazásait, könyvjelzőit, előzményeit, jelszavait és más beállításait – a rendszer véglegesen társítja a(z) <ph name="USER_NAME" /> fiókhoz. Ezen adatokat a Google-fiók Irányítópultján törölheti, de más fiókhoz nem társíthatja őket. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index a742a6e..08626cde 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -36,7 +36,9 @@
 <translation id="1715127912119967311">‏כדי לשפר את התכונות האלו, Chromium שולח את האינטראקציות שלך איתן ל-Google. בודקים אנושיים יכולים לקרוא את הנתונים האלה, לעבד אותם ולהוסיף להם הערות.</translation>
 <translation id="17264556997921157">‏יש לך אפשרות לראות ולהסיר את תחומי העניין שלפיהם האתרים מציגים לך את המודעות. ההערכה של תחומי העניין ב-Chromium מתבססת על היסטוריית הגלישה שלך מהזמן האחרון.</translation>
 <translation id="1733725117201708356">‏נתוני הגלישה ב-Chromium יימחקו בקרוב</translation>
+<translation id="1736443181683099871">‏Chromium ינסה לשדרג את הניווטים ל-HTTPS</translation>
 <translation id="1745121272106313518">‏Chromium יופעל מחדש בעוד <ph name="REMAINING_TIME" /></translation>
+<translation id="1749104137266986751">‏כש-HTTPS לא יהיה זמין, Chromium ישתמש בחיבור לא מאובטח בלי להציג אזהרה</translation>
 <translation id="1774152462503052664">‏התרה ל-Chromium לפעול ברקע</translation>
 <translation id="1779356040007214683">‏כדי לשפר את האבטחה של Chromium, השבתנו חלק מהתוספים שלא רשומים ב<ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> וייתכן שנוספו ללא ידיעתך.</translation>
 <translation id="1808667845054772817">‏התקנת Chromium מחדש</translation>
@@ -122,6 +124,7 @@
 <translation id="3286538390144397061">הפעל מחדש כעת</translation>
 <translation id="328888136576916638">‏המפתחות של Google API חסרים. פונקציונליות מסוימת של Chromium תהיה מושבתת.</translation>
 <translation id="3296368748942286671">‏המשך הפעלת יישומים ברקע כאשר Chromium סגור</translation>
+<translation id="3313189106987092621">‏Chromium יציג אזהרה לפני טעינת אתר כלשהו באמצעות חיבור לא מאובטח</translation>
 <translation id="3350761136195634146">‏כבר קיים פרופיל Chromium עם החשבון הזה</translation>
 <translation id="3387527074123400161">ChromiumOS</translation>
 <translation id="3406848076815591792">‏לעבור לפרופיל קיים של Chromium?</translation>
@@ -219,6 +222,7 @@
 <translation id="5224391634244552924">‏אין סיסמאות שמורות. Chromium יכול לבדוק את הסיסמאות שלך רק אם שמרת אותן.</translation>
 <translation id="5252179775517634216">‏המשתמש <ph name="EXISTING_USER" /> כבר מחובר לפרופיל Chromium הזה. ייווצר פרופיל Chromium חדש בשביל <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="5277894862589591112">‏כדי להחיל את השינויים שביצעת, יש להפעיל מחדש את Chromium</translation>
+<translation id="5294316920224716406">‏בגלישה במצב פרטי, Chromium יציג אזהרה לפני טעינת אתר באמצעות חיבור לא מאובטח</translation>
 <translation id="5296845517486664001">‏כשגרסאות הניסיון פעילות, ובמקרים שבהם צורפת באופן אקראי לגרסת ניסיון פעילה ב-Chromium, היסטוריית הגלישה שלך משפיעה על המודעות שמוצגות לך ועל תחומי העניין המשוערים שמופיעים בהמשך. כדי להגן על הפרטיות שלך, מתבצעת ב-Chromium מחיקה של תחומי העניין שלך על בסיס מתחלף מדי חודש.</translation>
 <translation id="5352264705793813212">‏יש ל-Chromium כמה המלצות לגבי בטיחות שכדאי לבדוק</translation>
 <translation id="5358375970380395591">‏הכניסה שלך מתבצעת באמצעות חשבון מנוהל שמעניק למנהל המערכת שלו שליטה על הפרופיל שלך ב-Chromium. הנתונים שלך ב-Chromium, כגון יישומים, סימניות, היסטוריה, סיסמאות והגדרות אחרות ייקשרו באופן קבוע ל-<ph name="USER_NAME" />. ניתן למחוק את הנתונים האלה באמצעות לוח הבקרה של חשבונות Google, אבל לא ניתן לשייך את הנתונים האלה לחשבון אחר. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb
index 0bdbd8be..8bbfdc1 100644
--- a/chrome/app/resources/chromium_strings_mn.xtb
+++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -38,7 +38,9 @@
 <translation id="1715127912119967311">Эдгээр онцлогийг сайжруулахад туслахын тулд Chromium таны түүнтэй хийсэн харилцан үйлдлүүдийг Google-д илгээнэ. Энэ өгөгдлийг хянагч хүмүүс уншиж, боловсруулж мөн тэмдэглэж магадгүй.</translation>
 <translation id="17264556997921157">Танд зар харуулахад ашиглах сонирхлын сайтуудын сэдвийг та харах болон хасах боломжтой. Chromium таны сонирхлыг саяхны хөтчийн түүхэд тань тулгуурлан тооцоолно.</translation>
 <translation id="1733725117201708356">Chromium удахгүй интернэтээр үзсэн өгөгдлийг устгана</translation>
+<translation id="1736443181683099871">Chromium навигацуудыг HTTPS болгож сайжруулахаар оролдоно</translation>
 <translation id="1745121272106313518">Chromium-г <ph name="REMAINING_TIME" />-н дараа дахин эхлүүлнэ</translation>
+<translation id="1749104137266986751">HTTPS боломжгүй үед Chromium танд сануулалгүйгээр аюултай холболт ашиглана</translation>
 <translation id="1774152462503052664">Chromium-ыг арын орчинд ажиллуулах</translation>
 <translation id="1779356040007214683">Chromium аюулгүй байдлыг нэмэгдүүлэхийн тулд бид <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />-ны жагсаалтад байхгүй бөгөөд танд мэдэгдэлгүйгээр нэмэгдсэн байж болзошгүй зарим өргөтгөлүүдийг идэвхгүй болгосон.</translation>
 <translation id="1808667845054772817">Chromium-ыг дахин суулгах</translation>
@@ -124,6 +126,7 @@
 <translation id="3286538390144397061">Одоо дахин эхлүүлнэ үү</translation>
 <translation id="328888136576916638">Google-ийн API түлхүүр байхгүй байна. Chromium-ийн зарим функц идэвхгүй болно.</translation>
 <translation id="3296368748942286671">Chromium-ийг хаахад ард байгаа програмуудыг ажиллуулсан хэвээр бай.</translation>
+<translation id="3313189106987092621">Chromium аюултай холболт ашиглан аливаа сайтыг ачаалахаас өмнө танд сануулна</translation>
 <translation id="3350761136195634146">Энэ бүртгэлтэй Chromium-н профайл аль хэдийн байна</translation>
 <translation id="3387527074123400161">ChromiumOS</translation>
 <translation id="3406848076815591792">Chromium-н одоо байгаа профайл руу сэлгэх үү?</translation>
@@ -221,6 +224,7 @@
 <translation id="5224391634244552924">Хадгалсан ямар ч нууц үг алга. Таныг нууц үгсээ хадгалах үед Chromium тэднийг шалгах боломжтой.</translation>
 <translation id="5252179775517634216"><ph name="EXISTING_USER" /> Chromium-н энэ профайлд аль хэдийн нэвтэрсэн байна. Энэ нь <ph name="USER_EMAIL_ADDRESS" />-д Chromium-н шинэ профайл үүсгэнэ</translation>
 <translation id="5277894862589591112">Өөрчлөлтөө хэрэгжүүлэхийн тулд Chromium-г дахин ажиллуулна уу</translation>
+<translation id="5294316920224716406">Нууцлалын горимд үзэх үед Chromium аюултай холболт ашиглан сайтыг ачаалахаас өмнө танд сануулна</translation>
 <translation id="5296845517486664001">Туршилтын хугацаанд байгаа бөгөөд Chromium таныг санамсаргүй байдлаар идэвхтэй туршилтын хугацаанд байрлуулсан бол таны хөтчийн түүх доор тооцоолсны дагуу таны хардаг зар болон сонирхолд нөлөөлнө. Таны нууцлалыг хамгаалахын тулд Chromium тодорхойгүй хугацаанд сар бүр таны сонирхлыг устгана.</translation>
 <translation id="5352264705793813212">Chromium таны шалгавал зохих аюулгүй байдлын зарим зөвлөмжийг оллоо</translation>
 <translation id="5358375970380395591">Та удирдан ажиллаж буй хаягт нэвтэрч байгаагаас гадна таны Chromium профайлыг хянах эрхийг системийн ажилтанд шилжүүлж байна. Таны апп, хавчуурга, түүх, нууц үг болон бусад тохиргоо гэх мэт таны Chromium өгөгдлийг <ph name="USER_NAME" />-тэй холбох болно. Та энэхүү өгөгдлийг Google Accounts Dashboard-р дамжуулан устгах боломжтой боловч та энэхүү өгөгдлийн өөр хаягтай холбох боломжгүй байна. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index da8b0731..ae747c2 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -36,7 +36,9 @@
 <translation id="1715127912119967311">Untuk membantu meningkatkan ciri ini, Chromium menghantar interaksi anda dengan ciri tersebut kepada Google. Data ini boleh dibaca, diproses dan dianotasikan oleh jurusemak.</translation>
 <translation id="17264556997921157">Anda boleh melihat dan mengalih keluar topik minat yang digunakan oleh laman untuk memaparkan iklan kepada anda. Chromium menganggarkan minat anda berdasarkan sejarah penyemakan imbas anda baru-baru ini.</translation>
 <translation id="1733725117201708356">Chromium akan memadamkan data semakan imbas sebentar lagi</translation>
+<translation id="1736443181683099871">Chromium akan cuba meningkatkan navigasi kepada HTTPS</translation>
 <translation id="1745121272106313518">Chromium akan dimulakan semula dalam masa <ph name="REMAINING_TIME" /></translation>
+<translation id="1749104137266986751">Apabila HTTPS tidak tersedia, Chromium akan menggunakan sambungan yang tidak selamat tanpa memberi anda amaran</translation>
 <translation id="1774152462503052664">Benarkan Chromium dijalankan dalam latar belakang</translation>
 <translation id="1779356040007214683">Untuk menjadikan Chromium lebih selamat, kami melumpuhkan beberapa sambungan yang tidak disenaraikan dalam <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> dan mungkin telah ditambahkan tanpa pengetahuan anda.</translation>
 <translation id="1808667845054772817">Pasang semula Chromium</translation>
@@ -124,6 +126,7 @@
 <translation id="3286538390144397061">Mulakan Semula Sekarang</translation>
 <translation id="328888136576916638">Kunci API Google tiada. Sesetengah fungsi Chromium akan dilumpuhkan.</translation>
 <translation id="3296368748942286671">Terus menjalankan apl latar belakang apabila Chromium ditutup</translation>
+<translation id="3313189106987092621">Chromium akan memberi anda amaran sebelum memuatkan sebarang laman menggunakan sambungan yang tidak selamat</translation>
 <translation id="3350761136195634146">Profil Chromium dengan akaun ini telah pun wujud</translation>
 <translation id="3387527074123400161">Chromium OS</translation>
 <translation id="3406848076815591792">Tukar kepada profil Chromium yang sedia ada?</translation>
@@ -221,6 +224,7 @@
 <translation id="5224391634244552924">Tiada kata laluan yang disimpan. Chromium boleh menyemak kata laluan anda yang disimpan.</translation>
 <translation id="5252179775517634216"><ph name="EXISTING_USER" /> telah pun dilog masuk ke profil Chromium ini. Tindakan ini akan membuat profil Chromium baharu untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="5277894862589591112">Untuk menggunakan perubahan anda, mulakan semula Chromium</translation>
+<translation id="5294316920224716406">Apabila menyemak imbas dalam Mod Inkognito, Chromium akan memberi anda amaran sebelum memuatkan laman menggunakan sambungan yang tidak selamat</translation>
 <translation id="5296845517486664001">Semasa percubaan dihidupkan dan jika Chromium telah meletakkan anda secara rawak dalam percubaan aktif, sejarah penyemakan imbas anda mempengaruhi iklan yang anda lihat dan minat seperti yang dianggarkan di bawah. Untuk melindungi privasi anda, Chromium memadamkan minat anda secara bergilir setiap bulan.</translation>
 <translation id="5352264705793813212">Chromium menemukan beberapa syor keselamatan untuk semakan anda</translation>
 <translation id="5358375970380395591">Anda log masuk menggunakan akaun yang terurus dan memberikan pentadbirnya kawalan ke atas profil Chromium anda. Data Chromium anda, seperti apl, penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan terikat kepada <ph name="USER_NAME" /> secara kekal. Anda akan dapat memadamkan data ini melalui Papan Pemuka Akaun Google, tetapi anda tidak akan dapat mengaitkan data ini dengan akaun lain. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb
index acd61376..ecdf6fa 100644
--- a/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -38,7 +38,9 @@
 <translation id="1715127912119967311">Chromium stuurt je interacties met deze functies naar Google om de functies te verbeteren. Deze gegevens kunnen worden gelezen, verwerkt en geannoteerd door reviewers.</translation>
 <translation id="17264556997921157">Je kunt interessante onderwerpen bekijken en verwijderen die sites hebben gebruikt om advertenties te tonen. Chromium schat je interesses op basis van je recente browsegeschiedenis</translation>
 <translation id="1733725117201708356">Chromium verwijdert zo meteen browsegegevens</translation>
+<translation id="1736443181683099871">Chromium probeert navigatie te upgraden naar HTTPS</translation>
 <translation id="1745121272106313518">Chromium wordt over <ph name="REMAINING_TIME" /> opnieuw opgestart</translation>
+<translation id="1749104137266986751">Als HTTPS niet beschikbaar is, gebruikt Chromium een niet-beveiligde verbinding zonder je te waarschuwen</translation>
 <translation id="1774152462503052664">Chromium laten uitvoeren op de achtergrond</translation>
 <translation id="1779356040007214683">Om Chromium veiliger te maken, hebben we een aantal extensies uitgezet die niet worden vermeld in de <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> en mogelijk zonder je medeweten zijn geïnstalleerd.</translation>
 <translation id="1808667845054772817">Chromium opnieuw installeren</translation>
@@ -126,6 +128,7 @@
 <translation id="3286538390144397061">Nu herstarten</translation>
 <translation id="328888136576916638">Google API-sleutels ontbreken. Sommige functies van Chromium worden uitgezet.</translation>
 <translation id="3296368748942286671">Achtergrondapps actief houden als Chromium is gesloten</translation>
+<translation id="3313189106987092621">Chromium waarschuwt je voordat een site wordt geladen via een niet-beveiligde verbinding</translation>
 <translation id="3350761136195634146">Er bestaat al een Chromium-profiel voor dit account</translation>
 <translation id="3387527074123400161">Chromium OS</translation>
 <translation id="3406848076815591792">Overschakelen naar bestaand Chromium-profiel?</translation>
@@ -223,6 +226,7 @@
 <translation id="5224391634244552924">Geen opgeslagen wachtwoorden. Chromium kan je wachtwoorden checken als je deze hebt opgeslagen.</translation>
 <translation id="5252179775517634216"><ph name="EXISTING_USER" /> is al ingelogd bij dit Chromium-profiel. Hiermee maak je een nieuw Chromium-profiel voor <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="5277894862589591112">Als je de wijzigingen wilt toepassen, start je Chromium opnieuw</translation>
+<translation id="5294316920224716406">Als je browst in de incognitomodus, waarschuwt Chromium je voordat een site wordt geladen via een niet-beveiligde verbinding</translation>
 <translation id="5296845517486664001">Tijdens actieve proeven en als Chromium je willekeurig in een actieve proef heeft geplaatst, heeft je browsegeschiedenis invloed op de advertenties die je te zien krijgt en de interesses zoals hieronder geschat. Ter bescherming van je privacy verwijdert Chromium je interesses elke maand op voortschrijdende basis.</translation>
 <translation id="5352264705793813212">Chromium heeft een aantal veiligheidsaanbevelingen gevonden die je moet controleren</translation>
 <translation id="5358375970380395591">Je logt in op een beheerd account waarmee de eigenaar van dat account beheer krijgt over je Chromium-profiel. Je Chromium-gegevens zoals je apps, bookmarks, geschiedenis, wachtwoorden en andere instellingen worden permanent gekoppeld aan <ph name="USER_NAME" />. Je kunt deze gegevens verwijderen via het Google Accounts Dashboard, maar je kunt deze gegevens niet koppelen aan een ander account.<ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb
index be0e10e..1361abb 100644
--- a/chrome/app/resources/chromium_strings_or.xtb
+++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -38,7 +38,9 @@
 <translation id="1715127912119967311">ଏହି ଫିଚରଗୁଡ଼ିକୁ ଉନ୍ନତ କରିବା ପାଇଁ, Chromium ସେଗୁଡ଼ିକ ସହିତ ଆପଣଙ୍କ ଇଣ୍ଟରାକ୍ସନ Googleକୁ ପଠାଏ। ଏହି ଡାଟାକୁ ମାନବ ସମୀକ୍ଷକମାନଙ୍କ ଦ୍ୱାରା ପଢ଼ାଯାଇପାରେ, ପ୍ରକ୍ରିୟାନ୍ୱିତ କରାଯାଇପାରେ କିମ୍ବା ଏନୋଟେଟ କରାଯାଇପାରେ।</translation>
 <translation id="17264556997921157">ଆପଣଙ୍କୁ ବିଜ୍ଞାପନଗୁଡ଼ିକ ଦେଖାଇବା ପାଇଁ ସାଇଟଗୁଡ଼ିକ ବ୍ୟବହାର କରୁଥିବା ରୁଚିପୂର୍ଣ୍ଣ ବିଷୟଗୁଡ଼ିକୁ ଆପଣ ଦେଖିପାରିବେ ଏବଂ କାଢ଼ି ଦେଇପାରିବେ। Chromium ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ବ୍ରାଉଜିଂ ଇତିହାସ ଆଧାରରେ ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକର ଆକଳନ କରିବ।</translation>
 <translation id="1733725117201708356">Chromium ବ୍ରାଉଜିଂ ଡାଟାକୁ ଶୀଘ୍ର ଡିଲିଟ କରିବ</translation>
+<translation id="1736443181683099871">Chromium ନାଭିଗେସନକୁ HTTPSକୁ ଅପଗ୍ରେଡ କରିବା ପାଇଁ ଚେଷ୍ଟା କରିବ</translation>
 <translation id="1745121272106313518">Chromium <ph name="REMAINING_TIME" />ରେ ରିଷ୍ଟାର୍ଟ ହେବ</translation>
+<translation id="1749104137266986751">ଯେତେବେଳେ HTTPS ଉପଲବ୍ଧ ନଥାଏ, Chromium ଆପଣଙ୍କୁ ଚେତାବନୀ ନଦେଇ ଏକ ଅସୁରକ୍ଷିତ କନେକ୍ସନ ବ୍ୟବହାର କରିବ</translation>
 <translation id="1774152462503052664">ପୃଷ୍ଠପଟରେ Chromium ଚାଲିବାକୁ ଦିଅନ୍ତୁ</translation>
 <translation id="1779356040007214683">Chromiumକୁ ଆହୁରି ସୁରକ୍ଷିତ କରିବା ପାଇଁ, ଆମେ <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> ରେ ତାଲିକାଭୁକ୍ତ ହୋଇନଥିବା ଏବଂ ଆପଣଙ୍କର ଅଜାଣତରେ ଯୋଗ କରାଯାଇଥିବା କିଛି ଏକ୍ସଟେନ୍‌ସନ୍‌କୁ ଅକ୍ଷମ କରିଦେଇଛୁ।</translation>
 <translation id="1808667845054772817">Chromiumକୁ ପୁଣି ଇନ୍‍ଷ୍ଟଲ୍ କରନ୍ତୁ</translation>
@@ -126,6 +128,7 @@
 <translation id="3286538390144397061">ଏବେ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation>
 <translation id="328888136576916638">Google API କୀ'ଗୁଡ଼ିକ ମିଳୁନାହିଁ। Chromiumର କିଛି କାର୍ଯ୍ୟକାରିତାକୁ ଅକ୍ଷମ କରାଯିବ।</translation>
 <translation id="3296368748942286671">ଯେତେବେଳେ Chromium ବନ୍ଦ ରହେ, ସେତେବେଳେ ପୃଷ୍ଠଭୂମିରେ ଥିବା ଆପ୍‍ଗୁଡ଼ିକ ଚଲାଇବା ଜାରି ରଖନ୍ତୁ</translation>
+<translation id="3313189106987092621">ଏକ ଅସୁରକ୍ଷିତ କନେକ୍ସନ ବ୍ୟବହାର କରି କୌଣସି ସାଇଟ ଲୋଡ କରିବା ପୂର୍ବରୁ Chromium ଆପଣଙ୍କୁ ଚେତାବନୀ ଦେବ</translation>
 <translation id="3350761136195634146">ଏହି ଆକାଉଣ୍ଟ ସହ ଏକ Chromium ପ୍ରୋଫାଇଲ୍ ପୂର୍ବରୁ ଅଛି</translation>
 <translation id="3387527074123400161">ChromiumOS</translation>
 <translation id="3406848076815591792">ପୂର୍ବରୁ ଥିବା Chromium ପ୍ରୋଫାଇଲକୁ ସ୍ୱିଚ୍ କରିବେ?</translation>
@@ -223,6 +226,7 @@
 <translation id="5224391634244552924">ସେଭ୍ କରାଯାଇଥିବା କୌଣସି ପାସୱାର୍ଡ ନାହିଁ। ଆପଣ ପାସୱାର୍ଡଗୁଡ଼ିକ ସେଭ୍ କଲେ Chromium ସେଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରିପାରିବ।</translation>
 <translation id="5252179775517634216"><ph name="EXISTING_USER" /> ଏହି Chromium ପ୍ରୋଫାଇଲରେ ପୂର୍ବରୁ ସାଇନ୍ ଇନ୍ କରିସାରିଛନ୍ତି। ଏହା <ph name="USER_EMAIL_ADDRESS" /> ପାଇଁ ଏକ ନୂଆ Chromium ପ୍ରୋଫାଇଲ୍ ତିଆରି କରିବ</translation>
 <translation id="5277894862589591112">ଆପଣ କରିଥିବା ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ଲାଗୁ କରିବା ପାଇଁ Chromiumକୁ ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ</translation>
+<translation id="5294316920224716406">ଇନକଗ୍ନିଟୋ ମୋଡରେ ବ୍ରାଉଜ କରିବା ସମୟରେ, ଏକ ଅସୁରକ୍ଷିତ କନେକ୍ସନ ବ୍ୟବହାର କରି କୌଣସି ସାଇଟ ଲୋଡ କରିବା ପୂର୍ବରୁ Chromium ଆପଣଙ୍କୁ ଚେତାବନୀ ଦେବ</translation>
 <translation id="5296845517486664001">ଟ୍ରାଏଲଗୁଡ଼ିକ ଚାଲୁ ଥିବା ସମୟରେ ଯଦି Chromium ଆପଣଙ୍କୁ ରେଣ୍ଡମ ଭାବେ ଏକ ସକ୍ରିୟ ଟ୍ରାଏଲରେ ରଖିଥାଏ, ତେବେ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଇତିହାସ ଆପଣ ଦେଖୁଥିବା ବିଜ୍ଞାପନ ଏବଂ ରୁଚିଗୁଡ଼ିକୁ ନିମ୍ନରେ ଆକଳନ କରାଯାଇଥିବା ଅନୁସାରେ ପ୍ରଭାବିତ କରେ। ଆପଣଙ୍କ ଗୋପନୀୟତାକୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ, Chromium ପ୍ରତି ମାସରେ ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ପର୍ଯ୍ୟାୟ କ୍ରମେ ଡିଲିଟ କରେ।</translation>
 <translation id="5352264705793813212">Chromium ଆପଣଙ୍କ ସମୀକ୍ଷା ପାଇଁ କିଛି ସୁରକ୍ଷା ସୁପାରିଶ ପାଇଛି</translation>
 <translation id="5358375970380395591">ଆପଣ ଏକ ପରିଚାଳିତ ଆକାଉଣ୍ଟ ମାଧ୍ୟମରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି ଏବଂ ଏହାର ବ୍ୟବସ୍ଥାପକଙ୍କୁ ଆପଣଙ୍କ Chromium ପ୍ରୋଫାଇଲ୍‌ର ନିୟନ୍ତ୍ରଣ ଦେଇଛନ୍ତି। ଆପଣଙ୍କର Chromium ଡାଟା ଯେପରିକି, ଆପଣଙ୍କର ଆପ୍ସ, ବୁକ୍‌ମାର୍କଗୁଡ଼ିକ, ଇତିବୃତ୍ତି, ପାସ୍‌ୱର୍ଡଗୁଡ଼ିକ ଏବଂ ଅନ୍ୟାନ୍ୟ ସେଟିଂସ୍ ସ୍ଥାୟୀରୂପେ <ph name="USER_NAME" />କୁ ଯୋଡ଼ି ହୋଇଯିବ। ଆପଣ ଏହି ଡାଟାକୁ Google ଆକାଉଣ୍ଟ ଡ୍ୟାସ୍‌ବୋର୍ଡ ମାଧ୍ୟମରେ ଡିଲିଟ୍ କରିପାରିବେ, କିନ୍ତୁ ଆପଣ ଏହି ଡାଟାକୁ ଅନ୍ୟ ଆକାଉଣ୍ଟ ସହିତ ଜଡ଼ିତ କରିପାରିବେ ନାହିଁ। <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb
index 348cec3a..7a60a85 100644
--- a/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -38,7 +38,9 @@
 <translation id="1715127912119967311">Ili kusaidia kuboresha vipengele hivi, Chromium hutumia Google data ya jinsi unavyovitumia. Data hii inaweza kusomwa, kuchakatwa na kuwekewa vidokezo na wahakiki wanadamu.</translation>
 <translation id="17264556997921157">Unaweza kuona na kuondoa mada zinazokuvutia zinazotumiwa na tovuti kukuonyesha matangazo. Chromium hukadiria mambo yanayokuvutia kulingana na historia yako ya kuvinjari ya hivi karibuni.</translation>
 <translation id="1733725117201708356">Chromium itafuta data ya kuvinjari hivi karibuni</translation>
+<translation id="1736443181683099871">Chromium itajaribu kuboresha usogezaji ili utumie HTTPS</translation>
 <translation id="1745121272106313518">Chromium itazima kisha iwake baada ya <ph name="REMAINING_TIME" /></translation>
+<translation id="1749104137266986751">Wakati kiendelezi cha HTTPS hakipatikani, Chromium itatumia muunganisho usio salama bila kukutahadharisha</translation>
 <translation id="1774152462503052664">Acha Chromium iendeshe katika mandharinyuma</translation>
 <translation id="1779356040007214683">Ili kufanya Chromium salama zaidi, tumezima baadhi ya viendelezi ambavyo havijaorodheshwa katika <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> na ambavyo huendwa viliongezwa pasipo ridhaa yako.</translation>
 <translation id="1808667845054772817">Sakinisha Chromium Upya</translation>
@@ -126,6 +128,7 @@
 <translation id="3286538390144397061">Zima na uwashe sasa</translation>
 <translation id="328888136576916638">Funguo za Google API zinakosekana. Utendaji fulani wa Chromium utazimwa.</translation>
 <translation id="3296368748942286671">Endelea kuendesha programu za mandharinyuma wakati Chromium imefungwa</translation>
+<translation id="3313189106987092621">Chromium itakutahadharisha kabla ya kupakia tovuti yoyote kwa kutumia muunganisho usio salama</translation>
 <translation id="3350761136195634146">Tayari kuna wasifu kwenye Chromium unaotumia akaunti hii</translation>
 <translation id="3387527074123400161">Mfumo wa uendeshaji wa Chromium</translation>
 <translation id="3406848076815591792">Ungependa kutumia wasifu uliopo wa Chromium?</translation>
@@ -223,6 +226,7 @@
 <translation id="5224391634244552924">Hakuna manenosiri yaliyohifadhiwa. Chromium inaweza kukagua manenosiri yako ukiyahifadhi.</translation>
 <translation id="5252179775517634216">Tayari <ph name="EXISTING_USER" /> ameingia katika akaunti kwenye wasifu huu kwenye Chromium. Hatua hii itafungua wasifu mpya wa <ph name="USER_EMAIL_ADDRESS" /> kwenye Chromium</translation>
 <translation id="5277894862589591112">Ili utumie mabadiliko uliyofanya, fungua Chromium upya</translation>
+<translation id="5294316920224716406">Unapovinjari katika hali fiche, Chromium itakutahadharisha kabla ya kupakia tovuti kwa kutumia muunganisho usio salama</translation>
 <translation id="5296845517486664001">Vipindi vya kujaribu vinapowashwa na iwapo Chromium imekuweka kwa unasibu katika kipindi cha kujaribu kinachoendelea, historia ya kuvinjari huathiri mambo yanayokuvutia na matangazo unayoyaona kama inavyokadiriwa hapa chini. Ili kulinda faragha yako, Chromium hufuta mambo yanayokuvutia kadiri unavyoendelea kutumia kila mwezi.</translation>
 <translation id="5352264705793813212">Chromium imepata baadhi ya mapendekezo ya usalama unayopaswa kukagua</translation>
 <translation id="5358375970380395591">Unaingia katika akaunti inayodhibitiwa na kumpa msimamizi wa akaunti hiyo udhibiti wa wasifu wako kwenye Chromium. Data yako ya Chromium, kama vile programu zako, alamisho, historia, manenosiri, na mipangilio miingine itahusishwa na <ph name="USER_NAME" /> kabisa. Utaweza kufuta data hii kupitia Dashibodi ya Akaunti za Google, lakini hutaweza  kuunganisha data hii na akaunti nyingine. <ph name="LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 44386fc..23400167 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -577,6 +577,7 @@
 <translation id="1461041542809785877">Performans</translation>
 <translation id="1461177659295855031">Əlfəcin Paneli qovluğuna köçürün</translation>
 <translation id="1461288887896722288">İdarə olunan hesaba daxil oldunuz. İdarə olunan profil yaratmaqla hesabla əlaqələndirilmiş bəzi resurslara daxil ola biləcəksiniz.</translation>
+<translation id="1461868306585780092">Təhlükəli bağlantı istifadəsindən əvvəl xəbərdarlıq edilsin</translation>
 <translation id="146219525117638703">ONC Durumu</translation>
 <translation id="146220085323579959">İnternet kəsildi. internet bağlantınızı yoxlayın və yenidən cəhd edin.</translation>
 <translation id="1462480037563370607">Saytları əl ilə əlavə edin</translation>
@@ -1554,6 +1555,7 @@
 <translation id="2180620921879609685">Məzmunu istənilən səhifədə bloklayın</translation>
 <translation id="2181821976797666341">Siyasətlər</translation>
 <translation id="2182058453334755893">Buferə kopyalandı</translation>
+<translation id="2182419606502127232">Server qeydləri daxil edilsin.</translation>
 <translation id="2183570493397356669">"Davam edin" düyməsi deaktivdir</translation>
 <translation id="2184515124301515068">Saytların avtomatik oxutma vaxtını Chrome'un seçməsinə icazə verin (məsləhətlidir)</translation>
 <translation id="2186206192313702726">Google Linza</translation>
@@ -1750,6 +1752,7 @@
 <translation id="2323018538045954000">Yadda saxlanılmış Wi-Fi şəbəkələri</translation>
 <translation id="2325444234681128157">Parolu yadda saxlayın</translation>
 <translation id="2326188115274135041">Avtomatik kiliddən çıxarmanı aktiv etmək üçün PIN'i təsdiq edin</translation>
+<translation id="2326906096734221931">Tətbiq ayarlarını açın</translation>
 <translation id="2326931316514688470">Tətbiqi yenidən yükləyin</translation>
 <translation id="2327492829706409234">Tətbiqi aktiv edin</translation>
 <translation id="2327920026543055248"><ph name="CHARACTER" />/<ph name="TOTAL" /> simvol daxil edin</translation>
@@ -3887,6 +3890,7 @@
 <translation id="399788104667917863">Alətlər panelinə bərkidin</translation>
 <translation id="3998976413398910035">Printerləri idarə edin</translation>
 <translation id="4001540981461989979">Hərəkət edərkən maus kursoru vurğulansın</translation>
+<translation id="4002347779798688515">Mobil şəbəkə provayderi kilidli olsa, endirilmiş profil istifadəyə yararsız ola bilər. Dəstək üçün provayder ilə əlaqə saxlayın.</translation>
 <translation id="4002440992267487163">Pin ayarlanması</translation>
 <translation id="4005817994523282006">Saat qurşağının aşkarlanması üsulu</translation>
 <translation id="4007856537951125667">Qısayolları gizlədin</translation>
@@ -5421,6 +5425,7 @@
 <translation id="5261683757250193089">Veb Mağazada Açın</translation>
 <translation id="5261799091118902550">Bu fayl virus və ya zərərli proqram ola bilər. Google-a göndərərək təhlükəli olub-olmadığını yoxlaya bilərsiniz.</translation>
 <translation id="5262784498883614021">Şəbəkəyə avtomatik olaraq qoşulun</translation>
+<translation id="5263656105659419083">Yan panelə asanlıqla qayıtmaq üçün yuxarı sağ tərəfdə Bərkidin üzərinə klikləyin</translation>
 <translation id="5264148714798105376">Bu, bir və ya iki dəqiqə çəkə bilər.</translation>
 <translation id="5264252276333215551">Tətbiqinizi kiosk rejimində işlətmək üçün internetə qoşulun.</translation>
 <translation id="5265797726250773323">Quraşdıran zaman xəta baş verdi</translation>
@@ -5568,6 +5573,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{Çoxlu bildiriş ilə 1 sayt tapıldı}other{Çoxlu bildiriş ilə {NUM_SITES} sayt tapıldı}}</translation>
 <translation id="5388885445722491159">Qoşalaşdırıldı</translation>
 <translation id="5389626883706033615">Saytların haqqınızda yadda saxlanan məlumatdan istifadə üçün icazə istəməsi bloklanıb</translation>
+<translation id="5389794555912875905">Təhlükəli saytlara keçməzdən əvvəl xəbərdarlıqlara baxın (tövsiyə edilir)</translation>
 <translation id="5390112241331447203">Rəy hesabatlarında göndərilən system_logs.txt faylını daxil edin.</translation>
 <translation id="5390677308841849479">Tünd-qırmızı və narıncı</translation>
 <translation id="5390743329570580756">Göndərin</translation>
@@ -5851,6 +5857,7 @@
 <translation id="5608580678041221894">Kəsilmiş hissəni tənzimləmək və ya köçürmək üçün aşağıdakı düymələrə toxunun</translation>
 <translation id="5609231933459083978">Görünür tətbiq yanlışdır.</translation>
 <translation id="561030196642865721">Bu saytda üçüncü tərəf kukilərə icazə verilir</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Üzr istəyirik, parolunuz hələ də doğrulana bilməyib. Qeyd: əgər parolunuzu son vaxtlar dəyimisinizsə, hesabdan çıxan kimi yeni parolunuz tətbiq olunacaq, lütfən, köhnə parolu burada işlədin.</translation>
 <translation id="5614190747811328134">İstifadəçi bildirişi</translation>
 <translation id="5614553682702429503">Parol yadda saxlanılsın?</translation>
@@ -6205,6 +6212,7 @@
 <translation id="5901089233978050985">Çəkilənlər tabına keçin</translation>
 <translation id="5901494423252125310">Printerin qapağı açıqdır</translation>
 <translation id="5901630391730855834">Sarı</translation>
+<translation id="5902892210366342391">Anonim rejimdə təhlükəli saytlara keçməzdən əvvəl xəbərdarlıqlara baxın</translation>
 <translation id="5904614460720589786">Konfiqurasiya xətasına görə <ph name="APP_NAME" /> tətbiqini ayarlamaq mümkün olmadı. Administratorunuz ilə əlaqə saxlayın. Xəta kodu: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Güncəllənmək üzrədir! Güncəlləməni tamamlamaq üçün cihazı yenidən başladın.</translation>
 <translation id="5906732635754427568">Bu tətbiqlə bağlı data cihazdan silinəcək.</translation>
@@ -6740,6 +6748,7 @@
 <translation id="6333170995003625229">E-poçt ünvanı və ya parolunuzu doğrulamaq mümkün olmadı. Yenidən daxil olmağa cəhd edin.</translation>
 <translation id="6334267141726449402">Jurnalları toplamaq üçün bu keçidi kopyalayıb, istifadəçiyə göndərin.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> ADB sazlamasını deaktiv edib. <ph name="DEVICE_TYPE" /> cihazınız 24 saat ərzində sıfırlanacaq. Saxlamaq istədiyiniz faylları yedəkləyin.</translation>
+<translation id="6336194758029258346">Tətbiq dili</translation>
 <translation id="6337543438445391085">Datada yenə də bəzi şəxsi məlumatlar ola bilər. İxrac edilmiş faylları nəzərdən keçirin.</translation>
 <translation id="6338968693068997776">USB cihazı əlavə edin</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> üçün yeni profil yaradın</translation>
@@ -7245,6 +7254,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">Cihazda sayt datasına icazə verilməyib</translation>
 <translation id="6762833852331690540">Aktiv</translation>
+<translation id="6762861159308991328">Tətbiq ayarlarında keçidlərin açılma qaydasını dəyişə bilərsiniz</translation>
 <translation id="676560328519657314">Google Pay'də ödəniş metodlarınız</translation>
 <translation id="6766488013065406604">Google Parol Menecerinə keçin</translation>
 <translation id="6767566652486411142">Başqa Dil Seçin...</translation>
@@ -7460,6 +7470,7 @@
 <translation id="6912007319859991306">Mobil SİM kartın PİN kodu</translation>
 <translation id="6912380255120084882">Fərqli cihazı sınayın</translation>
 <translation id="691289340230098384">Subtitr tərcihləri</translation>
+<translation id="6914812290245989348">Təhlükəli saytlara keçməzdən əvvəl xəbərdarlıqları görməyin</translation>
 <translation id="6916590542764765824">İstisnaları idarə edin</translation>
 <translation id="6918677045355889289">ChromeOS güncəllənməsi tələb olunur</translation>
 <translation id="6919354101107095996">Sayta daxil olmağa çalışın. Sonra yenidən endirin</translation>
@@ -8941,6 +8952,7 @@
 <translation id="8076835018653442223">Cihazınızdakı lokal fayllara giriş administratorunuz tərəfindən deaktiv edilib</translation>
 <translation id="8077120325605624147">Ziyarət etdiyiniz istənilən sayt sizə istənilən reklamı göstərə bilər</translation>
 <translation id="8077579734294125741">Digər Chrome profilləri</translation>
+<translation id="80790299200510644">Şəkil axtarışı</translation>
 <translation id="80798452873915119">Saytlar bütün displeylərinizdə pəncərələri idarə etməyi tələb edə bilər</translation>
 <translation id="8080028325999236607">Bütün Panelləri Qapadın</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 0ec909f..07747dbf5 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -584,6 +584,7 @@
 <translation id="1461041542809785877">Performanse</translation>
 <translation id="1461177659295855031">Premjesti u folder trake oznaka</translation>
 <translation id="1461288887896722288">Upravo ste se prijavili na upravljani račun. Kreiranje novog upravljanog profila će vam omogućiti da pristupite određenim izvorima povezanim s tim računom.</translation>
+<translation id="1461868306585780092">Upozori prije upotrebe nesigurnih veza</translation>
 <translation id="146219525117638703">Stanje ONC-a</translation>
 <translation id="146220085323579959">Veza s internetom je prekinuta. Provjerite internetsku vezu i pokušajte ponovo.</translation>
 <translation id="1462480037563370607">Ručno dodajte web lokacije</translation>
@@ -1569,6 +1570,7 @@
 <translation id="2180620921879609685">blokirati sadržaj na bilo kojoj stranici</translation>
 <translation id="2181821976797666341">Pravila</translation>
 <translation id="2182058453334755893">Kopirano u međumemoriju</translation>
+<translation id="2182419606502127232">Uključi moje zapisnike poslužitelja.</translation>
 <translation id="2183570493397356669">Dugme za nastavak je onemogućeno</translation>
 <translation id="2184515124301515068">Dozvolite da Chrome odabere kada web lokacije mogu reproducirati zvuk (preporučeno)</translation>
 <translation id="2186206192313702726">Google Objektiv</translation>
@@ -1765,6 +1767,7 @@
 <translation id="2323018538045954000">Sačuvane WiFi mreže</translation>
 <translation id="2325444234681128157">Zapamti lozinku</translation>
 <translation id="2326188115274135041">Potvrdite PIN da uključite automatsko otključavanje</translation>
+<translation id="2326906096734221931">Otvori postavke aplikacije</translation>
 <translation id="2326931316514688470">&amp;Ponovo učitaj aplikaciju</translation>
 <translation id="2327492829706409234">Omogući aplikaciju</translation>
 <translation id="2327920026543055248">Unesite znak <ph name="CHARACTER" /> od <ph name="TOTAL" /></translation>
@@ -3902,6 +3905,7 @@
 <translation id="399788104667917863">Zakačite na alatnu traku</translation>
 <translation id="3998976413398910035">Upravljajte štampačima</translation>
 <translation id="4001540981461989979">Isticanje kursora miša prilikom pomicanja</translation>
+<translation id="4002347779798688515">Preuzeti se profil možda neće moći koristiti ako je davatelj mrežne usluge zaključan. Podršku potražite od davatelja usluga.</translation>
 <translation id="4002440992267487163">Postavi PIN</translation>
 <translation id="4005817994523282006">Način prepoznavanja vremenske zone</translation>
 <translation id="4007856537951125667">Sakrij prečice</translation>
@@ -5439,6 +5443,7 @@
 <translation id="5261683757250193089">Otvori u Web trgovini</translation>
 <translation id="5261799091118902550">Fajl je možda virus ili zlonamjerni softver. Možete ga poslati Googleu da provjeri je li nesiguran.</translation>
 <translation id="5262784498883614021">Automatski se poveži s mrežom</translation>
+<translation id="5263656105659419083">Da biste se jednostavno vratili na bočnu ploču, kliknite Prikvači u gornjem desnom kutu</translation>
 <translation id="5264148714798105376">Ovo može potrajati minut ili više.</translation>
 <translation id="5264252276333215551">Povežite se na internet da pokrenete aplikaciju u načinu rada kioska.</translation>
 <translation id="5265797726250773323">Greška prilikom instalacije</translation>
@@ -5586,6 +5591,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{Pronađena je 1 web lokacija s mnogo obavještenja}one{Pronađena je {NUM_SITES} web lokacija s mnogo obavještenja}few{Pronađene su {NUM_SITES} web lokacije s mnogo obavještenja}other{Pronađeno je {NUM_SITES} web lokacija s mnogo obavještenja}}</translation>
 <translation id="5388885445722491159">Upareno</translation>
 <translation id="5389626883706033615">Web lokacije su blokirane tako da vas ne pitaju za korištenje sačuvanih informacija o vama</translation>
+<translation id="5389794555912875905">Prikaži upozorenja prije prelaska na nesigurne web-lokacije (preporučeno)</translation>
 <translation id="5390112241331447203">Uključi fajl system_logs.txt koji je poslan u izvještajima s povratnim informacijama.</translation>
 <translation id="5390677308841849479">Tamnocrvena i narandžasta</translation>
 <translation id="5390743329570580756">Šalji za</translation>
@@ -5869,6 +5875,7 @@
 <translation id="5608580678041221894">Dodirnite sljedeće tipke da podesite ili pomjerite područje za rezanje</translation>
 <translation id="5609231933459083978">Čini se da je aplikacija nevažeća.</translation>
 <translation id="561030196642865721">Kolačići treće strane su dozvoljeni na ovoj web lokaciji</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Žao nam je, vaša lozinka još nije potvrđena. Napomena: ako ste nedavno promijenili lozinku, vaša nova lozinka će se primijeniti nakon što se odjavite. Ovdje koristite staru lozinku.</translation>
 <translation id="5614190747811328134">Korisničko obavještenja</translation>
 <translation id="5614553682702429503">Sačuvati lozinku?</translation>
@@ -6223,6 +6230,7 @@
 <translation id="5901089233978050985">Pređi na snimanje kartice</translation>
 <translation id="5901494423252125310">Otvoren je poklopac štampača</translation>
 <translation id="5901630391730855834">Žuta</translation>
+<translation id="5902892210366342391">Prikaži upozorenja prije prelaska na nesigurne web-lokacije u anonimnom načinu</translation>
 <translation id="5904614460720589786">Postavljanje aplikacije <ph name="APP_NAME" /> nije uspjelo zbog problema s konfiguracijom. Kontaktirajte administratora. Kȏd greške: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Još malo pa je ažurirano! Ponovo pokrenite uređaj da završite ažuriranje.</translation>
 <translation id="5906732635754427568">Podaci koji su povezani s ovom aplikacijom bit će uklonjeni s ovog uređaja.</translation>
@@ -6760,6 +6768,7 @@
 <translation id="6333170995003625229">Potvrđivanje adrese e-pošte ili lozinke nije uspjelo. Pokušajte se ponovo prijaviti.</translation>
 <translation id="6334267141726449402">Kopirajte i pošaljite link korisniku da prikupi zapisnike.</translation>
 <translation id="6336038146639916978">Domena <ph name="MANAGER" /> je onemogućila otklanjanje grešaka putem ADB-a. Ovim će se <ph name="DEVICE_TYPE" /> vratiti na zadano za 24 sata. Napravite kopiju svih fajlova koje želite sačuvati.</translation>
+<translation id="6336194758029258346">Jezik aplikacije</translation>
 <translation id="6337543438445391085">Neke lične informacije će možda i dalje biti uključene u podatke. Obavezno pregledajte izvezene fajlove.</translation>
 <translation id="6338968693068997776">Dodajte USB uređaj</translation>
 <translation id="6339668969738228384">Kreirajte novi profil za <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -7269,6 +7278,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">Pohranjivanje podataka web lokacije na uređaj nije dozvoljeno</translation>
 <translation id="6762833852331690540">Uključeno</translation>
+<translation id="6762861159308991328">Način otvaranja veza možete promijeniti u postavkama aplikacije</translation>
 <translation id="676560328519657314">Vaši načini plaćanja na Google Payu</translation>
 <translation id="6766488013065406604">Odlazak u Google upravitelj lozinki</translation>
 <translation id="6767566652486411142">Odaberite drugi jezik...</translation>
@@ -7484,6 +7494,7 @@
 <translation id="6912007319859991306">PIN SIM kartice za mobilnu mrežu</translation>
 <translation id="6912380255120084882">Pokušajte s drugim uređajem</translation>
 <translation id="691289340230098384">Postavke titlova</translation>
+<translation id="6914812290245989348">Ne prikazuj upozorenja prije otvaranja nesigurnih web-lokacija</translation>
 <translation id="6916590542764765824">Upravljanje ekstenzijama</translation>
 <translation id="6918677045355889289">Potrebno je ažurirati ChromeOS</translation>
 <translation id="6919354101107095996">Pokušajte se prijaviti na web lokaciju. Zatim ponovo preuzmite</translation>
@@ -8967,6 +8978,7 @@
 <translation id="8076835018653442223">Administrator je onemogućio pristup lokalnim fajlovima na vašem uređaju</translation>
 <translation id="8077120325605624147">Bilo koja web lokacija koju posjetite vam može prikazivati bilo koje oglase</translation>
 <translation id="8077579734294125741">Drugi profili u Chromeu</translation>
+<translation id="80790299200510644">Pretraživanje slika</translation>
 <translation id="80798452873915119">Web lokacije mogu pitati da upravljaju prozorima na svim mojim ekranima</translation>
 <translation id="8080028325999236607">Zatvori sve kartice</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 6bd364f..b86d5cb 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1774,7 +1774,7 @@
 <translation id="2332515770639153015">«مرور ایمن پیشرفته» روشن است</translation>
 <translation id="2332742915001411729">بازنشانی روی موارد پیش‌فرض</translation>
 <translation id="2332948465534020594">«مزاحم نشوید» فعال است</translation>
-<translation id="2333166365943957309">سلسله‌مراتب میانای کاربری</translation>
+<translation id="2333166365943957309">سلسله‌مراتب واسط کاربر</translation>
 <translation id="233471714539944337">محتوای حساس</translation>
 <translation id="2335111415680198280">{0,plural, =1{بستن # پنجره}one{بستن # پنجره}other{بستن # پنجره}}</translation>
 <translation id="2336228925368920074">نشانک‌گذاری همه برگه‌ها...</translation>
@@ -9188,7 +9188,7 @@
 <translation id="8260864402787962391">ماوس</translation>
 <translation id="8261378640211443080">این برنامه‌افزودنی در <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> فهرست نشده است و ممکن است بدون اطلاع شما اضافه شده باشد.</translation>
 <translation id="8261506727792406068">حذف</translation>
-<translation id="8262971894813353037">‏طراحی جدید نسخه رایانه را برای میانای کاربر وب فعال می‌کند. طراحی جدید Chrome‏ ۲۰۲۳ هم باید فعال شود.</translation>
+<translation id="8262971894813353037">‏طراحی جدید نسخه رایانه را برای واسط کاربر وب فعال می‌کند. طراحی جدید Chrome‏ ۲۰۲۳ هم باید فعال شود.</translation>
 <translation id="8263336784344783289">نامی برای گروه وارد کنید</translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> مکان‌نمای ماوس شما را غیرفعال کرد.</translation>
 <translation id="8264024885325823677">این تنظیم را سرپرست شما مدیریت می‌کند.</translation>
@@ -10424,7 +10424,7 @@
 <translation id="924818813611903184">‏مدیریت زبان‌ها در تنظیمات ChromeOS</translation>
 <translation id="925270020047573546">پخش محتوای صوتی میز کار در این دستگاه پشتیبانی نمی‌شود.</translation>
 <translation id="925575170771547168">با این کار <ph name="TOTAL_USAGE" /> از داده‌هایی که سایت‌ها ذخیره کرده‌اند حذف خواهد شد</translation>
-<translation id="930193457234051160">‏طراحی جدید میانای کاربر وب Chrome‏ ۲۰۲۳</translation>
+<translation id="930193457234051160">‏طراحی جدید واسط کاربر وب Chrome‏ ۲۰۲۳</translation>
 <translation id="930268624053534560">مهرهای زمان با جزئیات</translation>
 <translation id="930551443325541578">تکرار کلیدها و نشانه‌های تکیه</translation>
 <translation id="930893132043726269">درحال‌حاضر فراگردی می‌شود</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index ac8deb4d..d5103b1 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -583,6 +583,7 @@
 <translation id="1461041542809785877">Pagganap</translation>
 <translation id="1461177659295855031">Lumipat sa folder na Bookmarks Bar</translation>
 <translation id="1461288887896722288">Nag-sign in ka sa isang pinapamahalaang account, ang paggawa ng bagong pinapamahalaang profile ay magbibigay-daan sa iyong ma-access ang ilang resource na naka-link sa account na iyon.</translation>
+<translation id="1461868306585780092">Magbigay ng babala bago gumamit ng mga hindi secure na koneksyon</translation>
 <translation id="146219525117638703">Estado ng ONC</translation>
 <translation id="146220085323579959">Nadiskonekta ang Internet. Pakisuri ang iyong koneksyon sa internet at subukan ulit.</translation>
 <translation id="1462480037563370607">Manual na magdagdag ng mga site</translation>
@@ -1571,6 +1572,7 @@
 <translation id="2180620921879609685">I-block ang content sa anumang page</translation>
 <translation id="2181821976797666341">Mga Patakaran</translation>
 <translation id="2182058453334755893">Kinopya sa Iyong Clipboard</translation>
+<translation id="2182419606502127232">Isama ang aking server logs.</translation>
 <translation id="2183570493397356669">Na-disable ang button na Magpatuloy</translation>
 <translation id="2184515124301515068">Hayaan ang Chrome na pumili kung kailan makakapag-play ng tunog ang mga site (inirerekomenda)</translation>
 <translation id="2186206192313702726">Google Lens</translation>
@@ -1767,6 +1769,7 @@
 <translation id="2323018538045954000">Mga naka-save na Wi-Fi network</translation>
 <translation id="2325444234681128157">Tandaan ang password</translation>
 <translation id="2326188115274135041">Kumpirmahin ang PIN para i-on ang awtomatikong pag-unlock</translation>
+<translation id="2326906096734221931">Buksan ang Mga setting ng app</translation>
 <translation id="2326931316514688470">I-&amp;reload ang app</translation>
 <translation id="2327492829706409234">Paganahin ang app</translation>
 <translation id="2327920026543055248">Maglagay ng <ph name="CHARACTER" /> character sa <ph name="TOTAL" /></translation>
@@ -3904,10 +3907,12 @@
 <translation id="399788104667917863">I-pin sa toolbar</translation>
 <translation id="3998976413398910035">Pamahalaan ang mga printer</translation>
 <translation id="4001540981461989979">I-highlight ang cursor ng mouse kapag gumagalaw</translation>
+<translation id="4002347779798688515">Posibleng hindi magamit ang naka-download na profile kung naka-lock ang mobile network provider. Makipag-ugnayan sa iyong provider para sa suporta.</translation>
 <translation id="4002440992267487163">I-pin ang pag-set up</translation>
 <translation id="4005817994523282006">Paraan ng pagtukoy ng time zone</translation>
 <translation id="4007856537951125667">Itago ang mga shortcut</translation>
 <translation id="4008291085758151621">Hindi available ang impormasyon ng site sa VR</translation>
+<translation id="4010746393007464819">May available na upgrade sa Debian 12 (Bookworm)</translation>
 <translation id="4010917659463429001">Upang makuha ang iyong mga bookmark sa mobile device mo, <ph name="GET_IOS_APP_LINK" />.</translation>
 <translation id="4014432863917027322">Ayusin ang "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="4015163439792426608">May mga extension? <ph name="BEGIN_LINK" />Pamahalaan ang iyong mga extension<ph name="END_LINK" /> sa isang madaling puntahang lugar.</translation>
@@ -5441,6 +5446,7 @@
 <translation id="5261683757250193089">Buksan sa Web Store</translation>
 <translation id="5261799091118902550">Posibleng virus o malware ang file na ito. Puwede mo itong ipadala sa Google para masuri kung hindi ito ligtas.</translation>
 <translation id="5262784498883614021">Awtomatikong kumonekta sa network</translation>
+<translation id="5263656105659419083">Para madaling makabalik sa panel sa gilid, i-click ang I-pin sa kanang bahagi sa itaas</translation>
 <translation id="5264148714798105376">Maaari itong abutin nang isang minuto o higit pa.</translation>
 <translation id="5264252276333215551">Mangyaring kumonekta sa Internet upang ilunsad ang iyong app sa kiosk mode.</translation>
 <translation id="5265797726250773323">Nagkaroon ng error habang nag-i-install</translation>
@@ -5588,6 +5594,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{Nakakita ng 1 site na may napakaraming notification}one{Nakakita ng {NUM_SITES} site na may napakaraming notification}other{Nakakita ng {NUM_SITES} na site na may napakaraming notification}}</translation>
 <translation id="5388885445722491159">Ipinares</translation>
 <translation id="5389626883706033615">Naka-block ang mga site para hindi mahiling ng mga ito sa iyo na gumamit ng impormasyong na-save ng mga ito tungkol sa iyo</translation>
+<translation id="5389794555912875905">Makakita ng mga babala bago makapunta sa mga hindi secure na site (inirerekomenda)</translation>
 <translation id="5390112241331447203">Isama ang file na system_logs.txt na ipinadala sa mga feedback report.</translation>
 <translation id="5390677308841849479">Dark red at orange</translation>
 <translation id="5390743329570580756">Magpadala para sa</translation>
@@ -5871,6 +5878,7 @@
 <translation id="5608580678041221894">I-tap ang mga sumusunod na key upang isaayos o ilipat ang lugar ng pag-crop</translation>
 <translation id="5609231933459083978">Mukhang di-wasto ang application.</translation>
 <translation id="561030196642865721">Pinapayagan ang third-party na cookies sa site na ito</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Paumanhin, hindi pa rin ma-verify ang iyong password. Tandaan: kung pinalitan mo kamakailan ang iyong password, malalapat ang iyong bagong password sa sandaling mag-sign out ka, pakigamit ang lumang password dito.</translation>
 <translation id="5614190747811328134">Notice sa User</translation>
 <translation id="5614553682702429503">I-save ang password?</translation>
@@ -6068,6 +6076,7 @@
 <translation id="5782040878821624922">Available ito sa anumang device</translation>
 <translation id="5782227691023083829">Tina-translate...</translation>
 <translation id="57838592816432529">I-mute</translation>
+<translation id="5784291589716625675">Palitan ang wika ng app</translation>
 <translation id="5785583009707899920">Mga Utility ng File ng Chrome</translation>
 <translation id="5787146423283493983">Pangunahing Kasunduan</translation>
 <translation id="5787420647064736989">Pangalan ng device</translation>
@@ -6225,6 +6234,7 @@
 <translation id="5901089233978050985">Lumipat sa kina-capture na tab</translation>
 <translation id="5901494423252125310">Nakabukas ang takip ng printer</translation>
 <translation id="5901630391730855834">Dilaw</translation>
+<translation id="5902892210366342391">Makakita ng mga babala bago makapunta sa mga hindi secure na site sa Incognito mode</translation>
 <translation id="5904614460720589786">Hindi ma-set up ang <ph name="APP_NAME" /> dahil sa isang problema sa configuration. Makipag-ugnayan sa iyong administrator. Code ng error: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Halos napapanahon na! I-restart ang iyong device upang tapusin ang pag-a-update.</translation>
 <translation id="5906732635754427568">Aalisin sa device na ito ang data na nauugnay sa app na ito.</translation>
@@ -6541,6 +6551,7 @@
 <translation id="6151323131516309312">Pindutin <ph name="SEARCH_KEY" /> upang maghanap <ph name="SITE_NAME" /></translation>
 <translation id="6151771661215463137">Kasalukuyan nang nasa iyong folder ng download ang file.</translation>
 <translation id="6152918902620844577">Hinihintay ang susunod na pagpapatakbo</translation>
+<translation id="6153439704237222699">Matuto pa tungkol sa Do Not Track</translation>
 <translation id="6154240335466762404">Alisin ang lahat ng port</translation>
 <translation id="615436196126345398">Protocol</translation>
 <translation id="6155141482566063812">Ibinabahagi ng tab sa background ang iyong screen</translation>
@@ -6762,6 +6773,7 @@
 <translation id="6333170995003625229">Hindi ma-verify ang iyong email address o password. Subukang mag-sign in ulit.</translation>
 <translation id="6334267141726449402">Kopyahin at ipadala ang link na ito sa user para makolekta ang mga log.</translation>
 <translation id="6336038146639916978">Na-disable ng <ph name="MANAGER" /> ang pag-debug ng ADB. Ire-reset nito ang iyong <ph name="DEVICE_TYPE" /> pagkalipas ng 24 na oras. I-back up ang anumang file na gusto mong panatilihin.</translation>
+<translation id="6336194758029258346">Wika ng app</translation>
 <translation id="6337543438445391085">Posibleng may ilang personal na impormasyon pa ring kasama sa data. Tiyaking suriin ang mga na-export na file.</translation>
 <translation id="6338968693068997776">Magdagdag ng USB device</translation>
 <translation id="6339668969738228384">Gumawa ng bagong profile para sa <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -7269,6 +7281,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">Hindi pinapayagan ang on-device na data ng site</translation>
 <translation id="6762833852331690540">Naka-on</translation>
+<translation id="6762861159308991328">Puwede mong baguhin kung paano magbubukas ang mga link sa Mga setting ng app</translation>
 <translation id="676560328519657314">Iyong mga paraan ng pagbabayad sa Google Pay</translation>
 <translation id="6766488013065406604">Pumunta sa Google Password Manager</translation>
 <translation id="6767566652486411142">Pumili ng Iba Pang Wika...</translation>
@@ -7484,6 +7497,7 @@
 <translation id="6912007319859991306">PIN ng Cellular SIM</translation>
 <translation id="6912380255120084882">Sumubok ng ibang device</translation>
 <translation id="691289340230098384">Mga kagustuhan sa caption</translation>
+<translation id="6914812290245989348">Walang makikitang anumang babala bago pumunta sa mga hindi secure na site</translation>
 <translation id="6916590542764765824">Pamahalaan ang Mga Extension</translation>
 <translation id="6918677045355889289">Kailangan ng pag-update sa ChromeOS</translation>
 <translation id="6919354101107095996">Subukang mag-sign in sa site. Pagkatapos, mag-download ulit</translation>
@@ -8859,6 +8873,7 @@
 <translation id="7988805580376093356">Panatilihin ang iyong OS at patakbuhin ang <ph name="DEVICE_OS" /> mula sa USB.</translation>
 <translation id="7988876720343145286">Higit pang setting at pahintulot ng Android</translation>
 <translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> Boses <ph name="COUNT" /></translation>
+<translation id="7990958035181555539">Awtomatikong i-transfer ang WiFi mula sa iyong Android phone</translation>
 <translation id="7991296728590311172">Mga setting ng Switch Access</translation>
 <translation id="7992203134935383159">Speech synthesis</translation>
 <translation id="7994515119120860317">Isalin ang Text sa Larawan gamit ang <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
@@ -8967,6 +8982,7 @@
 <translation id="8076835018653442223">Na-disable ng iyong administrator ang access sa mga lokal na file sa iyong device</translation>
 <translation id="8077120325605624147">Puwedeng magpakita ng anumang ad sa iyo ang anumang site na bibisitahin mo</translation>
 <translation id="8077579734294125741">Iba pang Profile sa Chrome</translation>
+<translation id="80790299200510644">Paghahanap ng Larawan</translation>
 <translation id="80798452873915119">Puwedeng magtanong ang mga site na pamahalaan ang mga window sa lahat ng iyong display</translation>
 <translation id="8080028325999236607">Isara ang Lahat ng Tab</translation>
 <translation id="808089508890593134">Google</translation>
@@ -9806,6 +9822,7 @@
 <translation id="8736288397686080465">Na-update ang site na ito sa background.</translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">Piliin ang wika kung saan ita-translate ang page</translation>
+<translation id="8738418093147087440">Maghanap ayon sa mga bansa, wika, o mga pangalan ng input</translation>
 <translation id="8740086188450289493">Gamitin ang password ng Google Account</translation>
 <translation id="8740247629089392745">Puwede mong ibigay ang Chromebook na ito kay <ph name="SUPERVISED_USER_NAME" />. Malapit nang matapos ang pag-set up, puwede nang mag-explore pagkatapos nito.</translation>
 <translation id="8740672167979365981">Kinakailangang i-update ang ChromeOS Flex</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 1eef290..f55f590b 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -580,6 +580,7 @@
 <translation id="1461041542809785877">ભજવણી</translation>
 <translation id="1461177659295855031">બુકમાર્ક બાર ફોલ્ડર પર ખસેડો</translation>
 <translation id="1461288887896722288">તમે હમણાં જ મેનેજ કરેલા એકાઉન્ટમાં સાઇન ઇન થયા છો, મેનેજ કરેલી નવી પ્રોફાઇલ બનાવવાથી તમે તે એકાઉન્ટ સાથે લિંક કરેલા કેટલાક સંસાધનો ઍક્સેસ કરી શકશો.</translation>
+<translation id="1461868306585780092">અસુરક્ષિત કનેક્શનનો ઉપયોગ કરતા પહેલાં ચેતવણી આપો</translation>
 <translation id="146219525117638703">ONC સ્થિતિ</translation>
 <translation id="146220085323579959">ઇન્ટરનેટ ડિસ્કનેક્ટ થયું, કૃપા કરીને તમારું ઇન્ટરનેટ કનેક્શન તપાસો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="1462480037563370607">મેન્યૂઅલી સાઇટ ઉમેરો</translation>
@@ -1555,6 +1556,7 @@
 <translation id="2180620921879609685">કોઈપણ પેજ પરનું કન્ટેન્ટ બ્લૉક કરો</translation>
 <translation id="2181821976797666341">પૉલિસીઓ</translation>
 <translation id="2182058453334755893">તમારા ક્લિપબોર્ડ પર કૉપિ કરવામાં આવ્યું</translation>
+<translation id="2182419606502127232">મારા સર્વર લૉગ શામેલ કરો.</translation>
 <translation id="2183570493397356669">ચાલુ રાખો બટન બંધ છે</translation>
 <translation id="2184515124301515068">સાઇટ સાઉન્ડ ક્યારે ચલાવી શકે તે Chromeને પસંદ કરવા દો (સુઝાવ આપીએ છીએ)</translation>
 <translation id="2186206192313702726">Google Lens</translation>
@@ -1749,6 +1751,7 @@
 <translation id="2323018538045954000">સાચવેલા વાઇ-ફાઇ નેટવર્ક</translation>
 <translation id="2325444234681128157">પાસવર્ડ યાદ રાખો</translation>
 <translation id="2326188115274135041">ઑટોમૅટિક રીતે અનલૉક કરવાની સુવિધા ચાલુ કરવા માટે પિન કન્ફર્મ કરો</translation>
+<translation id="2326906096734221931">ઍપ સેટિંગ ખોલો</translation>
 <translation id="2326931316514688470">ઍપ્લિકેશન &amp;ફરીથી લોડ કરો</translation>
 <translation id="2327492829706409234">ઍપ ચાલુ કરો</translation>
 <translation id="2327920026543055248"><ph name="TOTAL" />માંથી <ph name="CHARACTER" /> અક્ષર દાખલ કરો</translation>
@@ -3886,6 +3889,7 @@
 <translation id="399788104667917863">ટૂલબાર પર પિન કરો</translation>
 <translation id="3998976413398910035">પ્રિન્ટર મેનેજ કરો</translation>
 <translation id="4001540981461989979">ખસેડતી વખતે માઉસના કર્સરને હાઇલાઇટ કરો</translation>
+<translation id="4002347779798688515">જો મોબાઇલ નેટવર્ક પ્રદાતા લૉક કરેલા હોય, તો ડાઉનલોડ કરેલી પ્રોફાઇલનો ઉપયોગ કરી શકાશે નહીં. સપોર્ટ માટે તમારા પ્રદાતાનો સંપર્ક કરો.</translation>
 <translation id="4002440992267487163">પિનને સેટઅપ કરો</translation>
 <translation id="4005817994523282006">સમય ઝોન ઓળખ પદ્ધતિ</translation>
 <translation id="4007856537951125667">શૉર્ટકટ છુપાવો</translation>
@@ -5422,6 +5426,7 @@
 <translation id="5261683757250193089">વેબ દુકાનમાં ખોલો</translation>
 <translation id="5261799091118902550">આ ફાઇલ વાયરસ અથવા માલવેર હોઈ શકે છે. તે અસુરક્ષિત છે કે કેમ તે ચેક કરવા માટે તમે તેને Googleને મોકલી શકો છો.</translation>
 <translation id="5262784498883614021">નેટવર્ક સાથે ઑટોમૅટિક રીતે કનેક્ટ થાઓ</translation>
+<translation id="5263656105659419083">બાજુની પૅનલ પર સરળતાથી પાછા જવા માટે, ઉપર જમણી બાજુએ "પિન કરો" પર ક્લિક કરો</translation>
 <translation id="5264148714798105376">આમાં એક મિનિટ જેટલો સમય લાગી શકે છે.</translation>
 <translation id="5264252276333215551">કૃપા કરીને કિઓસ્ક મોડમાં તમારી એપ્લિકેશનને લોંચ કરવા માટે ઇન્ટરનેટથી કનેક્ટ કરો.</translation>
 <translation id="5265797726250773323">ઇન્સ્ટૉલ કરતી વખતે ભૂલ આવી</translation>
@@ -5569,6 +5574,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{ઘણા બધા નોટિફિકેશન ધરાવતી 1 સાઇટ મળી છે}one{ઘણા બધા નોટિફિકેશન ધરાવતી {NUM_SITES} સાઇટ મળી છે}other{ઘણા બધા નોટિફિકેશન ધરાવતી {NUM_SITES} સાઇટ મળી છે}}</translation>
 <translation id="5388885445722491159">જોડી કરેલા</translation>
 <translation id="5389626883706033615">આ સાઇટને, તેમના દ્વારા તમારા વિશે સાચવવામાં આવેલી માહિતીનો ઉપયોગ કરવાનું પૂછવાથી બ્લૉક કરવામાં આવી છે</translation>
+<translation id="5389794555912875905">અસુરક્ષિત સાઇટ પર જતાં પહેલાં ચેતવણીઓ જુઓ (ભલામણ કરેલી)</translation>
 <translation id="5390112241331447203">પ્રતિસાદના રિપોર્ટમાં મોકલેલી system_logs.txt ફાઇલનો સમાવેશ કરો.</translation>
 <translation id="5390677308841849479">ઘેરો લાલ અને નારંગી</translation>
 <translation id="5390743329570580756">આ માટે મોકલો</translation>
@@ -5852,6 +5858,7 @@
 <translation id="5608580678041221894">કાપવા માટેના ક્ષેત્રને સમાયોજિત કરવા અથવા ખસેડવા માટે નીચેની કીને ટૅપ કરો</translation>
 <translation id="5609231933459083978">ઍપ્લિકેશન અમાન્ય હોય તેવું લાગે છે.</translation>
 <translation id="561030196642865721">આ સાઇટ પર ત્રીજા પક્ષની કુકીને મંજૂરી આપવામાં આવે છે</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">માફ કરશો, તમારો પાસવર્ડ હજી ચકાસી શકાયો નથી. નોંધ: જો તમે તાજેતરમાં તમારો પાસવર્ડ બદલ્યો હોય, તો તમારો નવો પાસવર્ડ તમે એક વાર સાઇન આઉટ કરી લો તે પછી લાગુ થશે, કૃપા કરીને અહીં જૂના પાસવર્ડનો ઉપયોગ કરો.</translation>
 <translation id="5614190747811328134">વપરાશકર્તા સૂચના</translation>
 <translation id="5614553682702429503">પાસવર્ડ સાચવીએ?</translation>
@@ -6207,6 +6214,7 @@
 <translation id="5901089233978050985">ટૅબ કૅપ્ચર કરવા પર સ્વિચ કરો</translation>
 <translation id="5901494423252125310">પ્રિન્ટરનું ઢાંકણ ખૂલ્લું છે</translation>
 <translation id="5901630391730855834">પીળો</translation>
+<translation id="5902892210366342391">છૂપા મોડમાં અસુરક્ષિત સાઇટ પર જતાં પહેલાં ચેતવણીઓ જુઓ</translation>
 <translation id="5904614460720589786">ગોઠવણીમાં સમસ્યાને લીધે <ph name="APP_NAME" />ને સેટઅપ કરી શક્યાં નહીં. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો. ભૂલનો કોડ: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">અપ ટૂ ડેટ થવામાં છે! અપડેટ કરવાનું સમાપ્ત કરવા માટે તમારા ઉપકરણને પુનઃપ્રારંભ કરો.</translation>
 <translation id="5906732635754427568">આ ઍપ્લિકેશન સાથે સંકળાયેલ ડેટાને આ ઉપકરણમાંથી દૂર કરવામાં આવશે.</translation>
@@ -6745,6 +6753,7 @@
 <translation id="6333170995003625229">તમારું ઇમેઇલ ઍડ્રેસ કે પાસવર્ડ ચકાસી શકાયો નથી. ફરીથી સાઇન ઇન કરવાનો પ્રયાસ કરો.</translation>
 <translation id="6334267141726449402">લૉગ એકત્રિત કરવા માટે આ લિંક કૉપિ કરી વપરાશકર્તાને તે મોકલો.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> દ્વારા ADB ડિબગીંગ બંધ કરાયું છે. આમ કરવાથી 24 કલાકમાં તમારું <ph name="DEVICE_TYPE" /> રીસેટ થશે. તમે રાખવા માગતા હો તેવી કોઈપણ ફાઇલોનું બૅકઅપ લો.</translation>
+<translation id="6336194758029258346">ઍપની ભાષા</translation>
 <translation id="6337543438445391085">ડેટામાં હજી પણ અમુક વ્યક્તિગત માહિતી શામેલ હોઈ શકે છે. નિકાસ કરવામાં આવેલી ફાઇલોનો રિવ્યૂ કરવાની ખાતરી કરો.</translation>
 <translation id="6338968693068997776">USB ડિવાઇસ ઉમેરો</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> માટે એક નવી પ્રોફાઇલ બનાવો</translation>
@@ -7252,6 +7261,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">સાઇટના ડિવાઇસ પરના ડેટા માટે મંજૂરી નથી</translation>
 <translation id="6762833852331690540">ચાલુ</translation>
+<translation id="6762861159308991328">ઍપ સેટિંગમાં લિંક કેવી રીતે ખુલે છે તમે તે બદલી શકો છો</translation>
 <translation id="676560328519657314">Google Payમાં તમારી ચુકવણી પદ્ધતિઓ</translation>
 <translation id="6766488013065406604">Google Password Manager પર જાઓ</translation>
 <translation id="6767566652486411142">બીજી ભાષા પસંદ કરો...</translation>
@@ -7467,6 +7477,7 @@
 <translation id="6912007319859991306">સેલ્યુલર સિમ પિન</translation>
 <translation id="6912380255120084882">કોઈ બીજું ડિવાઇસ અજમાવી જુઓ</translation>
 <translation id="691289340230098384">કૅપ્શનની પસંદગીઓ</translation>
+<translation id="6914812290245989348">અસુરક્ષિત સાઇટ પર જતાં પહેલાં કોઈપણ ચેતવણીઓ જોશો નહીં</translation>
 <translation id="6916590542764765824">એક્સ્ટેન્શન મેનેજ કરો</translation>
 <translation id="6918677045355889289">ChromeOSને અપડેટ કરવાની જરૂર છે</translation>
 <translation id="6919354101107095996">સાઇટમાં સાઇન ઇન કરવાનો પ્રયાસ કરો. પછી, ફરીથી ડાઉનલોડ કરો</translation>
@@ -8944,6 +8955,7 @@
 <translation id="8076835018653442223">તમારા ઍડમિનિસ્ટ્રેટરે તમારા ડિવાઇસ પર સ્થાનિક ફાઇલોનો ઍક્સેસ બંધ કરેલો છે</translation>
 <translation id="8077120325605624147">તમે મુલાકાત લો છો તેવી કોઈપણ સાઇટ તમને કોઈપણ જાહેરાત બતાવી શકે છે</translation>
 <translation id="8077579734294125741">અન્ય Chrome પ્રોફાઇલ</translation>
+<translation id="80790299200510644">છબી વડે શોધ</translation>
 <translation id="80798452873915119">સાઇટ તમારા બધા ડિસ્પ્લે પર વિન્ડો મેનેજ કરવા માટે કહી શકે છે</translation>
 <translation id="8080028325999236607">બધા ટૅબ્સ બંધ કરો</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 10d4a750..2d8f7fa 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -581,6 +581,7 @@
 <translation id="1461041542809785877">Izvedba</translation>
 <translation id="1461177659295855031">Premjesti u mapu Traka oznaka</translation>
 <translation id="1461288887896722288">Upravo ste se prijavili na upravljani račun i izrada novog upravljanog profila omogućit će vam pristup nekim resursima povezanima s tim računom.</translation>
+<translation id="1461868306585780092">Upozori prije upotrebe nesigurnih veza</translation>
 <translation id="146219525117638703">Stanje ONC-a</translation>
 <translation id="146220085323579959">Internet je isključen. Provjerite internetsku vezu i pokušajte ponovo.</translation>
 <translation id="1462480037563370607">Dodajte web-lokacije ručno</translation>
@@ -1560,6 +1561,7 @@
 <translation id="2180620921879609685">Blokiraj sadržaj na bilo kojoj stranici</translation>
 <translation id="2181821976797666341">Pravila</translation>
 <translation id="2182058453334755893">Kopirano u međuspremnik</translation>
+<translation id="2182419606502127232">Uključi moje zapisnike poslužitelja.</translation>
 <translation id="2183570493397356669">Onemogućen je gumb Nastavi</translation>
 <translation id="2184515124301515068">Neka Chrome odluči kada web-lokacije mogu reproducirati zvuk (preporučeno)</translation>
 <translation id="2186206192313702726">Google objektiv</translation>
@@ -1754,6 +1756,7 @@
 <translation id="2323018538045954000">Spremljene Wi-Fi mreže</translation>
 <translation id="2325444234681128157">Zapamti zaporku</translation>
 <translation id="2326188115274135041">Potvrdite PIN da biste uključili automatsko otključavanje</translation>
+<translation id="2326906096734221931">Otvori postavke aplikacije</translation>
 <translation id="2326931316514688470">&amp;Ponovo učitaj aplikaciju</translation>
 <translation id="2327492829706409234">Omogući aplikaciju</translation>
 <translation id="2327920026543055248">Unesite sljedeći broj znakova: <ph name="CHARACTER" /> od ukupno <ph name="TOTAL" /></translation>
@@ -3891,6 +3894,7 @@
 <translation id="399788104667917863">Prikvačite na alatnu traku</translation>
 <translation id="3998976413398910035">Upravljajte pisačima</translation>
 <translation id="4001540981461989979">Isticanje pokazivača miša prilikom kretanja</translation>
+<translation id="4002347779798688515">Preuzeti se profil možda neće moći koristiti ako je davatelj mrežne usluge zaključan. Podršku potražite od davatelja usluga.</translation>
 <translation id="4002440992267487163">Postavi PIN</translation>
 <translation id="4005817994523282006">Način otkrivanja vremenske zone</translation>
 <translation id="4007856537951125667">Skrivanje prečaca</translation>
@@ -5427,6 +5431,7 @@
 <translation id="5261683757250193089">Otvori u web-trgovini</translation>
 <translation id="5261799091118902550">Ta datoteka možda je virus ili zlonamjerni softver. Možete je poslati Googleu da biste provjerili je li nesigurna.</translation>
 <translation id="5262784498883614021">Automatsko povezivanje s mrežom</translation>
+<translation id="5263656105659419083">Da biste se jednostavno vratili na bočnu ploču, kliknite Prikvači u gornjem desnom kutu</translation>
 <translation id="5264148714798105376">To može potrajati otprilike minutu.</translation>
 <translation id="5264252276333215551">Povežite se s internetom da biste pokrenuli svoju aplikaciju u načinu kioska.</translation>
 <translation id="5265797726250773323">Pogreška prilikom instalacije</translation>
@@ -5574,6 +5579,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{Pronađena je 1 web-lokacija s mnogo obavijesti}one{Pronađena je {NUM_SITES} web-lokacija s mnogo obavijesti}few{Pronađene su {NUM_SITES} web-lokacije s mnogo obavijesti}other{Pronađeno je {NUM_SITES} web-lokacija s mnogo obavijesti}}</translation>
 <translation id="5388885445722491159">Upareno</translation>
 <translation id="5389626883706033615">Web-lokacije od vas ne smiju tražiti da odobrite korištenje podataka koje je spremila o vama</translation>
+<translation id="5389794555912875905">Prikaži upozorenja prije prelaska na nesigurne web-lokacije (preporučeno)</translation>
 <translation id="5390112241331447203">Uključi system_logs.txt datoteku koja se šalje u izvješćima s povratnim informacijama.</translation>
 <translation id="5390677308841849479">Tamnocrvena i narančasta</translation>
 <translation id="5390743329570580756">Prima</translation>
@@ -5857,6 +5863,7 @@
 <translation id="5608580678041221894">Dodirnite sljedeće tipke da biste prilagodili ili pomaknuli područje za izrezivanje</translation>
 <translation id="5609231933459083978">Čini se da je ova aplikacija nevažeća.</translation>
 <translation id="561030196642865721">Na ovoj su web-lokaciji dopušteni kolačići treće strane</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Nažalost, vaša zaporka i dalje nije mogla biti potvrđena. Napomena: ako ste nedavno promijenili zaporku, vaša nova zaporka primjenjivat će se nakon što se odjavite. Ovdje upotrijebite staru zaporku.</translation>
 <translation id="5614190747811328134">Korisnička obavijest</translation>
 <translation id="5614553682702429503">Želite li spremiti zaporku?</translation>
@@ -6209,6 +6216,7 @@
 <translation id="5901089233978050985">Prijeđi na snimanje kartice</translation>
 <translation id="5901494423252125310">Otvorena su vratašca pisača</translation>
 <translation id="5901630391730855834">Žuta</translation>
+<translation id="5902892210366342391">Prikaži upozorenja prije prelaska na nesigurne web-lokacije u anonimnom načinu</translation>
 <translation id="5904614460720589786">Postavljanje aplikacije <ph name="APP_NAME" /> nije uspjelo zbog problema s konfiguracijom. Obratite se administratoru. Kôd pogreške: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Ažuriranje će uskoro biti gotovo. Za dovršetak ponovo pokrenite uređaj.</translation>
 <translation id="5906732635754427568">Podaci povezani s tom aplikacijom uklonit će se s uređaja.</translation>
@@ -6745,6 +6753,7 @@
 <translation id="6333170995003625229">Vaša e-adresa ili zaporka nije se mogla potvrditi. Ponovo se pokušajte prijaviti.</translation>
 <translation id="6334267141726449402">Kopirajte i pošaljite tu vezu korisniku radi prikupljanja zapisnika.</translation>
 <translation id="6336038146639916978">Domena <ph name="MANAGER" /> onemogućila je ADB otklanjanje pogrešaka. Zbog toga će se uređaj <ph name="DEVICE_TYPE" /> vratiti na zadano za 24 sata. Sigurnosno kopirajte sve datoteke koje želite zadržati.</translation>
+<translation id="6336194758029258346">Jezik aplikacije</translation>
 <translation id="6337543438445391085">Neki osobni podaci i dalje mogu biti uključeni u podatke. Svakako pregledajte izvezene datoteke.</translation>
 <translation id="6338968693068997776">Dodavanje USB uređaja</translation>
 <translation id="6339668969738228384">Izradi novi profil za <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -7254,6 +7263,7 @@
 <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation>
 <translation id="6761623907967804682">Nisu dopušteni podaci web-lokacije na uređaju</translation>
 <translation id="6762833852331690540">Uključeno</translation>
+<translation id="6762861159308991328">Način otvaranja veza možete promijeniti u postavkama aplikacije</translation>
 <translation id="676560328519657314">Vaši načini plaćanja na Google Payu</translation>
 <translation id="6766488013065406604">Otvorite Google upravitelja zaporki</translation>
 <translation id="6767566652486411142">Odabir drugog jezika…</translation>
@@ -7469,6 +7479,7 @@
 <translation id="6912007319859991306">PIN SIM-a za mobilnu mrežu</translation>
 <translation id="6912380255120084882">Pokušajte s nekim drugim uređajem</translation>
 <translation id="691289340230098384">Preferencije za titlove</translation>
+<translation id="6914812290245989348">Ne prikazuj upozorenja prije otvaranja nesigurnih web-lokacija</translation>
 <translation id="6916590542764765824">Upravljanje proširenjima</translation>
 <translation id="6918677045355889289">Potrebno je ažurirati Chrome OS</translation>
 <translation id="6919354101107095996">Pokušajte se prijaviti na web-lokaciju. Potom ponovite preuzimanje</translation>
@@ -8952,6 +8963,7 @@
 <translation id="8076835018653442223">Pristup lokalnim datotekama na vašem uređaju onemogućio je administrator</translation>
 <translation id="8077120325605624147">Svaka web-lokacija koju posjetite može vam prikazati bilo koji oglas</translation>
 <translation id="8077579734294125741">Ostali profili na Chromeu</translation>
+<translation id="80790299200510644">Pretraživanje slika</translation>
 <translation id="80798452873915119">Web-lokacije mogu tražiti dopuštenje za upravljanje prozorima na svim zaslonima</translation>
 <translation id="8080028325999236607">Zatvori sve kartice</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 8b9b5b3..9f46d1b 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -582,6 +582,7 @@
 <translation id="1461041542809785877">Teljesítmény</translation>
 <translation id="1461177659295855031">Áthelyezés a Könyvjelzősáv mappába</translation>
 <translation id="1461288887896722288">Ön felügyelt fiókkal jelentkezett be. Ha új felügyelt profilt hoz létre, hozzáférhet a fiókhoz kapcsolt egyes erőforrásokhoz.</translation>
+<translation id="1461868306585780092">Figyelmeztetés nem biztonságos kapcsolatok használata előtt</translation>
 <translation id="146219525117638703">ONC állapot</translation>
 <translation id="146220085323579959">Nem érhető el az internet. Kérjük, ellenőrizze az internetkapcsolatot, és próbálja újra.</translation>
 <translation id="1462480037563370607">Webhelyek hozzáadása manuálisan</translation>
@@ -1569,6 +1570,7 @@
 <translation id="2180620921879609685">Tartalmak letiltása bármely oldalon</translation>
 <translation id="2181821976797666341">Házirendek</translation>
 <translation id="2182058453334755893">Vágólapra másolva</translation>
+<translation id="2182419606502127232">Tartalmazza a szervernaplóimat.</translation>
 <translation id="2183570493397356669">Folytatás gomb letiltva</translation>
 <translation id="2184515124301515068">A Chrome dönthet arról, hogy a webhelyek lejátszhatnak-e hangot (ajánlott)</translation>
 <translation id="2186206192313702726">Google Lens</translation>
@@ -1765,6 +1767,7 @@
 <translation id="2323018538045954000">Mentett Wi-Fi-hálózatok</translation>
 <translation id="2325444234681128157">Jelszó megjegyzése</translation>
 <translation id="2326188115274135041">A PIN-kód megerősítése az automatikus feloldás bekapcsolásához</translation>
+<translation id="2326906096734221931">Alkalmazásbeállítások megnyitása</translation>
 <translation id="2326931316514688470">Alkalmazás új&amp;ratöltése</translation>
 <translation id="2327492829706409234">Alkalmazás engedélyezése</translation>
 <translation id="2327920026543055248"><ph name="CHARACTER" />. karakter megadása az összesen <ph name="TOTAL" /> karakterből</translation>
@@ -3901,10 +3904,12 @@
 <translation id="399788104667917863">Rögzítés az eszköztárra</translation>
 <translation id="3998976413398910035">Nyomtatók kezelése</translation>
 <translation id="4001540981461989979">Egérkurzor kiemelése mozgatáskor</translation>
+<translation id="4002347779798688515">Előfordulhat, hogy a letöltött profil nem használható, ha zárolva van a mobilhálózat-szolgáltató. Segítségért forduljon a szolgáltatóhoz.</translation>
 <translation id="4002440992267487163">PIN-kód beállítása</translation>
 <translation id="4005817994523282006">Időzóna-észlelési módszer</translation>
 <translation id="4007856537951125667">Parancsikonok elrejtése</translation>
 <translation id="4008291085758151621">A webhely-információk nem állnak rendelkezésre VR-módban</translation>
+<translation id="4010746393007464819">Frissíthet a következőre: Debian 12 (Bookworm)</translation>
 <translation id="4010917659463429001">Könyvjelzők eléréséhez mobileszközön: <ph name="GET_IOS_APP_LINK" />.</translation>
 <translation id="4014432863917027322">Javítja a következőt: „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="4015163439792426608">Használ bővítményeket? Egyetlen helyen, egyszerűen <ph name="BEGIN_LINK" />kezelheti őket<ph name="END_LINK" />.</translation>
@@ -5438,6 +5443,7 @@
 <translation id="5261683757250193089">Megnyitás az Internetes áruházban</translation>
 <translation id="5261799091118902550">Lehet, hogy ez a fájl vírus vagy rosszindulatú program. Elküldheti a Google-nak biztonsági ellenőrzésre.</translation>
 <translation id="5262784498883614021">Automatikus csatlakozás a hálózathoz</translation>
+<translation id="5263656105659419083">Az oldalsó panelre való egyszerű visszatéréshez kattintson a jobb felső sarokban lévő Kitűzés gombra</translation>
 <translation id="5264148714798105376">Ez eltarthat egy-két percig.</translation>
 <translation id="5264252276333215551">Csatlakozzon az internethez az alkalmazás kioszk módban való indításához.</translation>
 <translation id="5265797726250773323">Hiba a telepítés során</translation>
@@ -5585,6 +5591,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{1 webhelyet találtunk sok értesítéssel}other{{NUM_SITES} webhelyet találtunk sok értesítéssel}}</translation>
 <translation id="5388885445722491159">Párosítva</translation>
 <translation id="5389626883706033615">A webhelyek nem kérhetik Öntől az Önről elmentett adatok használatát</translation>
+<translation id="5389794555912875905">Figyelmeztetések megjelenítése a nem biztonságos webhelyek felkeresése előtt (ajánlott)</translation>
 <translation id="5390112241331447203">A system_logs.txt fájl is kerüljön be a visszajelzési jelentésekbe.</translation>
 <translation id="5390677308841849479">Sötétvörös-narancssárga</translation>
 <translation id="5390743329570580756">Küldés –</translation>
@@ -5868,6 +5875,7 @@
 <translation id="5608580678041221894">Az alábbi kulcsokra koppintva módosítható vagy mozgatható a körbevágás területe</translation>
 <translation id="5609231933459083978">Úgy tűnik, hogy az alkalmazás érvénytelen.</translation>
 <translation id="561030196642865721">Ezen a webhelyen engedélyezett a harmadik felektől származó cookie-k használata</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Sajnos a jelszó ellenőrzése még mindig nem sikerült. Megjegyzés: ha a közelmúltban módosította jelszavát, az új jelszó kijelentkezés után kerül beállításra, ezért kérjük, itt a régi jelszót használja.</translation>
 <translation id="5614190747811328134">Felhasználói értesítés</translation>
 <translation id="5614553682702429503">Szeretné elmenteni a jelszót?</translation>
@@ -6066,6 +6074,7 @@
 <translation id="5782040878821624922">Bármilyen eszközön rendelkezésre áll.</translation>
 <translation id="5782227691023083829">A fordítás folyamatban...</translation>
 <translation id="57838592816432529">Némítás</translation>
+<translation id="5784291589716625675">Alkalmazás nyelvének módosítása</translation>
 <translation id="5785583009707899920">Chrome-fájlokkal kapcsolatos segédprogramok</translation>
 <translation id="5787146423283493983">Kulcsmegegyezés</translation>
 <translation id="5787420647064736989">Eszköznév</translation>
@@ -6223,6 +6232,7 @@
 <translation id="5901089233978050985">Váltás rögzítő lapra</translation>
 <translation id="5901494423252125310">A nyomtató fedele nyitva van</translation>
 <translation id="5901630391730855834">Sárga</translation>
+<translation id="5902892210366342391">Figyelmeztetések megjelenítése inkognitó módban a nem biztonságos webhelyek felkeresése előtt</translation>
 <translation id="5904614460720589786">A(z) <ph name="APP_NAME" /> beállítása konfigurációs probléma miatt nem sikerült. Forduljon a rendszergazdájához. Hibakód: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Már majdnem naprakész! Indítsa újra az eszközt a frissítés befejezéséhez.</translation>
 <translation id="5906732635754427568">Az alkalmazáshoz kapcsolódó adatok törlődnek erről az eszközről.</translation>
@@ -6539,6 +6549,7 @@
 <translation id="6151323131516309312">Nyomja meg a(z) <ph name="SEARCH_KEY" /> gombot a(z) <ph name="SITE_NAME" /> kereséshez</translation>
 <translation id="6151771661215463137">A fájl már megtalálható a letöltések mappájában.</translation>
 <translation id="6152918902620844577">Várakozás a következő műveletre…</translation>
+<translation id="6153439704237222699">További információ a Do Not Track funkcióról</translation>
 <translation id="6154240335466762404">Összes port eltávolítása</translation>
 <translation id="615436196126345398">Protokoll</translation>
 <translation id="6155141482566063812">Az egyik háttérben futó lap megosztja az Ön képernyőjét</translation>
@@ -6760,6 +6771,7 @@
 <translation id="6333170995003625229">Nem sikerült ellenőrizni az e-mail-címét vagy jelszavát. Próbáljon újra bejelentkezni.</translation>
 <translation id="6334267141726449402">Másolja vágólapra és küldje el ezt a linket a felhasználónak a naplók összegyűjtéséhez.</translation>
 <translation id="6336038146639916978">A(z) <ph name="MANAGER" /> letiltotta az ADB-hibakeresést. Ezzel visszaállítja <ph name="DEVICE_TYPE" /> eszközét 24 órán belül. Készítsen biztonsági másolatot a megőrizni kívánt fájlokról.</translation>
+<translation id="6336194758029258346">Az alkalmazás nyelve</translation>
 <translation id="6337543438445391085">Egyes személyes adatok továbbra is szerepelhetnek az adatokban. Mindenképpen tekintse át az exportált fájlokat.</translation>
 <translation id="6338968693068997776">USB-eszköz hozzáadása</translation>
 <translation id="6339668969738228384">Új profil létrehozása a következőhöz: <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -7265,6 +7277,7 @@
 <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />”</translation>
 <translation id="6761623907967804682">Az eszközalapú webhelyadatok nem engedélyezettek</translation>
 <translation id="6762833852331690540">Be</translation>
+<translation id="6762861159308991328">A linkek megnyitásának módját az Alkalmazásbeállításokban módosíthatja</translation>
 <translation id="676560328519657314">Az Ön fizetési módjai a Google Pay szolgáltatásban</translation>
 <translation id="6766488013065406604">Ugrás a Google Jelszókezelőhöz</translation>
 <translation id="6767566652486411142">Másik nyelv választása…</translation>
@@ -7480,6 +7493,7 @@
 <translation id="6912007319859991306">Mobilos SIM PIN-kódja</translation>
 <translation id="6912380255120084882">Próbálkozzon másik eszközzel</translation>
 <translation id="691289340230098384">Feliratbeállítások</translation>
+<translation id="6914812290245989348">Ne jelenjenek meg figyelmeztetések a nem biztonságos webhelyek megnyitása előtt</translation>
 <translation id="6916590542764765824">Bővítmények kezelése</translation>
 <translation id="6918677045355889289">A ChromeOS frissítése szükséges</translation>
 <translation id="6919354101107095996">Próbáljon bejelentkezni a webhelyre. Ezt követően próbálja meg ismét letölteni.</translation>
@@ -8854,6 +8868,7 @@
 <translation id="7988805580376093356">Az operációs rendszer megtartása és a(z) <ph name="DEVICE_OS" /> futtatása USB-ről.</translation>
 <translation id="7988876720343145286">További Android-beállítások és -engedélyek</translation>
 <translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> – <ph name="COUNT" />. hang</translation>
+<translation id="7990958035181555539">Wi-Fi automatikus átvitele androidos telefonról</translation>
 <translation id="7991296728590311172">A kapcsolóalapú hozzáférés beállításai</translation>
 <translation id="7992203134935383159">Beszédszintézis</translation>
 <translation id="7994515119120860317">A képen lévő szöveg fordítása a következővel: <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
@@ -8962,6 +8977,7 @@
 <translation id="8076835018653442223">A rendszergazda letiltotta a helyi fájlok elérését az eszközön</translation>
 <translation id="8077120325605624147">Bármely felkeresett webhely bármilyen hirdetést megjeleníthet Önnek</translation>
 <translation id="8077579734294125741">Egyéb Chrome-profilok</translation>
+<translation id="80790299200510644">Képkereső</translation>
 <translation id="80798452873915119">A webhelyek engedélyt kérhetnek arra, hogy az összes képernyőn kezeljék az ablakokat</translation>
 <translation id="8080028325999236607">Összes lap bezárása</translation>
 <translation id="808089508890593134">Google</translation>
@@ -9800,6 +9816,7 @@
 <translation id="8736288397686080465">Ez a webhely frissült a háttérben.</translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">Válassza ki a nyelvet, amelyre le szeretné fordítani az oldalt</translation>
+<translation id="8738418093147087440">Keresés ország, nyelv vagy beviteli nevek alapján</translation>
 <translation id="8740086188450289493">A Google-fiók jelszavának használata</translation>
 <translation id="8740247629089392745">Átadhatja a Chromebookot <ph name="SUPERVISED_USER_NAME" /> számára. A beállítás majdnem kész, eljött a felfedezés ideje.</translation>
 <translation id="8740672167979365981">Szükség van a ChromeOS Flex frissítésére</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index ce87e44..0b68207 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -584,6 +584,7 @@
 <translation id="1461041542809785877">ביצועים</translation>
 <translation id="1461177659295855031">העברה לתיקייה 'סרגל הסימניות'</translation>
 <translation id="1461288887896722288">נכנסת לחשבון מנוהל. יצירת פרופיל מנוהל חדש תאפשר לך לגשת לחלק מהמשאבים שמקושרים לחשבון הזה.</translation>
+<translation id="1461868306585780092">הצגת אזהרה לפני שימוש בחיבורים לא מאובטחים</translation>
 <translation id="146219525117638703">‏מצב ONC</translation>
 <translation id="146220085323579959">האינטרנט מנותק. יש לבדוק את חיבור האינטרנט שלך ולנסות שוב.</translation>
 <translation id="1462480037563370607">הוספת אתרים באופן ידני</translation>
@@ -1569,6 +1570,7 @@
 <translation id="2180620921879609685">לחסום תוכן בכל דף</translation>
 <translation id="2181821976797666341">מדיניות</translation>
 <translation id="2182058453334755893">הועתק אל הלוח</translation>
+<translation id="2182419606502127232">אני רוצה לכלול את יומני השרת שלי.</translation>
 <translation id="2183570493397356669">הלחצן 'המשך' מושבת</translation>
 <translation id="2184515124301515068">‏Chrome יקבע מתי אתרים יכולים להפעיל צלילים (מומלץ)</translation>
 <translation id="2186206192313702726">Google Lens</translation>
@@ -1765,6 +1767,7 @@
 <translation id="2323018538045954000">‏רשתות Wi-Fi שמורות</translation>
 <translation id="2325444234681128157">שמירת סיסמה</translation>
 <translation id="2326188115274135041">יש לאשר את קוד האימות כדי להפעיל את ביטול הנעילה האוטומטי</translation>
+<translation id="2326906096734221931">פתיחה של הגדרות האפליקציה</translation>
 <translation id="2326931316514688470">&amp;טעינת האפליקציה מחדש</translation>
 <translation id="2327492829706409234">הפעלת האפליקציה</translation>
 <translation id="2327920026543055248">הזנת תו <ph name="CHARACTER" /> מתוך <ph name="TOTAL" /></translation>
@@ -3903,6 +3906,7 @@
 <translation id="399788104667917863">הצמדה לסרגל הכלים</translation>
 <translation id="3998976413398910035">ניהול המדפסות</translation>
 <translation id="4001540981461989979">להדגיש את סמן העכבר כשהוא זז</translation>
+<translation id="4002347779798688515">אם ספק הרשת הסלולרית נעול, ייתכן שלא ניתן יהיה להשתמש בפרופיל שהורד. עליך לפנות לספק לקבלת תמיכה.</translation>
 <translation id="4002440992267487163">הגדרת קוד אימות</translation>
 <translation id="4005817994523282006">שיטה לזיהוי אזור זמן</translation>
 <translation id="4007856537951125667">הסתרת קיצורי הדרך</translation>
@@ -5440,6 +5444,7 @@
 <translation id="5261683757250193089">פתיחה בחנות האינטרנט</translation>
 <translation id="5261799091118902550">‏הקובץ עשוי להיות וירוס או תוכנה זדונית. ניתן לשלוח אותו ל-Google כדי לבדוק אם הוא לא בטוח.</translation>
 <translation id="5262784498883614021">התחברות אוטומטית לרשת</translation>
+<translation id="5263656105659419083">כדי לחזור בקלות לחלונית הצדדית, לוחצים על 'הצמדה' בפינה השמאלית העליונה</translation>
 <translation id="5264148714798105376">הפעולה יכולה להימשך כדקה.</translation>
 <translation id="5264252276333215551">יש להתחבר לאינטרנט כדי להפעיל את היישום במצב קיוסק.</translation>
 <translation id="5265797726250773323">קרתה שגיאה במהלך ההתקנה</translation>
@@ -5587,6 +5592,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{נמצא אתר אחד עם הרבה התראות}one{נמצאו {NUM_SITES} אתרים עם הרבה התראות}two{נמצאו {NUM_SITES} אתרים עם הרבה התראות}other{נמצאו {NUM_SITES} אתרים עם הרבה התראות}}</translation>
 <translation id="5388885445722491159">מתואם</translation>
 <translation id="5389626883706033615">אתרים לא יכולים לבקש ממך הרשאה להשתמש במידע שנשמר עליך</translation>
+<translation id="5389794555912875905">הצגת אזהרות לפני מעבר לאתרים לא מאובטחים (מומלץ)</translation>
 <translation id="5390112241331447203">‏הכללה של הקובץ system_logs.txt שנשלח בדוחות המשוב.</translation>
 <translation id="5390677308841849479">אדום כהה וכתום</translation>
 <translation id="5390743329570580756">שליחה עבור</translation>
@@ -5870,6 +5876,7 @@
 <translation id="5608580678041221894">יש להקיש על המקשים הבאים כדי לשנות או להזיז את אזור החיתוך</translation>
 <translation id="5609231933459083978">נראה שהיישום אינו חוקי.</translation>
 <translation id="561030196642865721">‏קובצי cookie של צד שלישי מותרים באתר הזה</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />,‏ <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">מצטערים, עדיין לא ניתן לאמת את הסיסמה שלך. שים לב: אם שינית את סיסמתך לאחרונה, הסיסמה החדשה תיכנס לתוקף לאחר היציאה מהמערכת. יש להשתמש בסיסמה הישנה כאן.</translation>
 <translation id="5614190747811328134">הודעת משתמש</translation>
 <translation id="5614553682702429503">לשמור את הסיסמה?</translation>
@@ -6224,6 +6231,7 @@
 <translation id="5901089233978050985">לכרטיסיית ההקלטה</translation>
 <translation id="5901494423252125310">דלת המדפסת פתוחה</translation>
 <translation id="5901630391730855834">צהוב</translation>
+<translation id="5902892210366342391">הצגת אזהרות לפני מעבר לאתרים לא מאובטחים במצב פרטי</translation>
 <translation id="5904614460720589786">לא ניתן להתקין את האפליקציה <ph name="APP_NAME" /> עקב בעיה בהגדרות. יש לפנות למנהל המערכת. קוד שגיאה: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">העדכון כמעט הושלם! צריך להפעיל מחדש את המכשיר כדי לסיים את העדכון.</translation>
 <translation id="5906732635754427568">המערכת תסיר מהמכשיר הזה נתונים המשויכים לאפליקציה הזו.</translation>
@@ -6761,6 +6769,7 @@
 <translation id="6333170995003625229">לא ניתן לאמת את כתובת האימייל או את הסיסמה שלך. יש לנסות להיכנס שוב.</translation>
 <translation id="6334267141726449402">כדי לאסוף את היומנים, צריך להעתיק את הקישור הזה ולשלוח אותו למשתמש.</translation>
 <translation id="6336038146639916978">‏ניפוי באגים באמצעות ADB הושבת על-ידי <ph name="MANAGER" />. פעולה זו תאפס את <ph name="DEVICE_TYPE" /> בתוך 24 שעות. כדאי לגבות קבצים שברצונך לשמור.</translation>
+<translation id="6336194758029258346">שפת האפליקציה</translation>
 <translation id="6337543438445391085">יכול להיות שפרטים אישיים מסוימים עדיין ייכללו בנתונים. חשוב לבדוק את הקבצים שיוצאו.</translation>
 <translation id="6338968693068997776">‏הוספת התקן USB</translation>
 <translation id="6339668969738228384">יצירת פרופיל חדש בשביל <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -7270,6 +7279,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">אין הרשאה לשמירת נתונים מאתרים במכשיר</translation>
 <translation id="6762833852331690540">מופעל</translation>
+<translation id="6762861159308991328">אפשר לשנות את אופן הפתיחה של קישורים בהגדרות האפליקציה</translation>
 <translation id="676560328519657314">‏אמצעי התשלום שלך ב-Google Pay</translation>
 <translation id="6766488013065406604">‏ל'מנהל הסיסמאות של Google'</translation>
 <translation id="6767566652486411142">בחירת שפה אחרת...</translation>
@@ -7485,6 +7495,7 @@
 <translation id="6912007319859991306">‏קוד גישה לכרטיס ה-SIM הסלולרי</translation>
 <translation id="6912380255120084882">צריך לנסות מכשיר אחר</translation>
 <translation id="691289340230098384">הגדרות מועדפות לכתוביות</translation>
+<translation id="6914812290245989348">המערכת לא תציג אזהרות לפני מעבר לאתרים לא מאובטחים</translation>
 <translation id="6916590542764765824">ניהול תוספים</translation>
 <translation id="6918677045355889289">‏נדרש עדכון של ChromeOS</translation>
 <translation id="6919354101107095996">אפשר לנסות להיכנס לאתר. לאחר מכן, אפשר להוריד שוב.</translation>
@@ -8967,6 +8978,7 @@
 <translation id="8076835018653442223">מנהל המערכת ביטל את הגישה לקבצים מקומיים במכשיר שלך</translation>
 <translation id="8077120325605624147">לכל אתר שבו מבקרים יש הרשאה להציג כל מודעה</translation>
 <translation id="8077579734294125741">‏פרופילים אחרים ב-Chrome</translation>
+<translation id="80790299200510644">חיפוש באמצעות תמונות</translation>
 <translation id="80798452873915119">אתרים יכולים לבקש הרשאה לנהל את החלונות בכל המסכים</translation>
 <translation id="8080028325999236607">סגור את כל הכרטיסיות</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index bf965427..0444953 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -9160,7 +9160,7 @@
 <translation id="8248050856337841185">&amp;Ielīmēt</translation>
 <translation id="8248381369318572865">Piekļuve jūsu mikrofonam un jūsu runas analīze</translation>
 <translation id="8248887045858762645">Chrome padoms</translation>
-<translation id="8249048954461686687">OEM mape</translation>
+<translation id="8249048954461686687">OAR mape</translation>
 <translation id="8249239468199142122">Akumulatora enerģijas taupīšanas režīms</translation>
 <translation id="8250210000648910632">Krātuvē vairs nav vietas</translation>
 <translation id="8251441930213048644">Atsvaidzināt tūlīt</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index b43d4b5..268c177 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -582,6 +582,7 @@
 <translation id="1461041542809785877">Хүчин чадал</translation>
 <translation id="1461177659295855031">Хавчуургын хэсэг хавтас руу зөөх</translation>
 <translation id="1461288887896722288">Та дөнгөж сая тохиргоо хийгдсэн бүртгэлээр нэвтэрсэн. Шинэ тохиргоо хийгдсэн профайл үүсгэх нь танд тухайн бүртгэлтэй холбосон зарим нөөцөд хандахыг зөвшөөрнө.</translation>
+<translation id="1461868306585780092">Аюултай холболтууд ашиглаж эхлэхээс өмнө сануулах</translation>
 <translation id="146219525117638703">ONC Төлөв</translation>
 <translation id="146220085323579959">Интернэт салсан байна. Интернетийн холболтоо шалгаад дахин хандана уу.</translation>
 <translation id="1462480037563370607">Сайтуудыг гар аргаар нэмэх</translation>
@@ -1566,6 +1567,7 @@
 <translation id="2180620921879609685">Аливаа хуудсан дээрх контентыг блоклох</translation>
 <translation id="2181821976797666341">Тохиргоонууд</translation>
 <translation id="2182058453334755893">Түр санах ой руу хуулсан</translation>
+<translation id="2182419606502127232">Миний серверийн логийг оруулна уу.</translation>
 <translation id="2183570493397356669">Үргэлжлүүлэх товчлуурыг идэвхгүй болгосон</translation>
 <translation id="2184515124301515068">Сайтуудад дуу тоглуулах боломжтой үеийг сонгох зөвшөөрлийг Chrome-д олгох (санал болгосон)</translation>
 <translation id="2186206192313702726">Google Lens</translation>
@@ -1762,6 +1764,7 @@
 <translation id="2323018538045954000">Хадгалсан Wi-Fi сүлжээнүүд</translation>
 <translation id="2325444234681128157">Нууц үг санах</translation>
 <translation id="2326188115274135041">Түгжээг автоматаар тайлах үйлдлийг идэвхжүүлэхийн тулд ПИН-г баталгаажуулна уу</translation>
+<translation id="2326906096734221931">Аппын тохиргоог нээх</translation>
 <translation id="2326931316514688470">Аппыг дахин ачаалла</translation>
 <translation id="2327492829706409234">Аппликейшнийг идэвхжүүл</translation>
 <translation id="2327920026543055248"><ph name="TOTAL" />-с <ph name="CHARACTER" />-р тэмдгийг оруулна уу</translation>
@@ -3898,6 +3901,7 @@
 <translation id="399788104667917863">Самбарт бэхлэх</translation>
 <translation id="3998976413398910035">Хэвлэгчдийг удирдах</translation>
 <translation id="4001540981461989979">Хулганын курсорыг хөдөлж байх үед тодруулах</translation>
+<translation id="4002347779798688515">Хэрэв мобайл сүлжээ нийлүүлэгч түгжээтэй бол татсан профайлыг ашиглах боломжгүй байж магадгүй. Тусламж авах бол нийлүүлэгчтэйгээ холбогдоно уу.</translation>
 <translation id="4002440992267487163">Пинийн тохируулга</translation>
 <translation id="4005817994523282006">Цагийн бүс илрүүлэх арга</translation>
 <translation id="4007856537951125667">Товчлолыг нуух</translation>
@@ -5435,6 +5439,7 @@
 <translation id="5261683757250193089">Веб дэлгүүрт нээх</translation>
 <translation id="5261799091118902550">Энэ файл вирус эсвэл хортой программ байж магадгүй. Та үүнийг аюултай эсэхийг шалгуулахаар Google-д илгээх боломжтой.</translation>
 <translation id="5262784498883614021">Сүлжээнд автоматаар холбогдох</translation>
+<translation id="5263656105659419083">Хажуугийн самбар луу хялбархан буцахын тулд баруун дээд талын Бэхлэхийг товшино уу</translation>
 <translation id="5264148714798105376">Үүнд нэг эсвэл хоёр минут шаардлагатай.</translation>
 <translation id="5264252276333215551">Програмаа kiosk горимд эхлүүлэхийн тулд интернетэд холбогдоно уу.</translation>
 <translation id="5265797726250773323">Суулгах явцад алдаа гарлаа</translation>
@@ -5582,6 +5587,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{Маш олон мэдэгдэлтэй 1 сайтыг олсон}other{Маш олон мэдэгдэлтэй {NUM_SITES} сайтыг олсон}}</translation>
 <translation id="5388885445722491159">Холбосон</translation>
 <translation id="5389626883706033615">Сайтуудыг танаас таны талаар хадгалсан мэдээллээ ашиглахыг хүсэхийг блоклосон</translation>
+<translation id="5389794555912875905">Аюултай сайтууд руу очихоос өмнө сануулга харах (санал болгосон)</translation>
 <translation id="5390112241331447203">Санал хүсэлтийн тайланд илгээсэн system_logs.txt файлыг багтаана.</translation>
 <translation id="5390677308841849479">Бараан улаан ба улбар шар</translation>
 <translation id="5390743329570580756">Дараахад илгээх</translation>
@@ -5865,6 +5871,7 @@
 <translation id="5608580678041221894">Тайрсан хэсгийг тохируулах эсвэл зөөхийн тулд дараах түлхүүрийг товшино уу</translation>
 <translation id="5609231933459083978">Энэхүү апп нь хүчин төгөлдөр бус апп байж болзошгүй байна.</translation>
 <translation id="561030196642865721">Гуравдагч талын күүкиг энэ сайт дээр зөвшөөрсөн</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Уучлаарай, таны нууц үгийг баталгаажуулах боломжгүй байна. Анхааруулга: Хэрэв та нууц үгээ сольсон бол таныг холбогдох хэсгээс гаран дахин хандах үед шинэ нууц үг тань ашиглагдах болно. Хэрэв та хуучин нууц үгээ ашиглах бол энэ хэсгийг ашиглана уу.</translation>
 <translation id="5614190747811328134">Хэрэглэгчийн сануулга</translation>
 <translation id="5614553682702429503">Нууц үгийг хадгалах уу?</translation>
@@ -6220,6 +6227,7 @@
 <translation id="5901089233978050985">Авч буй таб руу сэлгэх</translation>
 <translation id="5901494423252125310">Хэвлэгчийн таг нээлттэй байна</translation>
 <translation id="5901630391730855834">Шар</translation>
+<translation id="5902892210366342391">Нууцлалын горимд аюултай сайтууд руу очихоос өмнө сануулга харах</translation>
 <translation id="5904614460720589786">Тохируулгын асуудлын улмаас <ph name="APP_NAME" />-г тохируулж чадсангүй. Админтайгаа холбогдоно уу. Алдааны код: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Удахгүй шинэчилж дууслаа! Шинэчлэлтийг дуусгахын тулд төхөөрөмжөө дахин асаана уу.</translation>
 <translation id="5906732635754427568">Энэ апп-тай холбоотой өгөгдлийг төхөөрөмжөөс устгах болно.</translation>
@@ -6756,6 +6764,7 @@
 <translation id="6333170995003625229">Таны имэйл хаяг эсвэл нууц үгийг баталгаажуулж чадсангүй. Дахин нэвтрэхээр оролдоно уу.</translation>
 <translation id="6334267141726449402">Логуудыг цуглуулахын тулд энэ холбоосыг хуулаад хэрэглэгчид илгээнэ үү.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> ADB дебагийг идэвхгүй болгосон. Энэ нь таны <ph name="DEVICE_TYPE" />-г 24 цагийн дотор шинэчилнэ. Хадгалахыг хүссэн дурын файлуудаа хуулбарлана уу.</translation>
+<translation id="6336194758029258346">Аппын хэл</translation>
 <translation id="6337543438445391085">Зарим хувийн мэдээллийг өгөгдөлд багтаасан хэвээр байж магадгүй. Экспортолсон файлуудыг шалгана уу.</translation>
 <translation id="6338968693068997776">USB төхөөрөмж нэмнэ үү</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" />-д шинэ профайл үүсгэх</translation>
@@ -7261,6 +7270,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">Төхөөрөмж дээрх сайтын өгөгдлийг зөвшөөрдөггүй</translation>
 <translation id="6762833852331690540">Асаалттай</translation>
+<translation id="6762861159308991328">Та холбооснуудыг хэрхэн нээхийг Аппын тохиргоонд өөрчлөх боломжтой</translation>
 <translation id="676560328519657314">Таны Google Pay дэх төлбөрийн хэрэгслүүд</translation>
 <translation id="6766488013065406604">Google Password Manager-т очих</translation>
 <translation id="6767566652486411142">Өөр хэл сонгох...</translation>
@@ -7476,6 +7486,7 @@
 <translation id="6912007319859991306">Үүрэн холбооны SIM-н ПИН</translation>
 <translation id="6912380255120084882">Өөр төхөөрөмж туршина уу</translation>
 <translation id="691289340230098384">Хадмалын тохируулга</translation>
+<translation id="6914812290245989348">Аюултай сайтууд руу очихоос өмнө ямар нэг сануулга харахгүй</translation>
 <translation id="6916590542764765824">Удирдлаганд байдаг өргөтгөлүүд</translation>
 <translation id="6918677045355889289">ChromeOS-н шинэчлэлт шаардлагатай</translation>
 <translation id="6919354101107095996">Сайтад нэвтрэхээр оролдоно уу. Дараа нь дахин татна уу</translation>
@@ -8955,6 +8966,7 @@
 <translation id="8076835018653442223">Таны админ төхөөрөмжийн дотоод файлд хандах тохиргоог идэвхгүй болгосон</translation>
 <translation id="8077120325605624147">Таны зочилсон ямар ч сайт танд ямар ч зар харуулах боломжтой</translation>
 <translation id="8077579734294125741">Chrome-н бусад профайл</translation>
+<translation id="80790299200510644">Зурган хайлт</translation>
 <translation id="80798452873915119">Сайтууд таны бүх дэлгэц дээр цонх удирдахыг хүсэх боломжтой</translation>
 <translation id="8080028325999236607">Бүх цонхнуудыг хаах</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 497548c..2698503 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -582,6 +582,7 @@
 <translation id="1461041542809785877">Prestasi</translation>
 <translation id="1461177659295855031">Alihkan ke folder Bar Penanda Halaman</translation>
 <translation id="1461288887896722288">Anda baru sahaja log masuk ke akaun terurus, tindakan membuat profil terurus baharu akan membenarkan anda untuk mengakses beberapa sumber yang dipautkan kepada akaun tersebut.</translation>
+<translation id="1461868306585780092">Amaran sebelum menggunakan sambungan yang tidak selamat</translation>
 <translation id="146219525117638703">Keadaan ONC</translation>
 <translation id="146220085323579959">Internet terputus. Sila periksa sambungan internet anda dan cuba lagi.</translation>
 <translation id="1462480037563370607">Tambahkan laman secara manual</translation>
@@ -1570,6 +1571,7 @@
 <translation id="2180620921879609685">Sekat kandungan pada mana-mana halaman</translation>
 <translation id="2181821976797666341">Dasar</translation>
 <translation id="2182058453334755893">Disalin ke Papan Keratan Anda</translation>
+<translation id="2182419606502127232">Sertakan log pelayan saya.</translation>
 <translation id="2183570493397356669">Butang teruskan dilumpuhkan</translation>
 <translation id="2184515124301515068">Benarkan Chrome memilih masa tapak boleh memainkan bunyi (disyorkan)</translation>
 <translation id="2186206192313702726">Google Lens</translation>
@@ -1766,6 +1768,7 @@
 <translation id="2323018538045954000">Rangkaian Wi-Fi yang disimpan</translation>
 <translation id="2325444234681128157">Ingat kata laluan</translation>
 <translation id="2326188115274135041">Sahkan PIN untuk menghidupkan buka kunci automatik</translation>
+<translation id="2326906096734221931">Buka tetapan Apl</translation>
 <translation id="2326931316514688470">&amp;Muat semula apl</translation>
 <translation id="2327492829706409234">Dayakan apl</translation>
 <translation id="2327920026543055248">Masukkan aksara <ph name="CHARACTER" /> daripada <ph name="TOTAL" /></translation>
@@ -3903,10 +3906,12 @@
 <translation id="399788104667917863">Semat pada bar alat</translation>
 <translation id="3998976413398910035">Urus pencetak</translation>
 <translation id="4001540981461989979">Serlahkan kursor tetikus semasa bergerak</translation>
+<translation id="4002347779798688515">Profil yang dimuat turun mungkin tidak boleh digunakan jika penyedia rangkaian mudah alih dikunci. Hubungi penyedia anda untuk mendapatkan sokongan.</translation>
 <translation id="4002440992267487163">Persediaan PIN</translation>
 <translation id="4005817994523282006">Kaedah pengesanan zon waktu</translation>
 <translation id="4007856537951125667">Sembunyikan pintasan</translation>
 <translation id="4008291085758151621">Maklumat tapak tidak tersedia dalam VR</translation>
+<translation id="4010746393007464819">Peningkatan kepada Debian 12 (Bookworm) tersedia</translation>
 <translation id="4010917659463429001">Untuk mendapatkan penanda halaman anda pada peranti mudah alih, <ph name="GET_IOS_APP_LINK" />.</translation>
 <translation id="4014432863917027322">Baiki "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="4015163439792426608">Ada sambungan? <ph name="BEGIN_LINK" />Urus sambungan anda<ph name="END_LINK" /> di satu tempat yang mudah.</translation>
@@ -5440,6 +5445,7 @@
 <translation id="5261683757250193089">Buka dalam Gedung Web</translation>
 <translation id="5261799091118902550">Fail ini mungkin virus atau perisian hasad. Anda boleh menghantar fail ini kepada Google untuk menyemak jika fail tersebut tidak selamat.</translation>
 <translation id="5262784498883614021">Sambung kepada rangkaian secara automatik</translation>
+<translation id="5263656105659419083">Untuk kembali kepada panel sisi dengan mudah, klik Pin pada bahagian atas sebelah kanan</translation>
 <translation id="5264148714798105376">Proses ini mungkin mengambil masa seminit atau lebih.</translation>
 <translation id="5264252276333215551">Sila sambung ke Internet untuk melancarkan apl anda dalam mod kios.</translation>
 <translation id="5265797726250773323">Ralat semasa pemasangan</translation>
@@ -5587,6 +5593,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{Menemukan 1 laman dengan pemberitahuan yang banyak}other{Menemukan {NUM_SITES} laman dengan pemberitahuan yang banyak}}</translation>
 <translation id="5388885445722491159">Dipasangkan</translation>
 <translation id="5389626883706033615">Laman disekat daripada meminta anda menggunakan maklumat yang disimpan tentang anda</translation>
+<translation id="5389794555912875905">Lihat amaran sebelum mengakses laman yang tidak selamat (disyorkan)</translation>
 <translation id="5390112241331447203">Sertakan fail system_logs.txt yang dihantar dalam laporan maklum balas.</translation>
 <translation id="5390677308841849479">Merah gelap dan jingga</translation>
 <translation id="5390743329570580756">Hantar untuk</translation>
@@ -5870,6 +5877,7 @@
 <translation id="5608580678041221894">Ketik kekunci berikut untuk melaras atau mengalihkan kawasan pemangkasan</translation>
 <translation id="5609231933459083978">Apl kelihatan tidak sah.</translation>
 <translation id="561030196642865721">Kuki pihak ketiga dibenarkan di tapak ini</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Maaf, kata laluan anda masih tidak dapat disahkan. Perhatian: jika anda menukar kata laluan anda baru-baru ini, kata laluan baharu anda akan digunakan apabila anda log keluar, sila gunakan kata laluan yang lama di sini.</translation>
 <translation id="5614190747811328134">Notis Pengguna</translation>
 <translation id="5614553682702429503">Simpan kata laluan?</translation>
@@ -6067,6 +6075,7 @@
 <translation id="5782040878821624922">Tersedia pada sebarang peranti</translation>
 <translation id="5782227691023083829">Menterjemahkan…</translation>
 <translation id="57838592816432529">Redam</translation>
+<translation id="5784291589716625675">Tukar bahasa apl</translation>
 <translation id="5785583009707899920">Utiliti Fail Chrome</translation>
 <translation id="5787146423283493983">Perjanjian Penting</translation>
 <translation id="5787420647064736989">Nama peranti</translation>
@@ -6224,6 +6233,7 @@
 <translation id="5901089233978050985">Beralih kepada menangkap tab</translation>
 <translation id="5901494423252125310">Pintu pencetak terbuka</translation>
 <translation id="5901630391730855834">Kuning</translation>
+<translation id="5902892210366342391">Lihat amaran sebelum mengakses laman yang tidak selamat dalam Mod Inkognito</translation>
 <translation id="5904614460720589786">Tidak dapat menyediakan <ph name="APP_NAME" /> kerana terdapat masalah konfigurasi. Sila hubungi pentadbir anda. Kod ralat: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Hampir terkini! Mulakan semula peranti anda untuk menyelesaikan kemas kini.</translation>
 <translation id="5906732635754427568">Data yang berkaitan dengan apl ini akan dialih keluar daripada peranti ini.</translation>
@@ -6540,6 +6550,7 @@
 <translation id="6151323131516309312">Tekan <ph name="SEARCH_KEY" /> untuk mencari <ph name="SITE_NAME" /></translation>
 <translation id="6151771661215463137">Fail ini telah pun wujud dalam folder muat turun anda.</translation>
 <translation id="6152918902620844577">Menunggu operasi seterusnya</translation>
+<translation id="6153439704237222699">Ketahui lebih lanjut mengenai Do Not Track</translation>
 <translation id="6154240335466762404">Alih keluar semua port</translation>
 <translation id="615436196126345398">Protokol</translation>
 <translation id="6155141482566063812">Tab latar belakang berkongsi skrin anda</translation>
@@ -6761,6 +6772,7 @@
 <translation id="6333170995003625229">Alamat e-mel atau kata laluan anda tidak dapat disahkan. Cuba log masuk semula.</translation>
 <translation id="6334267141726449402">Salin dan hantar pautan ini kepada pengguna untuk mengumpul log.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> telah melumpuhkan penyahpepijatan ADB. Tindakan ini akan menetapkan semula <ph name="DEVICE_TYPE" /> anda dalam masa 24 jam. Sandarkan mana-mana fail yang ingin anda simpan.</translation>
+<translation id="6336194758029258346">Bahasa apl</translation>
 <translation id="6337543438445391085">Beberapa maklumat peribadi mungkin masih disertakan dalam data. Pastikan anda menyemak fail yang dieksport.</translation>
 <translation id="6338968693068997776">Tambah peranti USB</translation>
 <translation id="6339668969738228384">Buat profil baharu untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -7266,6 +7278,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">Data laman pada peranti tidak dibenarkan</translation>
 <translation id="6762833852331690540">Hidupkan</translation>
+<translation id="6762861159308991328">Anda boleh menukar cara pautan dibuka dalam tetapan Apl</translation>
 <translation id="676560328519657314">Kaedah pembayaran anda pada Google Pay</translation>
 <translation id="6766488013065406604">Akses Google Password Manager</translation>
 <translation id="6767566652486411142">Pilih Bahasa Lain...</translation>
@@ -7481,6 +7494,7 @@
 <translation id="6912007319859991306">PIN SIM Selular</translation>
 <translation id="6912380255120084882">Cuba peranti yang berbeza</translation>
 <translation id="691289340230098384">Pilihan kapsyen</translation>
+<translation id="6914812290245989348">Jangan melihat sebarang amaran sebelum mengakses laman yang tidak selamat</translation>
 <translation id="6916590542764765824">Urus Sambungan</translation>
 <translation id="6918677045355889289">Kemaskinian Chrome OS diperlukan</translation>
 <translation id="6919354101107095996">Cuba log masuk ke laman. Kemudian, muat turun sekali lagi</translation>
@@ -8856,6 +8870,7 @@
 <translation id="7988805580376093356">Kekalkan OS anda dan jalankan <ph name="DEVICE_OS" /> daripada USB.</translation>
 <translation id="7988876720343145286">Lagi tetapan dan kebenaran Android</translation>
 <translation id="7990863024647916394">Suara <ph name="DISPLAY_NAME" /> <ph name="COUNT" /></translation>
+<translation id="7990958035181555539">Pindahkan Wi-Fi secara automatik daripada telefon Android anda</translation>
 <translation id="7991296728590311172">Tetapan Akses Suis</translation>
 <translation id="7992203134935383159">Sintesis pertuturan</translation>
 <translation id="7994515119120860317">Terjemahkan Teks dalam Imej dengan <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
@@ -8964,6 +8979,7 @@
 <translation id="8076835018653442223">Akses kepada fail setempat pada peranti anda dilumpuhkan oleh pentadbir anda</translation>
 <translation id="8077120325605624147">Mana-mana laman yang anda lawati boleh memaparkan sebarang iklan kepada anda</translation>
 <translation id="8077579734294125741">Profil Chrome Lain</translation>
+<translation id="80790299200510644">Carian Imej</translation>
 <translation id="80798452873915119">Laman boleh meminta untuk mengurus tetingkap pada semua paparan anda</translation>
 <translation id="8080028325999236607">Tutup Semua Tab</translation>
 <translation id="808089508890593134">Google</translation>
@@ -9803,6 +9819,7 @@
 <translation id="8736288397686080465">Tapak ini dikemas kini di latar belakang.</translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">Ketik bahasa sasaran untuk penterjemahan halaman tersebut</translation>
+<translation id="8738418093147087440">Cari mengikut negara, bahasa atau nama input</translation>
 <translation id="8740086188450289493">Gunakan kata laluan Google Account</translation>
 <translation id="8740247629089392745">Anda boleh menyerahkan Chromebook ini kepada <ph name="SUPERVISED_USER_NAME" />. Persediaan hampir selesai, kemudian tibalah masa untuk meneroka.</translation>
 <translation id="8740672167979365981">Kemaskinian Chrome OS Flex diperlukan</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 915ad216..0273c8d 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -579,6 +579,7 @@
 <translation id="1461041542809785877">Prestaties</translation>
 <translation id="1461177659295855031">Verplaatsen naar map Bookmarkbalk</translation>
 <translation id="1461288887896722288">Je bent zojuist ingelogd op een beheerd account. Als je een nieuw beheerd profiel maakt, heb je toegang tot bepaalde bronnen die aan dat account zijn gekoppeld.</translation>
+<translation id="1461868306585780092">Waarschuwen voordat niet-beveiligde verbindingen worden gebruikt</translation>
 <translation id="146219525117638703">ONC-status</translation>
 <translation id="146220085323579959">Verbinding met internet verbroken. Controleer je internetverbinding en probeer het opnieuw.</translation>
 <translation id="1462480037563370607">Sites handmatig toevoegen</translation>
@@ -1558,6 +1559,7 @@
 <translation id="2180620921879609685">Content op elke pagina blokkeren</translation>
 <translation id="2181821976797666341">Beleid</translation>
 <translation id="2182058453334755893">Naar klembord gekopieerd</translation>
+<translation id="2182419606502127232">Mijn serverlogboeken toevoegen.</translation>
 <translation id="2183570493397356669">Knop Doorgaan staat uit</translation>
 <translation id="2184515124301515068">Chrome laten kiezen wanneer sites geluid mogen afspelen (aanbevolen)</translation>
 <translation id="2186206192313702726">Google Lens</translation>
@@ -1751,6 +1753,7 @@
 <translation id="2323018538045954000">Opgeslagen wifi-netwerken</translation>
 <translation id="2325444234681128157">Wachtwoord onthouden</translation>
 <translation id="2326188115274135041">Bevestig je pincode om automatisch ontgrendelen aan te zetten</translation>
+<translation id="2326906096734221931">App-instellingen openen</translation>
 <translation id="2326931316514688470">App opnieuw &amp;laden</translation>
 <translation id="2327492829706409234">App aanzetten</translation>
 <translation id="2327920026543055248">Teken <ph name="CHARACTER" /> van <ph name="TOTAL" /> opgeven</translation>
@@ -3888,6 +3891,7 @@
 <translation id="399788104667917863">Vastzetten op werkbalk</translation>
 <translation id="3998976413398910035">Printers beheren</translation>
 <translation id="4001540981461989979">Muisaanwijzer markeren tijdens bewegen</translation>
+<translation id="4002347779798688515">Het gedownloade profiel kan misschien niet worden gebruikt als de mobiele provider is vergrendeld. Neem contact op met je provider voor support.</translation>
 <translation id="4002440992267487163">Pincode instellen</translation>
 <translation id="4005817994523282006">Detectiemethode voor tijdzone</translation>
 <translation id="4007856537951125667">Snelkoppelingen verbergen</translation>
@@ -5422,6 +5426,7 @@
 <translation id="5261683757250193089">Openen in Web Store</translation>
 <translation id="5261799091118902550">Dit bestand is misschien een virus of malware. Je kunt het bestand naar Google sturen om te laten checken of het onveilig is.</translation>
 <translation id="5262784498883614021">Automatisch verbinding maken met netwerk</translation>
+<translation id="5263656105659419083">Klik rechtsboven op Vastzetten zodat je makkelijk kunt teruggaan naar het zijvenster</translation>
 <translation id="5264148714798105376">Dit kan een minuut duren.</translation>
 <translation id="5264252276333215551">Maak verbinding met internet om je app te openen in de kiosmodus.</translation>
 <translation id="5265797726250773323">Fout bij het installeren</translation>
@@ -5569,6 +5574,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{1 site met veel meldingen gevonden}other{{NUM_SITES} sites met veel meldingen gevonden}}</translation>
 <translation id="5388885445722491159">Gekoppeld</translation>
 <translation id="5389626883706033615">Sites kunnen je niet vragen om informatie te gebruiken die ze over jou hebben opgeslagen</translation>
+<translation id="5389794555912875905">Waarschuwingen tonen voordat je naar niet-beveiligde sites gaat (aanbevolen)</translation>
 <translation id="5390112241331447203">Het bestand system_logs.txt opnemen dat in feedbackrapporten wordt gestuurd.</translation>
 <translation id="5390677308841849479">Donkerrood/oranje</translation>
 <translation id="5390743329570580756">Verzenden voor</translation>
@@ -5852,6 +5858,7 @@
 <translation id="5608580678041221894">Tik op de volgende toetsen om het bijsnijdgebied aan te passen of te verplaatsen</translation>
 <translation id="5609231933459083978">De app blijkt ongeldig te zijn.</translation>
 <translation id="561030196642865721">Cookies van derden zijn toegestaan op deze site</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Je wachtwoord kan nog steeds niet worden geverifieerd. Opmerking: als je je wachtwoord onlangs hebt gewijzigd, wordt je nieuwe wachtwoord doorgevoerd zodra je uitlogt. Gebruik hier het oude wachtwoord.</translation>
 <translation id="5614190747811328134">Gebruikerskennisgeving</translation>
 <translation id="5614553682702429503">Wachtwoord opslaan?</translation>
@@ -6204,6 +6211,7 @@
 <translation id="5901089233978050985">Overschakelen naar tabblad vastleggen</translation>
 <translation id="5901494423252125310">Printerklep is open</translation>
 <translation id="5901630391730855834">Geel</translation>
+<translation id="5902892210366342391">Waarschuwingen tonen voordat je in de incognitomodus naar niet-beveiligde sites gaat</translation>
 <translation id="5904614460720589786">Kan <ph name="APP_NAME" /> niet instellen vanwege een configuratieprobleem. Neem contact op met je beheerder. Foutcode: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Updaten bijna voltooid. Start je apparaat opnieuw op om de update te voltooien.</translation>
 <translation id="5906732635754427568">Gegevens die zijn gekoppeld aan deze app, worden verwijderd van dit apparaat.</translation>
@@ -6739,6 +6747,7 @@
 <translation id="6333170995003625229">Je e-mailadres of wachtwoord kan niet worden geverifieerd. Probeer opnieuw in te loggen.</translation>
 <translation id="6334267141726449402">Kopieer en verstuur deze link naar de gebruiker om de logboeken te verzamelen.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> heeft ADB-foutopsporing uitgezet. Hierdoor wordt je <ph name="DEVICE_TYPE" /> over 24 uur gereset. Maak een back-up van de bestanden die je wilt houden.</translation>
+<translation id="6336194758029258346">App-taal</translation>
 <translation id="6337543438445391085">Bepaalde persoonlijke informatie kan nog steeds in de gegevens zijn opgenomen. Check de geëxporteerde bestanden.</translation>
 <translation id="6338968693068997776">USB-apparaat toevoegen</translation>
 <translation id="6339668969738228384">Een nieuw profiel maken voor <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -7244,6 +7253,7 @@
 <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation>
 <translation id="6761623907967804682">Sitegegevens op het apparaat niet toegestaan</translation>
 <translation id="6762833852331690540">Aan</translation>
+<translation id="6762861159308991328">Je kunt in de app-instellingen aanpassen hoe links worden geopend</translation>
 <translation id="676560328519657314">Je betaalmethoden in Google Pay</translation>
 <translation id="6766488013065406604">Naar Google Wachtwoordmanager</translation>
 <translation id="6767566652486411142">Een andere taal kiezen…</translation>
@@ -7459,6 +7469,7 @@
 <translation id="6912007319859991306">Pincode voor mobiele simkaart</translation>
 <translation id="6912380255120084882">Probeer een ander apparaat.</translation>
 <translation id="691289340230098384">Voorkeuren voor ondertiteling</translation>
+<translation id="6914812290245989348">Geen waarschuwingen tonen voordat je naar niet-beveiligde sites gaat</translation>
 <translation id="6916590542764765824">Extensies beheren</translation>
 <translation id="6918677045355889289">Chrome OS-update vereist</translation>
 <translation id="6919354101107095996">Probeer in te loggen bij de site. Download daarna opnieuw.</translation>
@@ -8938,6 +8949,7 @@
 <translation id="8076835018653442223">Toegang tot lokale bestanden op je apparaat is ingetrokken door je beheerder</translation>
 <translation id="8077120325605624147">Elke site die je bezoekt, kan elke advertentie aan je tonen</translation>
 <translation id="8077579734294125741">Andere Chrome-profielen</translation>
+<translation id="80790299200510644">Zoeken met afbeelding</translation>
 <translation id="80798452873915119">Sites kunnen vragen of ze vensters mogen beheren op al je schermen</translation>
 <translation id="8080028325999236607">Alle tabbladen sluiten</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 00131b12..16b8d28 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -3900,6 +3900,7 @@
 <translation id="4005817994523282006">Metode for registrering av tidssone</translation>
 <translation id="4007856537951125667">Skjul snarveier</translation>
 <translation id="4008291085758151621">Nettstedsinformasjon er ikke tilgjengelig i VR</translation>
+<translation id="4010746393007464819">En oppgradering til Debian 12 (Bookworm) er tilgjengelig</translation>
 <translation id="4010917659463429001">For å få bokmerker på mobilenheten din, <ph name="GET_IOS_APP_LINK" />.</translation>
 <translation id="4014432863917027322">Vil du reparere «<ph name="EXTENSION_NAME" />»?</translation>
 <translation id="4015163439792426608">Har du utvidelser? <ph name="BEGIN_LINK" />Administrer utvidelsene<ph name="END_LINK" /> på ett praktisk sted.</translation>
@@ -6058,6 +6059,7 @@
 <translation id="5782040878821624922">Det er tilgjengelig på alle enheter</translation>
 <translation id="5782227691023083829">Oversetter</translation>
 <translation id="57838592816432529">Kutt lyden</translation>
+<translation id="5784291589716625675">Endre språk for appen</translation>
 <translation id="5785583009707899920">Chrome Filverktøy</translation>
 <translation id="5787146423283493983">Nøkkelavtale</translation>
 <translation id="5787420647064736989">Enhetsnavn</translation>
@@ -6531,6 +6533,7 @@
 <translation id="6151323131516309312">Trykk <ph name="SEARCH_KEY" /> for å søke på <ph name="SITE_NAME" /></translation>
 <translation id="6151771661215463137">Filen finnes allerede i nedlastingsmappen.</translation>
 <translation id="6152918902620844577">Venter på neste operasjon</translation>
+<translation id="6153439704237222699">Finn ut mer om Ikke spor</translation>
 <translation id="6154240335466762404">Fjern alle porter</translation>
 <translation id="615436196126345398">Protokoll</translation>
 <translation id="6155141482566063812">En fane i bakgrunnen deler skjermen din</translation>
@@ -8847,6 +8850,7 @@
 <translation id="7988805580376093356">Behold operativsystemet ditt, og kjør <ph name="DEVICE_OS" /> fra USB.</translation>
 <translation id="7988876720343145286">Flere Android-innstillinger og -tillatelser</translation>
 <translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> stemme <ph name="COUNT" /></translation>
+<translation id="7990958035181555539">Overfør wifi automatisk fra Android-telefonen din</translation>
 <translation id="7991296728590311172">Innstillinger for brytertilgang</translation>
 <translation id="7992203134935383159">Talesyntese</translation>
 <translation id="7994515119120860317">Oversett tekst i bildet med <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
@@ -9793,6 +9797,7 @@
 <translation id="8736288397686080465">Dette nettstedet har blitt oppdatert i bakgrunnen.</translation>
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8737914367566358838">Velg språket du vil oversette siden til</translation>
+<translation id="8738418093147087440">Søk etter land, språk eller inndatanavn</translation>
 <translation id="8740086188450289493">Bruk passordet for Google-kontoen</translation>
 <translation id="8740247629089392745">Du kan gi Chromebooken til <ph name="SUPERVISED_USER_NAME" />. Konfigureringen er nesten ferdig, og så er det tid for å utforske.</translation>
 <translation id="8740672167979365981">ChromeOS Flex må oppdateres</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index 3c4f6bf..e677bc9 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -581,6 +581,7 @@
 <translation id="1461041542809785877">ପରଫରମାନ୍ସ</translation>
 <translation id="1461177659295855031">ବୁକମାର୍କ ବାର ଫୋଲ୍ଡରକୁ ମୁଭ କରନ୍ତୁ</translation>
 <translation id="1461288887896722288">ଆପଣ ଏବେ ଏକ ପରିଚାଳିତ ଆକାଉଣ୍ଟରେ ସାଇନ ଇନ କରିଛନ୍ତି, ଏକ ନୂଆ ପରିଚାଳିତ ପ୍ରୋଫାଇଲ ତିଆରି କରିବା ଫଳରେ ଏହା ଆପଣଙ୍କୁ ସେହି ଆକାଉଣ୍ଟ ସହ ଲିଙ୍କ କରାଯାଇଥିବା କିଛି ରିସୋର୍ସକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଅନୁମତି ଦେବ।</translation>
+<translation id="1461868306585780092">ଅସୁରକ୍ଷିତ କନେକ୍ସନଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବା ପୂର୍ବରୁ ଚେତାବନୀ ଦିଅନ୍ତୁ</translation>
 <translation id="146219525117638703">ONC ସ୍ଥିତି</translation>
 <translation id="146220085323579959">ଇଣ୍ଟର୍ନେଟ୍‍ ବିଚ୍ଛିନ୍ନ ହୋ‍ଇଛି। ଦୟାକରି, ଆପଣଙ୍କର ଇଣ୍ଟର୍ନେଟ୍‍ ସଂଯୋଗ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="1462480037563370607">ମାନୁଆଲୀ ସାଇଟଗୁଡ଼ିକୁ ଯୋଗ କରନ୍ତୁ</translation>
@@ -1555,6 +1556,7 @@
 <translation id="2180620921879609685">ଯେ କୌଣସି ପୃଷ୍ଠାରେ ବିଷୟବସ୍ତୁକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation>
 <translation id="2181821976797666341">ନୀତି</translation>
 <translation id="2182058453334755893">ଆପଣଙ୍କର କ୍ଲିପ୍‌ବୋର୍ଡକୁ କପି କରାଯାଇଛି</translation>
+<translation id="2182419606502127232">ମୋ ସର୍ଭର ଲଗଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରନ୍ତୁ।</translation>
 <translation id="2183570493397356669">"ଜାରି ରଖନ୍ତୁ" ବଟନକୁ ଅକ୍ଷମ କରାଯାଇଛି</translation>
 <translation id="2184515124301515068">ସାଇଟ୍‌ଗୁଡ଼ିକ କେତେବେଳେ ସାଉଣ୍ଡ୍ ଚାଲୁ କରିବେ ତାହା Chromeକୁ ବାଛିବାକୁ ଦିଅନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି)</translation>
 <translation id="2186206192313702726">Google Lens</translation>
@@ -1749,6 +1751,7 @@
 <translation id="2323018538045954000">ସେଭ୍ କରାଯାଇଥିବା ୱାଇ-ଫାଇ ନେଟୱାର୍କଗୁଡ଼ିକ</translation>
 <translation id="2325444234681128157">ପାସ୍‌ୱାର୍ଡ ମନେ ରଖନ୍ତୁ</translation>
 <translation id="2326188115274135041">ସ୍ୱଚାଳିତ ଭାବେ ଅନଲକ୍ ଚାଲୁ କରିବାକୁ PIN ସୁନିଶ୍ଚିତ କରନ୍ତୁ</translation>
+<translation id="2326906096734221931">ଆପ ସେଟିଂସ ଖୋଲନ୍ତୁ</translation>
 <translation id="2326931316514688470">&amp;ଆପ୍ ରିଲୋଡ୍ କରନ୍ତୁ</translation>
 <translation id="2327492829706409234">ଆପ୍‍କୁ ସକ୍ଷମ କରନ୍ତୁ</translation>
 <translation id="2327920026543055248"><ph name="TOTAL" />ଟିରୁ <ph name="CHARACTER" />ଟି କେରେକ୍ଟର ଲେଖନ୍ତୁ</translation>
@@ -3884,6 +3887,7 @@
 <translation id="399788104667917863">ଟୁଲବାରରେ ପିନ କରନ୍ତୁ</translation>
 <translation id="3998976413398910035">ପ୍ରିଣ୍ଟରଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ</translation>
 <translation id="4001540981461989979">ମୁଭ କରିବା ସମୟରେ ମାଉସ କର୍ସରକୁ ହାଇଲାଇଟ କରନ୍ତୁ</translation>
+<translation id="4002347779798688515">ଯଦି ମୋବାଇଲ ନେଟୱାର୍କ ପ୍ରଦାନକାରୀ ଲକ ଅଛି ତେବେ ଡାଉନଲୋଡ କରାଯାଇଥିବା ପ୍ରୋଫାଇଲ ବ୍ୟବହାରଯୋଗ୍ୟ ହୋଇନପାରେ। ସହାୟତା ପାଇଁ ଆପଣଙ୍କ ପ୍ରଦାନକାରୀଙ୍କ ସହ କଣ୍ଟାକ୍ଟ କରନ୍ତୁ।</translation>
 <translation id="4002440992267487163">ପିନ୍ ସେଟ୍‌ଅପ୍ କରନ୍ତୁ</translation>
 <translation id="4005817994523282006">ସମୟ କ୍ଷେତ୍ର ଚିହ୍ନଟକରଣ ପଦ୍ଧତି</translation>
 <translation id="4007856537951125667">ସର୍ଟକଟ୍‍ଗୁଡ଼ିକ ଲୁଚାନ୍ତୁ</translation>
@@ -5421,6 +5425,7 @@
 <translation id="5261683757250193089">ୱେବ୍ ଷ୍ଟୋର୍‌‌ରେ ଖୋଲନ୍ତୁ</translation>
 <translation id="5261799091118902550">ଏହି ଫାଇଲ ଏକ ଭାଇରସ କିମ୍ବା ମାଲୱେର ହୋଇଥାଇପାରେ। ଏହା ସୁରକ୍ଷିତ ନା ନୁହେଁ ତାହା ଯାଞ୍ଚ କରିବାକୁ ଆପଣ ଏହାକୁ Googleକୁ ପଠାଇପାରିବେ।</translation>
 <translation id="5262784498883614021">ସ୍ୱଚାଳିତ ଭାବେ ନେଟୱାର୍କ ସହିତ ସଂଯୋଗ କରନ୍ତୁ</translation>
+<translation id="5263656105659419083">ସାଇଡ ପେନେଲକୁ ସହଜରେ ଫେରିବା ପାଇଁ 'ଶୀର୍ଷ ଡାହାଣରେ ପିନ କରନ୍ତୁ'ରେ କ୍ଲିକ କରନ୍ତୁ</translation>
 <translation id="5264148714798105376">ଏଥିରେ ଗୋଟିଏ ମିନିଟ୍‌ କିମ୍ବା କିଛି ଅଧିକ ସମୟ ଲାଗିପାରେ।</translation>
 <translation id="5264252276333215551">କିଓସ୍କ ମୋଡ୍‌ରେ ଆପଣଙ୍କର ଆପ୍‌ ଲଞ୍ଚ କରିବାକୁ ଦୟାକରି ଇଣ୍ଟର୍ନେଟ୍‍କୁ ସଂଯୋଗ କରନ୍ତୁ।</translation>
 <translation id="5265797726250773323">ଇନ୍‌ଷ୍ଟଲ୍ ହେବା ସମୟରେ ତ୍ରୁଟି</translation>
@@ -5568,6 +5573,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{ବହୁତ ବିଜ୍ଞପ୍ତି ଥିବା 1 ସାଇଟ ମିଳିଲା}other{ବହୁତ ବିଜ୍ଞପ୍ତି ଥିବା {NUM_SITES} ସାଇଟ ମିଳିଲା}}</translation>
 <translation id="5388885445722491159">ପେୟାର୍‌ ହୋଇଛି</translation>
 <translation id="5389626883706033615">ଆପଣଙ୍କ ବିଷୟରେ ସାଇଟଗୁଡ଼ିକ ସେଭ କରିଥିବା ସୂଚନାକୁ ବ୍ୟବହାର କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଅନୁମତି ମାଗିବାରୁ ସେଗୁଡ଼ିକୁ ବ୍ଲକ କରାଯାଇଛି</translation>
+<translation id="5389794555912875905">ଅସୁରକ୍ଷିତ ସାଇଟଗୁଡ଼ିକୁ ଯିବା ପୂର୍ବରୁ ଚେତାବନୀ ଦେଖନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି)</translation>
 <translation id="5390112241331447203">ମତାମତ ରିପୋର୍ଟଗୁଡ଼ିକରେ ପଠାଯାଇଥିବା system_logs.txt ଫାଇଲ୍ ସାମିଲ କରନ୍ତୁ।</translation>
 <translation id="5390677308841849479">ଗାଢ଼ ଲାଲ ଓ କମଳା</translation>
 <translation id="5390743329570580756">ଏହା ପାଇଁ ପଠାନ୍ତୁ</translation>
@@ -5851,6 +5857,7 @@
 <translation id="5608580678041221894">କ୍ରପିଂ ଏରିଆକୁ ଆଡ୍‌ଜଷ୍ଟ କରିବା ପାଇଁ କିମ୍ୱା ଘୁଞ୍ଚାଇବା ପାଇଁ ନିମ୍ନରେ ଥିବା କୀଗୁଡ଼ିକୁ ଟାପ୍ କରନ୍ତୁ</translation>
 <translation id="5609231933459083978">ଆପ୍ଲିକେସନ୍‌ ଅବୈଧ ଥିବା ଜଣାପଡୁଛି।</translation>
 <translation id="561030196642865721">ଏହି ସାଇଟ୍‌ରେ ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ଅନୁମତି ଅଛି</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">କ୍ଷମା କରିବେ, ଆପଣଙ୍କର ପାସ୍‌ୱର୍ଡ ଏବେମଧ୍ୟ ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ। ଧ୍ୟାନ ଦିଅନ୍ତୁ: ଯଦି ବର୍ତ୍ତମାନ ଆପଣ ନିଜର ପାସ୍‍ୱର୍ଡକୁ ବଦଳାଇଥାଆନ୍ତି ତେବେ, ତାହା ଆପଣ ଥରେ ସାଇନ୍-ଆଉଟ୍ କରିବା ପରେ ନୂଆ ପାସ୍‍ୱର୍ଡ ଲାଗୁ ହେବ, ଦୟାକରି ଏଠାରେ ପୁରୁଣା ପାସ୍‍ୱର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ।</translation>
 <translation id="5614190747811328134">ୟୁଜରଙ୍କ ବିଜ୍ଞପ୍ତି</translation>
 <translation id="5614553682702429503">ପାସ୍‌ୱର୍ଡ ସେଭ୍‍ କରିବେ?</translation>
@@ -6203,6 +6210,7 @@
 <translation id="5901089233978050985">କ୍ୟାପଚର୍ କରୁଥିବା ଟାବକୁ ସ୍ୱିଚ୍ କରନ୍ତୁ</translation>
 <translation id="5901494423252125310">ପ୍ରିଣ୍ଟର୍ ଡୋର୍ ଖୋଲାଅଛି</translation>
 <translation id="5901630391730855834">ହଳଦିଆ</translation>
+<translation id="5902892210366342391">ଇନକଗ୍ନିଟୋ ମୋଡରେ ଅସୁରକ୍ଷିତ ସାଇଟଗୁଡ଼ିକୁ ଯିବା ପୂର୍ବରୁ ଚେତାବନୀ ଦେଖନ୍ତୁ</translation>
 <translation id="5904614460720589786">ଏକ କନଫିଗରେସନ୍ ସମସ୍ୟା ଯୋଗୁଁ <ph name="APP_NAME" />କୁ ସେଟ୍ ଅପ୍ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ। ତ୍ରୁଟି କୋଡ୍: <ph name="ERROR_CODE" />।</translation>
 <translation id="5906655207909574370">ପ୍ରାୟ ଅପ୍-ଟୁ-ଡେଟ୍! ଅପଡେଟିଂ ସମାପ୍ତ କରିବା ପାଇଁ ନିଜ ଡିଭାଇସ୍‌କୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।</translation>
 <translation id="5906732635754427568">ଏହି ଡିଭାଇସ୍‌ରୁ ଏହି ଆପ୍‌ ସମ୍ବନ୍ଧିତ ଡାଟା କାଢ଼ିଦିଆଯିବ।</translation>
@@ -6739,6 +6747,7 @@
 <translation id="6333170995003625229">ଆପଣଙ୍କ ଇମେଲ ଠିକଣା କିମ୍ବା ପାସୱାର୍ଡକୁ ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ। ପୁଣି ସାଇନ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="6334267141726449402">ଲଗଗୁଡ଼ିକୁ ସଂଗ୍ରହ କରିବା ପାଇଁ ଏହି ଲିଙ୍କକୁ କପି କରି ୟୁଜରଙ୍କୁ ପଠାନ୍ତୁ।</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> ADB ଡିବଗିଂକୁ ଅକ୍ଷମ କରିଛି। ଏହା ଦ୍ୱାରା ଆପଣଙ୍କ <ph name="DEVICE_TYPE" /> 24 ଘଣ୍ଟାରେ ରିସେଟ୍ ହୋଇଯିବ। ଆପଣ ରଖିବାକୁ ଚାହୁଁଥିବା ଯେ କୌଣସି ଫାଇଲର ବ୍ୟାକଅପ୍ ନିଅନ୍ତୁ।</translation>
+<translation id="6336194758029258346">ଆପ ଭାଷା</translation>
 <translation id="6337543438445391085">କିଛି ବ୍ୟକ୍ତିଗତ ସୂଚନା ଏବେ ବି ଡାଟାରେ ଅନ୍ତର୍ଭୁକ୍ତ ଥାଇପାରେ। ଏକ୍ସପୋର୍ଟ କରାଯାଇଥିବା ଫାଇଲଗୁଡ଼ିକର ସମୀକ୍ଷା କରିବାକୁ ସୁନିଶ୍ଚିତ କରନ୍ତୁ।</translation>
 <translation id="6338968693068997776">USB ଡିଭାଇସ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" />ପାଇଁ ଗୋଟିଏ ନୂଆ ପ୍ରୋଫାଇଲ୍ ତିଆରି କରନ୍ତୁ</translation>
@@ -7246,6 +7255,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">ଡିଭାଇସରେ ସାଇଟ ଡାଟାକୁ ଅନୁମତି ନାହିଁ</translation>
 <translation id="6762833852331690540">ଚାଲୁ ଅଛି</translation>
+<translation id="6762861159308991328">ଆପଣ ଆପ ସେଟିଂସରେ ଲିଙ୍କଗୁଡ଼ିକ କିପରି ଖୋଲିବ ତାହା ପରିବର୍ତ୍ତନ କରିପାରିବେ</translation>
 <translation id="676560328519657314">Google Payରେ ଆପଣଙ୍କ ପେମେଣ୍ଟ ପଦ୍ଧତିଗୁଡ଼ିକ</translation>
 <translation id="6766488013065406604">Google Password Managerକୁ ଯାଆନ୍ତୁ</translation>
 <translation id="6767566652486411142">ଅନ୍ୟ ଏକ ଭାଷା ବାଛନ୍ତୁ...</translation>
@@ -7461,6 +7471,7 @@
 <translation id="6912007319859991306">ସେଲ୍ୟୁଲାର୍ SIM PIN</translation>
 <translation id="6912380255120084882">ଏକ ଭିନ୍ନ ଡିଭାଇସ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ</translation>
 <translation id="691289340230098384">କ୍ୟାପ୍ସନ୍ ପସନ୍ଦଗୁଡ଼ିକ</translation>
+<translation id="6914812290245989348">ଅସୁରକ୍ଷିତ ସାଇଟଗୁଡ଼ିକୁ ଯିବା ପୂର୍ବରୁ କୌଣସି ଚେତାବନୀ ଦେଖୁନାହାଁନ୍ତି</translation>
 <translation id="6916590542764765824">ଏକ୍ସଟେନ୍‌ସନ୍‌ଗୁଡ଼ିକ ପରିଚାଳନା କରନ୍ତୁ</translation>
 <translation id="6918677045355889289">ChromeOS ଅପଡେଟ ଆବଶ୍ୟକ</translation>
 <translation id="6919354101107095996">ସାଇଟରେ ସାଇନ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ। ତା'ପରେ, ପୁଣି ଡାଉନଲୋଡ କରନ୍ତୁ</translation>
@@ -8941,6 +8952,7 @@
 <translation id="8076835018653442223">ଆପଣଙ୍କର ବ୍ୟବସ୍ଥାପକଙ୍କ ଦ୍ୱାରା ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ଥିବା ସ୍ଥାନୀୟ ଫାଇଲ୍‌ଗୁଡ଼ିକୁ ଆକ୍ସେସ୍‍ ଅକ୍ଷମ କରାଯାଇଛି</translation>
 <translation id="8077120325605624147">ଆପଣ ଭିଜିଟ କରୁଥିବା ଯେ କୌଣସି ସାଇଟ ଆପଣଙ୍କୁ ଯେ କୌଣସି ବିଜ୍ଞାପନ ଦେଖାଇପାରିବ</translation>
 <translation id="8077579734294125741">ଅନ୍ୟ Chrome ପ୍ରୋଫାଇଲଗୁଡ଼ିକ</translation>
+<translation id="80790299200510644">ଇମେଜ ସର୍ଚ୍ଚ</translation>
 <translation id="80798452873915119">ଆପଣଙ୍କ ସମସ୍ତ ଡିସପ୍ଲେରେ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ପରିଚାଳନା କରିବା ପାଇଁ ସାଇଟଗୁଡ଼ିକ ଅନୁମତି ମାଗିପାରିବେ</translation>
 <translation id="8080028325999236607">ସମସ୍ତ ଟାବକୁ ବନ୍ଦ କରନ୍ତୁ</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 9a81252..929615b 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3880,6 +3880,7 @@
 <translation id="4005817994523282006">Metoda wykrywania strefy czasowej</translation>
 <translation id="4007856537951125667">Ukryj skróty</translation>
 <translation id="4008291085758151621">Informacje o stronie nie są dostępne w rzeczywistości wirtualnej</translation>
+<translation id="4010746393007464819">Dostępne jest uaktualnienie do systemu Debian 12 (Bookworm)</translation>
 <translation id="4010917659463429001">Aby zaimportować zakładki na urządzenie mobilne, <ph name="GET_IOS_APP_LINK" />.</translation>
 <translation id="4014432863917027322">Naprawić „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="4015163439792426608">Korzystasz z rozszerzeń? <ph name="BEGIN_LINK" />Zarządzaj nimi<ph name="END_LINK" /> w jednym, łatwo dostępnym miejscu.</translation>
@@ -6041,6 +6042,7 @@
 <translation id="5782040878821624922">Będzie ono dostępne na wszystkich urządzeniach.</translation>
 <translation id="5782227691023083829">Trwa tłumaczenie...</translation>
 <translation id="57838592816432529">Wycisz</translation>
+<translation id="5784291589716625675">Zmień język aplikacji</translation>
 <translation id="5785583009707899920">Narzędzia do plików w Chrome</translation>
 <translation id="5787146423283493983">Uzgadnianie klucza</translation>
 <translation id="5787420647064736989">Nazwa urządzenia</translation>
@@ -6515,6 +6517,7 @@
 <translation id="6151323131516309312">Kliknij przycisk <ph name="SEARCH_KEY" />, aby przeszukać stronę <ph name="SITE_NAME" /></translation>
 <translation id="6151771661215463137">Plik już istnieje w folderze pobierania.</translation>
 <translation id="6152918902620844577">Czekam na następną operację</translation>
+<translation id="6153439704237222699">Więcej informacji o nagłówku Do Not Track</translation>
 <translation id="6154240335466762404">Usuń wszystkie porty</translation>
 <translation id="615436196126345398">Protokół</translation>
 <translation id="6155141482566063812">Karta w tle udostępnia Twój ekran</translation>
@@ -8835,6 +8838,7 @@
 <translation id="7988805580376093356">Zachowaj swój system operacyjny i uruchom <ph name="DEVICE_OS" /> z USB.</translation>
 <translation id="7988876720343145286">Więcej ustawień i uprawnień Androida</translation>
 <translation id="7990863024647916394"><ph name="DISPLAY_NAME" />, głos <ph name="COUNT" /></translation>
+<translation id="7990958035181555539">Automatyczne przenoszenie Wi-Fi z telefonu z Androidem</translation>
 <translation id="7991296728590311172">Ustawienia funkcji Switch Access</translation>
 <translation id="7992203134935383159">Synteza mowy</translation>
 <translation id="7994515119120860317">Przetłumacz tekst z obrazu za pomocą usługi <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
@@ -9780,6 +9784,7 @@
 <translation id="8736288397686080465">Ta witryna została zaktualizowana w tle.</translation>
 <translation id="8737709691285775803">Menedżer połączeń</translation>
 <translation id="8737914367566358838">Wybierz język, na który chcesz przetłumaczyć stronę</translation>
+<translation id="8738418093147087440">Wyszukaj według kraju, języka lub nazwy metody wprowadzania</translation>
 <translation id="8740086188450289493">Użyj hasła do konta Google</translation>
 <translation id="8740247629089392745">Możesz przekazać tego Chromebooka użytkownikowi <ph name="SUPERVISED_USER_NAME" />. Prawie wszystko zostało skonfigurowane i można korzystać z urządzenia.</translation>
 <translation id="8740672167979365981">Wymagana aktualizacja ChromeOS Flex</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 727639f..b8a7caea 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -5590,7 +5590,7 @@
 <translation id="5383740867328871413">Namnlös grupp – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation>
 <translation id="538822246583124912">Företagets policy har ändrats. En knapp för experiment har lagts till i verktygsfältet. Om du klickar på den öppnas en dialogruta där du kan aktivera experiment.</translation>
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{1 webbplats med många aviseringar hittades}other{{NUM_SITES} webbplatser med många aviseringar hittades}}</translation>
-<translation id="5388885445722491159">Kopplad</translation>
+<translation id="5388885445722491159">Parkopplad</translation>
 <translation id="5389626883706033615">Webbplatser hindras från att be dig använda information som de har sparat om dig</translation>
 <translation id="5389794555912875905">Visa varningar innan du besöker osäkra webbplatser (rekommenderas)</translation>
 <translation id="5390112241331447203">Ta med filen system_logs.txt som skickas i feedbackrapporter.</translation>
@@ -8695,7 +8695,7 @@
 <translation id="7861846108263890455">Språk för Google-konto</translation>
 <translation id="7864539943188674973">Inaktivera Bluetooth</translation>
 <translation id="7865127013871431856">Översättningsalternativ</translation>
-<translation id="786957569166715433"><ph name="DEVICE_NAME" /> – kopplad</translation>
+<translation id="786957569166715433"><ph name="DEVICE_NAME" /> – parkopplad</translation>
 <translation id="7869655448736341731">Alla</translation>
 <translation id="787069710204604994">Om du till exempel besöker en webbplats som säljer löparskor kan webbplatsen göra bedömningen att du är intresserad av löpning. Om du senare besöker en annan webbplats kan den webbplatsen visa en annons för löparskor utifrån den första webbplatsens förslag.</translation>
 <translation id="7870730066603611552">Granska synkroniseringsalternativen efter konfigureringen</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 14f0bedc..2b62375 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -582,6 +582,7 @@
 <translation id="1461041542809785877">Utandaji</translation>
 <translation id="1461177659295855031">Hamishia kwenye folda ya Sehemu ya Alamisho</translation>
 <translation id="1461288887896722288">Umeingia katika akaunti inayosimamiwa sasa hivi, ukiunda wasifu mpya unaosimamiwa, utaweza kufikia baadhi ya nyenzo zilizounganishwa na akaunti hiyo.</translation>
+<translation id="1461868306585780092">Tahadharisha kabla ya kutumia muunganisho usio salama</translation>
 <translation id="146219525117638703">Hali ya ONC</translation>
 <translation id="146220085323579959">Mtandao umekatizwa. Tafadhali kagua muunganisho wako wa mtandao na ujaribu tena.</translation>
 <translation id="1462480037563370607">Weka tovuti mwenyewe</translation>
@@ -1566,6 +1567,7 @@
 <translation id="2180620921879609685">Kuzuia maudhui kwenye ukurasa wowote</translation>
 <translation id="2181821976797666341">Sera</translation>
 <translation id="2182058453334755893">Yamenakiliwa kwenye Ubao wa Kunakili</translation>
+<translation id="2182419606502127232">Jumuisha kumbukumbu zangu za seva.</translation>
 <translation id="2183570493397356669">Kitufe cha "endelea" kimezimwa</translation>
 <translation id="2184515124301515068">Ruhusu Chrome ichague wakati ambapo tovuti zitacheza sauti (inapendekezwa)</translation>
 <translation id="2186206192313702726">Lenzi ya Google</translation>
@@ -1763,6 +1765,7 @@
 <translation id="2323018538045954000">Mitandao ya Wi-Fi iliyohifadhiwa</translation>
 <translation id="2325444234681128157">Kumbuka nenosiri</translation>
 <translation id="2326188115274135041">Thibitisha PIN ili uwashe mipangilio ya kufungua kiotomatiki</translation>
+<translation id="2326906096734221931">Fungua Mipangilio ya programu</translation>
 <translation id="2326931316514688470">Pakia upya programu</translation>
 <translation id="2327492829706409234">Washa programu</translation>
 <translation id="2327920026543055248">Ingiza herufi <ph name="CHARACTER" /> kati ya <ph name="TOTAL" /></translation>
@@ -3900,6 +3903,7 @@
 <translation id="399788104667917863">Bandika kwenye upau wa vidhibiti</translation>
 <translation id="3998976413398910035">Dhibiti printa</translation>
 <translation id="4001540981461989979">Angazia kiteuzi cha kipanya unaposogeza</translation>
+<translation id="4002347779798688515">Wasifu uliopakuliwa huenda usiweze kutumiwa ikiwa kipengele cha mtoa huduma za mtandao wa simu kimefungwa. Wasiliana na mtoa huduma wako ili upate usaidizi.</translation>
 <translation id="4002440992267487163">Mipangilio ya Pin</translation>
 <translation id="4005817994523282006">Mbinu ya kutambua saa za eneo</translation>
 <translation id="4007856537951125667">Ficha njia za mikato</translation>
@@ -5435,6 +5439,7 @@
 <translation id="5261683757250193089">Fungua katika Duka la Chrome kwenye Wavuti</translation>
 <translation id="5261799091118902550">Faili hii inaweza kuwa ni kirusi au programu hasidi. Unaweza kuituma kwa Google ili kuikagua kama si salama.</translation>
 <translation id="5262784498883614021">Unganisha kiotomatiki kwenye mtandao</translation>
+<translation id="5263656105659419083">Ili urudi kwenye kidirisha cha pembeni kwa urahisi, bofya Bandika katika sehemu ya juu kulia</translation>
 <translation id="5264148714798105376">Huenda shughuli hii ikachukua dakika kadhaa.</translation>
 <translation id="5264252276333215551">Tafadhali unganisha kwenye mtandao ili uzindue programu yako katika skrini nzima.</translation>
 <translation id="5265797726250773323">Hitilafu imetokea wakati wa kusakinisha</translation>
@@ -5582,6 +5587,7 @@
 <translation id="5388567882092991136">{NUM_SITES,plural, =1{Tumetambua tovui 1 yenye arifa nyingi}other{Tumetambua tovuti {NUM_SITES} zenye arifa nyingi}}</translation>
 <translation id="5388885445722491159">Imeoanishwa</translation>
 <translation id="5389626883706033615">Tovuti zimezuiwa ili zisiombe ruhusa ya kutumia maelezo ambayo zimehifadhi kukuhusu</translation>
+<translation id="5389794555912875905">Ona tahadhari kabla ya kwenda kwenye tovuti zisizo salama (inapendekezwa)</translation>
 <translation id="5390112241331447203">Jumuisha faili ya system_logs.txt iliyotumwa katika ripoti za maoni.</translation>
 <translation id="5390677308841849479">Rangi ya chungwa na nyekundu iliyokolea</translation>
 <translation id="5390743329570580756">Tuma kwa</translation>
@@ -5865,6 +5871,7 @@
 <translation id="5608580678041221894">Gusa vitufe vinavyofuata ili urekebishe au usogeze eneo la kupunguzia</translation>
 <translation id="5609231933459083978">Programu inaonekana kuwa batili.</translation>
 <translation id="561030196642865721">Vidakuzi vya mtu au kampuni nyingine vinaruhusiwa kwenye tovuti hii</translation>
+<translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5612734644261457353">Samahani, bado nenosiri lako halikuweza kuthibitishwa. Kumbuka: ikiwa ulibadilisha nenosiri lako hivi karibuni, nenosiri lako jipya litaanza kutumika pindi tu utakapoondoka, tafadhali tumia nenosiri jipya hapa.</translation>
 <translation id="5614190747811328134">Arifa ya Mtumiaji</translation>
 <translation id="5614553682702429503">Ungependa kuhifadhi nenosiri?</translation>
@@ -6219,6 +6226,7 @@
 <translation id="5901089233978050985">Nenda kwenye kichupo kinachonaswa</translation>
 <translation id="5901494423252125310">Mlango wa printa umefunguka</translation>
 <translation id="5901630391730855834">Manjano</translation>
+<translation id="5902892210366342391">Ona tahadhari kabla ya kwenda kwenye tovuti zisizo salama katika hali fiche</translation>
 <translation id="5904614460720589786">Imeshindwa kusakinisha <ph name="APP_NAME" /> kwa sababu ya tatizo la mipangilio. Tafadhali wasiliana na msimamizi wako. Msimbo wa hitilafu: <ph name="ERROR_CODE" />.</translation>
 <translation id="5906655207909574370">Inakaribia kukamilisha kusasishwa! Zima na uwashe kifaa chako ili ukamilishe kusasisha.</translation>
 <translation id="5906732635754427568">Data inayohusishwa na programu hii itaondolewa kwenye kifaa hiki.</translation>
@@ -6756,6 +6764,7 @@
 <translation id="6333170995003625229">Imeshindwa kuthibitisha anwani ya barua pepe au nenosiri. Jaribu kuingia tena katika akaunti.</translation>
 <translation id="6334267141726449402">Nakili na utume kiungo hiki kwa mtumiaji ili ukusanye kumbukumbu.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> imezima utatuzi wa ADB. Hatua hii itarejesha mipangilio ambayo <ph name="DEVICE_TYPE" /> yako ilitoka nayo kiwandani, baada ya saa 24. Hifadhi nakala za faili zozote ambazo ungependa zisipotee.</translation>
+<translation id="6336194758029258346">Lugha ya programu</translation>
 <translation id="6337543438445391085">Baadhi ya taarifa binafsi huenda ikajumuishwa kwenye data. Hakikisha unakagua faili zilizohamishwa.</translation>
 <translation id="6338968693068997776">Weka kifaa cha USB</translation>
 <translation id="6339668969738228384">Unda wasifu mpya wa <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -7261,6 +7270,7 @@
 <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6761623907967804682">Tovuti hairuhusiwi kuhifadhi data kwenye kifaa</translation>
 <translation id="6762833852331690540">Imewashwa</translation>
+<translation id="6762861159308991328">Unaweza kubadilisha jinsi viungo vinavyofunguka katika Mipangilio ya programu</translation>
 <translation id="676560328519657314">Njia zako za kulipa kwenye Google Pay</translation>
 <translation id="6766488013065406604">Nenda kwenye Kidhibiti cha Manenosiri cha Google</translation>
 <translation id="6767566652486411142">Chagua Lugha Nyingine...</translation>
@@ -7476,6 +7486,7 @@
 <translation id="6912007319859991306">PIN ya SIM ya Mtandao wa Simu</translation>
 <translation id="6912380255120084882">Jaribu kusajili kifaa tofauti</translation>
 <translation id="691289340230098384">Mapendeleo ya manukuu</translation>
+<translation id="6914812290245989348">Usione tahadhari zozote kabla ya kwenda kwenye tovuti zisizo salama</translation>
 <translation id="6916590542764765824">Simamia Viendelezi</translation>
 <translation id="6918677045355889289">Unahitaji kusasisha Mfumo wa Uendeshaji wa Chrome</translation>
 <translation id="6919354101107095996">Jaribu kuingia katika akaunti ya tovuti. Kisha, pakua tena</translation>
@@ -8960,6 +8971,7 @@
 <translation id="8076835018653442223">Ufikiaji wa faili za ndani kwenye kifaa chako umezimwa na msimamizi wako</translation>
 <translation id="8077120325605624147">Tovuti yoyote unayotembelea inaweza kukuonyesha tangazo lolote</translation>
 <translation id="8077579734294125741">Wasifu Mwingine Kwenye Chrome</translation>
+<translation id="80790299200510644">Kutafuta kwa Picha</translation>
 <translation id="80798452873915119">Tovuti zinaweza kuomba kudhibiti madirisha kwenye skrini zako zote</translation>
 <translation id="8080028325999236607">Funga Vichupo Vyote</translation>
 <translation id="808089508890593134">Google</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index f7a94e3..f287c0f 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -6725,7 +6725,7 @@
 <translation id="6322559670748154781">此文件属于不常下载的内容,已被“高级保护”机制屏蔽</translation>
 <translation id="6324916366299863871">修改快捷方式</translation>
 <translation id="6325191661371220117">停用自动启动</translation>
-<translation id="6326175484149238433">从Chrome中移除</translation>
+<translation id="6326175484149238433">从 Chrome 中移除</translation>
 <translation id="6326855256003666642">正在使用相应扩展程序的活动数</translation>
 <translation id="6327065839080961103">“<ph name="FEATURE_NAME" />”功能的流量使用设置</translation>
 <translation id="6327785803543103246">网络代理自动发现</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb
index 41f33538..7537d62 100644
--- a/chrome/app/resources/google_chrome_strings_az.xtb
+++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -98,6 +98,7 @@
 <translation id="2556847002339236023">Chrome <ph name="TIMEOUT_DURATION" /> istifadə edilməsə, təşkilat onu bağlayır. Baxış datası silindi. Bura tarixçə, avto doldurma və endirmələr daxil ola bilər.</translation>
 <translation id="2559253115192232574">Daha sonra ziyarət etdiyiniz sayt gördüyünüz reklamları fərdiləşdirmək üçün Chrome'dan maraqlarınızı görməyi tələb edə bilər. Chrome 3-ə qədər marağı paylaşa bilər.</translation>
 <translation id="2563121210305478421">Chrome yenidən başladılsın?</translation>
+<translation id="2569974318947988067">Chrome naviqasiyaları HTTPS-ə təkmilləşdirməyə cəhd edəcək</translation>
 <translation id="2574930892358684005"><ph name="EXISTING_USER" /> artıq bu Chrome profilinə daxil olub. Baxışınızı ayrı saxlamaq üçün Chrome sizin üçün öz profilinizi yarada bilər.</translation>
 <translation id="2580411288591421699">Hazırda istifadə olunan Google Chrome versiyasını quraşdıra bilməzsiniz. Lütfən, Google Chrome'u qapadın və yenidən cəhd edin.</translation>
 <translation id="2586406160782125153">Brauzinq datanız bu cihazdan silinəcək. Datanı sonradan bərpa etmək üçün Chrome'a <ph name="USER_EMAIL" /> kimi daxil olun.</translation>
@@ -214,6 +215,7 @@
 <translation id="4335235004908507846">Chrome Sizi data pozuntuları, xətalı artırmalar və digər güvənlik məsələlərinə qarşı qoruya bilər</translation>
 <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> Chrome'a əlavə edildi</translation>
 <translation id="4384570495110188418">Hesaba daxil olmadığınız üçün Chrome parollarınızı yoxlaya bilmir</translation>
+<translation id="4389991535395284064">Anonim rejimdə nəzər saldıqda Chrome təhlükəli bağlantı ilə sayt yükləməzdən əvvəl xəbərdarlıq edəcək</translation>
 <translation id="4393248995085527349">Google Chrome güncəlləmələrini əldə etmək üçün macOS 10.15 və ya daha yeni versiya tələb olunur. Bu kompüter macOS 10.13 istifadə edir.</translation>
 <translation id="4427306783828095590">Təkmil qoruma ilə fişinq və zərərli proqramların bloklanması üçün daha çox iş görülür</translation>
 <translation id="4450664632294415862">Chrome - Şəbəkəyə Giriş - <ph name="PAGE_TITLE" /></translation>
@@ -384,6 +386,7 @@
 <translation id="7426611252293106642">Google Chrome düzgün işləməyə bilər, çünki daha bu Linux sistemi üzərində dəstəklənmir</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Chrome 1 dəqiqə istifadə edilmədikdə təşkilat onu avtomatik bağlayır.}other{Chrome # dəqiqə istifadə edilmədikdə təşkilat onu avtomatik bağlayır.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Chrome 1 dəqiqə istifadə edilmədikdə təşkilat baxış datasını avtomatik silir. Bura tarixçə, avtodoldurma və endirmələr daxil ola bilər. Tablar açıq qalacaq.}other{Chrome # dəqiqə istifadə edilmədikdə təşkilat baxış datasını avtomatik silir. Bura tarixçə, avtodoldurma və endirmələr daxil ola bilər. Tablar açıq qalacaq.}}</translation>
+<translation id="7477130805345743099">Chrome təhlükəli bağlantı ilə sayt yükləməzdən əvvəl xəbərdarlıq edəcək</translation>
 <translation id="7481213027396403996">Chrome’un ən güclü güvənlik sistemini əldə edin</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> Quraşdırıcısı</translation>
@@ -475,6 +478,7 @@
 <translation id="8922193594870374009"><ph name="ORIGIN" /> cihazından Android telefonunuza nömrə göndərmək üçün hər iki cihazda Chrome'a daxil olun.</translation>
 <translation id="8986207147630327271">Bu brauzerə iş profili əlavə edirsiniz və administratorunuza yalnız iş profili üzərində nəzarət verirsiniz.</translation>
 <translation id="8989968390305463310">Baxış tarixçəniz gördüyünüz reklamlara və aşağıda təxmin edilən maraqlara təsir edir. Məxfiliyinizi qorumaq üçün Chrome hər ay maraqlarınızı növbəlilik əsasında avtomatik olaraq silir. Silmədiyiniz təqdirdə maraqlar yenilənə bilər.</translation>
+<translation id="8999117580775242387">HTTPS əlçatan olmadıqda Chrome xəbərdarlıq etmədən təhlükəli bağlantı istifadə edəcək</translation>
 <translation id="8999208279178790196">{0,plural, =0{Chrome güncəlləməsi əlçatandır}=1{Chrome güncəlləməsi əlçatandır}other{Chrome güncəlləməsi # gün əlçatan olub}}</translation>
 <translation id="9053892488859122171">ChromeOS Flex sistemi</translation>
 <translation id="9054037008353851982">Güncəlləmək üçün yenidən başladın - Tablar yenidən açılacaq</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb
index 1f749a18..92abd733 100644
--- a/chrome/app/resources/google_chrome_strings_bs.xtb
+++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -101,6 +101,7 @@
 <translation id="2556847002339236023">Vaš organizacija zatvara Chrome kada se ne koristi <ph name="TIMEOUT_DURATION" />. Podaci o pregledanju su izbrisani. Ovo može uključivati historiju, automatsko popunjavanje i preuzimanja.</translation>
 <translation id="2559253115192232574">Kasnije, web lokacija koju ste posjetili može zatražiti od Chromea da pogleda vaša interesovanja radi personalizacije oglasa koje vidite. Chrome može dijeliti do 3 ineresovanja.</translation>
 <translation id="2563121210305478421">Ponovo pokrenuti Chrome?</translation>
+<translation id="2569974318947988067">Chrome će pokušati nadograditi kretanja na HTTPS</translation>
 <translation id="2574930892358684005">Račun <ph name="EXISTING_USER" /> je već prijavljen na ovom Chrome profilu. Da vaše pregledanje ostane odvojeno, Chrome vam može kreirati vaš lični profil.</translation>
 <translation id="2580411288591421699">Nije moguće instalirati istu verziju Google Chromea koja je trenutno pokrenuta. Zatvorite Google Chrome i pokušajte ponovo.</translation>
 <translation id="2586406160782125153">Na ovaj način će se podaci o pregledanju izbrisati s ovog uređaja. Da preuzmete svoje podatke kasnije, prijavite se na Chrome kao <ph name="USER_EMAIL" />.</translation>
@@ -217,6 +218,7 @@
 <translation id="4335235004908507846">Chrome vam može pomoći da se zaštitite od narušavanja podataka, loših ekstenzija i još mnogo toga</translation>
 <translation id="4343195214584226067">Ekstenzija <ph name="EXTENSION_NAME" /> je dodana u Chrome</translation>
 <translation id="4384570495110188418">Chrome ne može provjeravati vaše lozinke jer niste prijavljeni</translation>
+<translation id="4389991535395284064">Ako pregledavate u anonimnom načinu, Chrome će vas upozoriti prije nego što učitate web-lokaciju putem nesigurne veze</translation>
 <translation id="4393248995085527349">Da primate buduća ažuriranja za Google Chrome, trebat će vam macOS 10.15 ili novija verzija. Ovaj računar koristi macOS 10.13.</translation>
 <translation id="4427306783828095590">Poboljšana zaštita vas još bolje čuva od krađe identiteta i zlonamjernog softvera</translation>
 <translation id="4450664632294415862">Chrome – prijava na mrežu – <ph name="PAGE_TITLE" /></translation>
@@ -389,6 +391,7 @@
 <translation id="7426611252293106642">Google Chrome možda neće ispravno raditi jer više nije podržan na ovoj Linux distribuciji</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Organizacija automatski zatvara Chrome kada se ne koristi 1 minutu.}one{Organizacija automatski zatvara Chrome kada se ne koristi # minutu.}few{Organizacija automatski zatvara Chrome kada se ne koristi # minute.}other{Organizacija automatski zatvara Chrome kada se ne koristi # minuta.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Organizacija automatski briše podatke o pregledanju kada se Chrome ne koristi 1 minutu. Ovo može uključivati historiju, automatsko popunjavanje i preuzimanja. Kartice će ostati otvorene.}one{Organizacija automatski briše podatke o pregledanju kada se Chrome ne koristi # minutu. Ovo može uključivati historiju, automatsko popunjavanje i preuzimanja. Kartice će ostati otvorene.}few{Organizacija automatski briše podatke o pregledanju kada se Chrome ne koristi # minute. Ovo može uključivati historiju, automatsko popunjavanje i preuzimanja. Kartice će ostati otvorene.}other{Organizacija automatski briše podatke o pregledanju kada se Chrome ne koristi # minuta. Ovo može uključivati historiju, automatsko popunjavanje i preuzimanja. Kartice će ostati otvorene.}}</translation>
+<translation id="7477130805345743099">Chrome će vas upozoriti prije učitavanja bilo koje web-lokacije putem nesigurne veze</translation>
 <translation id="7481213027396403996">Odaberite maksimalnu sigurnost koju nudi Chrome</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119">Alat za instaliranje preglednika <ph name="COMPANY_NAME" /></translation>
@@ -480,6 +483,7 @@
 <translation id="8922193594870374009">Da pošaljete broj s uređaja <ph name="ORIGIN" /> na svoj Android telefon, prijavite se u Chrome na oba uređaja.</translation>
 <translation id="8986207147630327271">Dodajete radni profil na ovaj preglednik i dajte administratoru kontrolu samo nad radnim profilom.</translation>
 <translation id="8989968390305463310">Vaša historija pregledanja utiče na oglase koje vidite i interesovanja, kao što je procijenjeno u nastavku. Da zaštiti vašu privatnost, Chrome automatski briše vaša interesovanja na mjesečnoj osnovi. Interesovanja se mogu osvježiti ukoliko ih ne uklonite.</translation>
+<translation id="8999117580775242387">Kad HTTPS nije dostupan, Chrome će upotrebljavati nesigurnu vezu bez upozorenja</translation>
 <translation id="8999208279178790196">{0,plural, =0{Dostupno je ažuriranje Chromea}=1{Dostupno je ažuriranje Chromea}one{Ažuriranje Chromea je dostupno # dan}few{Ažuriranje Chromea je dostupno # dana}other{Ažuriranje Chromea je dostupno # dana}}</translation>
 <translation id="9053892488859122171">Sistem ChromeOS Flex</translation>
 <translation id="9054037008353851982">Pokrenite ponovo da ažurirate. Kartice će se ponovo otvoriti</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 77e317b..7570316a 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -101,6 +101,7 @@
 <translation id="2556847002339236023">Isinasara ng iyong organisasyon ang Chrome kapag hindi ito ginagamit sa loob ng <ph name="TIMEOUT_DURATION" />. Na-delete ang data mula sa pag-browse. Posibleng kasama rito ang history, autofill, at mga download.</translation>
 <translation id="2559253115192232574">Sa ibang pagkakataon, puwedeng hilingin ng site na binibisita mo sa Chrome na makita ang iyong mga interes para ma-personalize ang mga ad na nakikita mo. Puwedeng magbahagi ng hanggang 3 interes ang Chrome.</translation>
 <translation id="2563121210305478421">Muling ilunsad ang Chrome?</translation>
+<translation id="2569974318947988067">Susubukan ng Chrome na i-upgrade ang mga pag-navigate sa HTTPS</translation>
 <translation id="2574930892358684005">Naka-sign in na si <ph name="EXISTING_USER" /> sa profile sa Chrome na ito. Para panatilihing hiwalay ang iyong pag-browse, puwedeng gumawa ang Chrome ng sarili mong profile para sa iyo.</translation>
 <translation id="2580411288591421699">Hindi ma-install ang parehong bersyon ng Google Chrome na kasalukuyang tumatakbo. Mangyaring isara ang Google Chrome at muling subukan.</translation>
 <translation id="2586406160782125153">Ide-delete nito ang iyong data sa pag-browse sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chrome bilang <ph name="USER_EMAIL" />.</translation>
@@ -217,6 +218,7 @@
 <translation id="4335235004908507846">Makakatulong ang Chrome na panatilihin kang ligtas laban sa mga paglabag sa data, sirang extension, at higit pa</translation>
 <translation id="4343195214584226067">Naidagdag na ang <ph name="EXTENSION_NAME" /> sa Chrome</translation>
 <translation id="4384570495110188418">Hindi masusuri ng Chrome ang iyong mga password dahil hindi ka naka-sign in</translation>
+<translation id="4389991535395284064">Kapag nagba-browse sa Incognito mode, bibigyan ka ng babala ng Chrome bago nito i-load ang isang site na gumagamit ng hindi secure na koneksyon</translation>
 <translation id="4393248995085527349">Para makakuha ng mga update sa Google Chrome sa hinaharap, mangangailangan ka ng macOS 10.15 o mas bago. Gumagamit ang computer na ito ng macOS 10.13.</translation>
 <translation id="4427306783828095590">Mas maraming magagawa ang pinahusay na proteksyon para mag-block ng phishing and malware</translation>
 <translation id="4450664632294415862">Chrome - Pag-sign in sa Network - <ph name="PAGE_TITLE" /></translation>
@@ -389,6 +391,7 @@
 <translation id="7426611252293106642">Posibleng hindi gumana nang maayos ang Google Chrome dahil hindi na ito sinusuportahan sa Linux distribution na ito.</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Awtomatikong isinasara ng iyong organisasyon ang Chrome kapag hindi ito nagamit nang 1 minuto.}one{Awtomatikong isinasara ng iyong organisasyon ang Chrome kapag hindi ito nagamit nang # minuto.}other{Awtomatikong isinasara ng iyong organisasyon ang Chrome kapag hindi ito nagamit nang # na minuto.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Awtomatikong ide-delete ng iyong organisasyon ang data mula sa pag-browse kapag hindi nagamit ang Chrome nang 1 minuto. Posibleng kasama rito ang history, autofill, at mga download. Mananatiling nakabukas ang iyong mga tab.}one{Awtomatikong ide-delete ng iyong organisasyon ang data mula sa pag-browse kapag hindi nagamit ang Chrome nang # minuto. Posibleng kasama rito ang history, autofill, at mga download. Mananatiling nakabukas ang iyong mga tab.}other{Awtomatikong ide-delete ng iyong organisasyon ang data mula sa pag-browse kapag hindi nagamit ang Chrome nang # na minuto. Posibleng kasama rito ang history, autofill, at mga download. Mananatiling nakabukas ang iyong mga tab.}}</translation>
+<translation id="7477130805345743099">Bibigyan ka ng babala ng Chrome bago nito i-load ang anumang site na gumagamit ng hindi secure na koneksyon</translation>
 <translation id="7481213027396403996">Kunin ang pinakamahusay na seguridad ng Chrome</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119">Installer ng <ph name="COMPANY_NAME" /></translation>
@@ -480,6 +483,7 @@
 <translation id="8922193594870374009">Para magpadala ng numero sa iyong Android phone mula sa <ph name="ORIGIN" />, mag-sign in sa Chrome sa parehong device.</translation>
 <translation id="8986207147630327271">Nagdaragdag ka ng profile sa trabaho sa browser na ito at binibigyan mo ang iyong administrator ng kontrol sa profile sa trabaho lang.</translation>
 <translation id="8989968390305463310">Naaapektuhan ng iyong history ng pag-browse ang mga ad na nakikita mo at mga interes tulad ng tinatantya sa ibaba. Para protektahan ang iyong privacy, awtomatikong ide-delete ng Chrome ang mga interes mo sa rolling na paraan bawat buwan. Puwedeng ma-refresh ang mga interes maliban na lang kung alisin mo ang mga ito.</translation>
+<translation id="8999117580775242387">Kapag hindi available ang HTTPS, gagamit ang Chrome ng hindi secure na koneksyon nang hindi ka binabalaan</translation>
 <translation id="8999208279178790196">{0,plural, =0{May available na update sa Chrome}=1{May available na update sa Chrome}one{# araw nang may available na update sa Chrome}other{# na araw nang may available na update sa Chrome}}</translation>
 <translation id="9053892488859122171">System ng ChromeOS Flex</translation>
 <translation id="9054037008353851982">Ilunsad Ulit para I-update - Bubukas ulit ang iyong mga tab</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb
index 70f6305..b67287e 100644
--- a/chrome/app/resources/google_chrome_strings_gu.xtb
+++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -101,6 +101,7 @@
 <translation id="2556847002339236023">જ્યારે તમારી સંસ્થા <ph name="TIMEOUT_DURATION" /> માટે Chromeનો ઉપયોગ ન કરે ત્યારે તેને બંધ કરે છે. બ્રાઉઝિંગ ડેટા ડિલીટ કરવામાં આવ્યો હતો. આમાં ઇતિહાસ, ઑટોમૅટિક રીતે ભરવાની સુવિધા અને ડાઉનલોડ કરેલું કન્ટેન્ટ શામેલ હોઈ શકે છે.</translation>
 <translation id="2559253115192232574">પછી, તમે જેની મુલાકાત લો તે સાઇટ Chromeને તમારી રુચિઓ જોવા માટે કહી શકે છે, જેથી તમને જોવા મળતી જાહેરાતોને મનગમતી બનાવી શકાય. Chrome વધુમાં વધુ 3 રુચિ શેર કરી શકે છે.</translation>
 <translation id="2563121210305478421">Chrome ફરીથી લૉન્ચ કરીએ?</translation>
+<translation id="2569974318947988067">Chrome નૅવિગેશનને HTTPS પર અપગ્રેડ કરવાનો પ્રયાસ કરશે</translation>
 <translation id="2574930892358684005"><ph name="EXISTING_USER" /> આ Chrome પ્રોફાઇલમાં પહેલેથી સાઇન ઇન છે. તમારું બ્રાઉઝિંગ અલગ રાખવા, Chrome તમારા માટે તમારી અલગ પ્રોફાઇલ બનાવી શકે છે.</translation>
 <translation id="2580411288591421699">હાલમાં ચાલી રહ્યું છે તે જ Google Chrome વર્ઝનને ઇન્સ્ટૉલ કરી શકાતું નથી. કૃપા કરીને Google Chrome બંધ કરો અને ફરીથી પ્રયાસ કરો.</translation>
 <translation id="2586406160782125153">આ, તમારા બ્રાઉઝિંગ ડેટાને આ ડિવાઇસમાંથી ડિલીટ કરશે. પછીથી તમારો ડેટા ફરીથી મેળવવા માટે, Chromeમાં <ph name="USER_EMAIL" /> તરીકે સાઇન ઇન કરો.</translation>
@@ -217,6 +218,7 @@
 <translation id="4335235004908507846">Chrome તમને ડેટા ઉલ્લંઘન, ખરાબ એક્સ્ટેંશન અને બીજી ઘણી બાબતોથી સુરક્ષિત રાખી શકે છે</translation>
 <translation id="4343195214584226067"><ph name="EXTENSION_NAME" />ને Chromeમાં ઉમેરવામાં આવ્યું છે</translation>
 <translation id="4384570495110188418">તમે સાઇન ઇન કરેલું ન હોવાને કારણે Chrome તમારા પાસવર્ડ ચેક કરી શકતું નથી</translation>
+<translation id="4389991535395284064">છૂપા મોડમાં બ્રાઉઝ કરતી વખતે, Chrome તમને અસુરક્ષિત કનેક્શનનો ઉપયોગ કરીને સાઇટ લોડ કરતા પહેલાં ચેતવણી આપશે</translation>
 <translation id="4393248995085527349">Google Chromeની ભાવિ અપડેટ મેળવવા માટે, તમારે macOS 10.15 કે તે પછીના વર્ઝન પર અપડેટ કરવું જરૂરી રહેશે. આ કમ્પ્યુટર macOS 10.13નો ઉપયોગ કરી રહ્યું છે.</translation>
 <translation id="4427306783828095590">વધારેલી સુરક્ષા ફિશિંગ અને માલવેરને બ્લૉક કરવામાં વધુ સહાયરૂપ થાય છે</translation>
 <translation id="4450664632294415862">Chrome - નેટવર્ક સાઇન ઇન - <ph name="PAGE_TITLE" /></translation>
@@ -389,6 +391,7 @@
 <translation id="7426611252293106642">આ Linux વિતરણ સિસ્ટમ પર Google Chrome હવે સપોર્ટ કરતું ન હોવાથી કદાચ તે યોગ્ય રીતે કાર્ય ન કરે</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{જ્યારે 1 મિનિટ સુધી Chromeનો ઉપયોગ કરવામાં ન આવે, ત્યારે તમારી સંસ્થા તેને ઑટોમૅટિક રીતે બંધ કરી નાખે છે.}one{જ્યારે # મિનિટ સુધી Chromeનો ઉપયોગ કરવામાં ન આવે, ત્યારે તમારી સંસ્થા તેને ઑટોમૅટિક રીતે બંધ કરી નાખે છે.}other{જ્યારે # મિનિટ સુધી Chromeનો ઉપયોગ કરવામાં ન આવે, ત્યારે તમારી સંસ્થા તેને ઑટોમૅટિક રીતે બંધ કરી નાખે છે.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{જ્યારે 1 મિનિટ સુધી Chromeનો ઉપયોગ કરવામાં ન આવે, ત્યારે તમારી સંસ્થા બ્રાઉઝિંગ ડેટાને ઑટોમૅટિક રીતે ડિલીટ કરે છે. આમાં ઇતિહાસ, ઑટોમૅટિક રીતે ભરવાની સુવિધા અને ડાઉનલોડ કરેલું કન્ટેન્ટ શામેલ હોઈ શકે છે. તમારા ટૅબ ખોલેલા રહેશે.}one{જ્યારે # મિનિટ સુધી Chromeનો ઉપયોગ કરવામાં ન આવે, ત્યારે તમારી સંસ્થા બ્રાઉઝિંગ ડેટાને ઑટોમૅટિક રીતે ડિલીટ કરે છે. આમાં ઇતિહાસ, ઑટોમૅટિક રીતે ભરવાની સુવિધા અને ડાઉનલોડ કરેલું કન્ટેન્ટ શામેલ હોઈ શકે છે. તમારા ટૅબ ખોલેલા રહેશે.}other{જ્યારે # મિનિટ સુધી Chromeનો ઉપયોગ કરવામાં ન આવે, ત્યારે તમારી સંસ્થા બ્રાઉઝિંગ ડેટાને ઑટોમૅટિક રીતે ડિલીટ કરે છે. આમાં ઇતિહાસ, ઑટોમૅટિક રીતે ભરવાની સુવિધા અને ડાઉનલોડ કરેલું કન્ટેન્ટ શામેલ હોઈ શકે છે. તમારા ટૅબ ખોલેલા રહેશે.}}</translation>
+<translation id="7477130805345743099">અસુરક્ષિત કનેક્શનનો ઉપયોગ કરીને કોઈપણ સાઇટ લોડ કરતા પહેલાં Chrome તમને ચેતવણી આપશે</translation>
 <translation id="7481213027396403996">Chromeની સૌથી વધુ મજબૂત સુરક્ષા મેળવો</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ઇન્સ્ટૉલર</translation>
@@ -480,6 +483,7 @@
 <translation id="8922193594870374009"><ph name="ORIGIN" />માંથી તમારા Android ફોન પર નંબર મોકલવા માટે, બન્ને ડિવાઇસ પર Chromeમાં સાઇન ઇન કરો.</translation>
 <translation id="8986207147630327271">તમે આ બ્રાઉઝરમાં ઑફિસની પ્રોફાઇલ ઉમેરી રહ્યાં છો અને તમારા વ્યવસ્થાપકને માત્ર ઑફિસની પ્રોફાઇલનો નિયંત્રણ આપી રહ્યાં છો.</translation>
 <translation id="8989968390305463310">તમારો બ્રાઉઝિંગ ઇતિહાસ તમે જુઓ છો તે જાહેરાતોને અને નીચે જણાવેલી અનુમાનિત રુચિઓને અસર કરે છે. તમારી પ્રાઇવસીની સુરક્ષા કરવા માટે Chrome નવા વિષયો આવતા જાય, તેના આધારે દર મહિને તમારી રુચિના વિષયોને ઑટોમૅટિક રીતે ડિલીટ કરે છે. જો તમે રુચિઓને કાઢી ન નાખો, તો તે રિફ્રેશ થઈ શકે છે.</translation>
+<translation id="8999117580775242387">જ્યારે HTTPS ઉપલબ્ધ ન હોય, ત્યારે Chrome તમને ચેતવણી આપ્યા વિના અસુરક્ષિત કનેક્શનનો ઉપયોગ કરશે</translation>
 <translation id="8999208279178790196">{0,plural, =0{એક Chrome અપડેટ ઉપલબ્ધ છે}=1{એક Chrome અપડેટ ઉપલબ્ધ છે}one{Chrome અપડેટ # દિવસ માટે ઉપલબ્ધ છે}other{Chrome અપડેટ # દિવસ માટે ઉપલબ્ધ છે}}</translation>
 <translation id="9053892488859122171">ChromeOS Flex સિસ્ટમ</translation>
 <translation id="9054037008353851982">અપડેટ કરવા માટે ફરીથી લૉન્ચ કરો - તમારાં ટૅબ ફરીથી ખૂલશે</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
index 922ed3e..0baaa34 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -97,6 +97,7 @@
 <translation id="2556847002339236023">Vaša organizacija zatvara Chrome kada se ne upotrebljava <ph name="TIMEOUT_DURATION" />. Podaci o pregledavanju su izbrisani. To može uključivati povijest, automatsko popunjavanje i preuzimanja.</translation>
 <translation id="2559253115192232574">Web-lokacija koju posjetite nakon toga može od Chromea tražiti podatke o vašim interesima kako bi prilagodila oglase koji će vam se prikazivati. Chrome može dijeliti najviše tri interesa.</translation>
 <translation id="2563121210305478421">Ponovo pokrenuti Chrome?</translation>
+<translation id="2569974318947988067">Chrome će pokušati nadograditi kretanja na HTTPS</translation>
 <translation id="2574930892358684005">Korisnik <ph name="EXISTING_USER" /> već je prijavljen na taj profil u Chromeu. Da bi vaše pregledavanje ostalo odvojeno, Chrome vam može izraditi vlastiti profil.</translation>
 <translation id="2580411288591421699">Nije moguće instalirati istu verziju programa Google Chrome koja je trenutačno pokrenuta. Zatvorite Google Chrome i pokušajte ponovo.</translation>
 <translation id="2586406160782125153">Time će se izbrisati podaci o pregledavanju s uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao <ph name="USER_EMAIL" />.</translation>
@@ -213,6 +214,7 @@
 <translation id="4335235004908507846">Chrome vam može pomoći da se bolje zaštitite od povrede podataka, zlonamjernih proširenja i još mnogo toga</translation>
 <translation id="4343195214584226067">Proširenje <ph name="EXTENSION_NAME" /> dodano je u Chrome</translation>
 <translation id="4384570495110188418">Chrome ne može provjeriti vaše zaporke jer niste prijavljeni</translation>
+<translation id="4389991535395284064">Ako pregledavate u anonimnom načinu, Chrome će vas upozoriti prije nego što učitate web-lokaciju putem nesigurne veze</translation>
 <translation id="4393248995085527349">Da biste primali buduća ažuriranja Google Chromea, trebat će vam macOS 10.15 ili novija verzija. Na ovom se računalu upotrebljava macOS 10.13.</translation>
 <translation id="4427306783828095590">Poboljšana zaštita blokira krađu identiteta i zlonamjerni softver na više načina</translation>
 <translation id="4450664632294415862">Chrome – Prijava na mrežu – <ph name="PAGE_TITLE" /></translation>
@@ -381,6 +383,7 @@
 <translation id="7426611252293106642">Google Chrome možda neće ispravno raditi jer više nije podržan na toj distribuciji Linuxa</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Kad se Chrome ne koristi jednu minutu, vaša ga organizacija automatski zatvara.}one{Kad se Chrome ne koristi # minutu, vaša ga organizacija automatski zatvara.}few{Kad se Chrome ne koristi # minute, vaša ga organizacija automatski zatvara.}other{Kad se Chrome ne koristi # minuta, vaša ga organizacija automatski zatvara.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Vaša organizacija automatski briše podatke o pregledavanju kada se Chrome ne koristi jednu minutu. To može uključivati povijest, automatsko popunjavanje i preuzimanja. Kartice će ostati otvorene.}one{Vaša organizacija automatski briše podatke o pregledavanju kada se Chrome ne koristi # minutu. To može uključivati povijest, automatsko popunjavanje i preuzimanja. Kartice će ostati otvorene.}few{Vaša organizacija automatski briše podatke o pregledavanju kada se Chrome ne koristi # minute. To može uključivati povijest, automatsko popunjavanje i preuzimanja. Kartice će ostati otvorene.}other{Vaša organizacija automatski briše podatke o pregledavanju kada se Chrome ne koristi # minuta. To može uključivati povijest, automatsko popunjavanje i preuzimanja. Kartice će ostati otvorene.}}</translation>
+<translation id="7477130805345743099">Chrome će vas upozoriti prije učitavanja bilo koje web-lokacije putem nesigurne veze</translation>
 <translation id="7481213027396403996">Odaberite najsnažniju Chromeovu zaštitu sigurnosti</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119">Program za instalaciju <ph name="COMPANY_NAME" /></translation>
@@ -472,6 +475,7 @@
 <translation id="8922193594870374009">Da biste poslali broj s uređaja <ph name="ORIGIN" /> na svoj Android telefon, prijavite se na Chrome na oba uređaja.</translation>
 <translation id="8986207147630327271">Dodat ćete poslovni profil u ovaj preglednik i dati administratoru kontrolu samo nad poslovnim profilom.</translation>
 <translation id="8989968390305463310">Vaša povijest pregledavanja utječe na oglase koji vam se prikazuju i interese procijenjene u nastavku. Da bi zaštitio vašu privatnost, Chrome automatski kontinuirano briše vaše interese svakog mjeseca. Interesi se mogu osvježiti ako ih ne uklonite.</translation>
+<translation id="8999117580775242387">Kad HTTPS nije dostupan, Chrome će upotrebljavati nesigurnu vezu bez upozorenja</translation>
 <translation id="8999208279178790196">{0,plural, =0{Dostupno je ažuriranje Chromea}=1{Dostupno je ažuriranje Chromea}one{Ažuriranje Chromea dostupno je # dana}few{Ažuriranje Chromea dostupno je # dana}other{Ažuriranje Chromea dostupno je # dana}}</translation>
 <translation id="9053892488859122171">Sustav ChromeOS Flex</translation>
 <translation id="9054037008353851982">Ponovno pokrenite da biste ažurirali – kartice će se ponovno otvoriti</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb
index 11e45c1..0e7f5fb 100644
--- a/chrome/app/resources/google_chrome_strings_hu.xtb
+++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -97,6 +97,7 @@
 <translation id="2556847002339236023">Szervezete bezárja a Chrome-ot, ha nem használja a böngészőt ennyi ideig:<ph name="TIMEOUT_DURATION" />. A böngészési adatok törlődtek. A böngészési adatok közé tartozhatnak az előzmények, az automatikus kitöltés adatai és a letöltött tartalom is.</translation>
 <translation id="2559253115192232574">Később az Ön által felkeresett webhelyek a megjelenő hirdetések személyre szabása érdekében kérhetik a Chrome-tól az Ön érdeklődési köreinek megismerését. A Chrome legfeljebb három érdeklődési kört oszthat meg.</translation>
 <translation id="2563121210305478421">Újraindítja a Chrome-ot?</translation>
+<translation id="2569974318947988067">A Chrome megpróbálja HTTPS-re frissíteni a navigációt</translation>
 <translation id="2574930892358684005"><ph name="EXISTING_USER" /> már be van jelentkezve ebbe a Chrome-profilba. Ha szeretné elkülöníteni böngészési tevékenységeit, a Chrome saját profilt hozhat létre Önnek.</translation>
 <translation id="2580411288591421699">Nem lehet ugyanazt a Google Chrome verziót telepíteni, amely jelenleg is fut. Zárja be a Google Chrome-ot, és próbálja újra.</translation>
 <translation id="2586406160782125153">Ezzel az eszközön lévő összes böngészési adat törlődik. Az adatok későbbi lekéréséhez jelentkezzen be a Chrome-ba a következő e-mail-címmel: <ph name="USER_EMAIL" />.</translation>
@@ -213,6 +214,7 @@
 <translation id="4335235004908507846">A Chrome segíthet az adatvédelmi incidensek, nem biztonságos bővítmények és egyebek elleni védekezésben</translation>
 <translation id="4343195214584226067">A(z) <ph name="EXTENSION_NAME" /> hozzá lett adva a Chrome-hoz</translation>
 <translation id="4384570495110188418">A Chrome nem tudja ellenőrizni az Ön jelszavait, mert nincs bejelentkezve</translation>
+<translation id="4389991535395284064">Inkognitó módban való böngészéskor a Chrome figyelmezteti Önt a nem biztonságos kapcsolatot használó webhelyek betöltése előtt</translation>
 <translation id="4393248995085527349">Ha a jövőben Google Chrome-frissítéseket szeretne kapni, akkor a macOS 10.15-ös vagy újabb verziójára lesz szüksége. Ezen a számítógépen a macOS 10.13 fut.</translation>
 <translation id="4427306783828095590">A Speciális védelem még többet tesz annak érdekében, hogy letiltsa az adathalászatot és a rosszindulatú programokat</translation>
 <translation id="4450664632294415862">Chrome – Hálózati bejelentkezés – <ph name="PAGE_TITLE" /></translation>
@@ -381,6 +383,7 @@
 <translation id="7426611252293106642">Előfordulhat, hogy a Chrome nem fog megfelelően működni, mert a továbbiakban már nem támogatja ezt a Linux-verziót.</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Szervezete automatikusan bezárja a Chrome-ot, ha 1 percig nincs használatban.}other{Szervezete automatikusan bezárja a Chrome-ot, ha # percig nincs használatban.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Szervezete automatikusan törli a böngészési adatokat, ha a Chrome 1 percig nincs használatban. A böngészési adatok közé tartozhatnak az előzmények, az automatikus kitöltés adatai és a letöltések. A lapok nyitva maradnak.}other{Szervezete automatikusan törli a böngészési adatokat, ha a Chrome # percig nincs használatban. A böngészési adatok közé tartozhatnak az előzmények, az automatikus kitöltés adatai és a letöltések. A lapok nyitva maradnak.}}</translation>
+<translation id="7477130805345743099">A Chrome figyelmezteti Önt a nem biztonságos kapcsolatot használó webhelyek betöltése előtt</translation>
 <translation id="7481213027396403996">Állítsa be a Chrome legerősebb védelmét</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119"><ph name="COMPANY_NAME" />-telepítő</translation>
@@ -472,6 +475,7 @@
 <translation id="8922193594870374009">Ha innen: <ph name="ORIGIN" /> szeretne számot küldeni Android-telefonjára, jelentkezzen be a Chrome-ba mindkét eszközén.</translation>
 <translation id="8986207147630327271">Munkaprofilt ad hozzá ehhez a böngészőhöz, és csak a munkaprofil felett adja át az irányítást a rendszergazdának.</translation>
 <translation id="8989968390305463310">Böngészési előzményei határozzák meg az Ön számára megjelenő hirdetéseket és az alább látható módon felmért érdeklődési köröket. Adatai védelme érdekében a Chrome havi rendszerességgel automatikusan törli az Ön érdeklődési köreit. Az érdeklődési körök frissülhetnek, kivéve, ha eltávolítja őket.</translation>
+<translation id="8999117580775242387">Ha a HTTPS nem áll rendelkezésre, a Chrome nem biztonságos kapcsolatot fog használni anélkül, hogy figyelmeztetné Önt</translation>
 <translation id="8999208279178790196">{0,plural, =0{Rendelkezésre áll egy Chrome-frissítés}=1{Rendelkezésre áll egy Chrome-frissítés}other{# napja rendelkezésre áll egy Chrome-frissítés}}</translation>
 <translation id="9053892488859122171">ChromeOS Flex rendszer</translation>
 <translation id="9054037008353851982">Indítsa újra a frissítéshez – a lapok újra meg fognak nyílni</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index 69b8205..80aafe6 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -97,6 +97,7 @@
 <translation id="2556847002339236023">‏לפי הגדרת הארגון, Chrome נסגר אוטומטית כשלא משתמשים בו במשך <ph name="TIMEOUT_DURATION" />. נתוני הגלישה נמחקו. בין הנתונים שנמחקו: היסטוריה, מילוי אוטומטי והורדות.</translation>
 <translation id="2559253115192232574">‏לאחר מכן, אתר שבו ביקרת יכול לשלוח בקשה ל-Chrome כדי לגלות מהם תחומי העניין שלך ולהתאים אישית את המודעות שמוצגות לך. Chrome יכול לשתף עד 3 תחומי עניין.</translation>
 <translation id="2563121210305478421">‏להפעיל את Chrome מחדש?</translation>
+<translation id="2569974318947988067">‏Chrome ינסה לשדרג את הניווטים ל-HTTPS</translation>
 <translation id="2574930892358684005">‏המשתמש <ph name="EXISTING_USER" /> כבר מחובר לפרופיל Chrome הזה. כדי להפריד בין פעילויות גלישה, Chrome יכול ליצור עבורך פרופיל משלך.</translation>
 <translation id="2580411288591421699">‏אין אפשרות להתקין את אותה גרסת Google Chrome הפועלת כעת. יש לסגור את Google Chrome ולנסות שוב.</translation>
 <translation id="2586406160782125153">‏הפעולה תמחק את נתוני הגלישה מהמכשיר. כדי לאחזר את הנתונים מאוחר יותר, יש להיכנס אל Chrome עם <ph name="USER_EMAIL" />.</translation>
@@ -213,6 +214,7 @@
 <translation id="4335235004908507846">‏Chrome עוזר להגן עליך מפני פרצות באבטחת המידע, תוספים לא תקינים ועוד</translation>
 <translation id="4343195214584226067">‏<ph name="EXTENSION_NAME" /> נוסף ל-‏Chrome</translation>
 <translation id="4384570495110188418">‏Chrome לא יכול לבדוק את הסיסמאות שלך כי לא נכנסת לחשבון</translation>
+<translation id="4389991535395284064">‏בגלישה במצב פרטי, Chrome יציג אזהרה לפני טעינת אתר באמצעות חיבור לא מאובטח</translation>
 <translation id="4393248995085527349">‏כדי לקבל עדכונים של Google Chrome בעתיד, צריך להשתמש ב-macOS מגרסה 10.15 ואילך. במחשב הזה מותקנת מערכת ההפעלה macOS 10.13.</translation>
 <translation id="4427306783828095590">עם ההגנה המשופרת, החסימה של פישינג ותוכנות זדוניות מקיפה יותר</translation>
 <translation id="4450664632294415862">‏Chrome – כניסה לרשת – <ph name="PAGE_TITLE" /></translation>
@@ -381,6 +383,7 @@
 <translation id="7426611252293106642">‏יכול להיות ש-Google Chrome לא יפעל כראוי כי הוא כבר לא נתמך בגרסה הזו של Linux</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{‏לפי הגדרת הארגון, Chrome נסגר אוטומטית כשלא משתמשים בו במשך דקה.}one{‏לפי הגדרת הארגון, Chrome נסגר אוטומטית כשלא משתמשים בו במשך # דקות.}two{‏לפי הגדרת הארגון, Chrome נסגר אוטומטית כשלא משתמשים בו במשך # דקות.}other{‏לפי הגדרת הארגון, Chrome נסגר אוטומטית כשלא משתמשים בו במשך # דקות.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{‏נתוני הגלישה נמחקים באופן אוטומטי על ידי הארגון כשלא נעשה שימוש ב-Chrome במשך דקה. בין הנתונים שיימחקו: היסטוריה, מילוי אוטומטי והורדות. הכרטיסיות יישארו פתוחות.}one{‏נתוני הגלישה נמחקים באופן אוטומטי על ידי הארגון כשלא נעשה שימוש ב-Chrome במשך # דקות. בין הנתונים שיימחקו: היסטוריה, מילוי אוטומטי והורדות. הכרטיסיות יישארו פתוחות.}two{‏נתוני הגלישה נמחקים באופן אוטומטי על ידי הארגון כשלא נעשה שימוש ב-Chrome במשך # דקות. בין הנתונים שיימחקו: היסטוריה, מילוי אוטומטי והורדות. הכרטיסיות יישארו פתוחות.}other{‏נתוני הגלישה נמחקים באופן אוטומטי על ידי הארגון כשלא נעשה שימוש ב-Chrome במשך # דקות. בין הנתונים שיימחקו: היסטוריה, מילוי אוטומטי והורדות. הכרטיסיות יישארו פתוחות.}}</translation>
+<translation id="7477130805345743099">‏Chrome יציג אזהרה לפני טעינת אתר כלשהו באמצעות חיבור לא מאובטח</translation>
 <translation id="7481213027396403996">‏רוצה להשיג את רמת האבטחה הגבוהה ביותר של Chrome?</translation>
 <translation id="7535429826459677826">‏גרסת הפיתוח של Google Chrome</translation>
 <translation id="7583399374488819119">מנהל ההתקנה של <ph name="COMPANY_NAME" /></translation>
@@ -472,6 +475,7 @@
 <translation id="8922193594870374009">‏כדי לשלוח מספר מ-<ph name="ORIGIN" /> לטלפון Android, יש להיכנס אל Chrome בשני המכשירים.</translation>
 <translation id="8986207147630327271">בחרת להוסיף פרופיל עבודה לדפדפן זה ולתת למנהל המערכת שליטה רק על פרופיל העבודה.</translation>
 <translation id="8989968390305463310">‏היסטוריית הגלישה שלך משפיעה על המודעות שמוצגות לך ועל תחומי העניין המשוערים שמופיעים בהמשך. כדי להגן על הפרטיות שלך, מתבצעת ב-Chrome מחיקה אוטומטית של תחומי העניין שלך על בסיס מתחלף מדי חודש. תחומי עניין שלא הוסרו עוברים רענון.</translation>
+<translation id="8999117580775242387">‏כש-HTTPS לא יהיה זמין, Chrome ישתמש בחיבור לא מאובטח בלי להציג אזהרה</translation>
 <translation id="8999208279178790196">{0,plural, =0{‏יש עדכון זמין ל-Chrome}=1{‏יש עדכון זמין ל-Chrome}one{‏עדכון ל-Chrome זמין כבר # ימים}two{‏עדכון ל-Chrome זמין כבר # ימים}other{‏עדכון ל-Chrome זמין כבר # ימים}}</translation>
 <translation id="9053892488859122171">‏מערכת ChromeOS Flex</translation>
 <translation id="9054037008353851982">צריך להפעיל מחדש כדי לעדכן – הכרטיסיות ייפתחו מחדש</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb
index 72542016..23ea7b0 100644
--- a/chrome/app/resources/google_chrome_strings_mn.xtb
+++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -101,6 +101,7 @@
 <translation id="2556847002339236023">Танай байгууллага Chrome-г <ph name="TIMEOUT_DURATION" />-н турш ашиглаагүй үед хаадаг. Интернэтээр үзсэн өгөгдлийг устгасан. Үүнд түүх, автоматаар бөглөх хэсэг болон татаж авсан файлууд багтаж болно.</translation>
 <translation id="2559253115192232574">Дараа нь таны зочилсон сайт таны хардаг зарыг хувийн болгохын тулд Chrome-с таны сонирхлыг харахыг хүсэх боломжтой. Chrome 3 хүртэлх сонирхол хуваалцах боломжтой.</translation>
 <translation id="2563121210305478421">Chrome-г дахин эхлүүлэх үү?</translation>
+<translation id="2569974318947988067">Chrome навигацуудыг HTTPS болгож сайжруулахаар оролдоно</translation>
 <translation id="2574930892358684005"><ph name="EXISTING_USER" /> Chrome-н энэ профайлд аль хэдийн нэвтэрсэн байна. Таны хөтчийн үзэлтийг тусад нь байлгахын тулд Chrome танд өөрийн гэсэн профайл үүсгэж өгөх боломжтой.</translation>
 <translation id="2580411288591421699">Одоо ажиллаж байгаа Google Chrome-ийн хувилбарыг суурьлуулах боломжгүй. Google Chrome-оо хаагаад, дахин оролдоно уу.</translation>
 <translation id="2586406160782125153">Энэ нь төхөөрөмжөөс таны хайлтын өгөгдлийг устгах болно. Өгөгдлөө дараа нь сэргээхийн тулд Chrome-д <ph name="USER_EMAIL" />-р нэвтэрнэ үү.</translation>
@@ -217,6 +218,7 @@
 <translation id="4335235004908507846">Chrome нь таныг өгөгдлийн зөрчил, муу өргөтгөл болон бусад асуудлаас хамгаалахад туслах боломжтой</translation>
 <translation id="4343195214584226067"><ph name="EXTENSION_NAME" />-г Chrome-д нэмсэн</translation>
 <translation id="4384570495110188418">Та нэвтрээгүй байгаа тул Chrome таны нууц үгсийг шалгах боломжгүй байна</translation>
+<translation id="4389991535395284064">Нууцлалын горимд үзэх үед Chrome аюултай холболт ашиглан сайтыг ачаалахаас өмнө танд сануулна</translation>
 <translation id="4393248995085527349">Google Chrome-н цаашдын шинэчлэлтийг авахын тулд танд macOS 10.15 эсвэл түүнээс хойших хувилбар хэрэгтэй болно. Энэ компьютер macOS 10.13 хувилбарыг ашиглаж байна.</translation>
 <translation id="4427306783828095590">Сайжруулсан хамгаалалт нь фишинг болон хортой кодыг блоклохын тулд илүү ихийг хийдэг</translation>
 <translation id="4450664632294415862">Chrome - Сүлжээнд нэвтрэх - <ph name="PAGE_TITLE" /></translation>
@@ -389,6 +391,7 @@
 <translation id="7426611252293106642">Үүнийг Linux дистрибьютер дээр цаашид дэмжихгүй тул Google Chrome буруу ажиллаж болзошгүй</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Chrome-г 1 минутын турш ашиглаагүй үед танай байгууллага үүнийг автоматаар хаана.}other{Chrome-г # минутын турш ашиглаагүй үед танай байгууллага үүнийг автоматаар хаана.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Chrome-г 1 минутын турш ашиглаагүй үед танай байгууллага интернэтээр үзсэн өгөгдлийг автоматаар устгана. Үүнд түүх, автоматаар бөглөх хэсэг болон татаж авсан файлууд багтаж болно. Таны табууд нээлттэй хэвээр үлдэнэ.}other{Chrome-г # минутын турш ашиглаагүй үед танай байгууллага интернэтээр үзсэн өгөгдлийг автоматаар устгана. Үүнд түүх, автоматаар бөглөх хэсэг болон татаж авсан файлууд багтаж болно. Таны табууд нээлттэй хэвээр үлдэнэ.}}</translation>
+<translation id="7477130805345743099">Chrome аюултай холболт ашиглан аливаа сайтыг ачаалахаас өмнө танд сануулна</translation>
 <translation id="7481213027396403996">Chrome-н хамгийн хүчирхэг аюулгүй байдлыг аваарай</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> суулгагч</translation>
@@ -480,6 +483,7 @@
 <translation id="8922193594870374009"><ph name="ORIGIN" />-с Android утсандаа дугаар илгээхийн тулд хоёр төхөөрөмжийнхөө аль алинаас нь Chrome-д нэвтэрнэ үү.</translation>
 <translation id="8986207147630327271">Та энэ хөтчид ажлын профайл нэмж байгаа бөгөөд администратордоо зөвхөн ажлын профайлын хяналтыг өгч байна.</translation>
 <translation id="8989968390305463310">Таны хөтчийн түүх таны хардаг зар болон доор тооцоолсны дагуу сонирхолд нөлөөлнө. Таны нууцлалыг хамгаалахын тулд Chrome тодорхойгүй хугацаанд сар бүр таны сонирхлыг автоматаар устгана. Та сонирхлыг хасаагүй бол сэргээх боломжтой.</translation>
+<translation id="8999117580775242387">HTTPS боломжгүй үед Chrome танд сануулалгүйгээр аюултай холболт ашиглана</translation>
 <translation id="8999208279178790196">{0,plural, =0{Chrome-н шинэчлэлт боломжтой байна}=1{Chrome-н шинэчлэлт боломжтой байна}other{Chromium-н шинэчлэлт # хоногийн турш боломжтой байсаар байна}}</translation>
 <translation id="9053892488859122171">ChromeOS Flex-н систем</translation>
 <translation id="9054037008353851982">Шинэчлэхийн тулд дахин ачаалах - Таны табууд дахин нээгдэнэ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index 411abef1..29328d2 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -97,6 +97,7 @@
 <translation id="2556847002339236023">Organisasi anda menutup Chrome apabila apl tersebut tidak digunakan selama <ph name="TIMEOUT_DURATION" />. Data semakan imbas telah dipadamkan. Pemadaman ini termasuk sejarah, autolengkap dan muat turun.</translation>
 <translation id="2559253115192232574">Kemudian, laman yang anda lawati boleh meminta Chrome melihat minat anda untuk memeribadikan iklan yang anda lihat. Chrome boleh berkongsi sehingga 3 minat.</translation>
 <translation id="2563121210305478421">Lancarkan semula Chrome?</translation>
+<translation id="2569974318947988067">Chrome akan cuba meningkatkan navigasi kepada HTTPS</translation>
 <translation id="2574930892358684005"><ph name="EXISTING_USER" /> telah pun dilog masuk ke profil Chrome ini. Untuk menjadikan penyemakan imbas anda terpisah, Chrome boleh membuat profil anda sendiri untuk anda.</translation>
 <translation id="2580411288591421699">Tidak dapat memasang versi Google Chrome yang sama yang kini dijalankan. Sila tutup Google Chrome dan cuba semula.</translation>
 <translation id="2586406160782125153">Tindakan ini akan memadamkan data semakan imbas anda daripada peranti ini. Untuk mendapatkan kembali data anda kemudian, log masuk ke Chrome sebagai <ph name="USER_EMAIL" />.</translation>
@@ -213,6 +214,7 @@
 <translation id="4335235004908507846">Chrome dapat membantu untuk memastikan anda selamat daripada pelanggaran data, sambungan tidak elok dan pelbagai lagi</translation>
 <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> telah ditambahkan pada Chrome</translation>
 <translation id="4384570495110188418">Chrome tidak dapat menyemak kata laluan anda kerana anda tidak log masuk</translation>
+<translation id="4389991535395284064">Apabila menyemak imbas dalam Mod Inkognito, Chrome akan memberi anda amaran sebelum memuatkan laman menggunakan sambungan yang tidak selamat</translation>
 <translation id="4393248995085527349">Untuk mendapatkan kemaskinian Google Chrome yang akan datang, anda memerlukan macOS 10.15 atau yang lebih baharu. Komputer ini menggunakan macOS 10.13.</translation>
 <translation id="4427306783828095590">Perlindungan yang dipertingkatkan melakukan pelbagai lagi perkara untuk menyekat pancingan data dan perisian hasad</translation>
 <translation id="4450664632294415862">Chrome - Log Masuk Rangkaian - <ph name="PAGE_TITLE" /></translation>
@@ -381,6 +383,7 @@
 <translation id="7426611252293106642">Google Chrome mungkin tidak berfungsi dengan betul kerana tidak disokong pada edaran Linux ini lagi</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Organisasi anda akan menutup Chrome secara automatik apabila Chrome tidak digunakan selama 1 minit.}other{Organisasi anda akan menutup Chrome secara automatik apabila Chrome tidak digunakan selama # minit.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Organisasi anda akan memadamkan data semakan imbas secara automatik apabila Chrome tidak digunakan selama 1 minit. Pemadaman ini termasuk sejarah, autolengkap dan muat turun. Tab anda akan kekal terbuka.}other{Organisasi anda akan memadamkan data semakan imbas secara automatik apabila Chrome tidak digunakan selama # minit. Pemadaman ini termasuk sejarah, autolengkap dan muat turun. Tab anda akan kekal terbuka.}}</translation>
+<translation id="7477130805345743099">Chrome akan memberi anda amaran sebelum memuatkan sebarang laman menggunakan sambungan yang tidak selamat</translation>
 <translation id="7481213027396403996">Dapatkan keselamatan Chrome yang paling kukuh</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119">Pemasang <ph name="COMPANY_NAME" /></translation>
@@ -472,6 +475,7 @@
 <translation id="8922193594870374009">Untuk menghantar nombor daripada <ph name="ORIGIN" /> ke telefon Android anda, log masuk ke Chrome pada kedua-dua peranti.</translation>
 <translation id="8986207147630327271">Anda menambahkan profil kerja pada penyemak imbas ini dan memberi pentadbir anda kawalan terhadap profil kerja sahaja.</translation>
 <translation id="8989968390305463310">Sejarah penyemakan imbas anda mempengaruhi iklan yang anda lihat dan minat seperti yang dianggarkan di bawah. Untuk melindungi privasi anda, Chrome memadamkan minat anda secara automatik secara bergilir setiap bulan. Minat akan dimuat semula melainkan anda mengalih keluar minat anda.</translation>
+<translation id="8999117580775242387">Apabila HTTPS tidak tersedia, Chrome akan menggunakan sambungan yang tidak selamat tanpa memberi anda amaran</translation>
 <translation id="8999208279178790196">{0,plural, =0{Kemas kini Chrome tersedia}=1{Kemas kini Chrome tersedia}other{Kemas kini Chrome telah tersedia selama # hari}}</translation>
 <translation id="9053892488859122171">Sistem Chrome OS Flex</translation>
 <translation id="9054037008353851982">Lancarkan semula untuk Pengemaskinian - Tab anda akan dibuka semula</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index b836f1cc1..1a0ed2d 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -100,6 +100,7 @@
 <translation id="2556847002339236023">Je organisatie sluit Chrome als deze <ph name="TIMEOUT_DURATION" /> niet wordt gebruikt. Browsegegevens zijn verwijderd. Dit kunnen onder andere de geschiedenis, gegevens voor automatisch invullen en downloads zijn.</translation>
 <translation id="2559253115192232574">Later kan een site die je bezoekt Chrome vragen om je interesses te bekijken zodat de advertenties die je ziet kunnen worden gepersonaliseerd. Chrome kan maximaal 3 interesses delen.</translation>
 <translation id="2563121210305478421">Chrome opnieuw starten?</translation>
+<translation id="2569974318947988067">Chrome probeert navigatie te upgraden naar HTTPS</translation>
 <translation id="2574930892358684005"><ph name="EXISTING_USER" /> is al ingelogd bij dit Chrome-profiel. Als je je browsegegevens gescheiden wilt houden, kan Chrome een eigen profiel voor je maken.</translation>
 <translation id="2580411288591421699">Kan dezelfde Google Chrome-versie die momenteel actief is, niet installeren. Sluit Google Chrome en probeer het opnieuw.</translation>
 <translation id="2586406160782125153">Hiermee worden je browsegegevens verwijderd van dit apparaat. Als je je gegevens later wilt terughalen, log je in bij Chrome als <ph name="USER_EMAIL" />.</translation>
@@ -216,6 +217,7 @@
 <translation id="4335235004908507846">Chrome kan je beschermen tegen gegevenslekken, schadelijke extensies en meer</translation>
 <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> is toegevoegd aan Chrome</translation>
 <translation id="4384570495110188418">Chrome kan je wachtwoorden niet checken omdat je niet bent ingelogd.</translation>
+<translation id="4389991535395284064">Als je browst in de incognitomodus, waarschuwt Chrome je voordat een site wordt geladen via een niet-beveiligde verbinding</translation>
 <translation id="4393248995085527349">Als je toekomstige Google Chrome-updates wilt krijgen, heb je macOS 10.15 of hoger nodig. Deze computer gebruikt macOS 10.13.</translation>
 <translation id="4427306783828095590">Geoptimaliseerde beveiliging die je nog beter beschermt tegen phishing en malware</translation>
 <translation id="4450664632294415862">Chrome - Inloggen op netwerk - <ph name="PAGE_TITLE" /></translation>
@@ -386,6 +388,7 @@
 <translation id="7426611252293106642">Google Chrome werkt misschien niet goed omdat dit niet meer wordt ondersteund in deze Linux-distributie</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Je organisatie sluit Chrome automatisch als deze 1 minuut niet wordt gebruikt.}other{Je organisatie sluit Chrome automatisch als deze # minuten niet wordt gebruikt.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Je organisatie verwijdert browsegegevens automatisch als Chrome 1 minuut niet wordt gebruikt. Dit kunnen onder andere de geschiedenis, gegevens voor automatisch invullen en downloads zijn. Je tabbladen blijven geopend.}other{Je organisatie verwijdert browsegegevens automatisch als Chrome # minuten niet wordt gebruikt. Dit kunnen onder andere de geschiedenis, gegevens voor automatisch invullen en downloads zijn. Je tabbladen blijven geopend.}}</translation>
+<translation id="7477130805345743099">Chrome waarschuwt je voordat een site wordt geladen via een niet-beveiligde verbinding</translation>
 <translation id="7481213027396403996">Gebruik het hoogste beveiligingsniveau van Chrome</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119"><ph name="COMPANY_NAME" />-installatieprogramma</translation>
@@ -477,6 +480,7 @@
 <translation id="8922193594870374009">Als je een nummer vanaf <ph name="ORIGIN" /> naar je Android-telefoon wilt sturen, log je in bij Chrome op beide apparaten.</translation>
 <translation id="8986207147630327271">Je voegt een werkprofiel toe aan deze browser en geeft je beheerder alleen de controle over het werkprofiel.</translation>
 <translation id="8989968390305463310">Je browsegeschiedenis heeft invloed op de advertenties die je ziet en je interesses. Hieronder staat een schatting. Ter bescherming van je privacy verwijdert Chrome je interesses automatisch elke maand op voortschrijdende basis. Interesses kunnen worden vernieuwd, tenzij je ze verwijdert.</translation>
+<translation id="8999117580775242387">Als HTTPS niet beschikbaar is, gebruikt Chrome een niet-beveiligde verbinding zonder je te waarschuwen</translation>
 <translation id="8999208279178790196">{0,plural, =0{Er is een Chrome-update beschikbaar}=1{Er is een Chrome-update beschikbaar}other{Er is al # dagen een Chrome-update beschikbaar}}</translation>
 <translation id="9053892488859122171">Chrome OS Flex-systeem</translation>
 <translation id="9054037008353851982">Herstarten om te updaten, je tabbladen worden opnieuw geopend</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb
index 1fefd42..958873d 100644
--- a/chrome/app/resources/google_chrome_strings_or.xtb
+++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -101,6 +101,7 @@
 <translation id="2556847002339236023"><ph name="TIMEOUT_DURATION" /> ପାଇଁ Chromeକୁ ବ୍ୟବହାର କରାନଗଲେ ଆପଣଙ୍କ ସଂସ୍ଥା ଏହାକୁ ବନ୍ଦ କରିଦିଏ। ବ୍ରାଉଜିଂ ଡାଟାକୁ ଡିଲିଟ କରାଯାଇଛି। ଏଥିରେ ଇତିହାସ, ଅଟୋଫିଲ ଏବଂ ଡାଉନଲୋଡଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ ହୋଇପାରେ।</translation>
 <translation id="2559253115192232574">ପରେ, ଆପଣ ଭିଜିଟ କରୁଥିବା ଏକ ସାଇଟ, ଆପଣ ଦେଖୁଥିବା ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ପର୍ସନାଲାଇଜ କରିବା ପାଇଁ Chromeକୁ ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ କହିପାରିବ। Chrome 3ଟି ପର୍ଯ୍ୟନ୍ତ ରୁଚି ସେୟାର କରିପାରିବ।</translation>
 <translation id="2563121210305478421">Chrome ପୁଣି ଲଞ୍ଚ କରିବେ କି?</translation>
+<translation id="2569974318947988067">Chrome ନାଭିଗେସନକୁ HTTPSକୁ ଅପଗ୍ରେଡ କରିବା ପାଇଁ ଚେଷ୍ଟା କରିବ</translation>
 <translation id="2574930892358684005"><ph name="EXISTING_USER" /> ଏହି Chrome ପ୍ରୋଫାଇଲରେ ପୂର୍ବରୁ ସାଇନ୍ ଇନ୍ କରିସାରିଛନ୍ତି। ଆପଣଙ୍କ ବ୍ରାଉଜିଂକୁ ଅଲଗା ରଖିବାକୁ, Chrome ଆପଣଙ୍କ ପାଇଁ ଆପଣଙ୍କର ନିଜର ପ୍ରୋଫାଇଲ୍ ତିଆରି କରିପାରିବ।</translation>
 <translation id="2580411288591421699">ବର୍ତ୍ତମାନ ସମୟରେ ଚାଲୁଥିବା Google Chromeର ସମାନ ସଂସ୍କରଣକୁ ଇନ୍‍ଷ୍ଟଲ୍ କରାଯାଇପାରିବ ନାହିଁ। ଦୟାକରି Google Chromeକୁ ବନ୍ଦ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="2586406160782125153">ଏହା ଏହି ଡିଭାଇସ୍‍ରୁ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଡାଟା ଖାଲି କରିଦେବେ। ପରେ ଆପଣଙ୍କର ଡାଟା ପୁନଃପ୍ରାପ୍ତ କରିବାକୁ Chromeରେ <ph name="USER_EMAIL" />ରୂପେ ସାଇନ୍ ଇନ୍‌ କରନ୍ତୁ।</translation>
@@ -217,6 +218,7 @@
 <translation id="4335235004908507846">ଡାଟା ଚୋରି, କ୍ଷତିକାରକ ଏକ୍ସଟେନସନ୍ ଏବଂ ଆହୁରି ଅନେକ କିଛିରୁ Chrome ଆପଣଙ୍କୁ ସୁରକ୍ଷିତ ରଖିବାରେ ସାହାଯ୍ୟ କରିପାରିବ</translation>
 <translation id="4343195214584226067">Chromeରେ <ph name="EXTENSION_NAME" /> ଯୋଗକରାଯାଇଛି</translation>
 <translation id="4384570495110188418">ଆପଣ ସାଇନ୍ ଇନ୍ କରିନଥିବା ଯୋଗୁଁ Chrome ଆପଣଙ୍କ ପାସୱାର୍ଡଗୁଡ଼ିକ ଯାଞ୍ଚ କରିପାରିବ ନାହିଁ</translation>
+<translation id="4389991535395284064">ଇନକଗ୍ନିଟୋ ମୋଡରେ ବ୍ରାଉଜ କରିବା ସମୟରେ, ଏକ ଅସୁରକ୍ଷିତ କନେକ୍ସନ ବ୍ୟବହାର କରି କୌଣସି ସାଇଟ ଲୋଡ କରିବା ପୂର୍ବରୁ Chrome ଆପଣଙ୍କୁ ଚେତାବନୀ ଦେବ</translation>
 <translation id="4393248995085527349">ଭବିଷ୍ୟତରେ Google Chromeର ଅପଡେଟଗୁଡ଼ିକ ପାଇବା ପାଇଁ ଆପଣ macOS 10.15 କିମ୍ବା ତା'ପରର ସଂସ୍କରଣ ଆବଶ୍ୟକ କରିବେ। ଏହି କମ୍ପ୍ୟୁଟରରେ macOS 10.13 ସଂସ୍କରଣ ବ୍ୟବହାର କରାଯାଉଛି।</translation>
 <translation id="4427306783828095590">ଉନ୍ନତ ସୁରକ୍ଷା ଫିସିଂ ଓ ମାଲୱେୟାରକୁ ବ୍ଲକ୍ କରିବାକୁ ଅନେକ କିଛି କରେ</translation>
 <translation id="4450664632294415862">Chrome - ନେଟୱାର୍କ ସାଇନ୍-ଇନ୍ - <ph name="PAGE_TITLE" /></translation>
@@ -389,6 +391,7 @@
 <translation id="7426611252293106642">ଏହି Linux ଡିଷ୍ଟ୍ରିବ୍ୟୁସନରେ Google Chrome ଆଉ ସମର୍ଥିତ ନଥିବା ଯୋଗୁଁ ଏହା ସଠିକ୍ ଭାବରେ କାମ କରିନପାରେ</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{1 ମିନିଟ ପାଇଁ Chromeକୁ ବ୍ୟବହାର କରାନଗଲେ ଆପଣଙ୍କ ସଂସ୍ଥା ସ୍ୱତଃ ଏହାକୁ ବନ୍ଦ କରିଦିଏ।}other{# ମିନିଟ ପାଇଁ Chromeକୁ ବ୍ୟବହାର କରାନଗଲେ ଆପଣଙ୍କ ସଂସ୍ଥା ସ୍ୱତଃ ଏହାକୁ ବନ୍ଦ କରିଦିଏ।}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{1 ମିନିଟ ପାଇଁ Chromeକୁ ବ୍ୟବହାର କରାନଗଲେ ଆପଣଙ୍କ ସଂସ୍ଥା ସ୍ୱତଃ ବ୍ରାଉଜିଂ ଡାଟାକୁ ଡିଲିଟ କରିଦିଏ। ଏଥିରେ ଇତିହାସ, ଅଟୋଫିଲ ଏବଂ ଡାଉନଲୋଡଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ ହୋଇପାରେ। ଆପଣଙ୍କ ଟାବଗୁଡ଼ିକ ଖୋଲା ରହିବ।}other{# ମିନିଟ ପାଇଁ Chromeକୁ ବ୍ୟବହାର କରାନଗଲେ ଆପଣଙ୍କ ସଂସ୍ଥା ସ୍ୱତଃ ବ୍ରାଉଜିଂ ଡାଟାକୁ ଡିଲିଟ କରିଦିଏ। ଏଥିରେ ଇତିହାସ, ଅଟୋଫିଲ ଏବଂ ଡାଉନଲୋଡଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ ହୋଇପାରେ। ଆପଣଙ୍କ ଟାବଗୁଡ଼ିକ ଖୋଲା ରହିବ।}}</translation>
+<translation id="7477130805345743099">ଏକ ଅସୁରକ୍ଷିତ କନେକ୍ସନ ବ୍ୟବହାର କରି କୌଣସି ସାଇଟ ଲୋଡ କରିବା ପୂର୍ବରୁ Chrome ଆପଣଙ୍କୁ ଚେତାବନୀ ଦେବ</translation>
 <translation id="7481213027396403996">Chromeର ସବୁଠାରୁ ଶକ୍ତିଶାଳୀ ସୁରକ୍ଷା ପାଆନ୍ତୁ</translation>
 <translation id="7535429826459677826">Google Chrome ଡେଭ୍‍</translation>
 <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ଇନଷ୍ଟଲର</translation>
@@ -480,6 +483,7 @@
 <translation id="8922193594870374009"><ph name="ORIGIN" />ରୁ ଆପଣଙ୍କ Android ଫୋନକୁ ଏକ ନମ୍ବର ପଠାଇବାକୁ, ଉଭୟ ଡିଭାଇସରେ Chromeରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ।</translation>
 <translation id="8986207147630327271">ଆପଣ ଏହି ବ୍ରାଉଜରରେ ଏକ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଯୋଗ କରୁଛନ୍ତି ଏବଂ ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କୁ ସେହି ୱାର୍କ ପ୍ରୋଫାଇଲକୁ କେବଳ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅନୁମତି ଦେଉଛନ୍ତି।</translation>
 <translation id="8989968390305463310">ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଇତିହାସ ଆପଣ ଦେଖୁଥିବା ବିଜ୍ଞାପନ ଏବଂ ରୁଚିଗୁଡ଼ିକୁ ନିମ୍ନରେ ଆକଳନ କରାଯାଇଥିବା ଅନୁସାରେ ପ୍ରଭାବିତ କରେ। ଆପଣଙ୍କ ଗୋପନୀୟତାକୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ, Chrome ପ୍ରତି ମାସରେ ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ପର୍ଯ୍ୟାୟ କ୍ରମେ ସ୍ୱତଃ-ଡିଲିଟ କରେ। ଆପଣ ରୁଚିଗୁଡ଼ିକୁ କାଢ଼ି ନଦେବା ପର୍ଯ୍ୟନ୍ତ ସେଗୁଡ଼ିକ ରିଫ୍ରେସ ହୋଇପାରିବ।</translation>
+<translation id="8999117580775242387">ଯେତେବେଳେ HTTPS ଉପଲବ୍ଧ ନଥାଏ, Chrome ଆପଣଙ୍କୁ ଚେତାବନୀ ନଦେଇ ଏକ ଅସୁରକ୍ଷିତ କନେକ୍ସନ ବ୍ୟବହାର କରିବ</translation>
 <translation id="8999208279178790196">{0,plural, =0{Chrome‍ର ଏକ ଅପ୍‍‍ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି}=1{Chrome‍ର ଏକ ଅପ୍‍‍ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି}other{# ଦିନ ପାଇଁ Chrome‍ର ଏକ ଅପ୍‍‍ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି}}</translation>
 <translation id="9053892488859122171">ChromeOS Flex ସିଷ୍ଟମ</translation>
 <translation id="9054037008353851982">ଅପଡେଟ କରିବାକୁ ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ - ଆପଣଙ୍କ ଟାବଗୁଡ଼ିକ ପୁଣି ଖୋଲିବ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index 3dc71e1..c3db0729 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -101,6 +101,7 @@
 <translation id="2556847002339236023">Shirika lako hufunga Chrome isipotumika kwa <ph name="TIMEOUT_DURATION" />. Data ya kuvinjari ilifutwa. Data hii inaweza kujumuisha historia, maelezo yaliyojazwa kiotomatiki na vipakuliwa.</translation>
 <translation id="2559253115192232574">Baadaye, tovuti unayoitembelea inaweza kuiomba Chrome ili ione mambo yanayokuvutia na iweze kukuonyesha matangazo kulingana na mapendeleo yako. Chrome inaweza kushiriki hadi mambo matatu yanayokuvutia.</translation>
 <translation id="2563121210305478421">Ungependa kufungua Chrome tena?</translation>
+<translation id="2569974318947988067">Chrome itajaribu kuboresha usogezaji ili utumie HTTPS</translation>
 <translation id="2574930892358684005">Tayari <ph name="EXISTING_USER" /> ameingia katika akaunti kwenye wasifu huu wa Chrome. Ili utenganishe shughuli zako za kuvinjari, Chrome inaweza kukutengenezea wasifu wako mwenyewe.</translation>
 <translation id="2580411288591421699">Huwezi kusakinisha toleo la Google Chrome ambalo tayari linatumika. Tafadhali funga Google Chrome na ujaribu tena.</translation>
 <translation id="2586406160782125153">Hatua hii itafuta data yako ya kuvinjari kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika Chrome ukitumia <ph name="USER_EMAIL" />.</translation>
@@ -217,6 +218,7 @@
 <translation id="4335235004908507846">Chrome inaweza kukusaidia ulinde akaunti yako dhidi ya ufichuzi haramu wa data, viendelezi vibaya na zaidi</translation>
 <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> imeongezwa kwenye Chrome</translation>
 <translation id="4384570495110188418">Chrome imeshindwa kukagua manenosiri yako kwa sababu hujaingia katika akaunti</translation>
+<translation id="4389991535395284064">Unapovinjari katika hali fiche, Chrome itakutahadharisha kabla ya kupakia tovuti kwa kutumia muunganisho usio salama</translation>
 <translation id="4393248995085527349">Ili upate masasisho ya Google Chrome ya hapo baadaye, utahitaji toleo la macOS 10.15 au toleo jipya zaidi. Kompyuta hii inatumia macOS 10.13.</translation>
 <translation id="4427306783828095590">Kipengele cha ulinzi wa hali ya juu hufanya mengi zaidi ili kuzuia programu hasidi na wizi wa data binafsi</translation>
 <translation id="4450664632294415862">Chrome - Kuingia katika Akaunti ya Mtandao - <ph name="PAGE_TITLE" /></translation>
@@ -389,6 +391,7 @@
 <translation id="7426611252293106642">Huenda Google Chrome isifanye kazi vizuri kwa sababu haitumiki tena kwenye toleo hili la Linux</translation>
 <translation id="7449333426561673451">{COUNT,plural, =1{Shirika lako hufunga Chrome kiotomatiki isipotumika kwa dakika 1.}other{Shirika lako hufunga Chrome kiotomatiki isipotumika kwa dakika #.}}</translation>
 <translation id="7452987490177144319">{COUNT,plural, =1{Shirika lako hufuta kiotomatiki data ya kuvinjari Chrome isipotumika kwa dakika 1. Data hii inaweza kujumuisha historia, maelezo yaliyojazwa kiotomatiki na vipakuliwa. Vichupo vyako havitafungwa.}other{Shirika lako hufuta kiotomatiki data ya kuvinjari Chrome isipotumika kwa dakika #. Data hii inaweza kujumuisha historia, maelezo yaliyojazwa kiotomatiki na vipakuliwa. Vichupo vyako havitafungwa.}}</translation>
+<translation id="7477130805345743099">Chrome itakutahadharisha kabla ya kupakia tovuti yoyote kwa kutumia muunganisho usio salama</translation>
 <translation id="7481213027396403996">Pata usalama thabiti zaidi kutoka Chrome</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7583399374488819119">Kisakinishaji cha <ph name="COMPANY_NAME" /></translation>
@@ -480,6 +483,7 @@
 <translation id="8922193594870374009">Ili uweze kutuma nambari kwa simu yako ya Android kutoka <ph name="ORIGIN" />, ingia katika akaunti kwenye Chrome ukitumia vifaa vyote viwili.</translation>
 <translation id="8986207147630327271">Unaongeza wasifu wa kazini kwenye kivinjari hiki na unampa msimamizi wako uwezo wa kudhibiti wasifu huo wa kazini pekee.</translation>
 <translation id="8989968390305463310">Historia yako ya kuvinjari huathiri matangazo unayoyaona na mambo yanayokuvutia kama inavyokadiriwa hapa chini. Ili kulinda faragha yako, Chrome hufuta kiotomatiki mambo yanayokuvutia kadiri unavyoendelea kutumia kila mwezi. Mambo yanayokuvutia yanaweza kuonyeshwa upya isipokuwa ukiyaondoa.</translation>
+<translation id="8999117580775242387">Wakati kiendelezi cha HTTPS hakipatikani, Chrome itatumia muunganisho usio salama bila kukutahadharisha</translation>
 <translation id="8999208279178790196">{0,plural, =0{Sasisho la Chrome linapatikana}=1{Sasisho la Chrome linapatikana}other{Sasisho la Chrome limekuwepo kwa siku #}}</translation>
 <translation id="9053892488859122171">Mfumo wa ChromeOS Flex</translation>
 <translation id="9054037008353851982">Fungua tena ili Usasishe - Vichupo vyako vitafunguka upya</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
index 848d7b3..bba56e2 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -318,7 +318,7 @@
 <translation id="6277547788421725101">你的家长已为 Chrome 停用“网站、应用和扩展程序的权限”</translation>
 <translation id="6291089322031436445">Chrome 开发者版应用</translation>
 <translation id="6291549208091401781">已为您计算机上的所有用户安装 Google Chrome。</translation>
-<translation id="6326175484149238433">从Chrome中移除</translation>
+<translation id="6326175484149238433">从 Chrome 中移除</translation>
 <translation id="6327105987658262776">没有可用的更新。</translation>
 <translation id="6360449101159168105">当此标签页处于闲置状态时,系统会释放一些内存,以让 Chrome 保持快速运行。您可以选择始终不让此网站处于闲置状态。</translation>
 <translation id="6412673304250309937">将网址与存储在 Chrome 中的不安全网站列表进行比对。如果某个网站企图窃取您的密码,或者您下载了有害的文件,Chrome 可能还会将相应网址连同少量网页内容发送给“安全浏览”功能。</translation>
diff --git a/chrome/app/theme/google_chrome b/chrome/app/theme/google_chrome
index b466d65..d66f472d 160000
--- a/chrome/app/theme/google_chrome
+++ b/chrome/app/theme/google_chrome
@@ -1 +1 @@
-Subproject commit b466d65ecc143b93cfb78e0089591c4360c1d0dc
+Subproject commit d66f472d926cf161410d302354f9f26656b38f9e
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index f1cf854..8f42500 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3285,6 +3285,8 @@
       "password_manager/android/password_ui_view_android.h",
       "password_manager/android/save_update_password_message_delegate.cc",
       "password_manager/android/save_update_password_message_delegate.h",
+      "password_manager/android/shared_preferences_delegate_android.cc",
+      "password_manager/android/shared_preferences_delegate_android.h",
       "payments/android/service_worker_payment_app_bridge.cc",
       "permissions/notification_blocked_dialog_controller_android.cc",
       "permissions/notification_blocked_dialog_controller_android.h",
@@ -3998,8 +4000,6 @@
       "media_galleries/media_file_system_registry.h",
       "media_galleries/media_galleries_dialog_controller.cc",
       "media_galleries/media_galleries_dialog_controller.h",
-      "media_galleries/media_galleries_histograms.cc",
-      "media_galleries/media_galleries_histograms.h",
       "media_galleries/media_galleries_permission_controller.cc",
       "media_galleries/media_galleries_permission_controller.h",
       "media_galleries/media_galleries_preferences.cc",
@@ -7034,6 +7034,8 @@
           sources += [
             "printing/web_api/web_printing_service_chromeos.cc",
             "printing/web_api/web_printing_service_chromeos.h",
+            "printing/web_api/web_printing_type_converters.cc",
+            "printing/web_api/web_printing_type_converters.h",
           ]
         }
       }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 680632024..f25c204 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5901,6 +5901,9 @@
     {"arc-per-app-language", flag_descriptions::kArcPerAppLanguageName,
      flag_descriptions::kArcPerAppLanguageDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(arc::kPerAppLanguage)},
+    {"arc-resize-compat", flag_descriptions::kArcResizeCompatName,
+     flag_descriptions::kArcResizeCompatDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(arc::kResizeCompat)},
     {"arc-rounded-window-compat",
      flag_descriptions::kArcRoundedWindowCompatName,
      flag_descriptions::kArcRoundedWindowCompatDescription, kOsCrOS,
diff --git a/chrome/browser/apps/app_service/app_service_proxy_ash.cc b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
index b31c80f..c5b5943 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_ash.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
@@ -37,6 +37,9 @@
 #include "chrome/browser/ash/policy/dlp/dlp_files_controller_ash.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h"
+#include "chrome/browser/ui/ash/shelf/shelf_spinner_controller.h"
+#include "chrome/browser/ui/ash/shelf/shelf_spinner_item_controller.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/grit/browser_resources.h"
 #include "chrome/grit/chrome_unscaled_resources.h"
@@ -260,6 +263,55 @@
   }
 }
 
+void AppServiceProxyAsh::RegisterPublisher(AppType app_type,
+                                           AppPublisher* publisher) {
+  AppServiceProxyBase::RegisterPublisher(app_type, publisher);
+
+  for (auto it = launch_requests_.begin(); it != launch_requests_.end();) {
+    const std::string& app_id = it->first;
+    if (app_registry_cache_.GetAppType(app_id) != app_type) {
+      ++it;
+      continue;
+    }
+
+    // Close the spinner for the app icon.
+    auto* chrome_controller = ChromeShelfController::instance();
+    if (chrome_controller) {
+      chrome_controller->GetShelfSpinnerController()->CloseSpinner(app_id);
+    }
+
+    // Check the saved launch requests for `app_type`, and launch the app.
+    for (auto& launch_request : it->second) {
+      if (launch_request->params_.has_value()) {
+        LaunchAppWithParams(std::move(launch_request->params_.value()),
+                            std::move(launch_request->call_back_));
+        continue;
+      }
+
+      if (launch_request->intent_) {
+        LaunchAppWithIntent(app_id, launch_request->event_flags_,
+                            std::move(launch_request->intent_),
+                            launch_request->launch_source_,
+                            std::move(launch_request->window_info_),
+                            std::move(launch_request->call_back_));
+        continue;
+      }
+
+      if (!launch_request->file_paths_.empty()) {
+        LaunchAppWithFiles(app_id, launch_request->event_flags_,
+                           launch_request->launch_source_,
+                           std::move(launch_request->file_paths_));
+        continue;
+      }
+
+      Launch(app_id, launch_request->event_flags_,
+             launch_request->launch_source_,
+             std::move(launch_request->window_info_));
+    }
+    it = launch_requests_.erase(it);
+  }
+}
+
 void AppServiceProxyAsh::Uninstall(const std::string& app_id,
                                    UninstallSource uninstall_source,
                                    gfx::NativeWindow parent_window) {
@@ -864,6 +916,28 @@
   crosapi_subscriber_->OnPreferredAppsChanged(std::move(changes));
 }
 
+void AppServiceProxyAsh::OnPublisherNotReadyForLaunch(
+    const std::string& app_id,
+    std::unique_ptr<LaunchParams> launch_request) {
+  if (!base::FeatureList::IsEnabled(kAppServiceStorage)) {
+    AppServiceProxyBase::OnPublisherNotReadyForLaunch(
+        app_id, std::move(launch_request));
+    return;
+  }
+
+  auto* chrome_controller = ChromeShelfController::instance();
+  if (!chrome_controller) {
+    return;
+  }
+
+  // Add spinner to the app icon.
+  chrome_controller->GetShelfSpinnerController()->AddSpinnerToShelf(
+      app_id, std::make_unique<ShelfSpinnerItemController>(app_id));
+
+  // Save the launch request to launch the app later.
+  launch_requests_[app_id].push_back(std::move(launch_request));
+}
+
 bool AppServiceProxyAsh::MaybeShowLaunchPreventionDialog(
     const apps::AppUpdate& update) {
   if (update.AppId() == app_constants::kChromeAppId) {
@@ -1006,6 +1080,24 @@
        !apps_util::IsInstalled(update.Readiness()))) {
     pending_pause_requests_.MaybeRemoveApp(update.AppId());
   }
+
+  if (apps_util::IsInstalled(update.Readiness())) {
+    return;
+  }
+
+  auto it = launch_requests_.find(update.AppId());
+  if (it == launch_requests_.end()) {
+    return;
+  }
+
+  // If the app is uninstalled, close the spinner for the icon, and remove the
+  // launch requests for the app.
+  auto* chrome_controller = ChromeShelfController::instance();
+  if (chrome_controller) {
+    chrome_controller->GetShelfSpinnerController()->CloseSpinner(
+        update.AppId());
+  }
+  launch_requests_.erase(it);
 }
 
 void AppServiceProxyAsh::OnAppRegistryCacheWillBeDestroyed(
diff --git a/chrome/browser/apps/app_service/app_service_proxy_ash.h b/chrome/browser/apps/app_service/app_service_proxy_ash.h
index 285e2caf..6768aa8 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_ash.h
+++ b/chrome/browser/apps/app_service/app_service_proxy_ash.h
@@ -117,6 +117,7 @@
   apps::AppInstallService& AppInstallService();
 
   // apps::AppServiceProxyBase overrides:
+  void RegisterPublisher(AppType app_type, AppPublisher* publisher) override;
   void Uninstall(const std::string& app_id,
                  UninstallSource uninstall_source,
                  gfx::NativeWindow parent_window) override;
@@ -307,6 +308,10 @@
       base::flat_map<apps::ShortcutId,
                      std::unique_ptr<apps::ShortcutRemovalDialog>>;
 
+  // Map of app ID to a list of launch params.
+  using LaunchRequests =
+      std::map<std::string, std::vector<std::unique_ptr<LaunchParams>>>;
+
   bool IsValidProfile() override;
   void Initialize() override;
 
@@ -364,6 +369,11 @@
   // apps::AppServiceProxyBase overrides:
   void InitializePreferredAppsForAllSubscribers() override;
   void OnPreferredAppsChanged(PreferredAppChangesPtr changes) override;
+  // Displays spinner, and store the launch parameters to implement the launch
+  // task when the publisher is ready.
+  void OnPublisherNotReadyForLaunch(
+      const std::string& app_id,
+      std::unique_ptr<LaunchParams> launch_request) override;
   bool MaybeShowLaunchPreventionDialog(const apps::AppUpdate& update) override;
   void OnLaunched(LaunchCallback callback,
                   LaunchResult&& launch_result) override;
@@ -599,6 +609,9 @@
   std::list<std::pair<base::RepeatingCallback<bool(void)>, base::OnceClosure>>
       callback_list_;
 
+  // The launch requests when the publisher is not available.
+  LaunchRequests launch_requests_;
+
   base::flat_map<AppType, ShortcutPublisher*> shortcut_publishers_;
 
   std::unique_ptr<apps::ShortcutRegistryCache> shortcut_registry_cache_;
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 ebca286..bc7b4b99 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_base.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_base.cc
@@ -109,6 +109,10 @@
   return nullptr;
 }
 
+AppServiceProxyBase::LaunchParams::LaunchParams() = default;
+
+AppServiceProxyBase::LaunchParams::~LaunchParams() = default;
+
 AppServiceProxyBase::AppServiceProxyBase(Profile* profile)
     : app_inner_icon_loader_(this),
       app_icon_coalescer_(&app_inner_icon_loader_),
@@ -173,6 +177,15 @@
   return it == publishers_.end() ? nullptr : it->second;
 }
 
+void AppServiceProxyBase::OnPublisherNotReadyForLaunch(
+    const std::string& app_id,
+    std::unique_ptr<LaunchParams> launch_request) {
+  if (launch_request && !launch_request->call_back_.is_null()) {
+    std::move(launch_request->call_back_).Run(LaunchResult(State::FAILED));
+  }
+  return;
+}
+
 apps::AppRegistryCache& AppServiceProxyBase::AppRegistryCache() {
   return app_registry_cache_;
 }
@@ -262,6 +275,12 @@
                &window_info](const apps::AppUpdate& update) {
         auto* publisher = GetPublisher(update.AppType());
         if (!publisher) {
+          std::unique_ptr<LaunchParams> params =
+              std::make_unique<LaunchParams>();
+          params->event_flags_ = event_flags;
+          params->launch_source_ = launch_source;
+          params->window_info_ = std::move(window_info);
+          OnPublisherNotReadyForLaunch(update.AppId(), std::move(params));
           return;
         }
 
@@ -290,6 +309,12 @@
                &file_paths](const apps::AppUpdate& update) {
         auto* publisher = GetPublisher(update.AppType());
         if (!publisher) {
+          std::unique_ptr<LaunchParams> params =
+              std::make_unique<LaunchParams>();
+          params->event_flags_ = event_flags;
+          params->launch_source_ = launch_source;
+          params->file_paths_ = std::move(file_paths);
+          OnPublisherNotReadyForLaunch(update.AppId(), std::move(params));
           return;
         }
 
@@ -328,7 +353,14 @@
        callback = std::move(callback)](const AppUpdate& update) mutable {
         auto* publisher = GetPublisher(update.AppType());
         if (!publisher) {
-          std::move(callback).Run(LaunchResult(State::FAILED));
+          std::unique_ptr<LaunchParams> params =
+              std::make_unique<LaunchParams>();
+          params->event_flags_ = event_flags;
+          params->intent_ = std::move(intent);
+          params->launch_source_ = launch_source;
+          params->window_info_ = std::move(window_info);
+          params->call_back_ = std::move(callback);
+          OnPublisherNotReadyForLaunch(update.AppId(), std::move(params));
           return;
         }
 
@@ -372,7 +404,12 @@
   auto app_type = app_registry_cache_.GetAppType(params.app_id);
   auto* publisher = GetPublisher(app_type);
   if (!publisher) {
-    std::move(callback).Run(LaunchResult());
+    std::string app_id = params.app_id;
+    std::unique_ptr<LaunchParams> launch_params =
+        std::make_unique<LaunchParams>();
+    launch_params->params_ = std::move(params);
+    launch_params->call_back_ = std::move(callback);
+    OnPublisherNotReadyForLaunch(app_id, std::move(launch_params));
     return;
   }
 
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 a96ed8f..a2d6bd5 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_base.h
+++ b/chrome/browser/apps/app_service/app_service_proxy_base.h
@@ -16,6 +16,7 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/apps/app_service/app_launch_params.h"
 #include "chrome/browser/apps/app_service/launch_result_type.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/services/app_service/public/cpp/app_capability_access_cache.h"
@@ -49,7 +50,6 @@
 class AppUpdate;
 class BrowserAppLauncher;
 class PreferredAppsListHandle;
-struct AppLaunchParams;
 
 struct IntentLaunchInfo {
   IntentLaunchInfo();
@@ -79,6 +79,19 @@
 class AppServiceProxyBase : public KeyedService,
                             public PreferredAppsImpl::Host {
  public:
+  // The parameters of the launch calling.
+  struct LaunchParams {
+    LaunchParams();
+    ~LaunchParams();
+    int32_t event_flags_ = 0;
+    IntentPtr intent_;
+    LaunchSource launch_source_ = LaunchSource::kUnknown;
+    std::vector<base::FilePath> file_paths_;
+    WindowInfoPtr window_info_;
+    absl::optional<AppLaunchParams> params_;
+    LaunchCallback call_back_;
+  };
+
   explicit AppServiceProxyBase(Profile* profile);
   AppServiceProxyBase(const AppServiceProxyBase&) = delete;
   AppServiceProxyBase& operator=(const AppServiceProxyBase&) = delete;
@@ -101,7 +114,7 @@
   // Registers `publisher` with the App Service as exclusively publishing apps
   // of type `app_type`. `publisher` must have a lifetime equal to or longer
   // than this object.
-  void RegisterPublisher(AppType app_type, AppPublisher* publisher);
+  virtual void RegisterPublisher(AppType app_type, AppPublisher* publisher);
 
   // UnRegisters the publisher for `app_type`, As the publisher(ArcApps) might
   // be destroyed earlier than AppServiceProxy.
@@ -398,6 +411,11 @@
 
   AppPublisher* GetPublisher(AppType app_type);
 
+  // Called when a publisher is not ready to launch an app.
+  virtual void OnPublisherNotReadyForLaunch(
+      const std::string& app_id,
+      std::unique_ptr<LaunchParams> launch_request);
+
   // Returns true if the app cannot be launched and a launch prevention dialog
   // is shown to the user (e.g. the app is paused or blocked). Returns false
   // otherwise (and the app can be launched).
diff --git a/chrome/browser/apps/app_service/app_service_proxy_unittest.cc b/chrome/browser/apps/app_service/app_service_proxy_unittest.cc
index 823377e..842ad958 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_unittest.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_unittest.cc
@@ -6,6 +6,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/containers/contains.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
@@ -37,8 +38,15 @@
 #include "ui/gfx/image/image_skia_rep.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "ash/public/cpp/shelf_model.h"
 #include "chrome/browser/apps/app_service/subscriber_crosapi.h"
+#include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h"
+#include "chrome/browser/ui/ash/shelf/shelf_spinner_controller.h"
+#include "chrome/browser/ui/ash/shelf/shelf_spinner_item_controller.h"
 #include "chromeos/constants/chromeos_features.h"
+#include "components/services/app_service/public/cpp/app_launch_util.h"
+#include "ui/base/window_open_disposition.h"
+#include "ui/display/types/display_constants.h"
 #endif
 
 namespace apps {
@@ -46,6 +54,10 @@
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
 class FakePublisherForProxyTest : public AppPublisher {
  public:
+  using LaunchRequests = base::flat_map<
+      std::string,
+      std::vector<std::unique_ptr<AppServiceProxyBase::LaunchParams>>>;
+
   FakePublisherForProxyTest(AppServiceProxy* proxy,
                             AppType app_type,
                             std::vector<std::string> initial_app_ids)
@@ -59,10 +71,56 @@
   void Launch(const std::string& app_id,
               int32_t event_flags,
               LaunchSource launch_source,
-              WindowInfoPtr window_info) override {}
+              WindowInfoPtr window_info) override {
+    std::unique_ptr<AppServiceProxyBase::LaunchParams> params =
+        std::make_unique<AppServiceProxyBase::LaunchParams>();
+    params->event_flags_ = event_flags;
+    params->launch_source_ = launch_source;
+    params->window_info_ = std::move(window_info);
+    launch_requests_[app_id].push_back(std::move(params));
+  }
+
+  void LaunchAppWithFiles(const std::string& app_id,
+                          int32_t event_flags,
+                          LaunchSource launch_source,
+                          std::vector<base::FilePath> file_paths) override {
+    std::unique_ptr<AppServiceProxyBase::LaunchParams> params =
+        std::make_unique<AppServiceProxyBase::LaunchParams>();
+    params->event_flags_ = event_flags;
+    params->launch_source_ = launch_source;
+    params->file_paths_ = std::move(file_paths);
+    launch_requests_[app_id].push_back(std::move(params));
+  }
+
+  void LaunchAppWithIntent(const std::string& app_id,
+                           int32_t event_flags,
+                           IntentPtr intent,
+                           LaunchSource launch_source,
+                           WindowInfoPtr window_info,
+                           LaunchCallback callback) override {
+    std::unique_ptr<AppServiceProxyBase::LaunchParams> params =
+        std::make_unique<AppServiceProxyBase::LaunchParams>();
+    params->event_flags_ = event_flags;
+    params->intent_ = std::move(intent);
+    params->launch_source_ = launch_source;
+    params->window_info_ = std::move(window_info);
+    launch_requests_[app_id].push_back(std::move(params));
+    if (!callback.is_null()) {
+      std::move(callback).Run(LaunchResult(State::SUCCESS));
+    }
+  }
 
   void LaunchAppWithParams(AppLaunchParams&& params,
-                           LaunchCallback callback) override {}
+                           LaunchCallback callback) override {
+    std::unique_ptr<AppServiceProxyBase::LaunchParams> launch_params =
+        std::make_unique<AppServiceProxyBase::LaunchParams>();
+    std::string app_id = params.app_id;
+    launch_params->params_ = std::move(params);
+    launch_requests_[app_id].push_back(std::move(launch_params));
+    if (!callback.is_null()) {
+      std::move(callback).Run(LaunchResult(State::SUCCESS));
+    }
+  }
 
   void LoadIcon(const std::string& app_id,
                 const IconKey& icon_key,
@@ -83,6 +141,8 @@
     return supported_link_apps_.find(app_id) != supported_link_apps_.end();
   }
 
+  LaunchRequests& launch_requests() { return launch_requests_; }
+
  private:
   void CallOnApps(std::vector<std::string>& app_ids, bool uninstall) {
     std::vector<AppPtr> apps;
@@ -107,6 +167,7 @@
   }
 
   AppType app_type_;
+  LaunchRequests launch_requests_;
   std::vector<std::string> known_app_ids_;
   std::set<std::string> supported_link_apps_;
 };
@@ -127,8 +188,8 @@
     if (base::Contains(app_ids_, update.AppId())) {
       app_ids_.erase(update.AppId());
     }
-    if (app_ids_.empty() && !result_.GetCallback().is_null()) {
-      std::move(result_.GetCallback()).Run();
+    if (app_ids_.empty() && !result_.IsReady()) {
+      result_.SetValue();
     }
   }
 
@@ -175,6 +236,7 @@
 #endif
 
 class AppServiceProxyTest : public testing::Test {
+ public:
   void SetUp() override {
     scoped_feature_list_.InitAndEnableFeature(kAppServiceStorage);
   }
@@ -1278,5 +1340,249 @@
   EXPECT_EQ(AppType::kArc, proxy->AppRegistryCache().GetAppType(kTestAppId));
 }
 
+class AppServiceProxyLaunchTest : public AppServiceProxyTest {
+ public:
+  void SetUp() override {
+    AppServiceProxyTest::SetUp();
+    profile_ = std::make_unique<TestingProfile>();
+    proxy_ = AppServiceProxyFactory::GetForProfile(profile_.get());
+    CreateAndInitShelfController();
+  }
+
+  void TearDown() override { shelf_controller_ = nullptr; }
+
+  // Create and initialize the controller.
+  void CreateAndInitShelfController() {
+    model_ = std::make_unique<ash::ShelfModel>();
+    shelf_controller_ =
+        std::make_unique<ChromeShelfController>(profile_.get(), model_.get());
+    shelf_controller_->SetProfileForTest(profile_.get());
+    shelf_controller_->Init();
+  }
+
+  void InstallApp(AppType app_type, const std::string& app_id) {
+    FakeAppRegistryCacheObserver observer(&proxy()->AppRegistryCache());
+
+    AppPtr app1 = std::make_unique<App>(app_type, app_id);
+    app1->readiness = Readiness::kReady;
+    std::vector<AppPtr> apps1;
+    apps1.push_back(std::move(app1));
+    proxy()->OnApps(std::move(apps1), app_type,
+                    /*should_notify_initialized=*/false);
+    observer.WaitForOnAppUpdate(std::set<std::string>{app_id});
+  }
+
+  ChromeShelfController* shelf_controller() { return shelf_controller_.get(); }
+  AppServiceProxy* proxy() { return proxy_; }
+
+ public:
+  std::unique_ptr<TestingProfile> profile_;
+  std::unique_ptr<ash::ShelfModel> model_;
+  std::unique_ptr<ChromeShelfController> shelf_controller_;
+  raw_ptr<AppServiceProxy> proxy_;
+};
+
+// Verify the spinner can be closed when the app is uninstalled.
+TEST_F(AppServiceProxyLaunchTest, UninstallAppAfterLaunch) {
+  constexpr char kTestAppId1[] = "webapp1";
+  constexpr char kTestAppId2[] = "webapp2";
+  InstallApp(AppType::kWeb, kTestAppId1);
+  InstallApp(AppType::kWeb, kTestAppId2);
+
+  proxy()->Launch(kTestAppId1, /*event_flags=*/0, LaunchSource::kFromTest);
+  std::vector<base::FilePath> file_paths{base::FilePath("/abc")};
+  proxy()->LaunchAppWithFiles(kTestAppId1, /*event_flags=*/2,
+                              LaunchSource::kFromChromeInternal, file_paths);
+  proxy()->LaunchAppWithIntent(
+      kTestAppId2, /*event_flags=*/3,
+      apps_util::MakeShareIntent(/*text=*/"text", /*title=*/"title"),
+      LaunchSource::kFromManagementApi,
+      std::make_unique<WindowInfo>(display::kDefaultDisplayId),
+      base::NullCallback());
+
+  // Verify the spinner is applied to the app icon.
+  EXPECT_TRUE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId1));
+  EXPECT_TRUE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId2));
+
+  // Uninstall the app.
+  AppPtr app2 = std::make_unique<App>(AppType::kWeb, kTestAppId1);
+  app2->readiness = Readiness::kUninstalledByUser;
+  std::vector<AppPtr> apps2;
+  apps2.push_back(std::move(app2));
+  proxy()->OnApps(std::move(apps2), AppType::kWeb,
+                  /*should_notify_initialized=*/false);
+
+  // Verify the spinner is closed for `kTestAppId1`, and `kTestAppId2` still has
+  // the spinner.
+  EXPECT_FALSE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId1));
+  EXPECT_TRUE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId2));
+
+  // Register the ARC publisher.
+  FakePublisherForProxyTest pub1(proxy(), AppType::kArc,
+                                 std::vector<std::string>{});
+  auto& arc_launch_requests = pub1.launch_requests();
+
+  // Verify `kTestAppId2` still has the spinner.
+  EXPECT_TRUE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId2));
+  EXPECT_TRUE(arc_launch_requests.empty());
+
+  // Register the publisher for the web app.
+  FakePublisherForProxyTest pub2(proxy(), AppType::kWeb,
+                                 std::vector<std::string>{kTestAppId2});
+  auto& web_launch_requests = pub2.launch_requests();
+
+  // Verify the Launch request has been removed, and the launch function is not
+  // called.
+  EXPECT_FALSE(base::Contains(web_launch_requests, kTestAppId1));
+  EXPECT_TRUE(base::Contains(web_launch_requests, kTestAppId2));
+}
+
+TEST_F(AppServiceProxyLaunchTest, Launch) {
+  constexpr char kTestAppId[] = "webapp";
+  InstallApp(AppType::kWeb, kTestAppId);
+
+  proxy()->Launch(kTestAppId, /*event_flags=*/1, LaunchSource::kFromTest,
+                  std::make_unique<WindowInfo>(display::kDefaultDisplayId));
+  proxy()->Launch(kTestAppId, /*event_flags=*/2,
+                  LaunchSource::kFromChromeInternal,
+                  std::make_unique<WindowInfo>(display::kDefaultDisplayId));
+
+  // Verify the spinner is applied to the app icon.
+  EXPECT_TRUE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId));
+
+  // Register the publisher for the web app.
+  FakePublisherForProxyTest pub(proxy(), AppType::kWeb,
+                                std::vector<std::string>{kTestAppId});
+  auto& launch_requests = pub.launch_requests();
+
+  // Verify the spinner is closed.
+  EXPECT_FALSE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId));
+
+  // Verify the Launch function is called.
+  EXPECT_TRUE(base::Contains(launch_requests, kTestAppId));
+  EXPECT_EQ(2u, launch_requests[kTestAppId].size());
+  EXPECT_EQ(1, launch_requests[kTestAppId][0]->event_flags_);
+  EXPECT_EQ(LaunchSource::kFromTest,
+            launch_requests[kTestAppId][0]->launch_source_);
+  EXPECT_EQ(display::kDefaultDisplayId,
+            launch_requests[kTestAppId][0]->window_info_->display_id);
+  EXPECT_EQ(2, launch_requests[kTestAppId][1]->event_flags_);
+  EXPECT_EQ(LaunchSource::kFromChromeInternal,
+            launch_requests[kTestAppId][1]->launch_source_);
+  EXPECT_EQ(display::kDefaultDisplayId,
+            launch_requests[kTestAppId][1]->window_info_->display_id);
+}
+
+TEST_F(AppServiceProxyLaunchTest, LaunchAppWithFiles) {
+  constexpr char kTestAppId[] = "webapp";
+  InstallApp(AppType::kWeb, kTestAppId);
+
+  std::vector<base::FilePath> file_paths{base::FilePath("/abc")};
+  proxy()->LaunchAppWithFiles(kTestAppId, /*event_flags=*/2,
+                              LaunchSource::kFromChromeInternal, file_paths);
+
+  // Verify the spinner is applied to the app icon.
+  EXPECT_TRUE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId));
+
+  // Register the publisher for the web app.
+  FakePublisherForProxyTest pub(proxy(), AppType::kWeb,
+                                std::vector<std::string>{kTestAppId});
+  auto& launch_requests = pub.launch_requests();
+
+  // Verify the spinner is closed.
+  EXPECT_FALSE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId));
+
+  // Verify the Launch function is called.
+  EXPECT_TRUE(base::Contains(launch_requests, kTestAppId));
+  EXPECT_EQ(1u, launch_requests[kTestAppId].size());
+  EXPECT_EQ(2, launch_requests[kTestAppId][0]->event_flags_);
+  EXPECT_EQ(LaunchSource::kFromChromeInternal,
+            launch_requests[kTestAppId][0]->launch_source_);
+  EXPECT_EQ(file_paths, launch_requests[kTestAppId][0]->file_paths_);
+}
+
+TEST_F(AppServiceProxyLaunchTest, LaunchAppWithIntent) {
+  constexpr char kTestAppId[] = "webapp";
+  InstallApp(AppType::kWeb, kTestAppId);
+
+  auto intent = apps_util::MakeShareIntent(/*text=*/"text", /*title=*/"title");
+  bool is_called = false;
+  proxy()->LaunchAppWithIntent(
+      kTestAppId, /*event_flags=*/3, intent->Clone(),
+      LaunchSource::kFromManagementApi,
+      std::make_unique<WindowInfo>(display::kDefaultDisplayId),
+      base::BindLambdaForTesting(
+          [&is_called](apps::LaunchResult&& callback_result) {
+            is_called = true;
+          }));
+
+  // Verify the spinner is applied to the app icon.
+  EXPECT_TRUE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId));
+
+  // Register the publisher for the web app.
+  FakePublisherForProxyTest pub(proxy(), AppType::kWeb,
+                                std::vector<std::string>{kTestAppId});
+  auto& launch_requests = pub.launch_requests();
+
+  // Verify the spinner is closed.
+  EXPECT_FALSE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId));
+
+  // Verify the Launch function is called.
+  EXPECT_TRUE(base::Contains(launch_requests, kTestAppId));
+  EXPECT_EQ(1u, launch_requests[kTestAppId].size());
+  EXPECT_EQ(3, launch_requests[kTestAppId][0]->event_flags_);
+  EXPECT_EQ(*intent, *launch_requests[kTestAppId][0]->intent_);
+  EXPECT_EQ(LaunchSource::kFromManagementApi,
+            launch_requests[kTestAppId][0]->launch_source_);
+  EXPECT_TRUE(is_called);
+}
+
+TEST_F(AppServiceProxyLaunchTest, LaunchAppWithParams) {
+  constexpr char kTestAppId[] = "webapp";
+  InstallApp(AppType::kWeb, kTestAppId);
+
+  AppLaunchParams params(kTestAppId, LaunchContainer::kLaunchContainerWindow,
+                         WindowOpenDisposition::NEW_WINDOW,
+                         LaunchSource::kFromManagementApi);
+  bool is_called = false;
+  proxy()->LaunchAppWithParams(
+      std::move(params),
+      base::BindLambdaForTesting(
+          [&is_called](apps::LaunchResult&& callback_result) {
+            is_called = true;
+          }));
+
+  // Verify the spinner is applied to the app icon.
+  EXPECT_TRUE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId));
+
+  // Register the publisher for the web app.
+  FakePublisherForProxyTest pub(proxy(), AppType::kWeb,
+                                std::vector<std::string>{kTestAppId});
+  auto& launch_requests = pub.launch_requests();
+
+  // Verify the spinner is closed.
+  EXPECT_FALSE(
+      shelf_controller()->GetShelfSpinnerController()->HasApp(kTestAppId));
+
+  // Verify the Launch function is called.
+  EXPECT_TRUE(base::Contains(launch_requests, kTestAppId));
+  EXPECT_EQ(1u, launch_requests[kTestAppId].size());
+  EXPECT_EQ(LaunchSource::kFromManagementApi,
+            launch_requests[kTestAppId][0]->params_->launch_source);
+  EXPECT_TRUE(is_called);
+}
+
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.cc
index f040ba9b..f9bb77e6 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.cc
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.cc
@@ -108,6 +108,9 @@
     ::chromeos::PowerManagerClient::InitializeFake();
   }
 
+  // Wait for AppServiceProxy to be ready.
+  app_service_test_.SetUp(profile());
+
   app_platform_metrics_service_ =
       std::make_unique<AppPlatformMetricsService>(profile());
 
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.h b/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.h
index e254671..71a6bd1 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.h
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.h
@@ -10,6 +10,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_test.h"
 #include "chrome/browser/apps/app_service/metrics/app_platform_metrics_service.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/test/base/testing_profile.h"
@@ -149,6 +150,7 @@
   raw_ptr<ash::FakeChromeUserManager, DanglingUntriaged> fake_user_manager_;
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
   std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_;
+  apps::AppServiceTest app_service_test_;
 };
 
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_unittest.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_unittest.cc
index e3fe493..18ffac6 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_unittest.cc
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics_service_unittest.cc
@@ -244,7 +244,6 @@
       public ::testing::WithParamInterface<bool> {
  public:
   void SetUp() override {
-    AppPlatformMetricsServiceTestBase::SetUp();
     if (IsLacrosEnabled()) {
       feature_list_.InitWithFeatures(
           /*enabled_features=*/ash::standalone_browser::GetFeatureRefs(), {});
@@ -252,6 +251,7 @@
       feature_list_.InitWithFeatures(
           {}, /*disabled_features=*/ash::standalone_browser::GetFeatureRefs());
     }
+    AppPlatformMetricsServiceTestBase::SetUp();
 
     InstallApps();
     // The WebAppProvider system must be started after the apps are added, as
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc
index deacdb88..d018f55 100644
--- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc
+++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc
@@ -166,19 +166,21 @@
     base::OnceCallback<void(MenuItems)> callback) {
   bool is_system_web_app = false;
   bool can_use_uninstall = false;
+  bool can_close = true;
   WindowMode display_mode = WindowMode::kUnknown;
 
   proxy_->AppRegistryCache().ForOneApp(
-      app_id, [&is_system_web_app, &can_use_uninstall,
+      app_id, [&is_system_web_app, &can_use_uninstall, &can_close,
                &display_mode](const AppUpdate& update) {
         is_system_web_app = update.InstallReason() == InstallReason::kSystem;
         can_use_uninstall = update.AllowUninstall().value_or(false);
+        can_close = update.AllowClose().value_or(true);
         display_mode = update.WindowMode();
       });
 
   MenuItems menu_items;
 
-  if (display_mode != WindowMode::kUnknown && !is_system_web_app) {
+  if (display_mode != WindowMode::kUnknown && !is_system_web_app && can_close) {
     if (chromeos::features::IsCrosShortstandEnabled()) {
       apps::AddCommandItem(ash::LAUNCH_NEW,
                            IDS_APP_LIST_CONTEXT_MENU_NEW_WINDOW, menu_items);
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc b/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc
index 06ba7be..524c84f 100644
--- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc
+++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc
@@ -9,6 +9,7 @@
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/shelf_types.h"
 #include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
 #include "base/test/bind.h"
 #include "base/test/test_future.h"
 #include "chrome/browser/apps/app_service/app_registry_cache_waiter.h"
@@ -17,6 +18,7 @@
 #include "chrome/browser/ash/crosapi/ash_requires_lacros_browsertestbase.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.h"
+#include "chrome/browser/web_applications/web_app_id_constants.h"
 #include "chromeos/crosapi/mojom/test_controller.mojom.h"
 #include "components/services/app_service/public/cpp/app_launch_util.h"
 #include "components/services/app_service/public/cpp/instance_registry.h"
@@ -270,3 +272,115 @@
 
   EXPECT_EQ(ash::ShelfModel::Get()->ItemIndexByAppID(app_id), -1);
 }
+
+namespace {
+
+constexpr char kCalculatorAppUrl[] = "https://calculator.apps.chrome/";
+
+constexpr char kPreventCloseForCalculatorTemplate[] = R"([
+  {
+    "manifest_id": "https://calculator.apps.chrome/",
+    "run_on_os_login": "run_windowed",
+    "prevent_close_after_run_on_os_login": %s
+  }
+])";
+
+}  // namespace
+
+class WebAppsPreventCloseCrosapiBrowserTest
+    : public WebAppsCrosapiBrowserTest,
+      public ::testing::WithParamInterface<bool> {
+ public:
+  WebAppsPreventCloseCrosapiBrowserTest() = default;
+
+  WebAppsPreventCloseCrosapiBrowserTest(
+      const WebAppsPreventCloseCrosapiBrowserTest&) = delete;
+  WebAppsPreventCloseCrosapiBrowserTest& operator=(
+      const WebAppsPreventCloseCrosapiBrowserTest&) = delete;
+
+  ~WebAppsPreventCloseCrosapiBrowserTest() override = default;
+
+  bool IsPreventCloseEnabled() const { return GetParam(); }
+};
+
+IN_PROC_BROWSER_TEST_P(WebAppsPreventCloseCrosapiBrowserTest,
+                       CheckContextShelfMenu) {
+  if (!HasLacrosArgument()) {
+    return;
+  }
+
+  {
+    base::test::TestFuture<bool> waiter;
+    GetStandaloneBrowserTestController()->SetWebAppSettingsPref(
+        base::StringPrintf(kPreventCloseForCalculatorTemplate,
+                           IsPreventCloseEnabled() ? "true" : "false"),
+        waiter.GetCallback());
+    EXPECT_TRUE(waiter.Wait());
+  }
+
+  const auto app_id =
+      InstallWebApp(kCalculatorAppUrl, apps::WindowMode::kWindow);
+  EXPECT_EQ(app_id, web_app::kCalculatorAppId);
+
+  EXPECT_FALSE(ash::ShelfModel::Get()->ItemByID(
+      ash::ShelfID(web_app::kCalculatorAppId)));
+
+  {
+    AppInstanceWaiter waiter(AppServiceProxy()->InstanceRegistry(),
+                             web_app::kCalculatorAppId);
+    AppServiceProxy()->Launch(web_app::kCalculatorAppId, /*event_flags=*/0,
+                              apps::LaunchSource::kFromAppListGrid);
+    waiter.Await();
+  }
+
+  bool can_close = true;
+  AppServiceProxy()->AppRegistryCache().ForOneApp(
+      app_id, [&can_close](const apps::AppUpdate& update) {
+        can_close = update.AllowClose().value_or(true);
+      });
+
+  // Wait until prefs are propagated and App `allow_close` field is updated to
+  // expected value.
+  if (can_close == IsPreventCloseEnabled()) {
+    apps::AppUpdateWaiter waiter(
+        GetAshProfile(), web_app::kCalculatorAppId,
+        base::BindRepeating(
+            [](bool expected_allow_close, const apps::AppUpdate& update) {
+              return update.AllowClose().has_value() &&
+                     update.AllowClose().value() == expected_allow_close;
+            },
+            !IsPreventCloseEnabled()));
+    waiter.Wait();
+  }
+
+  EXPECT_TRUE(ash::ShelfModel::Get()->ItemByID(
+      ash::ShelfID(web_app::kCalculatorAppId)));
+
+  const std::vector<std::string> items =
+      GetContextMenuForApp(web_app::kCalculatorAppId);
+
+  if (!IsPreventCloseEnabled()) {
+    ASSERT_EQ(5u, items.size());
+    EXPECT_EQ(items[0], "New window");
+    EXPECT_EQ(items[1], "Pin");
+    EXPECT_EQ(items[2], "Close");
+    EXPECT_EQ(items[3], "Uninstall");
+    EXPECT_EQ(items[4], "App info");
+  } else {
+    ASSERT_EQ(3u, items.size());
+    EXPECT_EQ(items[0], "Pin");
+    EXPECT_EQ(items[1], "Uninstall");
+    EXPECT_EQ(items[2], "App info");
+  }
+
+  {
+    base::test::TestFuture<bool> waiter;
+    GetStandaloneBrowserTestController()->SetWebAppSettingsPref(
+        "", waiter.GetCallback());
+    EXPECT_TRUE(waiter.Wait());
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         WebAppsPreventCloseCrosapiBrowserTest,
+                         ::testing::Bool());
diff --git a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
index 677b5df..4474b24 100644
--- a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
+++ b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
@@ -31,7 +31,6 @@
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/media_galleries/gallery_watch_manager.h"
 #include "chrome/browser/media_galleries/media_file_system_registry.h"
-#include "chrome/browser/media_galleries/media_galleries_histograms.h"
 #include "chrome/browser/media_galleries/media_galleries_permission_controller.h"
 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
 #include "chrome/browser/platform_util.h"
@@ -393,8 +392,6 @@
 
 ExtensionFunction::ResponseAction
 MediaGalleriesGetMediaFileSystemsFunction::Run() {
-  ::media_galleries::UsageCount(::media_galleries::GET_MEDIA_FILE_SYSTEMS);
-
   if (base::FeatureList::IsEnabled(features::kDeprecateMediaGalleriesApis))
     return RespondNow(Error(kDeprecatedError));
 
@@ -481,7 +478,6 @@
 }
 
 void MediaGalleriesGetMediaFileSystemsFunction::ShowDialog() {
-  ::media_galleries::UsageCount(::media_galleries::SHOW_DIALOG);
   WebContents* contents = GetWebContentsForPrompt(
       GetSenderWebContents(), browser_context(), extension()->id());
   if (!contents) {
@@ -516,8 +512,6 @@
 
 ExtensionFunction::ResponseAction
 MediaGalleriesAddUserSelectedFolderFunction::Run() {
-  ::media_galleries::UsageCount(::media_galleries::ADD_USER_SELECTED_FOLDER);
-
   if (base::FeatureList::IsEnabled(features::kDeprecateMediaGalleriesApis))
     return RespondNow(Error(kDeprecatedError));
 
@@ -628,8 +622,6 @@
 MediaGalleriesGetMetadataFunction::~MediaGalleriesGetMetadataFunction() {}
 
 ExtensionFunction::ResponseAction MediaGalleriesGetMetadataFunction::Run() {
-  ::media_galleries::UsageCount(::media_galleries::GET_METADATA);
-
   if (base::FeatureList::IsEnabled(features::kDeprecateMediaGalleriesApis))
     return RespondNow(Error(kDeprecatedError));
 
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index d698e2c..fb2098a5 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -3062,7 +3062,6 @@
     "remote_apps/remote_apps_model.cc",
     "remote_apps/remote_apps_model.h",
     "remote_apps/remote_apps_types.h",
-    "reset/metrics.h",
     "scalable_iph/scalable_iph_delegate_impl.cc",
     "scalable_iph/scalable_iph_delegate_impl.h",
     "scanning/chrome_scanning_app_delegate.cc",
diff --git a/chrome/browser/ash/borealis/borealis_util.cc b/chrome/browser/ash/borealis/borealis_util.cc
index 9710282..6750647 100644
--- a/chrome/browser/ash/borealis/borealis_util.cc
+++ b/chrome/browser/ash/borealis/borealis_util.cc
@@ -25,8 +25,11 @@
 const char kIgnoredAppIdPrefix[] = "org.chromium.guest_os.borealis.xid.";
 const char kBorealisDlcName[] = "borealis-dlc";
 const char kAllowedScheme[] = "steam";
-const re2::LazyRE2 kURLAllowlistRegex[] = {{"//store/[0-9]{1,32}"},
-                                           {"//run/[0-9]{1,32}"}};
+const re2::LazyRE2 kURLAllowlistRegex[] = {
+    {"//store/[0-9]{1,32}"},
+    {"//run/[0-9]{1,32}"},
+    {"//subscriptioninstall/[0-9]{1,32}"},
+    {"//launch/[0-9]{1,32}/Dialog"}};
 const char kCompatToolVersionGameMismatch[] = "UNKNOWN (GameID mismatch)";
 const char kDeviceInformationKey[] = "entry.1613887985";
 const re2::LazyRE2 kSpuriousGameBlocklist[] = {
diff --git a/chrome/browser/ash/login/quickstart_controller.cc b/chrome/browser/ash/login/quickstart_controller.cc
index 9dad378..942d5fb 100644
--- a/chrome/browser/ash/login/quickstart_controller.cc
+++ b/chrome/browser/ash/login/quickstart_controller.cc
@@ -5,6 +5,9 @@
 #include "chrome/browser/ash/login/quickstart_controller.h"
 
 #include "ash/constants/ash_features.h"
+#include "ash/public/cpp/bluetooth_config_service.h"
+#include "base/check.h"
+#include "base/logging.h"
 #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h"
 #include "chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h"
 #include "chrome/browser/ash/login/oobe_screen.h"
@@ -25,6 +28,9 @@
 
 namespace {
 
+using bluetooth_config::mojom::BluetoothDevicePropertiesPtr;
+using bluetooth_config::mojom::BluetoothSystemState;
+
 absl::optional<QuickStartController::EntryPoint> EntryPointFromScreen(
     OobeScreenId screen) {
   if (screen.name == WelcomeScreenHandler::kScreenId.name) {
@@ -77,6 +83,7 @@
 QuickStartController::QuickStartController() {
   if (features::IsOobeQuickStartEnabled()) {
     InitTargetDeviceBootstrapController();
+    StartObservingBluetoothState();
   }
 }
 
@@ -142,21 +149,6 @@
   ResetState();
 }
 
-bool QuickStartController::ShouldShowBluetoothDialog() {
-  // TODO(ayag)(b/309382466): check bluetooth enabled
-  return !this->is_bluetooth_enabled_;
-}
-
-void QuickStartController::TurnOnBluetooth() {
-  // TODO(ayag)(b/309382466): enable bluetooth
-  this->is_bluetooth_enabled_ = true;
-}
-
-void QuickStartController::set_fake_bluetooth_state_for_testing(
-    bool bluetooth_enabled) {
-  this->is_bluetooth_enabled_ = bluetooth_enabled;
-}
-
 QuickStartController::EntryPoint QuickStartController::GetExitPoint() {
   return exit_point_.value();
 }
@@ -394,4 +386,50 @@
   bootstrap_controller_->Cleanup();
 }
 
+/******************* Bluetooth dialog related functions *******************/
+
+void QuickStartController::StartObservingBluetoothState() {
+  GetBluetoothConfigService(
+      cros_bluetooth_config_remote_.BindNewPipeAndPassReceiver());
+  cros_bluetooth_config_remote_->ObserveSystemProperties(
+      cros_system_properties_observer_receiver_.BindNewPipeAndPassRemote());
+}
+
+void QuickStartController::OnPropertiesUpdated(
+    bluetooth_config::mojom::BluetoothSystemPropertiesPtr properties) {
+  bluetooth_system_state_ = properties->system_state;
+}
+
+bool QuickStartController::ShouldShowBluetoothDialog() {
+  switch (bluetooth_system_state_) {
+    case BluetoothSystemState::kDisabled:
+      QS_LOG(INFO) << "Bluetooth is turned off.";
+      return true;
+    case BluetoothSystemState::kDisabling:
+      QS_LOG(INFO) << "Bluetooth is in the process of turning off.";
+      return false;
+    case BluetoothSystemState::kEnabled:
+      QS_LOG(INFO) << "Bluetooth is turned on.";
+      return false;
+    case BluetoothSystemState::kEnabling:
+      QS_LOG(INFO) << "Bluetooth is in the process of turning on.";
+      return false;
+    case BluetoothSystemState::kUnavailable:
+      QS_LOG(INFO) << "Device does not have access to Bluetooth.";
+      return false;
+  }
+}
+
+void QuickStartController::TurnOnBluetooth() {
+  // TODO(ayag)(b/310566204): rename SetBluetoothHidDetectionActive to be
+  // generic.
+  CHECK(cros_bluetooth_config_remote_);
+  cros_bluetooth_config_remote_->SetBluetoothHidDetectionActive();
+}
+
+bluetooth_config::mojom::BluetoothSystemState
+QuickStartController::get_bluetooth_system_state_for_testing() {
+  return bluetooth_system_state_;
+}
+
 }  // namespace ash::quick_start
diff --git a/chrome/browser/ash/login/quickstart_controller.h b/chrome/browser/ash/login/quickstart_controller.h
index 3d6205b..6d11dd4 100644
--- a/chrome/browser/ash/login/quickstart_controller.h
+++ b/chrome/browser/ash/login/quickstart_controller.h
@@ -14,6 +14,11 @@
 #include "chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h"
 #include "chrome/browser/ash/login/oobe_screen.h"
 #include "chrome/browser/ui/webui/ash/login/oobe_ui.h"
+#include "chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-forward.h"
+#include "chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-shared.h"
+#include "chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 
 namespace ash::quick_start {
 
@@ -23,8 +28,10 @@
 // source of truth for what the UI (QuickStartScreen) should be showing. Unlike
 // other OOBE screens, QuickStartScreen just acts as a delegate for this main
 // controller.
-class QuickStartController : public OobeUI::Observer,
-                             public TargetDeviceBootstrapController::Observer {
+class QuickStartController
+    : public OobeUI::Observer,
+      public TargetDeviceBootstrapController::Observer,
+      public bluetooth_config::mojom::SystemPropertiesObserver {
  public:
   // QuickStart flow entry point locations.
   enum class EntryPoint {
@@ -122,7 +129,8 @@
   // Turn on bluetooth for quick start flow to continue
   void TurnOnBluetooth();
 
-  void set_fake_bluetooth_state_for_testing(bool bluetooth_enabled);
+  bluetooth_config::mojom::BluetoothSystemState
+  get_bluetooth_system_state_for_testing();
 
   // Exit point to be used when the flow is cancelled.
   EntryPoint GetExitPoint();
@@ -131,6 +139,13 @@
   // Initializes the BootstrapController and starts to observe it.
   void InitTargetDeviceBootstrapController();
 
+  // Initializes the Bluetooth and starts to observe it.
+  void StartObservingBluetoothState();
+
+  // bluetooth_config::mojom::SystemPropertiesObserver
+  void OnPropertiesUpdated(bluetooth_config::mojom::BluetoothSystemPropertiesPtr
+                               properties) override;
+
   // Updates the UI state and notifies the frontend.
   void UpdateUiState(UiState ui_state);
 
@@ -203,8 +218,14 @@
   // is shown. UI updates happen over this observation path.
   base::ObserverList<UiDelegate> ui_delegates_;
 
-  // TODO(ayag)(b/309382466): set value by fetching bluetooth state
-  bool is_bluetooth_enabled_ = true;
+  mojo::Remote<bluetooth_config::mojom::CrosBluetoothConfig>
+      cros_bluetooth_config_remote_;
+
+  mojo::Receiver<bluetooth_config::mojom::SystemPropertiesObserver>
+      cros_system_properties_observer_receiver_{this};
+
+  bluetooth_config::mojom::BluetoothSystemState bluetooth_system_state_ =
+      bluetooth_config::mojom::BluetoothSystemState::kUnavailable;
 
   base::ScopedObservation<OobeUI, OobeUI::Observer> observation_{this};
   base::WeakPtrFactory<QuickStartController> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/login/screens/quick_start_screen_browsertest.cc b/chrome/browser/ash/login/screens/quick_start_screen_browsertest.cc
index 67ad3c7e..5d0c5f22 100644
--- a/chrome/browser/ash/login/screens/quick_start_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/quick_start_screen_browsertest.cc
@@ -2,7 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <memory>
 #include "ash/constants/ash_features.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
@@ -26,8 +28,11 @@
 #include "chrome/test/base/fake_gaia_mixin.h"
 #include "chromeos/ash/components/network/network_state_test_helper.h"
 #include "chromeos/ash/components/quick_start/quick_start_metrics.h"
+#include "chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-shared.h"
 #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom.h"
 #include "content/public/test/browser_test.h"
+#include "device/bluetooth/bluetooth_adapter_factory.h"
+#include "device/bluetooth/test/mock_bluetooth_adapter.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/chromeos/devicetype_utils.h"
@@ -35,6 +40,9 @@
 namespace ash {
 
 namespace {
+
+using bluetooth_config::mojom::BluetoothSystemState;
+
 constexpr char kWifiNetworkName[] = "wifi-test-network";
 constexpr char kWelcomeScreen[] = "welcomeScreen";
 constexpr char kQuickStartEntryPoint[] = "quickStartWelcomeEntryPoint";
@@ -116,11 +124,23 @@
     OobeBaseTest::SetUpInProcessBrowserTestFixture();
     quick_start::TargetDeviceConnectionBrokerFactory::SetFactoryForTesting(
         &connection_broker_factory_);
+
+    mock_bluetooth_adapter_ =
+        base::MakeRefCounted<testing::NiceMock<device::MockBluetoothAdapter>>();
+    device::BluetoothAdapterFactory::SetAdapterForTesting(
+        mock_bluetooth_adapter_);
+    ON_CALL(*mock_bluetooth_adapter_, IsPresent())
+        .WillByDefault(testing::Return(true));
+
+    SetUpBluetoothIsPoweredResponse(mock_bluetooth_adapter_, true);
+
+    testing::Mock::AllowLeak(mock_bluetooth_adapter_.get());
   }
 
   void TearDownInProcessBrowserTestFixture() override {
     quick_start::TargetDeviceConnectionBrokerFactory::SetFactoryForTesting(
         nullptr);
+    mock_bluetooth_adapter_.reset();
     OobeBaseTest::TearDownInProcessBrowserTestFixture();
   }
 
@@ -144,20 +164,20 @@
     OobeScreenWaiter(QuickStartView::kScreenId).Wait();
   }
 
-  void WaitForBluetoothDialogToOpen() {
-    test::OobeJS()
-        .CreateWaiter(
-            test::GetOobeElementPath({kQuickStartBluetoothDialogPath}) +
-            ".open")
-        ->Wait();
+  void SetUpBluetoothIsPoweredResponse(
+      scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>>
+          mock_bluetooth_adapter,
+      bool is_powered) {
+    ON_CALL(*mock_bluetooth_adapter, IsPowered())
+        .WillByDefault(testing::Return(is_powered));
   }
 
-  void WaitForBluetoothDialogToClose() {
-    test::OobeJS()
-        .CreateWaiter(
-            test::GetOobeElementPath({kQuickStartBluetoothDialogPath}) +
-            ".open === false")
-        ->Wait();
+  void EnsureBluetoothState(bool is_powered) {
+    EXPECT_EQ(WizardController::default_controller()
+                  ->quick_start_controller()
+                  ->get_bluetooth_system_state_for_testing(),
+              is_powered ? BluetoothSystemState::kEnabled
+                         : BluetoothSystemState::kDisabled);
   }
 
   void SkipUpdateScreenOnBrandedBuilds() {
@@ -285,6 +305,8 @@
  protected:
   quick_start::FakeTargetDeviceConnectionBroker::Factory
       connection_broker_factory_;
+  scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>>
+      mock_bluetooth_adapter_;
 
  private:
   std::unique_ptr<NetworkStateTestHelper> network_helper_;
@@ -301,6 +323,38 @@
   }
 };
 
+class QuickStartBrowserTestWithBluetoothDisabled
+    : public QuickStartBrowserTest {
+ public:
+  QuickStartBrowserTestWithBluetoothDisabled() {}
+  ~QuickStartBrowserTestWithBluetoothDisabled() override = default;
+
+  void SetUpInProcessBrowserTestFixture() override {
+    QuickStartBrowserTest::SetUpInProcessBrowserTestFixture();
+    SetUpBluetoothIsPoweredResponse(mock_bluetooth_adapter_, false);
+  }
+
+  void TearDownInProcessBrowserTestFixture() override {
+    QuickStartBrowserTest::TearDownInProcessBrowserTestFixture();
+  }
+
+  void WaitForBluetoothDialogToOpen() {
+    test::OobeJS()
+        .CreateWaiter(
+            test::GetOobeElementPath({kQuickStartBluetoothDialogPath}) +
+            ".open")
+        ->Wait();
+  }
+
+  void WaitForBluetoothDialogToClose() {
+    test::OobeJS()
+        .CreateWaiter(
+            test::GetOobeElementPath({kQuickStartBluetoothDialogPath}) +
+            ".open === false")
+        ->Wait();
+  }
+};
+
 IN_PROC_BROWSER_TEST_F(QuickStartNotDeterminedBrowserTest,
                        ButtonVisibleOnWelcomeScreen) {
   test::WaitForWelcomeScreen();
@@ -315,6 +369,77 @@
       ->Wait();
 }
 
+IN_PROC_BROWSER_TEST_F(QuickStartBrowserTestWithBluetoothDisabled,
+                       ClickingOnQuickStartWhenBluetoothDisabled) {
+  test::WaitForWelcomeScreen();
+
+  test::OobeJS()
+      .CreateVisibilityWaiter(/*visibility=*/true, kQuickStartButtonPath)
+      ->Wait();
+
+  EXPECT_CALL(*mock_bluetooth_adapter_, IsPowered())
+      .WillRepeatedly(testing::Return(false));
+
+  EnsureBluetoothState(/*is_powered=*/false);
+
+  test::OobeJS().ClickOnPath(kQuickStartButtonPath);
+  WaitForBluetoothDialogToOpen();
+}
+
+IN_PROC_BROWSER_TEST_F(QuickStartBrowserTestWithBluetoothDisabled,
+                       CancellingBluetoothEnablingClosesDialog) {
+  test::WaitForWelcomeScreen();
+
+  test::OobeJS()
+      .CreateVisibilityWaiter(/*visibility=*/true, kQuickStartButtonPath)
+      ->Wait();
+
+  EXPECT_CALL(*mock_bluetooth_adapter_, IsPowered())
+      .WillRepeatedly(testing::Return(false));
+
+  EnsureBluetoothState(/*is_powered=*/false);
+
+  test::OobeJS().ClickOnPath(kQuickStartButtonPath);
+
+  WaitForBluetoothDialogToOpen();
+
+  test::OobeJS()
+      .CreateVisibilityWaiter(/*visibility=*/true,
+                              kQuickStartBluetoothCancelButtonPath)
+      ->Wait();
+
+  test::OobeJS().ClickOnPath(kQuickStartBluetoothCancelButtonPath);
+
+  WaitForBluetoothDialogToClose();
+}
+
+IN_PROC_BROWSER_TEST_F(QuickStartBrowserTestWithBluetoothDisabled,
+                       TurningOnBlueoothFromBluetoothDialog) {
+  test::WaitForWelcomeScreen();
+
+  test::OobeJS()
+      .CreateVisibilityWaiter(/*visibility=*/true, kQuickStartButtonPath)
+      ->Wait();
+
+  EXPECT_CALL(*mock_bluetooth_adapter_, IsPowered())
+      .WillRepeatedly(testing::Return(false));
+
+  EnsureBluetoothState(/*is_powered=*/false);
+
+  test::OobeJS().ClickOnPath(kQuickStartButtonPath);
+
+  WaitForBluetoothDialogToOpen();
+
+  test::OobeJS()
+      .CreateVisibilityWaiter(/*visibility=*/true,
+                              kQuickStartBluetoothEnableButtonPath)
+      ->Wait();
+
+  test::OobeJS().ClickOnPath(kQuickStartBluetoothEnableButtonPath);
+
+  OobeScreenWaiter(QuickStartView::kScreenId).Wait();
+}
+
 IN_PROC_BROWSER_TEST_F(QuickStartBrowserTest, QRCode) {
   base::HistogramTester histogram_tester;
   histogram_tester.ExpectBucketCount(
@@ -379,77 +504,6 @@
   }
 }
 
-// TODO(ayag)(b/309384358): update tests after adding bluetooth checks
-IN_PROC_BROWSER_TEST_F(QuickStartBrowserTest,
-                       ClickingOnQuickStartWhenBluetoothDisabled) {
-  test::WaitForWelcomeScreen();
-
-  test::OobeJS()
-      .CreateVisibilityWaiter(/*visibility=*/true, kQuickStartButtonPath)
-      ->Wait();
-
-  WizardController::default_controller()
-      ->quick_start_controller()
-      ->set_fake_bluetooth_state_for_testing(false);
-
-  test::OobeJS().ClickOnPath(kQuickStartButtonPath);
-  WaitForBluetoothDialogToOpen();
-}
-
-// TODO(ayag)(b/309384358): update tests after adding bluetooth checks
-IN_PROC_BROWSER_TEST_F(QuickStartBrowserTest,
-                       CancellingBluetoothEnablingClosesDialog) {
-  test::WaitForWelcomeScreen();
-
-  test::OobeJS()
-      .CreateVisibilityWaiter(/*visibility=*/true, kQuickStartButtonPath)
-      ->Wait();
-
-  WizardController::default_controller()
-      ->quick_start_controller()
-      ->set_fake_bluetooth_state_for_testing(false);
-
-  test::OobeJS().ClickOnPath(kQuickStartButtonPath);
-
-  WaitForBluetoothDialogToOpen();
-
-  test::OobeJS()
-      .CreateVisibilityWaiter(/*visibility=*/true,
-                              kQuickStartBluetoothCancelButtonPath)
-      ->Wait();
-
-  test::OobeJS().ClickOnPath(kQuickStartBluetoothCancelButtonPath);
-
-  WaitForBluetoothDialogToClose();
-}
-
-// TODO(ayag)(b/309384358): update tests after adding bluetooth checks
-IN_PROC_BROWSER_TEST_F(QuickStartBrowserTest,
-                       TurningOnBlueoothFromBluetoothDialog) {
-  test::WaitForWelcomeScreen();
-
-  test::OobeJS()
-      .CreateVisibilityWaiter(/*visibility=*/true, kQuickStartButtonPath)
-      ->Wait();
-
-  WizardController::default_controller()
-      ->quick_start_controller()
-      ->set_fake_bluetooth_state_for_testing(false);
-
-  test::OobeJS().ClickOnPath(kQuickStartButtonPath);
-
-  WaitForBluetoothDialogToOpen();
-
-  test::OobeJS()
-      .CreateVisibilityWaiter(/*visibility=*/true,
-                              kQuickStartBluetoothEnableButtonPath)
-      ->Wait();
-
-  test::OobeJS().ClickOnPath(kQuickStartBluetoothEnableButtonPath);
-
-  OobeScreenWaiter(QuickStartView::kScreenId).Wait();
-}
-
 IN_PROC_BROWSER_TEST_F(QuickStartBrowserTest,
                        ClickingOnButtonEntersScreenFromWelcome) {
   EnterQuickStartFlowFromWelcomeScreen();
diff --git a/chrome/browser/ash/login/screens/reset_screen.cc b/chrome/browser/ash/login/screens/reset_screen.cc
index 5ce400b5..2bc113b 100644
--- a/chrome/browser/ash/login/screens/reset_screen.cc
+++ b/chrome/browser/ash/login/screens/reset_screen.cc
@@ -20,7 +20,6 @@
 #include "chrome/browser/ash/login/ui/login_display_host.h"
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
 #include "chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.h"
-#include "chrome/browser/ash/reset/metrics.h"
 #include "chrome/browser/ash/settings/cros_settings.h"
 #include "chrome/browser/ash/tpm_firmware_update.h"
 #include "chrome/browser/browser_process.h"
@@ -209,16 +208,12 @@
         LoginScreen::Get()->GetScopedGuestButtonBlocker();
   }
 
-  reset::DialogViewType dialog_type =
-      reset::DialogViewType::kCount;  // used by UMA metrics.
-
   bool restart_required = user_manager::UserManager::Get()->IsUserLoggedIn() ||
                           !base::CommandLine::ForCurrentProcess()->HasSwitch(
                               switches::kFirstExecAfterBoot);
   if (restart_required) {
     if (view_)
       view_->SetScreenState(ResetView::State::kRestartRequired);
-    dialog_type = reset::DialogViewType::kShortcutRestartRequired;
   } else {
     if (view_)
       view_->SetScreenState(ResetView::State::kPowerwashProposal);
@@ -229,17 +224,11 @@
           switches::kDisableRollbackOption)) {
     if (view_)
       view_->SetIsRollbackAvailable(false);
-    dialog_type = reset::DialogViewType::kShortcutOfferingRollbackUnavailable;
   } else {
     UpdateEngineClient::Get()->CanRollbackCheck(base::BindOnce(
         &ResetScreen::OnRollbackCheck, weak_ptr_factory_.GetWeakPtr()));
   }
 
-  if (dialog_type < reset::DialogViewType::kCount) {
-    UMA_HISTOGRAM_ENUMERATION("Reset.ChromeOS.PowerwashDialogShown",
-                              dialog_type, reset::DialogViewType::kCount);
-  }
-
   // Set availability of TPM firmware update.
   PrefService* prefs = g_browser_process->local_state();
   bool tpm_firmware_update_requested =
@@ -412,22 +401,11 @@
   VLOG(1) << "Requested rollback availability"
           << view_->GetIsRollbackAvailable();
   if (view_->GetIsRollbackAvailable() && !view_->GetIsRollbackRequested()) {
-    UMA_HISTOGRAM_ENUMERATION(
-        "Reset.ChromeOS.PowerwashDialogShown",
-        reset::DialogViewType::kShortcutOfferingRollbackAvailable,
-        reset::DialogViewType::kCount);
     view_->SetIsRollbackRequested(true);
   }
 }
 
 void ResetScreen::OnShowConfirm() {
-  reset::DialogViewType dialog_type =
-      view_->GetIsRollbackRequested()
-          ? reset::DialogViewType::kShortcutConfirmingPowerwashAndRollback
-          : reset::DialogViewType::kShortcutConfirmingPowerwashOnly;
-  UMA_HISTOGRAM_ENUMERATION("Reset.ChromeOS.PowerwashDialogShown", dialog_type,
-                            reset::DialogViewType::kCount);
-
   view_->SetShouldShowConfirmationDialog(true);
 }
 
@@ -468,12 +446,6 @@
 
   const bool rollback_available =
       !connector->IsDeviceEnterpriseManaged() && can_rollback;
-  reset::DialogViewType dialog_type =
-      rollback_available
-          ? reset::DialogViewType::kShortcutOfferingRollbackAvailable
-          : reset::DialogViewType::kShortcutOfferingRollbackUnavailable;
-  UMA_HISTOGRAM_ENUMERATION("Reset.ChromeOS.PowerwashDialogShown", dialog_type,
-                            reset::DialogViewType::kCount);
 
   view_->SetIsRollbackAvailable(rollback_available);
 }
diff --git a/chrome/browser/ash/login/screens/welcome_screen.cc b/chrome/browser/ash/login/screens/welcome_screen.cc
index 790c10c..cca5f1cc 100644
--- a/chrome/browser/ash/login/screens/welcome_screen.cc
+++ b/chrome/browser/ash/login/screens/welcome_screen.cc
@@ -742,6 +742,9 @@
 
 void WelcomeScreen::OnTurnOnBluetoothForQuickStart() {
   CHECK(context()->quick_start_enabled);
+  WizardController::default_controller()
+      ->quick_start_controller()
+      ->TurnOnBluetooth();
   Exit(Result::QUICK_START);
 }
 
diff --git a/chrome/browser/ash/policy/dlp/dialogs/files_policy_error_dialog.cc b/chrome/browser/ash/policy/dlp/dialogs/files_policy_error_dialog.cc
index 0c9b427..bc0c7da 100644
--- a/chrome/browser/ash/policy/dlp/dialogs/files_policy_error_dialog.cc
+++ b/chrome/browser/ash/policy/dlp/dialogs/files_policy_error_dialog.cc
@@ -196,14 +196,17 @@
 
   auto merged_enterprise_connectors_files = GetFilesBlockedByReasons(
       merged_enterprise_connectors_reasons, dialog_info_map);
-  sections_.emplace_back(
-      MapBlockReasonToViewID(
-          FilesPolicyDialog::BlockReason::kEnterpriseConnectors),
-      files_string_util::GetBlockReasonMessage(
-          FilesPolicyDialog::BlockReason::kEnterpriseConnectors,
-          merged_enterprise_connectors_files.size()),
-      merged_enterprise_connectors_files,
-      GetLearnMoreLinks(merged_enterprise_connectors_reasons, dialog_info_map));
+  if (!merged_enterprise_connectors_files.empty()) {
+    sections_.emplace_back(
+        MapBlockReasonToViewID(
+            FilesPolicyDialog::BlockReason::kEnterpriseConnectors),
+        files_string_util::GetBlockReasonMessage(
+            FilesPolicyDialog::BlockReason::kEnterpriseConnectors,
+            merged_enterprise_connectors_files.size()),
+        merged_enterprise_connectors_files,
+        GetLearnMoreLinks(merged_enterprise_connectors_reasons,
+                          dialog_info_map));
+  }
 
   AppendBlockedFilesSection(
       FilesPolicyErrorDialog::BlockReason::kEnterpriseConnectorsEncryptedFile,
diff --git a/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.cc b/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.cc
index f06e185c..3f77d78e 100644
--- a/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.cc
@@ -6,26 +6,32 @@
 
 #include <iomanip>
 #include <memory>
+#include <optional>
 #include <ostream>
 #include <string>
+#include <string_view>
 #include <utility>
 #include <vector>
 
 #include "ash/shell.h"
 #include "base/check.h"
 #include "base/check_deref.h"
+#include "base/check_is_test.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
+#include "base/functional/callback_helpers.h"
 #include "base/location.h"
 #include "base/memory/raw_ref.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/ash/policy/remote_commands/crd_logging.h"
+#include "chrome/browser/ash/policy/remote_commands/crd_oauth_token_fetcher.h"
 #include "chrome/browser/ash/policy/remote_commands/crd_remote_command_utils.h"
 #include "chrome/browser/ash/policy/remote_commands/crd_session_observer.h"
 #include "chrome/browser/ash/policy/remote_commands/crd_support_host_observer_proxy.h"
 #include "chrome/browser/ash/policy/remote_commands/remote_activity_notification_controller.h"
+#include "chrome/browser/device_identity/device_oauth2_token_service_factory.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
@@ -35,7 +41,6 @@
 #include "remoting/host/chromeos/remoting_service.h"
 #include "remoting/host/chromeos/session_id.h"
 #include "remoting/host/mojom/remote_support.mojom.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace policy {
 
@@ -165,7 +170,7 @@
 
  private:
   SessionEndCallback callback_;
-  absl::optional<base::Time> session_connected_time_;
+  std::optional<base::Time> session_connected_time_;
 };
 
 // Rejects incoming sessions when there is more than 15 minutes between
@@ -197,7 +202,7 @@
 
  private:
   base::OnceClosure terminate_session_;
-  absl::optional<base::OneShotTimer> terminate_timer_;
+  std::optional<base::OneShotTimer> terminate_timer_;
 };
 
 remoting::mojom::SupportSessionParamsPtr GetSessionParameters(
@@ -224,20 +229,35 @@
   };
 }
 
+DeviceOAuth2TokenService* GetOAuthService() {
+  return DeviceOAuth2TokenServiceFactory::Get();
+}
+
+std::unique_ptr<CrdOAuthTokenFetcher> CreateOAuthTokenFetcher(
+    DeviceOAuth2TokenService* service,
+    std::optional<std::string> oauth_token_for_test) {
+  if (service) {
+    return std::make_unique<RealCrdOAuthTokenFetcher>(CHECK_DEREF(service));
+  } else {
+    CHECK_IS_TEST();
+    return std::make_unique<FakeCrdOAuthTokenFetcher>(oauth_token_for_test);
+  }
+}
+
 }  // namespace
 
+// Empty base class implemented by all session launchers so
+// `CrdAdminSessionController` can keep ownership through a unique_ptr.
+class CrdAdminSessionController::SessionLauncher {
+ public:
+  virtual ~SessionLauncher() = default;
+};
+
 class CrdAdminSessionController::CrdHostSession : private CrdSessionObserver {
  public:
-  explicit CrdHostSession(RemotingServiceProxy& remoting_service)
-      : CrdHostSession(remoting_service,
-                       base::DoNothing(),
-                       base::DoNothing(),
-                       base::DoNothing()) {}
-  CrdHostSession(RemotingServiceProxy& remoting_service,
-                 AccessCodeCallback success_callback,
+  CrdHostSession(AccessCodeCallback success_callback,
                  ErrorCallback error_callback,
-                 SessionEndCallback session_finished_callback)
-      : remoting_service_(remoting_service) {
+                 SessionEndCallback session_finished_callback) {
     AddOwnedObserver(std::make_unique<HostStartObserver>(
         std::move(success_callback), std::move(error_callback)));
     AddOwnedObserver(std::make_unique<SessionDurationObserver>(
@@ -250,56 +270,28 @@
   CrdHostSession& operator=(const CrdHostSession&) = delete;
   ~CrdHostSession() override = default;
 
-  void Start(const SessionParameters& parameters) {
-    CRD_DVLOG(3) << "Starting CRD session with parameters " << parameters;
-    session_parameters_ = parameters;
-
-    remoting_service_->StartSession(
-        GetSessionParameters(parameters), GetEnterpriseParameters(parameters),
-        base::BindOnce(&CrdHostSession::OnStartSupportSessionResponse,
-                       weak_factory_.GetWeakPtr()));
-  }
-
-  void TryToReconnect(base::OnceClosure done_callback) {
-    CRD_DVLOG(3) << "Checking for reconnectable session";
-    remoting_service_->GetReconnectableSessionId(
-        base::BindOnce(&CrdHostSession::ReconnectToSession,
-                       weak_factory_.GetWeakPtr())
-            .Then(std::move(done_callback)));
-  }
-
   void AddObserver(CrdSessionObserver* observer) {
     observer_proxy_.AddObserver(observer);
   }
 
-  bool IsSessionCurtained() const {
-    return session_parameters_.has_value() &&
-           session_parameters_->curtain_local_user_session;
+  void SetIsSessionCurtained(bool is_curtained) {
+    is_curtained_ = is_curtained;
   }
 
+  bool IsSessionCurtained() const { return is_curtained_; }
+
   // We only have a valid, active CRD session (to which the remote admin
   // can connect/is connected) as long as the CRD host is bound.
   bool IsHostBound() const { return observer_proxy_.IsBound(); }
 
+  // Returns a callback that can be passed to the various
+  // start session methods of `RemotingServiceProxy`.
+  auto GetStartSessionCallback() {
+    return base::BindOnce(&CrdHostSession::OnStartSupportSessionResponse,
+                          weak_factory_.GetWeakPtr());
+  }
+
  private:
-  void ReconnectToSession(absl::optional<remoting::SessionId> id) {
-    if (id.has_value()) {
-      CRD_LOG(INFO) << "Attempting to resume reconnectable session";
-
-      remoting_service_->ReconnectToSession(
-          id.value(), "TODO(joedow): Provide real oauth access token",
-          base::BindOnce(&CrdHostSession::OnStartSupportSessionResponse,
-                         weak_factory_.GetWeakPtr()));
-    } else {
-      CRD_DVLOG(3) << "No reconnectable CRD session found.";
-    }
-  }
-
-  void AddOwnedObserver(std::unique_ptr<CrdSessionObserver> observer) {
-    observer_proxy_.AddObserver(observer.get());
-    owned_session_observers_.push_back(std::move(observer));
-  }
-
   void OnStartSupportSessionResponse(
       remoting::mojom::StartSupportSessionResponsePtr response) {
     if (response->is_support_session_error()) {
@@ -313,6 +305,11 @@
     observer_proxy_.Bind(std::move(response->get_observer()));
   }
 
+  void AddOwnedObserver(std::unique_ptr<CrdSessionObserver> observer) {
+    observer_proxy_.AddObserver(observer.get());
+    owned_session_observers_.push_back(std::move(observer));
+  }
+
   void TerminateSession() {
     // First inform our observers that the session is about to be aborted.
     observer_proxy_.ReportHostStopped(
@@ -330,15 +327,109 @@
     observer_proxy_.Unbind();
   }
 
-  raw_ref<RemotingServiceProxy> remoting_service_;
-
   SupportHostObserverProxy observer_proxy_;
   std::vector<std::unique_ptr<CrdSessionObserver>> owned_session_observers_;
-  absl::optional<SessionParameters> session_parameters_;
+
+  bool is_curtained_ = false;
 
   base::WeakPtrFactory<CrdHostSession> weak_factory_{this};
 };
 
+// Launcher that starts a new CRD session.
+class CrdAdminSessionController::NewSessionLauncher : public SessionLauncher {
+ public:
+  NewSessionLauncher(RemotingServiceProxy& remoting_service,
+                     CrdHostSession& session,
+                     const SessionParameters& parameters)
+      : remoting_service_(remoting_service), session_(session) {
+    Start(parameters);
+  }
+
+ private:
+  void Start(const SessionParameters& parameters) {
+    CRD_DVLOG(3) << "Starting CRD session with parameters " << parameters;
+    session_->SetIsSessionCurtained(parameters.curtain_local_user_session);
+    remoting_service_->StartSession(GetSessionParameters(parameters),
+                                    GetEnterpriseParameters(parameters),
+                                    session_->GetStartSessionCallback());
+  }
+
+  raw_ref<RemotingServiceProxy> remoting_service_;
+  raw_ref<CrdHostSession> session_;
+};
+
+// Launcher that checks if a reconnectable CRD session is available, and if so
+// connects to it.
+class CrdAdminSessionController::ReconnectedSessionLauncher
+    : public SessionLauncher {
+ public:
+  ReconnectedSessionLauncher(
+      RemotingServiceProxy& remoting_service,
+      CrdHostSession& session,
+      std::unique_ptr<CrdOAuthTokenFetcher> oauth_token_fetcher,
+      base::OnceClosure on_reconnect_done_callback)
+      : remoting_service_(remoting_service),
+        session_(session),
+        on_reconnect_done_(std::move(on_reconnect_done_callback)),
+        oauth_token_fetcher_(std::move(oauth_token_fetcher)) {
+    TryToReconnect();
+  }
+
+ private:
+  void TryToReconnect() {
+    CRD_DVLOG(3) << "Checking for reconnectable session";
+
+    // First fetch the id of the reconnectable session.
+    remoting_service_->GetReconnectableSessionId(base::BindOnce(
+        // Then fetch a new OAuth token.
+        &ReconnectedSessionLauncher::FetchOAuthToken,
+        weak_factory_.GetWeakPtr(),
+        base::BindOnce(
+            // And finally reconnect to the session.
+            &ReconnectedSessionLauncher::ReconnectToSession,
+            weak_factory_.GetWeakPtr())));
+  }
+
+  void FetchOAuthToken(
+      base::OnceCallback<void(remoting::SessionId, std::optional<std::string>)>
+          on_done,
+      std::optional<remoting::SessionId> id) {
+    if (!id.has_value()) {
+      CRD_DVLOG(3) << "No reconnectable CRD session found.";
+      return SignalReconnectDone();
+    }
+
+    session_->SetIsSessionCurtained(true);
+
+    CHECK_DEREF(oauth_token_fetcher_.get())
+        .Start(base::BindOnce(std::move(on_done), id.value()));
+  }
+
+  void ReconnectToSession(remoting::SessionId id,
+                          std::optional<std::string> oauth_token) {
+    CRD_LOG(INFO) << "Attempting to resume reconnectable session";
+
+    if (!oauth_token.has_value()) {
+      CRD_LOG(WARNING)
+          << "Failed to fetch OAuth token for reconnectable session";
+      return SignalReconnectDone();
+    }
+
+    remoting_service_->ReconnectToSession(id, oauth_token.value(),
+                                          session_->GetStartSessionCallback());
+    return SignalReconnectDone();
+  }
+
+  void SignalReconnectDone() { std::move(on_reconnect_done_).Run(); }
+
+  raw_ref<RemotingServiceProxy> remoting_service_;
+  raw_ref<CrdHostSession> session_;
+  base::OnceClosure on_reconnect_done_;
+  std::unique_ptr<CrdOAuthTokenFetcher> oauth_token_fetcher_;
+
+  base::WeakPtrFactory<ReconnectedSessionLauncher> weak_factory_{this};
+};
+
 CrdAdminSessionController::CrdAdminSessionController()
     : CrdAdminSessionController(std::make_unique<DefaultRemotingService>()) {}
 
@@ -367,6 +458,18 @@
 
 void CrdAdminSessionController::Shutdown() {
   notification_controller_ = nullptr;
+  TerminateSession();
+}
+
+void CrdAdminSessionController::SetOAuthTokenForTesting(
+    std::string_view token) {
+  CHECK_IS_TEST();
+  oauth_token_for_test_ = token;
+}
+
+void CrdAdminSessionController::ClearOAuthTokenForTesting() {
+  CHECK_IS_TEST();
+  oauth_token_for_test_.reset();
 }
 
 StartCrdSessionJobDelegate& CrdAdminSessionController::GetDelegate() {
@@ -379,6 +482,7 @@
 
 void CrdAdminSessionController::TerminateSession() {
   CRD_DVLOG(3) << "Terminating CRD session";
+  session_launcher_ = nullptr;
   active_session_ = nullptr;
 }
 
@@ -386,8 +490,14 @@
     base::OnceClosure done_callback) {
   CHECK(!HasActiveSession());
 
-  active_session_ = std::make_unique<CrdHostSession>(*remoting_service_);
-  active_session_->TryToReconnect(std::move(done_callback));
+  TerminateSession();
+
+  active_session_ = std::make_unique<CrdHostSession>(
+      base::DoNothing(), base::DoNothing(), base::DoNothing());
+  session_launcher_ = std::make_unique<ReconnectedSessionLauncher>(
+      *remoting_service_, *active_session_,
+      CreateOAuthTokenFetcher(GetOAuthService(), oauth_token_for_test_),
+      std::move(done_callback));
 }
 
 void CrdAdminSessionController::StartCrdHostAndGetCode(
@@ -396,16 +506,20 @@
     ErrorCallback error_callback,
     SessionEndCallback session_finished_callback) {
   CHECK(!HasActiveSession());
+
+  TerminateSession();
+
   active_session_ = std::make_unique<CrdHostSession>(
-      *remoting_service_, std::move(success_callback),
-      std::move(error_callback), std::move(session_finished_callback));
+      std::move(success_callback), std::move(error_callback),
+      std::move(session_finished_callback));
 
   if (base::FeatureList::IsEnabled(kEnableCrdAdminRemoteAccessV2)) {
     CHECK(notification_controller_);
     active_session_->AddObserver(notification_controller_.get());
   }
 
-  active_session_->Start(parameters);
+  session_launcher_ = std::make_unique<NewSessionLauncher>(
+      *remoting_service_, *active_session_, parameters);
 }
 
 bool CrdAdminSessionController::IsCurrentSessionCurtained() const {
diff --git a/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.h b/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.h
index a7f0a65..689cf68 100644
--- a/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.h
+++ b/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.h
@@ -6,6 +6,8 @@
 #define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_CRD_ADMIN_SESSION_CONTROLLER_H_
 
 #include <memory>
+#include <optional>
+#include <string_view>
 
 #include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
@@ -35,7 +37,7 @@
     using StartSessionCallback = base::OnceCallback<void(
         remoting::mojom::StartSupportSessionResponsePtr response)>;
     using SessionIdCallback =
-        base::OnceCallback<void(absl::optional<remoting::SessionId>)>;
+        base::OnceCallback<void(std::optional<remoting::SessionId>)>;
 
     // Starts a new remote support session. `callback` is
     // called with the result.
@@ -46,7 +48,7 @@
 
     // Checks if session information for a reconnectable session is stored,
     // and invokes `callback` with the id of the reconnectable session (or
-    // absl::nullopt if there is none).
+    // std::nullopt if there is none).
     virtual void GetReconnectableSessionId(SessionIdCallback callback) = 0;
 
     // Starts a new remote support session, which will resume the reconnectable
@@ -72,9 +74,16 @@
 
   StartCrdSessionJobDelegate& GetDelegate();
 
+  void SetOAuthTokenForTesting(std::string_view token);
+  void ClearOAuthTokenForTesting();
+
  private:
   class CrdHostSession;
 
+  class SessionLauncher;
+  class ReconnectedSessionLauncher;
+  class NewSessionLauncher;
+
   // Checks if there is a reconnectable session, and if so this will reconnect
   // to it. A session is reconnectable when it was created with
   // `SessionParameters::allow_reconnections` set. `done_callback` is invoked
@@ -95,8 +104,14 @@
 
   std::unique_ptr<RemotingServiceProxy> remoting_service_;
   std::unique_ptr<CrdHostSession> active_session_;
+  std::unique_ptr<SessionLauncher> session_launcher_;
+
   std::unique_ptr<RemoteActivityNotificationController>
       notification_controller_;
+
+  // During unittests the `DeviceOAuth2TokenService` will be null and the code
+  // will instead use this OAuth token to restart a reconnectable session.
+  std::optional<std::string> oauth_token_for_test_;
 };
 
 }  // namespace policy
diff --git a/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller_unittest.cc b/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller_unittest.cc
index 9873ea78..9c33569 100644
--- a/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd_admin_session_controller_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ash/policy/remote_commands/crd_admin_session_controller.h"
 
+#include <optional>
 #include <string>
 #include <tuple>
 
@@ -28,6 +29,7 @@
 #include "components/prefs/testing_pref_service.h"
 #include "components/session_manager/core/session_manager.h"
 #include "components/session_manager/session_manager_types.h"
+#include "content/public/test/browser_task_environment.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "remoting/host/chromeos/features.h"
@@ -35,7 +37,6 @@
 #include "remoting/protocol/errors.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 #define EXPECT_NO_CALLS(args...) EXPECT_CALL(args).Times(0);
 
@@ -193,11 +194,19 @@
            const std::string& error_message)
       : result_code_(result_code), error_message_(error_message) {}
 
-  absl::optional<std::string> access_code_;
-  absl::optional<ExtendedStartCrdSessionResultCode> result_code_;
-  absl::optional<std::string> error_message_;
+  std::optional<std::string> access_code_;
+  std::optional<ExtendedStartCrdSessionResultCode> result_code_;
+  std::optional<std::string> error_message_;
 };
 
+// Wrapper to return the `BrowserTaskEnvironment` as its base class
+// `TaskEnvironment`. Without this the compiler takes the wrong constructor
+// of `AshTestBase` and compilation fails.
+std::unique_ptr<base::test::TaskEnvironment> CreateTaskEnvironment(
+    base::test::TaskEnvironment::TimeSource time_source) {
+  return std::make_unique<content::BrowserTaskEnvironment>(time_source);
+}
+
 }  // namespace
 
 // A test class used for testing the `CrdAdminSessionController` class.
@@ -206,7 +215,8 @@
 class CrdAdminSessionControllerTest : public ash::AshTestBase {
  public:
   CrdAdminSessionControllerTest()
-      : ash::AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
+      : ash::AshTestBase(CreateTaskEnvironment(
+            base::test::TaskEnvironment::TimeSource::MOCK_TIME)),
         local_state_(TestingBrowserProcess::GetGlobal()) {}
   CrdAdminSessionControllerTest(const CrdAdminSessionControllerTest&) = delete;
   CrdAdminSessionControllerTest& operator=(
@@ -354,6 +364,11 @@
   }
 
  private:
+  void TearDown() override {
+    session_controller_.Shutdown();
+    AshTestBase::TearDown();
+  }
+
   ScopedTestingLocalState local_state_;
   testing::StrictMock<ash::MockLoginDisplayHost> mock_login_display_host_;
   TestFuture<Response> result_;
@@ -682,6 +697,9 @@
   EnableFeature(kEnableCrdAdminRemoteAccessV2);
 
   const remoting::SessionId kSessionId{123};
+  const std::string kOAuthToken = "oauth-token-for-reconnect";
+
+  session_controller().SetOAuthTokenForTesting(kOAuthToken);
 
   // First we should query for the reconnectable session id.
   EXPECT_CALL(remoting_service(), GetReconnectableSessionId)
@@ -690,10 +708,11 @@
   // And next we should use this session id to reconnect.
   EXPECT_CALL(remoting_service(),
               ReconnectToSession(kSessionId, testing::_, testing::_))
-      .WillOnce([&](remoting::SessionId, const std::string&,
+      .WillOnce([&](remoting::SessionId, const std::string& oauth_token,
                     StartSupportSessionCallback callback) {
         std::move(callback).Run(
             StartSupportSessionResponse::NewObserver(BindObserver()));
+        EXPECT_EQ(oauth_token, kOAuthToken);
       });
 
   TestFuture<void> done_signal;
@@ -704,6 +723,28 @@
 }
 
 TEST_F(CrdAdminSessionControllerTest,
+       ShouldHandleOauthTokenFailureWhileReconnecting) {
+  EnableFeature(kEnableCrdAdminRemoteAccessV2);
+
+  session_controller().ClearOAuthTokenForTesting();
+
+  // First we should query for the reconnectable session id.
+  EXPECT_CALL(remoting_service(), GetReconnectableSessionId)
+      .WillOnce([&](auto callback) {
+        std::move(callback).Run(remoting::SessionId{1});
+      });
+
+  // But since there is no oauth token we should never actually reconnect.
+  EXPECT_NO_CALLS(remoting_service(), ReconnectToSession);
+
+  TestFuture<void> done_signal;
+  session_controller().Init(&local_state(), done_signal.GetCallback());
+  ASSERT_TRUE(done_signal.Wait());
+
+  EXPECT_FALSE(delegate().HasActiveSession());
+}
+
+TEST_F(CrdAdminSessionControllerTest,
        ShouldNotResumeReconnectableSessionIfUnavailable) {
   EnableFeature(kEnableCrdAdminRemoteAccessV2);
 
diff --git a/chrome/browser/ash/policy/remote_commands/crd_oauth_token_fetcher.h b/chrome/browser/ash/policy/remote_commands/crd_oauth_token_fetcher.h
index ae0ed37..75b63d9 100644
--- a/chrome/browser/ash/policy/remote_commands/crd_oauth_token_fetcher.h
+++ b/chrome/browser/ash/policy/remote_commands/crd_oauth_token_fetcher.h
@@ -54,7 +54,7 @@
   void OnGetTokenFailure(const OAuth2AccessTokenManager::Request* request,
                          const GoogleServiceAuthError& error) override;
 
-  const raw_ref<DeviceOAuth2TokenService, ExperimentalAsh> oauth_service_;
+  const raw_ref<DeviceOAuth2TokenService> oauth_service_;
   OAuthTokenCallback done_callback_;
   // Handle for the OAuth access token request.
   std::unique_ptr<OAuth2AccessTokenManager::Request> oauth_request_;
diff --git a/chrome/browser/ash/reset/OWNERS b/chrome/browser/ash/reset/OWNERS
deleted file mode 100644
index e7a8a06..0000000
--- a/chrome/browser/ash/reset/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-achuith@chromium.org
-alemate@chromium.org
diff --git a/chrome/browser/ash/reset/metrics.h b/chrome/browser/ash/reset/metrics.h
deleted file mode 100644
index 922b485..0000000
--- a/chrome/browser/ash/reset/metrics.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_ASH_RESET_METRICS_H_
-#define CHROME_BROWSER_ASH_RESET_METRICS_H_
-
-namespace ash {
-namespace reset {
-
-enum class DialogViewType {
-
-  // User invoked the dialog from options page.
-  kFromOptions,
-
-  // Invoked with shortcut. Confirming form for powerwash.
-  kShortcutConfirmingPowerwashOnly,
-
-  // Invoked with shortcut. Confirming form for powerwash and rollback.
-  kShortcutConfirmingPowerwashAndRollback,
-
-  // Invoked with shortcut. Offering form, rollback option set.
-  kShortcutOfferingRollbackUnavailable,
-
-  // Invoked with shortcut. Offering form, rollback option not set.
-  kShortcutOfferingRollbackAvailable,
-
-  // Invoked with shortcut. Requesting restart form.
-  kShortcutRestartRequired,
-
-  // Must be last enum element.
-  kCount
-};
-
-}  // namespace reset
-}  // namespace ash
-
-#endif  // CHROME_BROWSER_ASH_RESET_METRICS_H_
diff --git a/chrome/browser/ash/sync/sync_error_notifier.cc b/chrome/browser/ash/sync/sync_error_notifier.cc
index 60d1671..8d882ea 100644
--- a/chrome/browser/ash/sync/sync_error_notifier.cc
+++ b/chrome/browser/ash/sync/sync_error_notifier.cc
@@ -114,7 +114,8 @@
     return params;
   }
 
-  if (ShouldShowSyncKeysMissingError(sync_service, profile->GetPrefs())) {
+  if (sync_service->GetUserSettings()
+          ->IsTrustedVaultKeyRequiredForPreferredDataTypes()) {
     BubbleViewParameters params;
     params.title_id =
         sync_service->GetUserSettings()->IsEncryptEverythingEnabled()
@@ -130,8 +131,8 @@
     return params;
   }
 
-  DCHECK(ShouldShowTrustedVaultDegradedRecoverabilityError(
-      sync_service, profile->GetPrefs()));
+  DCHECK(
+      sync_service->GetUserSettings()->IsTrustedVaultRecoverabilityDegraded());
 
   BubbleViewParameters params;
   params.title_id = IDS_SYNC_NEEDS_VERIFICATION_BUBBLE_VIEW_TITLE;
@@ -172,9 +173,9 @@
 
   const bool should_display_notification =
       ShouldShowSyncPassphraseError(sync_service_) ||
-      ShouldShowSyncKeysMissingError(service, profile_->GetPrefs()) ||
-      ShouldShowTrustedVaultDegradedRecoverabilityError(service,
-                                                        profile_->GetPrefs());
+      sync_service_->GetUserSettings()
+          ->IsTrustedVaultKeyRequiredForPreferredDataTypes() ||
+      sync_service_->GetUserSettings()->IsTrustedVaultRecoverabilityDegraded();
 
   if (should_display_notification == notification_displayed_) {
     return;
diff --git a/chrome/browser/autofill/autofill_autocomplete_browsertest.cc b/chrome/browser/autofill/autofill_autocomplete_browsertest.cc
index cd479ebb..2c91454 100644
--- a/chrome/browser/autofill/autofill_autocomplete_browsertest.cc
+++ b/chrome/browser/autofill/autofill_autocomplete_browsertest.cc
@@ -8,6 +8,7 @@
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/mock_callback.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/autofill/autocomplete_history_manager_factory.h"
@@ -22,9 +23,10 @@
 #include "components/autofill/core/browser/autocomplete_history_manager.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/suggestions_context.h"
-#include "components/autofill/core/browser/test_autofill_async_observer.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
+#include "components/autofill/core/browser/test_autofill_manager_waiter.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
+#include "components/autofill/core/browser/ui/suggestion_test_helpers.h"
 #include "components/autofill/core/common/autofill_clock.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
@@ -39,45 +41,20 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/switches.h"
 
-using autofill::test::TestAutofillAsyncObserver;
-using base::ASCIIToUTF16;
-using testing::ElementsAre;
-using testing::Field;
-
-using NotificationType = TestAutofillAsyncObserver::NotificationType;
-
 namespace autofill {
 
 namespace {
+
+using ::base::UTF8ToUTF16;
+using ::testing::ElementsAre;
+using ::testing::Field;
+using ::testing::IsEmpty;
+
 const char kDefaultAutocompleteInputId[] = "n300";
 const char kSimpleFormFileName[] = "autocomplete_simple_form.html";
+
 }  // namespace
 
-class MockSuggestionsHandler
-    : public AutocompleteHistoryManager::SuggestionsHandler {
- public:
-  MockSuggestionsHandler() = default;
-
-  void OnSuggestionsReturned(
-      FieldGlobalId field_id,
-      AutofillSuggestionTriggerSource trigger_source,
-      const std::vector<Suggestion>& suggestions) override {
-    last_suggestions_ = suggestions;
-  }
-
-  base::WeakPtr<MockSuggestionsHandler> GetWeakPtr() {
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
-  const std::vector<Suggestion>& last_suggestions() {
-    return last_suggestions_;
-  }
-
- private:
-  std::vector<Suggestion> last_suggestions_;
-  base::WeakPtrFactory<MockSuggestionsHandler> weak_ptr_factory_{this};
-};
-
 class AutofillAutocompleteTest : public InProcessBrowserTest {
  protected:
   void SetUpOnMainThread() override {
@@ -133,21 +110,14 @@
 
     ASSERT_TRUE(content::ExecJs(web_contents(), js));
 
-    // Set up observer for Autocomplete form submissions.
-    TestAutofillAsyncObserver observer(
-        should_skip_save ? NotificationType::AutocompleteFormSkipped
-                         : NotificationType::AutocompleteFormSubmitted,
-        /*detach_on_notify=*/true);
-    autocomplete_history_manager()->Attach(&observer);
-
     // Simulate a mouse click to submit the form because form submissions not
     // triggered by user gestures are ignored.
+    TestAutofillManagerWaiter waiter(manager(),
+                                     {AutofillManagerEvent::kFormSubmitted});
     content::SimulateMouseClick(
         active_browser_->tab_strip_model()->GetActiveWebContents(), 0,
         blink::WebMouseEvent::Button::kLeft);
-
-    // Wait for the form to be submitted.
-    observer.Wait();
+    ASSERT_TRUE(waiter.Wait(1));
 
     if (!should_skip_save) {
       // Wait for data to have been saved in the DB.
@@ -155,27 +125,6 @@
     }
   }
 
-  // Validates that there is only one available autocomplete suggestion for the
-  // given |prefix|, and its value is equal to |expected_value|.
-  void ValidateSingleValue(const std::string& prefix,
-                           const std::string& expected_value) {
-    MockSuggestionsHandler handler;
-    GetAutocompleteSuggestions(kDefaultAutocompleteInputId, prefix, handler);
-
-    EXPECT_THAT(handler.last_suggestions(),
-                ElementsAre(Field(
-                    &Suggestion::main_text,
-                    Suggestion::Text(ASCIIToUTF16(expected_value),
-                                     Suggestion::Text::IsPrimary(true)))));
-  }
-
-  void ValidateNoValue() {
-    MockSuggestionsHandler handler;
-    GetAutocompleteSuggestions(kDefaultAutocompleteInputId, "", handler);
-
-    EXPECT_TRUE(handler.last_suggestions().empty());
-  }
-
   void ReinitializeAutocompleteHistoryManager() {
     autocomplete_history_manager()->Init(GetWebDataService(), pref_service(),
                                          current_profile()->IsOffTheRecord());
@@ -200,27 +149,34 @@
     run_loop.Run();
   }
 
+  AutofillManager& manager() {
+    return ContentAutofillDriverFactory::FromWebContents(web_contents())
+        ->DriverForFrame(web_contents()->GetPrimaryMainFrame())
+        ->GetAutofillManager();
+  }
+
   PrefService* pref_service() { return active_browser_->profile()->GetPrefs(); }
 
- private:
-  void GetAutocompleteSuggestions(const std::string& input_name,
-                                  const std::string& prefix,
-                                  MockSuggestionsHandler& handler) {
-    AutofillClient& autofill_client =
-        ContentAutofillDriverFactory::FromWebContents(web_contents())
-            ->DriverForFrame(web_contents()->GetPrimaryMainFrame())
-            ->GetAutofillManager()
-            .client();
+  std::vector<Suggestion> GetAutocompleteSuggestions(
+      const std::string& input_name,
+      const std::string& prefix) {
+    base::MockCallback<SingleFieldFormFiller::OnSuggestionsReturnedCallback>
+        callback;
+    std::vector<Suggestion> suggestions;
+    EXPECT_CALL(callback, Run).WillOnce(testing::SaveArg<2>(&suggestions));
     EXPECT_TRUE(autocomplete_history_manager()->OnGetSingleFieldSuggestions(
         AutofillSuggestionTriggerSource::kFormControlElementClicked,
         test::CreateTestFormField(/*label=*/"", input_name, prefix,
                                   FormControlType::kInputText),
-        autofill_client, handler.GetWeakPtr(), SuggestionsContext()));
+        manager().client(), callback.Get(), SuggestionsContext()));
 
     // Make sure the DB task gets executed.
     WaitForDBTasks();
+
+    return suggestions;
   }
 
+ private:
   GURL GetURL(const std::string& filename) {
     return embedded_test_server()->GetURL("/autofill/" + filename);
   }
@@ -246,7 +202,9 @@
   std::string test_value = "SomeName!";
   NavigateToFile(kSimpleFormFileName);
   FillInputAndSubmit(test_value, /*should_skip_save=*/false);
-  ValidateSingleValue(prefix, test_value);
+  EXPECT_THAT(GetAutocompleteSuggestions(kDefaultAutocompleteInputId, prefix),
+              SuggestionVectorMainTextsAre(Suggestion::Text(
+                  UTF8ToUTF16(test_value), Suggestion::Text::IsPrimary(true))));
 }
 
 // Tests that we don't save new autocomplete entries when in Incognito.
@@ -258,7 +216,8 @@
   std::string test_value = "SomeName!";
   NavigateToFile(kSimpleFormFileName, WindowOpenDisposition::OFF_THE_RECORD);
   FillInputAndSubmit(test_value, /*should_skip_save=*/true);
-  ValidateNoValue();
+  EXPECT_THAT(GetAutocompleteSuggestions(kDefaultAutocompleteInputId, ""),
+              IsEmpty());
 }
 
 // Tests that we don't save new autocomplete entries when Autocomplete was
@@ -270,7 +229,8 @@
   std::string test_value = "SomeName!";
   NavigateToFile(kSimpleFormFileName);
   FillInputAndSubmit(test_value, /*should_skip_save=*/true);
-  ValidateNoValue();
+  EXPECT_THAT(GetAutocompleteSuggestions(kDefaultAutocompleteInputId, ""),
+              IsEmpty());
 }
 
 // Tests that initialization of the AutocompleteHistoryManager sets the
@@ -305,23 +265,23 @@
   std::string test_value = "SomeName!";
   NavigateToFile(kSimpleFormFileName);
   FillInputAndSubmit(test_value, /*should_skip_save=*/false);
-  ValidateSingleValue(prefix, test_value);
+  EXPECT_THAT(GetAutocompleteSuggestions(kDefaultAutocompleteInputId, prefix),
+              SuggestionVectorMainTextsAre(Suggestion::Text(
+                  UTF8ToUTF16(test_value), Suggestion::Text::IsPrimary(true))));
 
   // Come back to current time, modify the saved major version and setup our
   // observer.
   test_clock.Advance(days_delta);
   pref_service()->SetInteger(prefs::kAutocompleteLastVersionRetentionPolicy,
                              CHROME_VERSION_MAJOR - 1);
-  TestAutofillAsyncObserver observer(NotificationType::AutocompleteCleanupDone,
-                                     /*detach_on_notify=*/true);
-  autocomplete_history_manager()->Attach(&observer);
 
   // Trigger the retention policy cleanup (by reinitializing the
   // AutocompleteHistoryManager), and wait for the cleanup to complete.
   ReinitializeAutocompleteHistoryManager();
-  observer.Wait();
+  WaitForDBTasks();
 
-  ValidateNoValue();
+  EXPECT_THAT(GetAutocompleteSuggestions(kDefaultAutocompleteInputId, ""),
+              IsEmpty());
 }
 
 // Tests that the retention policy cleanup does not remove a valid entry (e.g.
@@ -339,24 +299,25 @@
   std::string test_value = "SomeName!";
   NavigateToFile(kSimpleFormFileName);
   FillInputAndSubmit(test_value, /*should_skip_save=*/false);
-  ValidateSingleValue(prefix, test_value);
+  EXPECT_THAT(GetAutocompleteSuggestions(kDefaultAutocompleteInputId, prefix),
+              SuggestionVectorMainTextsAre(Suggestion::Text(
+                  UTF8ToUTF16(test_value), Suggestion::Text::IsPrimary(true))));
 
   // Come back to current time, modify the saved major version and setup our
   // observer.
   test_clock.Advance(days_delta);
   pref_service()->SetInteger(prefs::kAutocompleteLastVersionRetentionPolicy,
                              CHROME_VERSION_MAJOR - 1);
-  TestAutofillAsyncObserver observer(NotificationType::AutocompleteCleanupDone,
-                                     /*detach_on_notify=*/true);
-  autocomplete_history_manager()->Attach(&observer);
 
   // Trigger the retention policy cleanup (by reinitializing the
   // AutocompleteHistoryManager), and wait for the cleanup to complete.
   ReinitializeAutocompleteHistoryManager();
-  observer.Wait();
+  WaitForDBTasks();
 
   // Verify that the entry is still there.
-  ValidateSingleValue(prefix, test_value);
+  EXPECT_THAT(GetAutocompleteSuggestions(kDefaultAutocompleteInputId, prefix),
+              SuggestionVectorMainTextsAre(Suggestion::Text(
+                  UTF8ToUTF16(test_value), Suggestion::Text::IsPrimary(true))));
 }
 
 }  // namespace autofill
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc
index 7029b84..bdc761bd 100644
--- a/chrome/browser/browser_features.cc
+++ b/chrome/browser/browser_features.cc
@@ -276,7 +276,7 @@
 // Enables bookmark trigger prerendering.
 BASE_FEATURE(kBookmarkTriggerForPrerender2,
              "BookmarkTriggerForPrerender2",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables New Tab Page trigger prerendering.
 BASE_FEATURE(kNewTabPageTriggerForPrerender2,
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index 7e354e09..84179ec6 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -867,12 +867,12 @@
       signin::ConsentLevel::kSignin);
   password_manager::features_util::OptInToAccountStorage(prefs, sync_service);
   ASSERT_TRUE(password_manager::features_util::IsOptedInForAccountStorage(
-      prefs, sync_service));
+      sync_service));
 
   RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA);
 
   EXPECT_FALSE(password_manager::features_util::IsOptedInForAccountStorage(
-      prefs, sync_service));
+      sync_service));
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -886,7 +886,7 @@
       signin::ConsentLevel::kSignin);
   password_manager::features_util::OptInToAccountStorage(prefs, sync_service);
   ASSERT_TRUE(password_manager::features_util::IsOptedInForAccountStorage(
-      prefs, sync_service));
+      sync_service));
 
   // Clearing cookies for some random domain should have no effect on the
   // opt-in.
@@ -899,7 +899,7 @@
                             std::move(filter_builder));
   }
   EXPECT_TRUE(password_manager::features_util::IsOptedInForAccountStorage(
-      prefs, sync_service));
+      sync_service));
 
   // Clearing cookies for google.com should clear the opt-in.
   {
@@ -911,7 +911,7 @@
                             std::move(filter_builder));
   }
   EXPECT_FALSE(password_manager::features_util::IsOptedInForAccountStorage(
-      prefs, sync_service));
+      sync_service));
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -980,13 +980,13 @@
 
     password_manager::features_util::OptInToAccountStorage(prefs, sync_service);
     ASSERT_TRUE(password_manager::features_util::IsOptedInForAccountStorage(
-        prefs, sync_service));
+        sync_service));
 
     ClearSiteDataAndWait(test_case.origin, test_case.cookie_partition_key,
                          test_case.storage_key, {});
 
     ASSERT_EQ(password_manager::features_util::IsOptedInForAccountStorage(
-                  prefs, sync_service),
+                  sync_service),
               test_case.expects_opted_in);
   }
 }
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 2034d10..7239478 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -176,6 +176,7 @@
 #include "content/public/browser/first_party_sets_handler.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/site_instance.h"
+#include "content/public/browser/synthetic_trial_syncer.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
@@ -677,6 +678,8 @@
       variations::VariationsIdsProvider::GetInstance());
   metrics->GetSyntheticTrialRegistry()->AddObserver(
       variations::SyntheticTrialsActiveGroupIdProvider::GetInstance());
+  synthetic_trial_syncer_ = content::SyntheticTrialSyncer::Create(
+      metrics->GetSyntheticTrialRegistry());
   // Now that field trials have been created, initializes metrics recording.
   metrics->InitializeMetricsRecordingState();
 
@@ -1897,6 +1900,11 @@
 
   browser_process_->metrics_service()->Stop();
 
+  // BrowserProcessImpl::StartTearDown() makes SyntheticTrialRegistry
+  // unavailable. Since SyntheticTrialSyncer depends on SyntheticTrialRegistry,
+  // destroy before the tear-down.
+  synthetic_trial_syncer_.reset();
+
   restart_last_session_ = browser_shutdown::ShutdownPreThreadsStop();
   browser_process_->StartTearDown();
 #endif  // BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/chrome_browser_main.h b/chrome/browser/chrome_browser_main.h
index 04faf69..0ba3c56 100644
--- a/chrome/browser/chrome_browser_main.h
+++ b/chrome/browser/chrome_browser_main.h
@@ -36,6 +36,10 @@
 class RunLoop;
 }
 
+namespace content {
+class SyntheticTrialSyncer;
+}
+
 namespace tracing {
 class TraceEventSystemStatsMonitor;
 }
@@ -175,6 +179,8 @@
   std::unique_ptr<tracing::TraceEventSystemStatsMonitor>
       trace_event_system_stats_monitor_;
 
+  std::unique_ptr<content::SyntheticTrialSyncer> synthetic_trial_syncer_;
+
   // Members initialized after / released before main_message_loop_ ------------
 
   std::unique_ptr<BrowserProcessImpl> browser_process_;
diff --git a/chrome/browser/enterprise/idle/idle_service_interactive_uitest.cc b/chrome/browser/enterprise/idle/idle_service_interactive_uitest.cc
index 1a764a6..59e3862 100644
--- a/chrome/browser/enterprise/idle/idle_service_interactive_uitest.cc
+++ b/chrome/browser/enterprise/idle/idle_service_interactive_uitest.cc
@@ -134,6 +134,8 @@
 
     keep_alive_ = std::make_unique<ScopedKeepAlive>(
         KeepAliveOrigin::BROWSER, KeepAliveRestartOption::DISABLED);
+
+    InProcessBrowserTest::SetUpInProcessBrowserTestFixture();
   }
 
   void TearDownOnMainThread() override {
@@ -152,10 +154,20 @@
       // already doing the same thing.
       keep_alive_.reset();
     }
+
+    if (ProfilePicker::IsOpen()) {
+      // `ProfilePicker` prevents browsers from being closed. We need to destroy
+      // `ProfilePicker` first, and then tear down browsers.
+      ProfilePicker::Hide();
+    }
+
     InProcessBrowserTest::TearDownOnMainThread();
   }
 
-  void TearDownInProcessBrowserTestFixture() override { keep_alive_.reset(); }
+  void TearDownInProcessBrowserTestFixture() override {
+    keep_alive_.reset();
+    InProcessBrowserTest::TearDownInProcessBrowserTestFixture();
+  }
 
   void SetIdleTimeoutPolicies(
       policy::MockConfigurationPolicyProvider& policy_provider,
@@ -612,8 +624,7 @@
   EXPECT_FALSE(ProfilePicker::IsOpen());
 }
 
-// TODO(crbug.com/1326685): Figure out why this test fails during teardown.
-IN_PROC_BROWSER_TEST_F(IdleServiceTest, DISABLED_JustShowProfilePicker) {
+IN_PROC_BROWSER_TEST_F(IdleServiceTest, JustShowProfilePicker) {
   EXPECT_CALL(idle_time_provider(), CalculateIdleTime())
       .WillOnce(Return(base::Seconds(58)));
   Profile* profile = browser()->profile();
@@ -637,8 +648,6 @@
   EXPECT_FALSE(IsDialogOpen());
   EXPECT_FALSE(GetIdleBubble(browser()));
   EXPECT_TRUE(ProfilePicker::IsOpen());
-
-  // Browsers are still open.
   EXPECT_EQ(1, GetBrowserCount(profile));
 }
 
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index e89e3e2..f143cfa 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -547,7 +547,7 @@
       base::BindOnce(
           &PasswordsPrivateDelegateImpl::OnRequestCredentialDetailsAuthResult,
           weak_ptr_factory_.GetWeakPtr(), ids, std::move(callback),
-          web_contents));
+          web_contents->GetWeakPtr()));
 }
 
 void PasswordsPrivateDelegateImpl::OnFetchingFamilyMembersCompleted(
@@ -794,7 +794,7 @@
       web_contents, base::Seconds(0), message,
       base::BindOnce(&PasswordsPrivateDelegateImpl::OnExportPasswordsAuthResult,
                      weak_ptr_factory_.GetWeakPtr(),
-                     std::move(accepted_callback), web_contents));
+                     std::move(accepted_callback), web_contents->GetWeakPtr()));
 }
 
 api::passwords_private::ExportProgressStatus
@@ -804,7 +804,7 @@
 
 bool PasswordsPrivateDelegateImpl::IsOptedInForAccountStorage() {
   return password_manager::features_util::IsOptedInForAccountStorage(
-      profile_->GetPrefs(), SyncServiceFactory::GetForProfile(profile_));
+      SyncServiceFactory::GetForProfile(profile_));
 }
 
 void PasswordsPrivateDelegateImpl::SetAccountStorageOptIn(
@@ -917,8 +917,11 @@
 }
 
 void PasswordsPrivateDelegateImpl::MaybeShowPasswordShareButtonIPH(
-    content::WebContents* web_contents) {
-  Browser* browser = chrome::FindBrowserWithTab(web_contents);
+    base::WeakPtr<content::WebContents> web_contents) {
+  if (!web_contents) {
+    return;
+  }
+  Browser* browser = chrome::FindBrowserWithTab(web_contents.get());
   if (!browser || !browser->window()) {
     return;
   }
@@ -969,9 +972,9 @@
 void PasswordsPrivateDelegateImpl::OnRequestCredentialDetailsAuthResult(
     const std::vector<int>& ids,
     UiEntriesCallback callback,
-    content::WebContents* web_contents,
+    base::WeakPtr<content::WebContents> web_contents,
     bool authenticated) {
-  if (!authenticated) {
+  if (!authenticated || !web_contents) {
     std::move(callback).Run({});
     return;
   }
@@ -1016,9 +1019,9 @@
 
 void PasswordsPrivateDelegateImpl::OnExportPasswordsAuthResult(
     base::OnceCallback<void(const std::string&)> accepted_callback,
-    content::WebContents* web_contents,
+    base::WeakPtr<content::WebContents> web_contents,
     bool authenticated) {
-  if (!authenticated) {
+  if (!authenticated || !web_contents) {
     std::move(accepted_callback).Run(kReauthenticationFailed);
     return;
   }
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
index b17fa5e..da83a65 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -198,7 +198,8 @@
       api::passwords_private::PasswordStoreSet from_stores);
   void UndoRemoveSavedPasswordOrExceptionInternal();
 
-  void MaybeShowPasswordShareButtonIPH(content::WebContents* web_contents);
+  void MaybeShowPasswordShareButtonIPH(
+      base::WeakPtr<content::WebContents> web_contents);
 
   // Callback for when the password list has been written to the destination.
   void OnPasswordsExportProgress(
@@ -212,15 +213,16 @@
       bool authenticated);
 
   // Callback for RequestCredentialDetails() after authentication check.
-  void OnRequestCredentialDetailsAuthResult(const std::vector<int>& ids,
-                                            UiEntriesCallback callback,
-                                            content::WebContents* web_contents,
-                                            bool authenticated);
+  void OnRequestCredentialDetailsAuthResult(
+      const std::vector<int>& ids,
+      UiEntriesCallback callback,
+      base::WeakPtr<content::WebContents> web_contents,
+      bool authenticated);
 
   // Callback for ExportPasswords() after authentication check.
   void OnExportPasswordsAuthResult(
       base::OnceCallback<void(const std::string&)> accepted_callback,
-      content::WebContents* web_contents,
+      base::WeakPtr<content::WebContents> web_contents,
       bool authenticated);
 
   // Callback for ContinueImport() after authentication check.
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
index 5a73dda..14b583e 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -135,7 +135,10 @@
 
 class MockPasswordManagerPorter : public PasswordManagerPorterInterface {
  public:
-  MOCK_METHOD(bool, Export, (content::WebContents * web_contents), (override));
+  MOCK_METHOD(bool,
+              Export,
+              (base::WeakPtr<content::WebContents> web_contents),
+              (override));
   MOCK_METHOD(void, CancelExport, (), (override));
   MOCK_METHOD(password_manager::ExportProgressStatus,
               GetExportProgressStatus,
@@ -157,7 +160,9 @@
 
 class FakePasswordManagerPorter : public PasswordManagerPorterInterface {
  public:
-  bool Export(content::WebContents* web_contents) override { return true; }
+  bool Export(base::WeakPtr<content::WebContents> web_contents) override {
+    return true;
+  }
 
   void CancelExport() override {}
 
@@ -1734,6 +1739,12 @@
 
   content::WebContents* web_contents() { return web_contents_; }
 
+  content::TestWebContentsFactory& web_contents_factory() {
+    return web_contents_factory_;
+  }
+
+  TestingProfile* profile() { return profile_; }
+
   scoped_refptr<PasswordsPrivateDelegateImpl> CreateDelegate() {
     return new PasswordsPrivateDelegateImpl(profile_);
   }
@@ -1781,6 +1792,35 @@
   histogram_tester().ExpectUniqueTimeSample(
       "PasswordManager.Settings.AuthenticationTime", base::Seconds(10), 1);
 }
+
+TEST_F(PasswordsPrivateDelegateImplMockTaskEnvironmentTest,
+       ClosingTabDuringExportDoesNotCrashChrome) {
+  content::WebContents* web_contents_ptr =
+      web_contents_factory().CreateWebContents(profile());
+  auto delegate = CreateDelegate();
+
+  auto biometric_authenticator =
+      std::make_unique<device_reauth::MockDeviceAuthenticator>();
+
+  device_reauth::DeviceAuthenticator::AuthenticateCallback auth_result_callback;
+  EXPECT_CALL(*biometric_authenticator, AuthenticateWithMessage)
+      .WillOnce(MoveArg<1>(&auth_result_callback));
+
+  delegate->SetDeviceAuthenticatorForTesting(
+      std::move(biometric_authenticator));
+
+  base::MockCallback<base::OnceCallback<void(const std::string&)>> callback;
+  delegate->ExportPasswords(callback.Get(), web_contents_ptr);
+
+  // Simulate closing tab while authentication is still ongoing.
+  web_contents_factory().DestroyWebContents(web_contents_ptr);
+
+  // Now simulate auth is finished with success. Expect export to fail because
+  // the tab is closed.
+  EXPECT_CALL(callback, Run("reauth-failed"));
+  std::move(auth_result_callback).Run(true);
+}
+
 #endif
 
 class PasswordsPrivateDelegateImplFetchFamilyMembersTest
diff --git a/chrome/browser/extensions/api/printing/printing_test_utils.cc b/chrome/browser/extensions/api/printing/printing_test_utils.cc
index 9c9a4ae..cf5da7c 100644
--- a/chrome/browser/extensions/api/printing/printing_test_utils.cc
+++ b/chrome/browser/extensions/api/printing/printing_test_utils.cc
@@ -219,6 +219,7 @@
   auto capabilities =
       std::make_unique<printing::PrinterSemanticCapsAndDefaults>();
   capabilities->color_model = printing::mojom::ColorModel::kColor;
+  capabilities->duplex_default = printing::mojom::DuplexMode::kSimplex;
   capabilities->duplex_modes.push_back(printing::mojom::DuplexMode::kSimplex);
   capabilities->copies_max = 2;
   capabilities->dpis.emplace_back(kHorizontalDpi, kVerticalDpi);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index f8609c4f..f1d0494 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -341,6 +341,11 @@
     "expiry_milestone": 135
   },
   {
+    "name": "arc-resize-compat",
+    "owners": [ "toshikikikuchi@chromium.org" ],
+    "expiry_milestone": 135
+  },
+  {
     "name": "arc-rounded-window-compat",
     "owners": [ "toshikikikuchi@chromium.org" ],
     "expiry_milestone": 125
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 4f92be7..db257093 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -5604,6 +5604,10 @@
     "When enabled, ARC Per-App Language settings will be surfaced in ChromeOS "
     "settings.";
 
+const char kArcResizeCompatName[] = "Enable ARC Resize Compatibility features";
+const char kArcResizeCompatDescription[] =
+    "Enable resize compatibility features for ARC++ apps";
+
 const char kArcRoundedWindowCompatName[] = "ARC Rounded Window Compatibility";
 const char kArcRoundedWindowCompatDescription[] =
     "Enable rounded window compatibility feature for ARC++ apps";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index ca4c8f9..7f548fd3 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -3221,6 +3221,9 @@
 extern const char kArcPerAppLanguageName[];
 extern const char kArcPerAppLanguageDescription[];
 
+extern const char kArcResizeCompatName[];
+extern const char kArcResizeCompatDescription[];
+
 extern const char kArcRoundedWindowCompatName[];
 extern const char kArcRoundedWindowCompatDescription[];
 
diff --git a/chrome/browser/media/webrtc/desktop_media_list_base.cc b/chrome/browser/media/webrtc/desktop_media_list_base.cc
index 489e6f7..0389599a 100644
--- a/chrome/browser/media/webrtc/desktop_media_list_base.cc
+++ b/chrome/browser/media/webrtc/desktop_media_list_base.cc
@@ -179,31 +179,6 @@
   }
 }
 
-// TODO(https://crbug.com/1479849): Remove this function once there's a function
-// in NativeDesktopMediaList that can set the window_id. Once this is in place
-// we can determine a correct DesktopMediaID and call UpdateSourceThumbnail().
-void DesktopMediaListBase::UpdateSourceThumbnailForId(
-    const DesktopMediaID::Id id,
-    const gfx::ImageSkia& image) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  // Unlike other methods that check can_refresh(), this one won't cause
-  // OnRefreshComplete() to be called, but the caller is expected to schedule a
-  // call to OnRefreshComplete() after this method and UpdateSourcePreview()
-  // have been called as many times as needed, so the check is still valid.
-  DCHECK(can_refresh());
-
-  for (size_t i = 0; i < sources_.size(); ++i) {
-    if (sources_[i].id.id == id) {
-      sources_[i].thumbnail = image;
-      if (observer_) {
-        observer_->OnSourceThumbnailChanged(i);
-      }
-      break;
-    }
-  }
-}
-
 void DesktopMediaListBase::UpdateSourceThumbnail(const DesktopMediaID& id,
                                                  const gfx::ImageSkia& image) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git a/chrome/browser/media/webrtc/desktop_media_list_base.h b/chrome/browser/media/webrtc/desktop_media_list_base.h
index 2cd1000b9..b6501298 100644
--- a/chrome/browser/media/webrtc/desktop_media_list_base.h
+++ b/chrome/browser/media/webrtc/desktop_media_list_base.h
@@ -79,8 +79,6 @@
   void UpdateSourcesList(const std::vector<SourceDescription>& new_sources);
 
   // Update a thumbnail to observer.
-  void UpdateSourceThumbnailForId(const content::DesktopMediaID::Id id,
-                                  const gfx::ImageSkia& image);
   void UpdateSourceThumbnail(const content::DesktopMediaID& id,
                              const gfx::ImageSkia& image);
 
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.cc b/chrome/browser/media/webrtc/native_desktop_media_list.cc
index 48b66d1..c76a6fff 100644
--- a/chrome/browser/media/webrtc/native_desktop_media_list.cc
+++ b/chrome/browser/media/webrtc/native_desktop_media_list.cc
@@ -250,6 +250,20 @@
   return window_id;
 }
 
+using ThumbnailCallback =
+    base::OnceCallback<void(const content::DesktopMediaID&,
+                            const gfx::ImageSkia&)>;
+
+void AssignWindowIdAndUpdateThumbnail(
+    content::DesktopMediaID desktop_media_id,
+    bool is_source_list_delegated,
+    const gfx::ImageSkia& thumbnail,
+    ThumbnailCallback update_thumbnail_callback) {
+  desktop_media_id.window_id =
+      GetUpdatedWindowId(desktop_media_id, is_source_list_delegated);
+  std::move(update_thumbnail_callback).Run(desktop_media_id, thumbnail);
+}
+
 }  // namespace
 
 class NativeDesktopMediaList::Worker
@@ -335,6 +349,7 @@
   const ThumbnailCapturer::FrameDeliveryMethod frame_delivery_method_;
   const bool add_current_process_windows_;
 
+  const bool is_source_list_delegated_;
   bool delegated_source_list_has_selection_ = false;
   bool focused_ = false;
 
@@ -370,7 +385,9 @@
       source_type_(ConvertToDesktopMediaIDType(type)),
       capturer_(std::move(capturer)),
       frame_delivery_method_(capturer_->GetFrameDeliveryMethod()),
-      add_current_process_windows_(add_current_process_windows) {
+      add_current_process_windows_(add_current_process_windows),
+      is_source_list_delegated_(capturer_->GetDelegatedSourceListController() !=
+                                nullptr) {
   DCHECK(capturer_);
 
   DCHECK(source_type_ == DesktopMediaID::Type::TYPE_WINDOW ||
@@ -385,8 +402,9 @@
   DCHECK(task_runner_->BelongsToCurrentThread());
   capturer_->Start(this);
 
-  if (capturer_->GetDelegatedSourceListController())
+  if (is_source_list_delegated_) {
     capturer_->GetDelegatedSourceListController()->Observe(this);
+  }
 }
 
 void NativeDesktopMediaList::Worker::Refresh(bool update_thumbnails) {
@@ -655,6 +673,8 @@
     ThumbnailCapturer::Result result,
     std::unique_ptr<webrtc::DesktopFrame> frame,
     ThumbnailCapturer::SourceId source_id) {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+
   // |frame| may be null if capture failed (e.g. because window has been
   // closed).
   if (!frame) {
@@ -663,10 +683,15 @@
 
   gfx::ImageSkia thumbnail =
       ScaleDesktopFrame(std::move(frame), thumbnail_size_);
+
   content::GetUIThreadTaskRunner({})->PostTask(
       FROM_HERE,
-      base::BindOnce(&NativeDesktopMediaList::UpdateSourceThumbnailForId,
-                     media_list_, source_id, thumbnail));
+      base::BindOnce(
+          &AssignWindowIdAndUpdateThumbnail,
+          DesktopMediaID(source_type_, source_id), is_source_list_delegated_,
+          thumbnail,
+          base::BindOnce(&NativeDesktopMediaList::UpdateSourceThumbnail,
+                         media_list_)));
 }
 
 void NativeDesktopMediaList::Worker::OnSourceListUpdated() {
@@ -674,7 +699,7 @@
 }
 
 void NativeDesktopMediaList::Worker::ClearDelegatedSourceListSelection() {
-  DCHECK(capturer_->GetDelegatedSourceListController());
+  DCHECK(is_source_list_delegated_);
   if (!delegated_source_list_has_selection_)
     return;
 
@@ -702,9 +727,9 @@
   // its source list is visible, unless a selection has previously been made.
   // If the capturer doesn't use a delegated source list, there's nothing for us
   // to do as we're continually querying the list state ourselves.
-  if (capturer_->GetDelegatedSourceListController() &&
-      !delegated_source_list_has_selection_)
+  if (is_source_list_delegated_ && !delegated_source_list_has_selection_) {
     capturer_->GetDelegatedSourceListController()->EnsureVisible();
+  }
 }
 
 void NativeDesktopMediaList::Worker::HideList() {
@@ -714,8 +739,9 @@
   // If the capturer doesn't use a delegated source list, there's nothing for us
   // to do as we want to continually querying the list state ourselves as we
   // have been doing.
-  if (capturer_->GetDelegatedSourceListController())
+  if (is_source_list_delegated_) {
     capturer_->GetDelegatedSourceListController()->EnsureHidden();
+  }
 }
 
 void NativeDesktopMediaList::Worker::OnSelection() {
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.h b/chrome/browser/media/webrtc/native_desktop_media_list.h
index 8dad4f59a..4a9a36c 100644
--- a/chrome/browser/media/webrtc/native_desktop_media_list.h
+++ b/chrome/browser/media/webrtc/native_desktop_media_list.h
@@ -74,7 +74,7 @@
   // Whether we need to find and add the windows owned by the current process.
   // If false, the capturer will do this for us.
   const bool add_current_process_windows_;
-  const bool is_source_list_delegated_ = false;
+  const bool is_source_list_delegated_;
   bool is_capturer_started_ = false;
 
 #if defined(USE_AURA)
diff --git a/chrome/browser/media/webrtc/thumbnail_capturer.h b/chrome/browser/media/webrtc/thumbnail_capturer.h
index 72033dc..f58ec6d4d 100644
--- a/chrome/browser/media/webrtc/thumbnail_capturer.h
+++ b/chrome/browser/media/webrtc/thumbnail_capturer.h
@@ -68,7 +68,7 @@
   // Returns a valid pointer if the capturer requires the user to make a
   // selection from a source list provided by the capturer.
   // Returns nullptr if the capturer does not provide a UI for the user to make
-  // a selection.
+  // a selection. The capturer must return the same value each time.
   //
   // Callers should not take ownership of the returned pointer, but it is
   // guaranteed to be valid as long as the desktop_capturer is valid.
diff --git a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
index eb2989b..846412f 100644
--- a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
+++ b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
@@ -26,7 +26,6 @@
 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
 #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h"
 #include "chrome/browser/media_galleries/media_file_system_registry.h"
-#include "chrome/browser/media_galleries/media_galleries_histograms.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/download/public/common/quarantine_connection.h"
 #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/media_galleries/media_file_system_registry.cc b/chrome/browser/media_galleries/media_file_system_registry.cc
index e7936f7..92ae3be5 100644
--- a/chrome/browser/media_galleries/media_file_system_registry.cc
+++ b/chrome/browser/media_galleries/media_file_system_registry.cc
@@ -25,7 +25,6 @@
 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
 #include "chrome/browser/media_galleries/gallery_watch_manager.h"
 #include "chrome/browser/media_galleries/media_file_system_context.h"
-#include "chrome/browser/media_galleries/media_galleries_histograms.h"
 #include "chrome/browser/media_galleries/media_galleries_preferences_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h"
@@ -434,7 +433,6 @@
             ->Subscribe(
                 base::BindRepeating(&MediaFileSystemRegistry::OnProfileShutdown,
                                     base::Unretained(this), profile));
-    media_galleries::UsageCount(media_galleries::PROFILES_WITH_USAGE);
   }
 
   return MediaGalleriesPreferencesFactory::GetForProfile(profile);
diff --git a/chrome/browser/media_galleries/media_galleries_histograms.cc b/chrome/browser/media_galleries/media_galleries_histograms.cc
deleted file mode 100644
index 90cb6a3..0000000
--- a/chrome/browser/media_galleries/media_galleries_histograms.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/media_galleries/media_galleries_histograms.h"
-
-#include "base/metrics/histogram_macros.h"
-
-namespace media_galleries {
-
-void UsageCount(MediaGalleriesUsages usage) {
-  DCHECK_LT(usage, MEDIA_GALLERIES_NUM_USAGES);
-  UMA_HISTOGRAM_ENUMERATION("MediaGalleries.Usage", usage,
-                            MEDIA_GALLERIES_NUM_USAGES);
-}
-
-}  // namespace media_galleries
diff --git a/chrome/browser/media_galleries/media_galleries_histograms.h b/chrome/browser/media_galleries/media_galleries_histograms.h
deleted file mode 100644
index 1c6c739..0000000
--- a/chrome/browser/media_galleries/media_galleries_histograms.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_HISTOGRAMS_H_
-#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_HISTOGRAMS_H_
-
-namespace media_galleries {
-
-enum MediaGalleriesUsages {
-  DIALOG_GALLERY_ADDED,
-  DIALOG_PERMISSION_ADDED,
-  DIALOG_PERMISSION_REMOVED,
-  GET_MEDIA_FILE_SYSTEMS,
-  PROFILES_WITH_USAGE,
-  SHOW_DIALOG,
-  SAVE_DIALOG,
-  WEBUI_ADD_GALLERY,
-  WEBUI_FORGET_GALLERY,
-  PREFS_INITIALIZED,
-  PREFS_INITIALIZED_ERROR,
-  GET_ALL_MEDIA_FILE_SYSTEM_METADATA,
-  GET_METADATA,
-  ADD_USER_SELECTED_FOLDER,
-  DELETED_START_MEDIA_SCAN,
-  DELETED_CANCEL_MEDIA_SCAN,
-  DELETED_ADD_SCAN_RESULTS,
-  DELETED_SCAN_FINISHED,
-  DELETED_ADD_SCAN_RESULTS_CANCELLED,
-  DELETED_ADD_SCAN_RESULTS_ACCEPTED,
-  DELETED_ADD_SCAN_RESULTS_FORGET_GALLERY,
-  DIALOG_FORGET_GALLERY,
-  DROP_PERMISSION_FOR_MEDIA_FILE_SYSTEM,
-  GET_ALL_GALLERY_WATCH,
-  REMOVE_ALL_GALLERY_WATCH,
-  DELETED_ITUNES_FILE_SYSTEM_USED,
-  DELETED_PICASA_FILE_SYSTEM_USED,
-  DELETED_IPHOTO_FILE_SYSTEM_USED,
-  MEDIA_GALLERIES_NUM_USAGES
-};
-
-void UsageCount(MediaGalleriesUsages usage);
-
-}  // namespace media_galleries
-
-#endif  // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_HISTOGRAMS_H_
diff --git a/chrome/browser/media_galleries/media_galleries_permission_controller.cc b/chrome/browser/media_galleries/media_galleries_permission_controller.cc
index b4dc2c0..3466832 100644
--- a/chrome/browser/media_galleries/media_galleries_permission_controller.cc
+++ b/chrome/browser/media_galleries/media_galleries_permission_controller.cc
@@ -12,7 +12,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/media_galleries/media_file_system_registry.h"
-#include "chrome/browser/media_galleries/media_galleries_histograms.h"
 #include "chrome/browser/media_galleries/media_gallery_context_menu.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/chrome_select_file_policy.h"
@@ -244,7 +243,6 @@
 
 void MediaGalleriesPermissionController::DidForgetEntry(
     GalleryDialogId gallery_id) {
-  media_galleries::UsageCount(media_galleries::DIALOG_FORGET_GALLERY);
   if (!new_galleries_.erase(gallery_id)) {
     DCHECK(base::Contains(known_galleries_, gallery_id));
     forgotten_galleries_.insert(gallery_id);
@@ -416,30 +414,19 @@
 
 void MediaGalleriesPermissionController::SavePermissions() {
   DCHECK(preferences_);
-  media_galleries::UsageCount(media_galleries::SAVE_DIALOG);
   for (GalleryPermissionsMap::const_iterator iter = known_galleries_.begin();
        iter != known_galleries_.end(); ++iter) {
     MediaGalleryPrefId pref_id = GetPrefId(iter->first);
     if (base::Contains(forgotten_galleries_, iter->first)) {
       preferences_->ForgetGalleryById(pref_id);
     } else {
-      bool changed = preferences_->SetGalleryPermissionForExtension(
-          *extension_, pref_id, iter->second.selected);
-      if (changed) {
-        if (iter->second.selected) {
-          media_galleries::UsageCount(
-              media_galleries::DIALOG_PERMISSION_ADDED);
-        } else {
-          media_galleries::UsageCount(
-              media_galleries::DIALOG_PERMISSION_REMOVED);
-        }
-      }
+      preferences_->SetGalleryPermissionForExtension(*extension_, pref_id,
+                                                     iter->second.selected);
     }
   }
 
   for (GalleryPermissionsMap::const_iterator iter = new_galleries_.begin();
        iter != new_galleries_.end(); ++iter) {
-    media_galleries::UsageCount(media_galleries::DIALOG_GALLERY_ADDED);
     // If the user added a gallery then unchecked it, forget about it.
     if (!iter->second.selected)
       continue;
diff --git a/chrome/browser/media_galleries/media_galleries_preferences.cc b/chrome/browser/media_galleries/media_galleries_preferences.cc
index 51629a4f..50021fd 100644
--- a/chrome/browser/media_galleries/media_galleries_preferences.cc
+++ b/chrome/browser/media_galleries/media_galleries_preferences.cc
@@ -26,7 +26,6 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/media_galleries/media_file_system_registry.h"
-#include "chrome/browser/media_galleries/media_galleries_histograms.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/apps/platform_apps/media_galleries_permission.h"
 #include "chrome/common/chrome_paths.h"
@@ -88,23 +87,6 @@
 
 const int kCurrentPrefsVersion = 3;
 
-int NumberExtensionsUsingMediaGalleries(Profile* profile) {
-  int count = 0;
-  if (!profile)
-    return count;
-
-  for (const scoped_refptr<const extensions::Extension>& extension :
-       extensions::ExtensionRegistry::Get(profile)->enabled_extensions()) {
-    const extensions::PermissionsData* permissions_data =
-        extension->permissions_data();
-    if (permissions_data->HasAPIPermission(
-            extensions::mojom::APIPermissionID::kMediaGalleries)) {
-      count++;
-    }
-  }
-  return count;
-}
-
 bool GetPrefId(const base::Value::Dict& dict, MediaGalleryPrefId* value) {
   const std::string* string_id = dict.FindString(kMediaGalleriesPrefIdKey);
   if (!string_id || !base::StringToUint64(*string_id, value)) {
@@ -485,13 +467,6 @@
   if (on_initialize_callbacks_.size() > 1)
     return;
 
-  // Check whether we should be initializing -- are there any extensions that
-  // are using media galleries?
-  media_galleries::UsageCount(media_galleries::PREFS_INITIALIZED);
-  if (NumberExtensionsUsingMediaGalleries(profile_) == 0) {
-    media_galleries::UsageCount(media_galleries::PREFS_INITIALIZED_ERROR);
-  }
-
   // We determine the freshness of the profile here, before any of the finders
   // return and add media galleries to it (hence why the APIHasBeenUsed check
   // needs to happen here rather than inside OnStorageMonitorInit itself).
diff --git a/chrome/browser/password_manager/android/password_generation_controller_impl.cc b/chrome/browser/password_manager/android/password_generation_controller_impl.cc
index 9bf1cc69..1b01527 100644
--- a/chrome/browser/password_manager/android/password_generation_controller_impl.cc
+++ b/chrome/browser/password_manager/android/password_generation_controller_impl.cc
@@ -160,6 +160,7 @@
   driver->GeneratedPasswordAccepted(
       generation_element_data_->form_data,
       generation_element_data_->generation_element_id, password);
+  driver->FocusNextFieldAfterPasswords();
   ResetFocusState();
 }
 
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc
index 439677b..632f402 100644
--- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc
+++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc
@@ -150,7 +150,7 @@
     return regular_pref->GetValue()->GetBool();
   }
 
-  if (regular_pref->IsManaged()) {
+  if (regular_pref->IsManaged() || regular_pref->IsManagedByCustodian()) {
     return regular_pref->GetValue()->GetBool();
   }
 
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
index fd83223..ff6a69c0 100644
--- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
+++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
@@ -1453,3 +1453,16 @@
   SetPasswordsSync(false);
   CreateNewService(std::move(bridge_helper));
 }
+
+TEST_F(PasswordManagerSettingsServiceAndroidImplTestLocalUsers,
+       SavePasswordsSettingManagedByCustodian) {
+  InitializeSettingsService(/*password_sync_enabled=*/false,
+                            /*setting_sync_enabled=*/false);
+  pref_service()->SetSupervisedUserPref(
+      password_manager::prefs::kCredentialsEnableService, base::Value(false));
+  pref_service()->SetUserPref(
+      password_manager::prefs::kOfferToSavePasswordsEnabledGMS,
+      base::Value(true));
+  EXPECT_FALSE(settings_service()->IsSettingEnabled(
+      PasswordManagerSetting::kOfferToSavePasswords));
+}
diff --git a/chrome/browser/password_manager/android/shared_preferences_delegate_android.cc b/chrome/browser/password_manager/android/shared_preferences_delegate_android.cc
new file mode 100644
index 0000000..ba56b624
--- /dev/null
+++ b/chrome/browser/password_manager/android/shared_preferences_delegate_android.cc
@@ -0,0 +1,33 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/password_manager/android/shared_preferences_delegate_android.h"
+#include "base/android/shared_preferences/shared_preferences_manager.h"
+
+#include "chrome/browser/preferences/android/chrome_shared_preferences.h"
+
+namespace {
+//  Password Protection key for SharedPreferencesManager.
+//  Must be kept in sync with ChromePreferenceKeys.java.
+constexpr char kPasswordProtectionAccounts[] =
+    "Chrome.PasswordProtection.Accounts";
+}  // namespace
+
+SharedPreferencesDelegateAndroid::SharedPreferencesDelegateAndroid() = default;
+
+SharedPreferencesDelegateAndroid::~SharedPreferencesDelegateAndroid() = default;
+
+std::string SharedPreferencesDelegateAndroid::GetCredentials(
+    const std::string& default_value) {
+  base::android::SharedPreferencesManager shared_prefs =
+      android::shared_preferences::GetChromeSharedPreferences();
+  return shared_prefs.ReadString(kPasswordProtectionAccounts, default_value);
+}
+
+void SharedPreferencesDelegateAndroid::SetCredentials(
+    const std::string& default_value) {
+  base::android::SharedPreferencesManager shared_prefs =
+      android::shared_preferences::GetChromeSharedPreferences();
+  return shared_prefs.WriteString(kPasswordProtectionAccounts, default_value);
+}
diff --git a/chrome/browser/password_manager/android/shared_preferences_delegate_android.h b/chrome/browser/password_manager/android/shared_preferences_delegate_android.h
new file mode 100644
index 0000000..2a86adb
--- /dev/null
+++ b/chrome/browser/password_manager/android/shared_preferences_delegate_android.h
@@ -0,0 +1,23 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_SHARED_PREFERENCES_DELEGATE_ANDROID_H_
+#define CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_SHARED_PREFERENCES_DELEGATE_ANDROID_H_
+
+#include "components/password_manager/core/browser/shared_preferences_delegate.h"
+
+// This enables access to Android SharedPreferences.
+class SharedPreferencesDelegateAndroid
+    : public password_manager::SharedPreferencesDelegate {
+ public:
+  SharedPreferencesDelegateAndroid();
+  ~SharedPreferencesDelegateAndroid() override;
+  SharedPreferencesDelegateAndroid(const SharedPreferencesDelegateAndroid&) =
+      delete;
+  SharedPreferencesDelegateAndroid& operator=(
+      const SharedPreferencesDelegateAndroid&) = delete;
+  std::string GetCredentials(const std::string& default_value) override;
+  void SetCredentials(const std::string& value) override;
+};
+#endif  // CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_SHARED_PREFERENCES_DELEGATE_ANDROID_H_
diff --git a/chrome/browser/password_manager/password_reuse_manager_factory.cc b/chrome/browser/password_manager/password_reuse_manager_factory.cc
index 721b6155..7bbb1b9 100644
--- a/chrome/browser/password_manager/password_reuse_manager_factory.cc
+++ b/chrome/browser/password_manager/password_reuse_manager_factory.cc
@@ -13,14 +13,20 @@
 #include "chrome/browser/password_manager/profile_password_store_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
+#include "components/password_manager/core/browser/features/password_features.h"
 #include "components/password_manager/core/browser/password_reuse_manager_impl.h"
 #include "components/password_manager/core/browser/password_store/password_store_interface.h"
 #include "components/password_manager/core/browser/password_store_signin_notifier_impl.h"
+#include "components/password_manager/core/browser/shared_preferences_delegate.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 
+#if BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/password_manager/android/shared_preferences_delegate_android.h"
+#endif
+
 namespace {
 
 using password_manager::metrics_util::SignInState;
@@ -99,6 +105,17 @@
   if (!store)
     return nullptr;
 
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile);
+  std::unique_ptr<password_manager::SharedPreferencesDelegate>
+      shared_pref_delegate;
+
+#if BUILDFLAG(IS_ANDROID)
+  if (base::FeatureList::IsEnabled(
+          password_manager::features::kFetchGaiaHashOnSignIn)) {
+    shared_pref_delegate = std::make_unique<SharedPreferencesDelegateAndroid>();
+  }
+#endif
   auto reuse_manager =
       std::make_unique<password_manager::PasswordReuseManagerImpl>();
   reuse_manager->Init(profile->GetPrefs(),
@@ -107,7 +124,8 @@
                           .get(),
                       AccountPasswordStoreFactory::GetForProfile(
                           profile, ServiceAccessType::EXPLICIT_ACCESS)
-                          .get());
+                          .get(),
+                      identity_manager, std::move(shared_pref_delegate));
 
   // Prepare password hash data for reuse detection.
   reuse_manager->PreparePasswordHashData(GetSignInStateForMetrics(profile));
diff --git a/chrome/browser/preloading/preview/preview_tab.cc b/chrome/browser/preloading/preview/preview_tab.cc
index 6f46874..ef26307 100644
--- a/chrome/browser/preloading/preview/preview_tab.cc
+++ b/chrome/browser/preloading/preview/preview_tab.cc
@@ -192,7 +192,7 @@
 }
 
 bool PreviewTab::IsInPreviewMode() const {
-  return base::FeatureList::IsEnabled(blink::features::kLinkPreviewNavigation);
+  return true;
 }
 
 void PreviewTab::PromoteToNewTab(content::WebContents& initiator_web_contents) {
@@ -237,12 +237,6 @@
 
 void PreviewTab::Activate(base::WeakPtr<content::WebContents> web_contents) {
   CHECK(web_contents);
-
-  // If we used ordinal navigation, we don't need to activate it.
-  if (!base::FeatureList::IsEnabled(blink::features::kLinkPreviewNavigation)) {
-    return;
-  }
-
   web_contents->ActivatePreviewPage();
 }
 
diff --git a/chrome/browser/preloading/preview/preview_test_util.cc b/chrome/browser/preloading/preview/preview_test_util.cc
index 700e4f3..f7f3ee5 100644
--- a/chrome/browser/preloading/preview/preview_test_util.cc
+++ b/chrome/browser/preloading/preview/preview_test_util.cc
@@ -62,10 +62,7 @@
 }  // namespace
 
 ScopedPreviewFeatureList::ScopedPreviewFeatureList() {
-  feature_list_.InitWithFeatures(
-      /*enabled_features=*/{blink::features::kLinkPreview,
-                            blink::features::kLinkPreviewNavigation},
-      /*disabled_features=*/{});
+  feature_list_.InitAndEnableFeature(blink::features::kLinkPreview);
 }
 
 PreviewTestHelper::PreviewTestHelper(const content::WebContents::Getter& fn)
diff --git a/chrome/browser/printing/web_api/OWNERS b/chrome/browser/printing/web_api/OWNERS
index 1beb49d1..96fbdee 100644
--- a/chrome/browser/printing/web_api/OWNERS
+++ b/chrome/browser/printing/web_api/OWNERS
@@ -1 +1,4 @@
 greengrape@google.com
+
+per-file *_type_converter*.*=set noparent
+per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/printing/web_api/web_printing_browsertest.cc b/chrome/browser/printing/web_api/web_printing_browsertest.cc
index e67d05f..5785c290 100644
--- a/chrome/browser/printing/web_api/web_printing_browsertest.cc
+++ b/chrome/browser/printing/web_api/web_printing_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/test/scoped_feature_list.h"
+#include "base/test/values_test_util.h"
 #include "chrome/browser/extensions/api/printing/printing_test_utils.h"
 #include "chrome/browser/ui/web_applications/test/isolated_web_app_test_utils.h"
 #include "chromeos/printing/printer_configuration.h"
@@ -10,9 +11,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features_generated.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/printing/fake_cups_printers_manager.h"
-#elif BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
 #include "base/test/gmock_callback_support.h"
 #include "chrome/browser/printing/local_printer_utils_chromeos.h"
 #include "chrome/test/chromeos/printing/mock_local_printer_chromeos.h"
@@ -140,4 +139,54 @@
                   .ExtractBool());
 }
 
+IN_PROC_BROWSER_TEST_F(WebPrintingBrowserTest, FetchAttributes) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  AddPrinterWithSemanticCaps(kId, kName,
+                             extensions::ConstructPrinterCapabilities());
+#elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  EXPECT_CALL(local_printer(), GetPrinters(_))
+      .WillOnce(base::test::RunOnceCallback<0>(
+          extensions::ConstructGetPrintersResponse(kId, kName)));
+
+  EXPECT_CALL(local_printer(), GetCapability(kId, _))
+      .WillOnce(base::test::RunOnceCallback<1>(
+          printing::PrinterWithCapabilitiesToMojom(
+              chromeos::Printer(kId),
+              *extensions::ConstructPrinterCapabilities())));
+#endif
+
+  // Keep in sync with extensions::ConstructPrinterCapabilities().
+  constexpr base::StringPiece kExpectedAttributes = R"({
+    "copiesDefault": 1,
+    "copiesSupported": {
+      "from": 1,
+      "to": 2
+    },
+    "documentFormatDefault": "application/pdf",
+    "documentFormatSupported": [ "application/pdf" ],
+    "multipleDocumentHandlingDefault": "separate-documents-uncollated-copies",
+    "multipleDocumentHandlingSupported": [
+      "separate-documents-uncollated-copies",
+      "separate-documents-collated-copies"
+    ],
+    "printerName": "name",
+    "sidesDefault": "one-sided",
+    "sidesSupported": [ "one-sided" ]
+  })";
+
+  constexpr base::StringPiece kFetchAttributesScript = R"(
+    (async () => {
+      const printers = await navigator.printing.getPrinters();
+      return await printers[0].fetchAttributes();
+    })();
+  )";
+
+  auto eval_result = EvalJs(app_frame(), kFetchAttributesScript);
+  ASSERT_TRUE(eval_result.error.empty()) << "Failed with " << eval_result.error;
+
+  const auto& attributes = eval_result.value.GetDict();
+  EXPECT_THAT(attributes, base::test::DictionaryHasValues(
+                              base::test::ParseJsonDict(kExpectedAttributes)));
+}
+
 }  // namespace printing
diff --git a/chrome/browser/printing/web_api/web_printing_service_chromeos.cc b/chrome/browser/printing/web_api/web_printing_service_chromeos.cc
index a0adeb3f..78fcd7aa 100644
--- a/chrome/browser/printing/web_api/web_printing_service_chromeos.cc
+++ b/chrome/browser/printing/web_api/web_printing_service_chromeos.cc
@@ -7,10 +7,23 @@
 #include <utility>
 
 #include "chrome/browser/printing/local_printer_utils_chromeos.h"
+#include "chrome/browser/printing/web_api/web_printing_type_converters.h"
 #include "content/public/browser/render_frame_host.h"
 
 namespace printing {
 
+namespace {
+
+blink::mojom::WebPrinterAttributesPtr ConvertResponse(
+    crosapi::mojom::CapabilitiesResponsePtr response) {
+  if (!response || !response->capabilities) {
+    return nullptr;
+  }
+  return blink::mojom::WebPrinterAttributes::From(*response->capabilities);
+}
+
+}  // namespace
+
 WebPrintingServiceChromeOS::WebPrintingServiceChromeOS(
     content::RenderFrameHost* render_frame_host,
     mojo::PendingReceiver<blink::mojom::WebPrintingService> receiver)
@@ -24,6 +37,13 @@
                      weak_factory_.GetWeakPtr(), std::move(callback)));
 }
 
+void WebPrintingServiceChromeOS::FetchAttributes(
+    FetchAttributesCallback callback) {
+  GetLocalPrinterInterface()->GetCapability(
+      *printers_.current_context(),
+      base::BindOnce(&ConvertResponse).Then(std::move(callback)));
+}
+
 void WebPrintingServiceChromeOS::OnPrintersRetrieved(
     GetPrintersCallback callback,
     std::vector<crosapi::mojom::LocalDestinationInfoPtr> printers) {
diff --git a/chrome/browser/printing/web_api/web_printing_service_chromeos.h b/chrome/browser/printing/web_api/web_printing_service_chromeos.h
index 4621d58..4efd8f785 100644
--- a/chrome/browser/printing/web_api/web_printing_service_chromeos.h
+++ b/chrome/browser/printing/web_api/web_printing_service_chromeos.h
@@ -31,6 +31,9 @@
   // blink::mojom::WebPrintingService:
   void GetPrinters(GetPrintersCallback callback) override;
 
+  // blink::mojom::WebPrinter:
+  void FetchAttributes(FetchAttributesCallback callback) override;
+
  private:
   using PrinterId = base::StrongAlias<class PrinterId, std::string>;
 
diff --git a/chrome/browser/printing/web_api/web_printing_type_converters.cc b/chrome/browser/printing/web_api/web_printing_type_converters.cc
new file mode 100644
index 0000000..130dba61
--- /dev/null
+++ b/chrome/browser/printing/web_api/web_printing_type_converters.cc
@@ -0,0 +1,125 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/printing/web_api/web_printing_type_converters.h"
+
+#include <optional>
+
+#include "base/containers/contains.h"
+#include "mojo/public/cpp/bindings/message.h"
+#include "printing/backend/print_backend.h"
+#include "third_party/blink/public/mojom/printing/web_printing.mojom.h"
+
+namespace {
+// sides:
+using DuplexMode = printing::mojom::DuplexMode;
+using WebPrintingSides = blink::mojom::WebPrintingSides;
+}  // namespace
+
+namespace mojo {
+
+template <>
+struct TypeConverter<std::optional<WebPrintingSides>, DuplexMode> {
+  static std::optional<WebPrintingSides> Convert(const DuplexMode& duplex) {
+    switch (duplex) {
+      case DuplexMode::kSimplex:
+        return WebPrintingSides::kOneSided;
+      case DuplexMode::kLongEdge:
+        return WebPrintingSides::kTwoSidedLongEdge;
+      case DuplexMode::kShortEdge:
+        return WebPrintingSides::kTwoSidedShortEdge;
+      default:
+        return absl::nullopt;
+    }
+  }
+};
+
+}  // namespace mojo
+
+namespace printing {
+namespace {
+
+// Checks if enum-default and enum-supported are in sync.
+template <typename T>
+bool ValidateDefaultAgainstSupported(const std::optional<T>& enum_default,
+                                     const std::vector<T>& enum_supported) {
+  if (!enum_default && enum_supported.empty()) {
+    // If both are empty, the invariant is fulfilled.
+    return true;
+  } else if (enum_default && !enum_supported.empty()) {
+    // If both are non-empty, then the latter must contain the former.
+    return base::Contains(enum_supported, *enum_default);
+  } else {
+    // If only one is populated, then there are some values that we don't
+    // support.
+    return false;
+  }
+}
+
+void ProcessCopies(const PrinterSemanticCapsAndDefaults& caps,
+                   blink::mojom::WebPrinterAttributes* attributes) {
+  attributes->copies_default = 1;
+  attributes->copies_supported =
+      blink::mojom::WebPrintingRange::New(1, caps.copies_max);
+}
+
+void ProcessMultipleDocumentHandling(
+    const PrinterSemanticCapsAndDefaults& caps,
+    blink::mojom::WebPrinterAttributes* attributes) {
+  attributes->multiple_document_handling_default =
+      caps.collate_capable && caps.collate_default
+          ? blink::mojom::WebPrintingMultipleDocumentHandling::
+                kSeparateDocumentsCollatedCopies
+          : blink::mojom::WebPrintingMultipleDocumentHandling::
+                kSeparateDocumentsUncollatedCopies;
+  attributes->multiple_document_handling_supported.push_back(
+      blink::mojom::WebPrintingMultipleDocumentHandling::
+          kSeparateDocumentsUncollatedCopies);
+  if (caps.collate_capable) {
+    attributes->multiple_document_handling_supported.push_back(
+        blink::mojom::WebPrintingMultipleDocumentHandling::
+            kSeparateDocumentsCollatedCopies);
+  }
+}
+
+void ProcessSides(const PrinterSemanticCapsAndDefaults& caps,
+                  blink::mojom::WebPrinterAttributes* attributes) {
+  attributes->sides_default =
+      mojo::ConvertTo<std::optional<WebPrintingSides>>(caps.duplex_default);
+  for (const auto& duplex : caps.duplex_modes) {
+    auto sides = mojo::ConvertTo<std::optional<WebPrintingSides>>(duplex);
+    if (!sides) {
+      mojo::ReportBadMessage("Unknown duplex enum value in duplex_modes!");
+      return;
+    }
+    attributes->sides_supported.push_back(*sides);
+  }
+
+  if (!ValidateDefaultAgainstSupported(attributes->sides_default,
+                                       attributes->sides_supported)) {
+    attributes->sides_default.reset();
+    attributes->sides_supported.clear();
+    return;
+  }
+}
+
+}  // namespace
+}  // namespace printing
+
+namespace mojo {
+
+blink::mojom::WebPrinterAttributesPtr
+TypeConverter<blink::mojom::WebPrinterAttributesPtr,
+              printing::PrinterSemanticCapsAndDefaults>::
+    Convert(const printing::PrinterSemanticCapsAndDefaults& capabilities) {
+  auto attributes = blink::mojom::WebPrinterAttributes::New();
+
+  printing::ProcessCopies(capabilities, attributes.get());
+  printing::ProcessMultipleDocumentHandling(capabilities, attributes.get());
+  printing::ProcessSides(capabilities, attributes.get());
+
+  return attributes;
+}
+
+}  // namespace mojo
diff --git a/chrome/browser/printing/web_api/web_printing_type_converters.h b/chrome/browser/printing/web_api/web_printing_type_converters.h
new file mode 100644
index 0000000..1219e21
--- /dev/null
+++ b/chrome/browser/printing/web_api/web_printing_type_converters.h
@@ -0,0 +1,26 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PRINTING_WEB_API_WEB_PRINTING_TYPE_CONVERTERS_H_
+#define CHROME_BROWSER_PRINTING_WEB_API_WEB_PRINTING_TYPE_CONVERTERS_H_
+
+#include "mojo/public/cpp/bindings/type_converter.h"
+#include "third_party/blink/public/mojom/printing/web_printing.mojom-forward.h"
+
+namespace printing {
+struct PrinterSemanticCapsAndDefaults;
+}  // namespace printing
+
+namespace mojo {
+
+template <>
+struct TypeConverter<blink::mojom::WebPrinterAttributesPtr,
+                     printing::PrinterSemanticCapsAndDefaults> {
+  static blink::mojom::WebPrinterAttributesPtr Convert(
+      const printing::PrinterSemanticCapsAndDefaults&);
+};
+
+}  // namespace mojo
+
+#endif  // CHROME_BROWSER_PRINTING_WEB_API_WEB_PRINTING_TYPE_CONVERTERS_H_
diff --git a/chrome/browser/resources/ash/settings/os_reset_page/os_powerwash_dialog.ts b/chrome/browser/resources/ash/settings/os_reset_page/os_powerwash_dialog.ts
index 7e442a6db..d5e3d6a 100644
--- a/chrome/browser/resources/ash/settings/os_reset_page/os_powerwash_dialog.ts
+++ b/chrome/browser/resources/ash/settings/os_reset_page/os_powerwash_dialog.ts
@@ -95,8 +95,6 @@
 
   override connectedCallback(): void {
     super.connectedCallback();
-
-    this.osResetBrowserProxy_.onPowerwashDialogShow();
     this.$.dialog.showModal();
   }
 
diff --git a/chrome/browser/resources/ash/settings/os_reset_page/os_reset_browser_proxy.ts b/chrome/browser/resources/ash/settings/os_reset_page/os_reset_browser_proxy.ts
index ab184246..49935d3 100644
--- a/chrome/browser/resources/ash/settings/os_reset_page/os_reset_browser_proxy.ts
+++ b/chrome/browser/resources/ash/settings/os_reset_page/os_reset_browser_proxy.ts
@@ -4,11 +4,6 @@
 
 export interface OsResetBrowserProxy {
   /**
-   * A method to be called when the reset powerwash dialog is shown.
-   */
-  onPowerwashDialogShow(): void;
-
-  /**
    * Initiates a factory reset and restarts.
    */
   requestFactoryResetRestart(): void;
@@ -25,10 +20,6 @@
     instance = obj;
   }
 
-  onPowerwashDialogShow(): void {
-    chrome.send('onPowerwashDialogShow');
-  }
-
   requestFactoryResetRestart(): void {
     chrome.send('requestFactoryResetRestart');
   }
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
index 4d0acf56..66b9cab 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
@@ -22,6 +22,7 @@
 import {PrefControlMixinInterface} from '/shared/settings/controls/pref_control_mixin.js';
 import {DropdownMenuOptionList} from '/shared/settings/controls/settings_dropdown_menu.js';
 import {StatusAction, SyncBrowserProxy, SyncBrowserProxyImpl, SyncStatus} from '/shared/settings/people_page/sync_browser_proxy.js';
+import {PrefsMixin} from 'chrome://resources/cr_components/settings_prefs/prefs_mixin.js';
 import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
 import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
@@ -64,15 +65,13 @@
   };
 }
 
-enum TimePeriod {
+export enum TimePeriod {
   LAST_HOUR = 0,
   LAST_DAY = 1,
   LAST_WEEK = 2,
   FOUR_WEEKS = 3,
   ALL_TIME = 4,
-  OLDER_THAN_30_DAYS = 5,
-  LAST_15_MINUTES = 6,
-  TIME_PERIOD_LAST = LAST_15_MINUTES
+  TIME_PERIOD_LAST = ALL_TIME
 }
 
 // TODO(crbug.com/1487530): Remove this after CbdTimeframeRequired finishes.
@@ -88,8 +87,8 @@
   TIME_PERIOD_LAST = LAST_15_MINUTES
 }
 
-const SettingsClearBrowsingDataDialogElementBase =
-    RouteObserverMixin(WebUiListenerMixin(I18nMixin(PolymerElement)));
+const SettingsClearBrowsingDataDialogElementBase = RouteObserverMixin(
+    WebUiListenerMixin(PrefsMixin(I18nMixin(PolymerElement))));
 
 export class SettingsClearBrowsingDataDialogElement extends
     SettingsClearBrowsingDataDialogElementBase {
@@ -308,6 +307,15 @@
     };
   }
 
+  static get observers() {
+    return [
+      `onTimePeriodAdvancedPrefUpdated_(
+          prefs.browser.clear_data.time_period.value)`,
+      `onTimePeriodBasicPrefUpdated_(
+          prefs.browser.clear_data.time_period_basic.value)`,
+    ];
+  }
+
   // TODO(dpapad): make |syncStatus| private.
   syncStatus: SyncStatus|undefined;
   private counters_: {[k: string]: string};
@@ -634,6 +642,27 @@
     // </if>
     return showFooter;
   }
+
+  private onTimePeriodAdvancedPrefUpdated_() {
+    this.onTimePeriodPrefUpdated_(false);
+  }
+
+  private onTimePeriodBasicPrefUpdated_() {
+    this.onTimePeriodPrefUpdated_(true);
+  }
+
+
+  private onTimePeriodPrefUpdated_(basic: boolean) {
+    const timePeriodPref = basic ? 'browser.clear_data.time_period_basic' :
+                                   'browser.clear_data.time_period';
+
+    const timePeriodValue = this.getPref(timePeriodPref).value;
+
+    if (!(timePeriodValue in TimePeriod)) {
+      // If the synced time period is not supported, default to "Last hour".
+      this.setPrefValue(timePeriodPref, TimePeriod.LAST_HOUR);
+    }
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts
index a49ea98..f4bcad0 100644
--- a/chrome/browser/resources/settings/lazy_load.ts
+++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -134,7 +134,7 @@
 export {SettingsPaymentsSectionElement} from './autofill_page/payments_section.js';
 export {SettingsVirtualCardUnenrollDialogElement} from './autofill_page/virtual_card_unenroll_dialog.js';
 export {ClearBrowsingDataBrowserProxy, ClearBrowsingDataBrowserProxyImpl, ClearBrowsingDataResult, UpdateSyncStateEvent} from './clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js';
-export {SettingsClearBrowsingDataDialogElement, TimePeriodExperiment} from './clear_browsing_data_dialog/clear_browsing_data_dialog.js';
+export {SettingsClearBrowsingDataDialogElement, TimePeriod, TimePeriodExperiment} from './clear_browsing_data_dialog/clear_browsing_data_dialog.js';
 export {SettingsHistoryDeletionDialogElement} from './clear_browsing_data_dialog/history_deletion_dialog.js';
 export {SettingsPasswordsDeletionDialogElement} from './clear_browsing_data_dialog/passwords_deletion_dialog.js';
 export {SettingsCheckboxElement} from './controls/settings_checkbox.js';
diff --git a/chrome/browser/resources/settings/site_settings/add_site_dialog.html b/chrome/browser/resources/settings/site_settings/add_site_dialog.html
index 3cd8861..ea6cf78 100644
--- a/chrome/browser/resources/settings/site_settings/add_site_dialog.html
+++ b/chrome/browser/resources/settings/site_settings/add_site_dialog.html
@@ -16,11 +16,6 @@
                 contentSetting)]]">
           $i18n{incognitoSiteOnly}
         </cr-checkbox>
-        <cr-checkbox id="thirdParties"
-            hidden$="[[shouldHideThirdPartyCookieCheckbox_(category,
-                cookiesExceptionType)]]">
-          $i18n{siteSettingsCookiesThirdPartyExceptionLabel}
-        </cr-checkbox>
       </div>
       <div slot="button-container">
         <cr-button class="cancel-button" on-click="onCancelClick_">
diff --git a/chrome/browser/resources/settings/site_settings/add_site_dialog.ts b/chrome/browser/resources/settings/site_settings/add_site_dialog.ts
index d9dc9dc..e5bbe30 100644
--- a/chrome/browser/resources/settings/site_settings/add_site_dialog.ts
+++ b/chrome/browser/resources/settings/site_settings/add_site_dialog.ts
@@ -23,7 +23,7 @@
 import {loadTimeData} from '../i18n_setup.js';
 
 import {getTemplate} from './add_site_dialog.html.js';
-import {ContentSetting, ContentSettingsTypes, CookiesExceptionType, SITE_EXCEPTION_WILDCARD} from './constants.js';
+import {ContentSetting, CookiesExceptionType, SITE_EXCEPTION_WILDCARD} from './constants.js';
 import {SiteSettingsMixin, SiteSettingsMixinInterface} from './site_settings_mixin.js';
 
 export interface AddSiteDialogElement {
@@ -32,7 +32,6 @@
     dialog: CrDialogElement,
     incognito: CrCheckboxElement,
     site: CrInputElement,
-    thirdParties: CrCheckboxElement,
   };
 }
 
@@ -133,8 +132,7 @@
     let primaryPattern = this.site_;
     let secondaryPattern = SITE_EXCEPTION_WILDCARD;
 
-    if (this.$.thirdParties.checked ||
-        this.cookiesExceptionType === CookiesExceptionType.THIRD_PARTY) {
+    if (this.cookiesExceptionType === CookiesExceptionType.THIRD_PARTY) {
       primaryPattern = SITE_EXCEPTION_WILDCARD;
       secondaryPattern = this.site_;
     }
@@ -156,16 +154,6 @@
       this.$.incognito.checked = false;
     }
   }
-
-  private shouldHideThirdPartyCookieCheckbox_(): boolean {
-    // TODO(crbug.com/1378703): Remove checkbox support after feature is
-    // launched.
-    if (loadTimeData.getBoolean('isPrivacySandboxSettings4')) {
-      return true;
-    }
-    return this.cookiesExceptionType !== CookiesExceptionType.COMBINED ||
-        this.category !== ContentSettingsTypes.COOKIES;
-  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts
index deb217dcf..c90dbb15 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts
@@ -297,8 +297,7 @@
    * Update the third-party cookies link row label when the pref changes.
    */
   private updateThirdPartyCookiesLabel_() {
-    if (!loadTimeData.getBoolean('isPrivacySandboxSettings4') ||
-        loadTimeData.getBoolean('is3pcdCookieSettingsRedesignEnabled')) {
+    if (loadTimeData.getBoolean('is3pcdCookieSettingsRedesignEnabled')) {
       return;
     }
 
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts
index a4f6c89b..d200fe0 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts
@@ -293,7 +293,6 @@
       id: Id.SITE_DATA,
       label: 'siteDataPageTitle',
       icon: 'settings:database',
-      shouldShow: () => loadTimeData.getBoolean('isPrivacySandboxSettings4'),
     },
     {
       route: routes.SITE_SETTINGS_SOUND,
@@ -357,10 +356,7 @@
     categoryList.push({
       route: routes.COOKIES,
       id: Id.COOKIES,
-      label:
-          (loadTimeData.getBoolean('isPrivacySandboxSettings4') ?
-               'thirdPartyCookiesLinkRowLabel' :
-               'siteSettingsCookies'),
+      label: 'thirdPartyCookiesLinkRowLabel',
       icon: 'settings:cookie',
       enabledLabel: 'trackingProtectionLinkRowSubLabel',
       disabledLabel: 'trackingProtectionLinkRowSubLabel',
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.h b/chrome/browser/signin/dice_web_signin_interceptor.h
index 1e56ba82..8570606a 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor.h
+++ b/chrome/browser/signin/dice_web_signin_interceptor.h
@@ -15,7 +15,6 @@
 #include "base/scoped_observation.h"
 #include "base/time/time.h"
 #include "chrome/browser/signin/web_signin_interceptor.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/policy/core/browser/signin/profile_separation_policies.h"
diff --git a/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc b/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
index 2288cfd..28a0381 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
@@ -587,7 +587,7 @@
   syncer::SyncService* sync_service =
       SyncServiceFactory::GetForProfile(GetProfile());
   EXPECT_TRUE(password_manager::features_util::IsOptedInForAccountStorage(
-      pref_service, sync_service));
+      sync_service));
   EXPECT_EQ(password_manager::features_util::GetDefaultPasswordStore(
                 pref_service, sync_service),
             password_manager::PasswordForm::Store::kAccountStore);
diff --git a/chrome/browser/signin/web_signin_interceptor.h b/chrome/browser/signin/web_signin_interceptor.h
index 1fa0aa67..61672d1 100644
--- a/chrome/browser/signin/web_signin_interceptor.h
+++ b/chrome/browser/signin/web_signin_interceptor.h
@@ -14,7 +14,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/scoped_observation.h"
 #include "base/time/time.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
diff --git a/chrome/browser/sync/sync_ui_util.cc b/chrome/browser/sync/sync_ui_util.cc
index 14b2e8c..2e8cb6b6 100644
--- a/chrome/browser/sync/sync_ui_util.cc
+++ b/chrome/browser/sync/sync_ui_util.cc
@@ -185,16 +185,15 @@
 }
 
 absl::optional<AvatarSyncErrorType> GetTrustedVaultError(
-    const syncer::SyncService* sync_service,
-    const PrefService* pref_service) {
-  if (ShouldShowSyncKeysMissingError(sync_service, pref_service)) {
+    const syncer::SyncService* sync_service) {
+  if (sync_service->GetUserSettings()
+          ->IsTrustedVaultKeyRequiredForPreferredDataTypes()) {
     return sync_service->GetUserSettings()->IsEncryptEverythingEnabled()
                ? AvatarSyncErrorType::kTrustedVaultKeyMissingForEverythingError
                : AvatarSyncErrorType::kTrustedVaultKeyMissingForPasswordsError;
   }
 
-  if (ShouldShowTrustedVaultDegradedRecoverabilityError(sync_service,
-                                                        pref_service)) {
+  if (sync_service->GetUserSettings()->IsTrustedVaultRecoverabilityDegraded()) {
     return sync_service->GetUserSettings()->IsEncryptEverythingEnabled()
                ? AvatarSyncErrorType::
                      kTrustedVaultRecoverabilityDegradedForEverythingError
@@ -254,7 +253,7 @@
     // Note the condition checked is not IsInitialSyncFeatureSetupComplete(),
     // because the setup incomplete case is treated separately below. See the
     // comment in ShouldRequestSyncConfirmation() about dashboard resets.
-    return GetTrustedVaultError(service, profile->GetPrefs());
+    return GetTrustedVaultError(service);
   }
 
   // RequiresClientUpgrade() is unrecoverable, but is treated separately below.
@@ -283,7 +282,7 @@
   }
 
   const absl::optional<AvatarSyncErrorType> trusted_vault_error =
-      GetTrustedVaultError(service, profile->GetPrefs());
+      GetTrustedVaultError(service);
   if (trusted_vault_error) {
     return trusted_vault_error;
   }
@@ -346,62 +345,6 @@
          settings->IsPassphraseRequiredForPreferredDataTypes();
 }
 
-bool ShouldShowSyncKeysMissingError(const syncer::SyncService* sync_service,
-                                    const PrefService* pref_service) {
-  const syncer::SyncUserSettings* settings = sync_service->GetUserSettings();
-  if (!settings->IsTrustedVaultKeyRequiredForPreferredDataTypes()) {
-    return false;
-  }
-
-  if (settings->IsInitialSyncFeatureSetupComplete()) {
-    return true;
-  }
-
-  // On desktop transport mode, IsTrustedVaultKeyRequiredForPreferredDataTypes()
-  // returns true even if the user isn't trying to sync any of the encrypted
-  // types. The check below tries to avoid showing an unexpected "You couldn't
-  // sync X" error in that case. It works fine if IsEncryptEverythingEnabled()
-  // is false, since PASSWORDS is the only one of AlwaysEncryptedUserTypes()
-  // currently supporting transport mode. Otherwise, it should really be OR-ed
-  // with other checks.
-  // TODO(crbug.com/1447083): Once the Desktop precondition for
-  // EnablePasswordsAccountStorage becomes "PASSWORDS is a selected type", and
-  // not a PreconditionState of the controller, this function can be replaced
-  // with a single IsTrustedVaultKeyRequiredForPreferredDataTypes() check.
-  //
-  // WARNING: Must match CredentialModelTypeController::GetPreconditionState().
-  return password_manager::features_util::IsOptedInForAccountStorage(
-      pref_service, sync_service);
-}
-
-bool ShouldShowTrustedVaultDegradedRecoverabilityError(
-    const syncer::SyncService* sync_service,
-    const PrefService* pref_service) {
-  const syncer::SyncUserSettings* settings = sync_service->GetUserSettings();
-  if (!settings->IsTrustedVaultRecoverabilityDegraded()) {
-    return false;
-  }
-
-  if (settings->IsInitialSyncFeatureSetupComplete()) {
-    return true;
-  }
-
-  // On desktop transport mode, IsTrustedVaultRecoverabilityDegraded() returns
-  // true even if the user isn't trying to sync any of the encrypted types. The
-  // check below tries to avoid unnecessarily showing the error in that case. It
-  // works fine if IsEncryptEverythingEnabled() is false, since PASSWORDS is the
-  // only one of AlwaysEncryptedUserTypes() currently supporting transport mode.
-  // Otherwise, it should really be OR-ed with other checks.
-  // TODO(crbug.com/1447083): Once the Desktop precondition for
-  // EnablePasswordsAccountStorage becomes "PASSWORDS is a selected type", and
-  // not a PreconditionState of the controller, this function can be replaced
-  // with a single IsTrustedVaultRecoverabilityDegraded() check.
-  //
-  // WARNING: Must match CredentialModelTypeController::GetPreconditionState().
-  return password_manager::features_util::IsOptedInForAccountStorage(
-      pref_service, sync_service);
-}
-
 void OpenTabForSyncKeyRetrieval(
     Browser* browser,
     syncer::TrustedVaultUserActionTriggerForUMA trigger) {
diff --git a/chrome/browser/sync/sync_ui_util.h b/chrome/browser/sync/sync_ui_util.h
index d62630f..0ef354e3 100644
--- a/chrome/browser/sync/sync_ui_util.h
+++ b/chrome/browser/sync/sync_ui_util.h
@@ -11,7 +11,6 @@
 
 class Browser;
 class Profile;
-class PrefService;
 
 namespace signin {
 class IdentityManager;
@@ -123,17 +122,6 @@
 // whether a missing passphrase is preventing Sync from fully starting up.
 bool ShouldShowSyncPassphraseError(const syncer::SyncService* service);
 
-// Returns whether missing trusted vault keys is preventing sync from starting
-// up encrypted datatypes.
-bool ShouldShowSyncKeysMissingError(const syncer::SyncService* sync_service,
-                                    const PrefService* pref_service);
-
-// Returns whether user action is required to improve the recoverability of the
-// trusted vault.
-bool ShouldShowTrustedVaultDegradedRecoverabilityError(
-    const syncer::SyncService* sync_service,
-    const PrefService* pref_service);
-
 // Opens a tab for the purpose of retrieving the trusted vault keys, which
 // usually requires a reauth.
 void OpenTabForSyncKeyRetrieval(
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 64f823d..6f1ff82 100644
--- a/chrome/browser/sync/test/integration/password_manager_sync_test.cc
+++ b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
@@ -959,14 +959,14 @@
   // some account opted in. No opt-in yet, so no re-signin.
   EXPECT_FALSE(
       password_manager::features_util::ShouldShowAccountStorageReSignin(
-          GetProfile(0)->GetPrefs(), GetSyncService(0), GURL()));
+          GetSyncService(0), GURL()));
 
   SignIn();
 
   // Still no opt-in. Plus, the user is signed-in already.
   EXPECT_FALSE(
       password_manager::features_util::ShouldShowAccountStorageReSignin(
-          GetProfile(0)->GetPrefs(), GetSyncService(0), GURL()));
+          GetSyncService(0), GURL()));
 
   password_manager::features_util::OptInToAccountStorage(
       GetProfile(0)->GetPrefs(), GetSyncService(0));
@@ -974,7 +974,7 @@
   // Now there's an opt-in but the user is signed-in already.
   EXPECT_FALSE(
       password_manager::features_util::ShouldShowAccountStorageReSignin(
-          GetProfile(0)->GetPrefs(), GetSyncService(0), GURL()));
+          GetSyncService(0), GURL()));
 
   SignOut();
 
@@ -982,20 +982,17 @@
   // except the Gaia sign-in page where it's useless. Native UI can offer
   // re-signin too, in that case the GURL is empty.
   EXPECT_TRUE(password_manager::features_util::ShouldShowAccountStorageReSignin(
-      GetProfile(0)->GetPrefs(), GetSyncService(0),
-      GURL("http://www.example.com")));
+      GetSyncService(0), GURL("http://www.example.com")));
   EXPECT_TRUE(password_manager::features_util::ShouldShowAccountStorageReSignin(
-      GetProfile(0)->GetPrefs(), GetSyncService(0),
-      GURL("https://www.example.com")));
+      GetSyncService(0), GURL("https://www.example.com")));
   EXPECT_TRUE(password_manager::features_util::ShouldShowAccountStorageReSignin(
-      GetProfile(0)->GetPrefs(), GetSyncService(0), GURL()));
+      GetSyncService(0), GURL()));
   EXPECT_FALSE(
       password_manager::features_util::ShouldShowAccountStorageReSignin(
-          GetProfile(0)->GetPrefs(), GetSyncService(0),
-          GaiaUrls::GetInstance()->gaia_url()));
+          GetSyncService(0), GaiaUrls::GetInstance()->gaia_url()));
   EXPECT_FALSE(
       password_manager::features_util::ShouldShowAccountStorageReSignin(
-          GetProfile(0)->GetPrefs(), GetSyncService(0),
+          GetSyncService(0),
           GaiaUrls::GetInstance()->gaia_url().Resolve("path")));
 
   SignIn();
@@ -1003,7 +1000,7 @@
   // Once the user signs in, no re-signin offered anymore.
   EXPECT_FALSE(
       password_manager::features_util::ShouldShowAccountStorageReSignin(
-          GetProfile(0)->GetPrefs(), GetSyncService(0), GURL()));
+          GetSyncService(0), GURL()));
 }
 
 IN_PROC_BROWSER_TEST_F(PasswordManagerSyncTest,
@@ -1025,11 +1022,11 @@
 
   SignIn("first@gmail.com");
   EXPECT_TRUE(password_manager::features_util::IsOptedInForAccountStorage(
-      GetProfile(0)->GetPrefs(), GetSyncService(0)));
+      GetSyncService(0)));
   SignOut();
   SignIn("second@gmail.com");
   EXPECT_FALSE(password_manager::features_util::IsOptedInForAccountStorage(
-      GetProfile(0)->GetPrefs(), GetSyncService(0)));
+      GetSyncService(0)));
 }
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 
@@ -1049,7 +1046,7 @@
   ASSERT_EQ(fake_server_->GetSyncEntitiesByModelType(syncer::PASSWORDS).size(),
             1u);
   EXPECT_TRUE(password_manager::features_util::IsOptedInForAccountStorage(
-      GetProfile(0)->GetPrefs(), GetSyncService(0)));
+      GetSyncService(0)));
 
   // Clear cookies and account passwords.
   content::BrowsingDataRemover* remover =
@@ -1069,7 +1066,7 @@
 
   // The opt-in should be gone as well.
   EXPECT_FALSE(password_manager::features_util::IsOptedInForAccountStorage(
-      GetProfile(0)->GetPrefs(), GetSyncService(0)));
+      GetSyncService(0)));
 }
 
 IN_PROC_BROWSER_TEST_F(PasswordManagerSyncTest,
@@ -1119,7 +1116,7 @@
 
   // Since we mangled the prefs file, the opt-in should be gone.
   ASSERT_FALSE(password_manager::features_util::IsOptedInForAccountStorage(
-      GetProfile(0)->GetPrefs(), GetSyncService(0)));
+      GetSyncService(0)));
   ASSERT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PASSWORDS));
 
   // Since there's no opt-in, the account-scoped store should have been cleared
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 fb44edb7..e0c6b7d 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
@@ -1022,8 +1022,6 @@
                   ->GetUserSettings()
                   ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
   ASSERT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PASSWORDS));
-  ASSERT_TRUE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                             GetProfile(0)->GetPrefs()));
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
   // Verify the profile-menu error string.
@@ -1060,8 +1058,6 @@
   EXPECT_FALSE(GetSyncService(0)
                    ->GetUserSettings()
                    ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
-  EXPECT_FALSE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                              GetProfile(0)->GetPrefs()));
   EXPECT_THAT(GetSyncStatusLabels(GetProfile(0)),
               StatusLabelsMatch(
                   SyncStatusMessageType::kSynced, IDS_SYNC_ACCOUNT_SYNCING,
@@ -1091,8 +1087,6 @@
   ASSERT_TRUE(GetSyncService(0)
                   ->GetUserSettings()
                   ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
-  ASSERT_TRUE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                             GetProfile(0)->GetPrefs()));
 
   // There needs to be an existing tab for the second tab (the retrieval flow)
   // to be closeable via javascript.
@@ -1115,8 +1109,6 @@
   ASSERT_FALSE(GetSyncService(0)
                    ->GetUserSettings()
                    ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
-  ASSERT_FALSE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                              GetProfile(0)->GetPrefs()));
 
   // Now mimic entering degraded recoverability state.
   GetSecurityDomainsServer()->RequirePublicKeyToAvoidRecoverabilityDegraded(
@@ -1392,10 +1384,6 @@
                    ->GetUserSettings()
                    ->IsTrustedVaultRecoverabilityDegraded());
   EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PASSWORDS));
-  EXPECT_FALSE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                              GetProfile(0)->GetPrefs()));
-  EXPECT_FALSE(ShouldShowTrustedVaultDegradedRecoverabilityError(
-      GetSyncService(0), GetProfile(0)->GetPrefs()));
   EXPECT_THAT(GetSyncStatusLabels(GetProfile(0)),
               StatusLabelsMatch(
                   SyncStatusMessageType::kSynced, IDS_SYNC_ACCOUNT_SYNCING,
@@ -1466,8 +1454,6 @@
                   ->GetUserSettings()
                   ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
   EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PASSWORDS));
-  EXPECT_TRUE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                             GetProfile(0)->GetPrefs()));
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -1482,8 +1468,6 @@
                   ->GetUserSettings()
                   ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
   ASSERT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PASSWORDS));
-  ASSERT_TRUE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                             GetProfile(0)->GetPrefs()));
 
   // There needs to be an existing tab for the second tab (the retrieval flow)
   // to be closeable via javascript.
@@ -1546,8 +1530,6 @@
                   ->GetUserSettings()
                   ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
   ASSERT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PASSWORDS));
-  ASSERT_TRUE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                             GetProfile(0)->GetPrefs()));
 
   // There needs to be an existing tab for the second tab (the retrieval flow)
   // to be closeable via javascript.
@@ -1631,8 +1613,6 @@
                   ->GetUserSettings()
                   ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
   ASSERT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PASSWORDS));
-  ASSERT_TRUE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                             GetProfile(0)->GetPrefs()));
 
   histogram_tester.ExpectUniqueSample("Sync.TrustedVaultErrorShownOnStartup",
                                       /*sample=*/true,
@@ -1698,8 +1678,6 @@
                    ->GetUserSettings()
                    ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
   ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PASSWORDS));
-  ASSERT_FALSE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                              GetProfile(0)->GetPrefs()));
 
   histogram_tester.ExpectUniqueSample("Sync.TrustedVaultErrorShownOnStartup",
                                       /*sample=*/false,
@@ -1736,16 +1714,15 @@
                                                              /*degraded=*/true)
                   .Wait());
 
-  EXPECT_TRUE(ShouldShowTrustedVaultDegradedRecoverabilityError(
-      GetSyncService(0), GetProfile(0)->GetPrefs()));
+  EXPECT_TRUE(GetSyncService(0)
+                  ->GetUserSettings()
+                  ->IsTrustedVaultRecoverabilityDegraded());
 
   ASSERT_THAT(GetSyncService(0)->GetUserSettings()->GetPassphraseType(),
               Eq(syncer::PassphraseType::kTrustedVaultPassphrase));
   ASSERT_FALSE(GetSyncService(0)
                    ->GetUserSettings()
                    ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
-  ASSERT_FALSE(ShouldShowSyncKeysMissingError(GetSyncService(0),
-                                              GetProfile(0)->GetPrefs()));
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
   // Verify the profile-menu error string.
@@ -1773,8 +1750,9 @@
   EXPECT_TRUE(TrustedVaultRecoverabilityDegradedStateChecker(GetSyncService(0),
                                                              /*degraded=*/false)
                   .Wait());
-  EXPECT_FALSE(ShouldShowTrustedVaultDegradedRecoverabilityError(
-      GetSyncService(0), GetProfile(0)->GetPrefs()));
+  EXPECT_FALSE(GetSyncService(0)
+                   ->GetUserSettings()
+                   ->IsTrustedVaultRecoverabilityDegraded());
   EXPECT_FALSE(GetSecurityDomainsServer()->IsRecoverabilityDegraded());
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
@@ -1915,8 +1893,9 @@
       /*last_key_version=*/GetSecurityDomainsServer()->GetCurrentEpoch());
   ASSERT_TRUE(SetupSync());
   ASSERT_FALSE(GetSecurityDomainsServer()->IsRecoverabilityDegraded());
-  ASSERT_FALSE(ShouldShowTrustedVaultDegradedRecoverabilityError(
-      GetSyncService(0), GetProfile(0)->GetPrefs()));
+  ASSERT_FALSE(GetSyncService(0)
+                   ->GetUserSettings()
+                   ->IsTrustedVaultRecoverabilityDegraded());
 
   // Mimic a server-side persistent auth error together with a degraded
   // recoverability, such as an account recovery flow that resets the account
diff --git a/chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_controller.cc b/chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_controller.cc
index e292fd5..7c67efa 100644
--- a/chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_controller.cc
+++ b/chrome/browser/touch_to_fill/password_manager/password_generation/android/touch_to_fill_password_generation_controller.cc
@@ -97,6 +97,7 @@
   frame_driver_->GeneratedPasswordAccepted(
       generation_element_data_.form_data,
       generation_element_data_.generation_element_id, password);
+  frame_driver_->FocusNextFieldAfterPasswords();
 }
 
 void TouchToFillPasswordGenerationController::OnGeneratedPasswordRejected() {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 7f0eee4..1425309 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4143,10 +4143,10 @@
       "webui/settings/settings_manage_profile_handler.h",
       "webui/settings/system_handler.cc",
       "webui/settings/system_handler.h",
-      "webui/signin/enterprise_profile_welcome_handler.cc",
-      "webui/signin/enterprise_profile_welcome_handler.h",
-      "webui/signin/enterprise_profile_welcome_ui.cc",
-      "webui/signin/enterprise_profile_welcome_ui.h",
+      "webui/signin/managed_user_profile_notice_handler.cc",
+      "webui/signin/managed_user_profile_notice_handler.h",
+      "webui/signin/managed_user_profile_notice_ui.cc",
+      "webui/signin/managed_user_profile_notice_ui.h",
       "webui/signin/profile_customization_handler.cc",
       "webui/signin/profile_customization_handler.h",
       "webui/signin/profile_customization_ui.cc",
diff --git a/chrome/browser/ui/passwords/password_generation_popup_controller_impl.cc b/chrome/browser/ui/passwords/password_generation_popup_controller_impl.cc
index d5917b4..5785775 100644
--- a/chrome/browser/ui/passwords/password_generation_popup_controller_impl.cc
+++ b/chrome/browser/ui/passwords/password_generation_popup_controller_impl.cc
@@ -258,8 +258,10 @@
   }
   // |this| can be destroyed here because GeneratedPasswordAccepted pops up
   // another UI and generates some event to close the dropdown.
-  if (weak_this)
+  if (weak_this) {
+    driver_->FocusNextFieldAfterPasswords();
     weak_this->HideImpl();
+  }
 }
 
 void PasswordGenerationPopupControllerImpl::Show(GenerationUIState state) {
diff --git a/chrome/browser/ui/passwords/password_generation_popup_controller_impl_unittest.cc b/chrome/browser/ui/passwords/password_generation_popup_controller_impl_unittest.cc
index ca607f68..893813c9 100644
--- a/chrome/browser/ui/passwords/password_generation_popup_controller_impl_unittest.cc
+++ b/chrome/browser/ui/passwords/password_generation_popup_controller_impl_unittest.cc
@@ -24,6 +24,11 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/rect_f.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "base/test/scoped_feature_list.h"
+#include "components/password_manager/core/browser/features/password_features.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 namespace password_manager {
 
 namespace {
@@ -62,6 +67,7 @@
               (const std::u16string& password),
               (override));
   MOCK_METHOD(void, ClearPreviewedForm, (), (override));
+  MOCK_METHOD(void, FocusNextFieldAfterPasswords, (), (override));
 };
 
 class MockPasswordGenerationPopupView : public PasswordGenerationPopupView {
@@ -281,4 +287,54 @@
   controller->Hide(autofill::PopupHidingReason::kViewDestroyed);
 }
 
+#if !BUILDFLAG(IS_ANDROID)
+TEST_F(PasswordGenerationPopupControllerImplTest,
+       AdvancesFieldFocusOnUseStrongPassword) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitWithFeaturesAndParameters(
+      {{password_manager::features::kPasswordGenerationExperiment,
+        {{"password_generation_variation", "edit_password"}}}},
+      {});
+
+  PasswordGenerationUIData ui_data{CreatePasswordGenerationUIData()};
+  auto driver = CreateDriver();
+  std::unique_ptr<content::WebContents> web_contents = CreateTestWebContents();
+  base::WeakPtr<PasswordGenerationPopupController> controller =
+      PasswordGenerationPopupControllerImpl::GetOrCreate(
+          /*previous=*/nullptr, ui_data.bounds, ui_data, driver->AsWeakPtr(),
+          /*observer=*/nullptr, web_contents.get(), main_rfh());
+
+  EXPECT_CALL(*driver,
+              GeneratedPasswordAccepted(_, autofill::FieldRendererId(100), _));
+  EXPECT_CALL(*driver, FocusNextFieldAfterPasswords);
+  controller->PasswordAccepted();
+}
+
+TEST_F(PasswordGenerationPopupControllerImplTest,
+       DoesNotAdvanceFieldFocusOnEditPassword) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitWithFeaturesAndParameters(
+      {{password_manager::features::kPasswordGenerationExperiment,
+        {{"password_generation_variation", "edit_password"}}}},
+      {});
+
+  PasswordGenerationUIData ui_data{CreatePasswordGenerationUIData()};
+  auto driver = CreateDriver();
+  std::unique_ptr<content::WebContents> web_contents = CreateTestWebContents();
+  base::WeakPtr<PasswordGenerationPopupController> controller =
+      PasswordGenerationPopupControllerImpl::GetOrCreate(
+          /*previous=*/nullptr, ui_data.bounds, ui_data, driver->AsWeakPtr(),
+          /*observer=*/nullptr, web_contents.get(), main_rfh());
+  // EditPasswordClicked() below results in calling view->Show(), hence the need
+  // to use the mock.
+  static_cast<PasswordGenerationPopupControllerImpl*>(controller.get())
+      ->SetViewForTesting(popup_view());
+
+  EXPECT_CALL(*driver,
+              GeneratedPasswordAccepted(_, autofill::FieldRendererId(100), _));
+  EXPECT_CALL(*driver, FocusNextFieldAfterPasswords).Times(0);
+  controller->EditPasswordClicked();
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 }  // namespace password_manager
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter.cc b/chrome/browser/ui/passwords/settings/password_manager_porter.cc
index 00ee49b..20cceaa 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_porter.cc
+++ b/chrome/browser/ui/passwords/settings/password_manager_porter.cc
@@ -78,7 +78,8 @@
   }
 }
 
-bool PasswordManagerPorter::Export(content::WebContents* web_contents) {
+bool PasswordManagerPorter::Export(
+    base::WeakPtr<content::WebContents> web_contents) {
   if (exporter_ && exporter_->GetProgressStatus() ==
                        password_manager::ExportProgressStatus::kInProgress) {
     return false;
@@ -140,7 +141,7 @@
   import_results_callback_ = std::move(results_callback);
   to_store_ = to_store;
 
-  PresentFileSelector(web_contents,
+  PresentFileSelector(web_contents->GetWeakPtr(),
                       PasswordManagerPorter::Type::PASSWORD_IMPORT);
 }
 
@@ -195,7 +196,7 @@
 }
 
 void PasswordManagerPorter::PresentFileSelector(
-    content::WebContents* web_contents,
+    base::WeakPtr<content::WebContents> web_contents,
     Type type) {
 // This method should never be called on Android (as there is no file selector),
 // and the relevant IDS constants are not present for Android.
@@ -204,7 +205,7 @@
   if (select_file_dialog_)
     return;
 
-  DCHECK(web_contents);
+  CHECK(web_contents);
 
   // Get the default file extension for password files.
   ui::SelectFileDialog::FileTypeInfo file_type_info;
@@ -215,7 +216,7 @@
 
   // Present the file selector dialogue.
   select_file_dialog_ = ui::SelectFileDialog::Create(
-      this, std::make_unique<ChromeSelectFilePolicy>(web_contents));
+      this, std::make_unique<ChromeSelectFilePolicy>(web_contents.get()));
 
   ui::SelectFileDialog::Type file_selector_mode =
       ui::SelectFileDialog::SELECT_NONE;
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter.h b/chrome/browser/ui/passwords/settings/password_manager_porter.h
index ac6e1680..9174c54 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_porter.h
+++ b/chrome/browser/ui/passwords/settings/password_manager_porter.h
@@ -43,7 +43,7 @@
   ~PasswordManagerPorter() override;
 
   // PasswordManagerPorterInterface:
-  bool Export(content::WebContents* web_contents) override;
+  bool Export(base::WeakPtr<content::WebContents> web_contents) override;
   void CancelExport() override;
   password_manager::ExportProgressStatus GetExportProgressStatus() override;
   void Import(content::WebContents* web_contents,
@@ -69,7 +69,8 @@
 
   // Display the file-picker dialogue for either importing or exporting
   // passwords.
-  void PresentFileSelector(content::WebContents* web_contents, Type type);
+  void PresentFileSelector(base::WeakPtr<content::WebContents> web_contents,
+                           Type type);
 
   // Callback from the file selector dialogue when a file has been picked (for
   // either import or export).
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter_interface.h b/chrome/browser/ui/passwords/settings/password_manager_porter_interface.h
index 2940c20..086dc62 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_porter_interface.h
+++ b/chrome/browser/ui/passwords/settings/password_manager_porter_interface.h
@@ -23,7 +23,7 @@
   virtual ~PasswordManagerPorterInterface() = default;
 
   // Triggers passwords export flow for the given |web_contents|.
-  virtual bool Export(content::WebContents* web_contents) = 0;
+  virtual bool Export(base::WeakPtr<content::WebContents> web_contents) = 0;
 
   virtual void CancelExport() = 0;
 
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc b/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc
index ccbea89..cfb53800 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc
+++ b/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc
@@ -298,7 +298,7 @@
               SetDestination(temp_file_path()));
 
   porter().SetExporterForTesting(std::move(mock_password_manager_exporter_));
-  porter().Export(web_contents());
+  porter().Export(web_contents()->GetWeakPtr());
 }
 
 TEST_F(PasswordManagerPorterTest, CancelExportFileSelection) {
@@ -312,7 +312,7 @@
   EXPECT_CALL(*mock_password_manager_exporter_, Cancel());
 
   porter().SetExporterForTesting(std::move(mock_password_manager_exporter_));
-  porter().Export(web_contents());
+  porter().Export(web_contents()->GetWeakPtr());
 }
 
 TEST_F(PasswordManagerPorterTest, CancelExport) {
@@ -324,7 +324,7 @@
   EXPECT_CALL(*mock_password_manager_exporter_, Cancel());
 
   porter().SetExporterForTesting(std::move(mock_password_manager_exporter_));
-  porter().Export(web_contents());
+  porter().Export(web_contents()->GetWeakPtr());
   porter().CancelExport();
 }
 
diff --git a/chrome/browser/ui/profiles/profile_picker.h b/chrome/browser/ui/profiles/profile_picker.h
index 3339d20..882ec3f 100644
--- a/chrome/browser/ui/profiles/profile_picker.h
+++ b/chrome/browser/ui/profiles/profile_picker.h
@@ -7,11 +7,11 @@
 
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
+#include "base/functional/callback.h"
 #include "base/functional/callback_forward.h"
 #include "base/time/time.h"
 #include "build/buildflag.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
diff --git a/chrome/browser/ui/profiles/profile_ui_test_utils.h b/chrome/browser/ui/profiles/profile_ui_test_utils.h
index 3cc22e9..f95b8ebd 100644
--- a/chrome/browser/ui/profiles/profile_ui_test_utils.h
+++ b/chrome/browser/ui/profiles/profile_ui_test_utils.h
@@ -8,14 +8,14 @@
 #include "base/files/file_path.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 #include "url/gurl.h"
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #endif
 
-class EnterpriseProfileWelcomeHandler;
+class ManagedUserProfileNoticeHandler;
 
 // This file contains helper functions for testing profile UIs, in particular,
 // the profile picker.
@@ -45,16 +45,17 @@
 // Waits until the picker gets closed.
 void WaitForPickerClosed();
 
-// Checks that the profile picker is currently displaying a welcome screen of
-// type `expected_type` and returns the handler associated with it.
-EnterpriseProfileWelcomeHandler* ExpectPickerWelcomeScreenType(
-    EnterpriseProfileWelcomeUI::ScreenType expected_type);
+// Checks that the profile picker is currently displaying a managed user
+// notice screen of type `expected_type` and returns the handler
+// associated with it.
+ManagedUserProfileNoticeHandler* ExpectPickerManagedUserNoticeScreenType(
+    ManagedUserProfileNoticeUI::ScreenType expected_type);
 
-// Checks that the profile picker is currently displaying a welcome screen of
+// Checks that the profile picker is currently displaying a notice screen of
 // type `expected_type` and performs the user action represented by `choice` on
 // that screen.
-void ExpectPickerWelcomeScreenTypeAndProceed(
-    EnterpriseProfileWelcomeUI::ScreenType expected_type,
+void ExpectPickerManagedUserNoticeScreenTypeAndProceed(
+    ManagedUserProfileNoticeUI::ScreenType expected_type,
     signin::SigninChoice choice);
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/signin/signin_view_controller_interactive_uitest.cc b/chrome/browser/ui/signin/signin_view_controller_interactive_uitest.cc
index 78b1c8e..32a9937 100644
--- a/chrome/browser/ui/signin/signin_view_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/signin/signin_view_controller_interactive_uitest.cc
@@ -18,7 +18,6 @@
 #include "chrome/browser/ui/signin/signin_view_controller.h"
 #include "chrome/browser/ui/signin/signin_view_controller_delegate.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "chrome/browser/ui/webui/signin/login_ui_test_utils.h"
diff --git a/chrome/browser/ui/views/profiles/first_run_flow_controller_lacros.cc b/chrome/browser/ui/views/profiles/first_run_flow_controller_lacros.cc
index d5abf20..a2c85d76 100644
--- a/chrome/browser/ui/views/profiles/first_run_flow_controller_lacros.cc
+++ b/chrome/browser/ui/views/profiles/first_run_flow_controller_lacros.cc
@@ -128,7 +128,7 @@
   }
 
   void SwitchToEnterpriseProfileWelcome(
-      EnterpriseProfileWelcomeUI::ScreenType type,
+      ManagedUserProfileNoticeUI::ScreenType type,
       signin::SigninChoiceCallback proceed_callback) override {
     NOTREACHED();
   }
diff --git a/chrome/browser/ui/views/profiles/enterprise_profile_welcome_ui_browsertest.cc b/chrome/browser/ui/views/profiles/managed_user_profile_notice_ui_browsertest.cc
similarity index 83%
rename from chrome/browser/ui/views/profiles/enterprise_profile_welcome_ui_browsertest.cc
rename to chrome/browser/ui/views/profiles/managed_user_profile_notice_ui_browsertest.cc
index 7de7a87..cb913c86 100644
--- a/chrome/browser/ui/views/profiles/enterprise_profile_welcome_ui_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/managed_user_profile_notice_ui_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/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 
 #include <memory>
 
@@ -32,7 +32,7 @@
 // and not in the webui directory because they manipulate views.
 
 namespace {
-struct EnterpriseWelcomeTestParam {
+struct ManagedUserNoticeTestParam {
   PixelTestParam pixel_test_param;
   bool profile_creation_required_by_policy = false;
   bool show_link_data_checkbox = false;
@@ -42,12 +42,12 @@
 // to be named like `<TestClassName>.InvokeUi_default/<TestSuffix>` instead
 // of using the index of the param in `TestParam` as suffix.
 std::string ParamToTestSuffix(
-    const ::testing::TestParamInfo<EnterpriseWelcomeTestParam>& info) {
+    const ::testing::TestParamInfo<ManagedUserNoticeTestParam>& info) {
   return info.param.pixel_test_param.test_suffix;
 }
 
 // Permutations of supported parameters.
-const EnterpriseWelcomeTestParam kWindowTestParams[] = {
+const ManagedUserNoticeTestParam kWindowTestParams[] = {
     {.pixel_test_param = {.test_suffix = "Regular"}},
     {.pixel_test_param = {.test_suffix = "DarkTheme", .use_dark_theme = true}},
     {.pixel_test_param = {.test_suffix = "Rtl",
@@ -58,7 +58,7 @@
                           .use_chrome_refresh_2023_style = true}},
 };
 
-const EnterpriseWelcomeTestParam kDialogTestParams[] = {
+const ManagedUserNoticeTestParam kDialogTestParams[] = {
     {.pixel_test_param = {.test_suffix = "Regular"}},
     {.pixel_test_param = {.test_suffix = "WithLinkDataCheckbox"},
      .show_link_data_checkbox = true},
@@ -74,43 +74,43 @@
 };
 
 // Creates a step to represent the enterprise-profile-welcome
-class EnterpriseWelcomeStepControllerForTest
+class ManagedUserNoticeStepControllerForTest
     : public ProfileManagementStepController {
  public:
-  explicit EnterpriseWelcomeStepControllerForTest(
+  explicit ManagedUserNoticeStepControllerForTest(
       ProfilePickerWebContentsHost* host,
       Profile* profile,
       const AccountInfo& account_info)
       : ProfileManagementStepController(host),
-        enterprise_welcome_url_(
+        managed_user_notice_url_(
             GURL(chrome::kChromeUIEnterpriseProfileWelcomeURL)),
         profile_(profile),
         account_info_(&account_info) {}
 
-  ~EnterpriseWelcomeStepControllerForTest() override = default;
+  ~ManagedUserNoticeStepControllerForTest() override = default;
 
   void Show(StepSwitchFinishedCallback step_shown_callback,
             bool reset_state) override {
     // Reload the WebUI in the picker contents.
     host()->ShowScreenInPickerContents(
-        enterprise_welcome_url_,
+        managed_user_notice_url_,
         base::BindOnce(
-            &EnterpriseWelcomeStepControllerForTest::OnEnterpriseWelcomeLoaded,
+            &ManagedUserNoticeStepControllerForTest::OnManagedUserNoticeLoaded,
             weak_ptr_factory_.GetWeakPtr(), std::move(step_shown_callback)));
   }
 
   void OnNavigateBackRequested() override { NOTREACHED_NORETURN(); }
 
-  void OnEnterpriseWelcomeLoaded(
+  void OnManagedUserNoticeLoaded(
       StepSwitchFinishedCallback step_shown_callback) {
     DCHECK(profile_);
     DCHECK(account_info_);
-    auto* enterprise_welcome_ui = static_cast<EnterpriseProfileWelcomeUI*>(
+    auto* managed_user_notice_ui = static_cast<ManagedUserProfileNoticeUI*>(
         host()->GetPickerContents()->GetWebUI()->GetController());
 
-    enterprise_welcome_ui->Initialize(
+    managed_user_notice_ui->Initialize(
         /*browser=*/nullptr,
-        EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled,
+        ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled,
         *account_info_, /*profile_creation_required_by_policy=*/false,
         /*show_link_data_option=*/false,
         /*proceed_callback*/ base::DoNothing());
@@ -121,19 +121,19 @@
   }
 
  private:
-  const GURL enterprise_welcome_url_;
+  const GURL managed_user_notice_url_;
   raw_ptr<Profile> profile_;
   raw_ptr<const AccountInfo> account_info_;
-  base::WeakPtrFactory<EnterpriseWelcomeStepControllerForTest>
+  base::WeakPtrFactory<ManagedUserNoticeStepControllerForTest>
       weak_ptr_factory_{this};
 };
 }  // namespace
 
-class EnterpriseWelcomeUIWindowPixelTest
+class ManagedUserNoticeUIWindowPixelTest
     : public ProfilesPixelTestBaseT<UiBrowserTest>,
-      public testing::WithParamInterface<EnterpriseWelcomeTestParam> {
+      public testing::WithParamInterface<ManagedUserNoticeTestParam> {
  public:
-  EnterpriseWelcomeUIWindowPixelTest()
+  ManagedUserNoticeUIWindowPixelTest()
       : ProfilesPixelTestBaseT<UiBrowserTest>(GetParam().pixel_test_param) {}
 
   void ShowUi(const std::string& name) override {
@@ -151,7 +151,7 @@
         base::BindLambdaForTesting(
             [this, &account_info](ProfilePickerWebContentsHost* host)
                 -> std::unique_ptr<ProfileManagementStepController> {
-              return std::make_unique<EnterpriseWelcomeStepControllerForTest>(
+              return std::make_unique<ManagedUserNoticeStepControllerForTest>(
                   host, browser()->profile(), account_info);
             }));
     profile_picker_view_->ShowAndWait(
@@ -167,7 +167,7 @@
     const std::string screenshot_name =
         base::StrCat({test_info->test_case_name(), "_", test_info->name()});
 
-    return VerifyPixelUi(widget, "EnterpriseWelcomeUIWindowPixelTest",
+    return VerifyPixelUi(widget, "ManagedUserProfileNoticeUIWindowPixelTest",
                          screenshot_name) != ui::test::ActionResult::kFailed;
   }
 
@@ -185,24 +185,24 @@
       profile_picker_view_;
 };
 
-IN_PROC_BROWSER_TEST_P(EnterpriseWelcomeUIWindowPixelTest, InvokeUi_default) {
+IN_PROC_BROWSER_TEST_P(ManagedUserNoticeUIWindowPixelTest, InvokeUi_default) {
   ShowAndVerifyUi();
 }
 
 INSTANTIATE_TEST_SUITE_P(,
-                         EnterpriseWelcomeUIWindowPixelTest,
+                         ManagedUserNoticeUIWindowPixelTest,
                          testing::ValuesIn(kWindowTestParams),
                          &ParamToTestSuffix);
 
-class EnterpriseWelcomeUIDialogPixelTest
+class ManagedUserNoticeUIDialogPixelTest
     : public ProfilesPixelTestBaseT<DialogBrowserTest>,
-      public testing::WithParamInterface<EnterpriseWelcomeTestParam> {
+      public testing::WithParamInterface<ManagedUserNoticeTestParam> {
  public:
-  EnterpriseWelcomeUIDialogPixelTest()
+  ManagedUserNoticeUIDialogPixelTest()
       : ProfilesPixelTestBaseT<DialogBrowserTest>(GetParam().pixel_test_param) {
   }
 
-  ~EnterpriseWelcomeUIDialogPixelTest() override = default;
+  ~ManagedUserNoticeUIDialogPixelTest() override = default;
 
   void ShowUi(const std::string& name) override {
     DCHECK(browser());
@@ -239,12 +239,12 @@
 #else
 #define MAYBE_InvokeUi_default InvokeUi_default
 #endif
-IN_PROC_BROWSER_TEST_P(EnterpriseWelcomeUIDialogPixelTest,
+IN_PROC_BROWSER_TEST_P(ManagedUserNoticeUIDialogPixelTest,
                        MAYBE_InvokeUi_default) {
   ShowAndVerifyUi();
 }
 
 INSTANTIATE_TEST_SUITE_P(,
-                         EnterpriseWelcomeUIDialogPixelTest,
+                         ManagedUserNoticeUIDialogPixelTest,
                          testing::ValuesIn(kDialogTestParams),
                          &ParamToTestSuffix);
diff --git a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc
index ee444ed..8674a2b 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc
@@ -93,7 +93,7 @@
 }
 
 void ProfilePickerSignedInFlowController::SwitchToEnterpriseProfileWelcome(
-    EnterpriseProfileWelcomeUI::ScreenType type,
+    ManagedUserProfileNoticeUI::ScreenType type,
     signin::SigninChoiceCallback proceed_callback) {
   DCHECK(IsInitialized());
   host_->ShowScreen(contents(),
@@ -171,17 +171,17 @@
 
 void ProfilePickerSignedInFlowController::
     SwitchToEnterpriseProfileWelcomeFinished(
-        EnterpriseProfileWelcomeUI::ScreenType type,
+        ManagedUserProfileNoticeUI::ScreenType type,
         signin::SigninChoiceCallback proceed_callback) {
   DCHECK(IsInitialized());
   // Initialize the WebUI page once we know it's committed.
-  EnterpriseProfileWelcomeUI* enterprise_profile_welcome_ui =
+  ManagedUserProfileNoticeUI* managed_user_profile_notice_ui =
       contents()
           ->GetWebUI()
           ->GetController()
-          ->GetAs<EnterpriseProfileWelcomeUI>();
+          ->GetAs<ManagedUserProfileNoticeUI>();
 
-  enterprise_profile_welcome_ui->Initialize(
+  managed_user_profile_notice_ui->Initialize(
       /*browser=*/nullptr, type,
       IdentityManagerFactory::GetForProfile(profile_)
           ->FindExtendedAccountInfoByEmailAddress(email_),
diff --git a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h
index 3c128a2a..5da8011 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h
+++ b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h
@@ -11,7 +11,7 @@
 #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h"
 #include "chrome/browser/ui/views/profiles/profile_management_types.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
 #include "components/signin/public/base/signin_metrics.h"
 #include "components/signin/public/identity_manager/account_info.h"
@@ -73,7 +73,7 @@
   // Finishes the sign-in process by moving to the enterprise profile welcome
   // screen.
   virtual void SwitchToEnterpriseProfileWelcome(
-      EnterpriseProfileWelcomeUI::ScreenType type,
+      ManagedUserProfileNoticeUI::ScreenType type,
       signin::SigninChoiceCallback proceed_callback);
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -121,7 +121,7 @@
   // Callbacks that finalize initialization of WebUI pages.
   void SwitchToSyncConfirmationFinished();
   void SwitchToEnterpriseProfileWelcomeFinished(
-      EnterpriseProfileWelcomeUI::ScreenType type,
+      ManagedUserProfileNoticeUI::ScreenType type,
       signin::SigninChoiceCallback proceed_callback);
 
   // Returns whether the flow is initialized (i.e. whether `Init()` has been
diff --git a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc
index a66200db..9f1bced 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc
@@ -126,7 +126,7 @@
     signin::SigninChoiceCallback callback) {
   enterprise_account_ = true;
   // In this flow, the enterprise confirmation is replaced by an enterprise
-  // welcome screen. Knowing if sync is enabled is needed for the screen. Thus,
+  // notice screen. Knowing if sync is enabled is needed for the screen. Thus,
   // it is delayed until either ShowSyncConfirmation() or
   // ShowSyncDisabledConfirmation() gets called.
   // Assume an implicit "Continue" here.
@@ -151,10 +151,10 @@
   }
 #endif
   if (enterprise_account_) {
-    // First show the welcome screen and only after that (if the user proceeds
+    // First show the notice screen and only after that (if the user proceeds
     // with the flow) the sync consent.
-    ShowEnterpriseWelcome(
-        EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled);
+    ShowManagedUserNotice(
+        ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled);
     return;
   }
 
@@ -182,10 +182,10 @@
   sync_disabled_ = true;
 
   sync_confirmation_callback_ = std::move(callback);
-  ShowEnterpriseWelcome(is_managed_account
-                            ? EnterpriseProfileWelcomeUI::ScreenType::
+  ShowManagedUserNotice(is_managed_account
+                            ? ManagedUserProfileNoticeUI::ScreenType::
                                   kEntepriseAccountSyncDisabled
-                            : EnterpriseProfileWelcomeUI::ScreenType::
+                            : ManagedUserProfileNoticeUI::ScreenType::
                                   kConsumerAccountSyncDisabled);
 }
 
@@ -253,15 +253,15 @@
   std::move(sync_confirmation_callback_).Run(result);
 }
 
-void ProfilePickerTurnSyncOnDelegate::ShowEnterpriseWelcome(
-    EnterpriseProfileWelcomeUI::ScreenType type) {
+void ProfilePickerTurnSyncOnDelegate::ShowManagedUserNotice(
+    ManagedUserProfileNoticeUI::ScreenType type) {
   DCHECK(sync_confirmation_callback_);
   // Unretained as the delegate lives until `sync_confirmation_callback_` gets
-  // called and thus always outlives the enterprise screen.
+  // called and thus always outlives the notice screen.
   if (controller_) {
     controller_->SwitchToEnterpriseProfileWelcome(
         type, base::BindOnce(
-                  &ProfilePickerTurnSyncOnDelegate::OnEnterpriseWelcomeClosed,
+                  &ProfilePickerTurnSyncOnDelegate::OnManagedUserNoticeClosed,
                   base::Unretained(this), type));
   }
 }
@@ -279,8 +279,8 @@
   ProfilePicker::CancelSignedInFlow();
 }
 
-void ProfilePickerTurnSyncOnDelegate::OnEnterpriseWelcomeClosed(
-    EnterpriseProfileWelcomeUI::ScreenType type,
+void ProfilePickerTurnSyncOnDelegate::OnManagedUserNoticeClosed(
+    ManagedUserProfileNoticeUI::ScreenType type,
     signin::SigninChoice choice) {
   if (choice == signin::SIGNIN_CHOICE_CANCEL) {
     HandleCancelSigninChoice(ProfileMetrics::ProfileSignedInFlowOutcome::
@@ -293,11 +293,11 @@
   DCHECK_EQ(choice, signin::SIGNIN_CHOICE_NEW_PROFILE);
 
   switch (type) {
-    case EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled:
+    case ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled:
       ShowSyncConfirmationScreen();
       return;
-    case EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncDisabled:
-    case EnterpriseProfileWelcomeUI::ScreenType::kConsumerAccountSyncDisabled:
+    case ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncDisabled:
+    case ManagedUserProfileNoticeUI::ScreenType::kConsumerAccountSyncDisabled:
       // Logging kEnterpriseSyncDisabled for consumer accounts on managed
       // devices is a pre-existing minor imprecision in reporting of this metric
       // that's not worth fixing.
@@ -309,10 +309,10 @@
       // entries to better match the situation.
       FinishSyncConfirmation(LoginUIService::SYNC_WITH_DEFAULT_SETTINGS);
       break;
-    case EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation:
+    case ManagedUserProfileNoticeUI::ScreenType::kEnterpriseAccountCreation:
       NOTREACHED_NORETURN()
-          << "The profile picker should not show an enterprise "
-             "welcome that prompts for profile creation";
+          << "The profile picker should not show a managed user "
+             "notice that prompts for profile creation";
   }
 }
 
diff --git a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h
index ddb0e46f..44da6b7 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h
+++ b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h
@@ -11,8 +11,8 @@
 #include "chrome/browser/profiles/profile_metrics.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_view.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 #include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 
 class Profile;
@@ -65,9 +65,9 @@
   void FinishSyncConfirmation(
       LoginUIService::SyncConfirmationUIClosedResult result);
 
-  // Shows the enterprise welcome screen.
-  void ShowEnterpriseWelcome(EnterpriseProfileWelcomeUI::ScreenType type);
-  void OnEnterpriseWelcomeClosed(EnterpriseProfileWelcomeUI::ScreenType type,
+  // Shows the managed user notice screen.
+  void ShowManagedUserNotice(ManagedUserProfileNoticeUI::ScreenType type);
+  void OnManagedUserNoticeClosed(ManagedUserProfileNoticeUI::ScreenType type,
                                  signin::SigninChoice choice);
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
index 188de26f..95082bb 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -64,10 +64,10 @@
 #include "chrome/browser/ui/views/profiles/avatar_toolbar_button.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_test_base.h"
 #include "chrome/browser/ui/views/user_education/browser_feature_promo_controller.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 #include "chrome/browser/ui/webui/signin/profile_customization_handler.h"
 #include "chrome/browser/ui/webui/signin/profile_customization_ui.h"
 #include "chrome/browser/ui/webui/signin/profile_picker_handler.h"
@@ -2089,7 +2089,7 @@
                        CreateSignedInProfile) {
   ASSERT_EQ(1u, BrowserList::GetInstance()->size());
   // Simulate a successful sign-in and wait for the sign-in to propagate to the
-  // flow, resulting in enterprise welcome screen getting displayed.
+  // flow, resulting in managed user notice screen getting displayed.
   // Consumer-looking gmail address avoids code that forces the sync service to
   // actually start which would add overhead in mocking further stuff.
   // Enterprise domain needed for this profile being detected as Work.
@@ -2097,9 +2097,9 @@
       SignInForNewProfile(GURL("chrome://enterprise-profile-welcome/"),
                           "joe.enterprise@gmail.com", "Joe", "enterprise.com");
 
-  profiles::testing::ExpectPickerWelcomeScreenTypeAndProceed(
+  profiles::testing::ExpectPickerManagedUserNoticeScreenTypeAndProceed(
       /*expected_type=*/
-      EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled,
+      ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled,
       /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE);
 
   WaitForLoadStop(GetSyncConfirmationURL());
@@ -2156,13 +2156,13 @@
   FinishDiceSignIn(profile_being_created, "joe.enterprise@gmail.com", "Joe",
                    "enterprise.com");
 
-  // Wait for the sign-in to propagate to the flow, resulting in enterprise
-  // welcome screen getting displayed.
+  // Wait for the sign-in to propagate to the flow, resulting in managed user
+  // notice screen getting displayed.
   WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/"));
 
-  profiles::testing::ExpectPickerWelcomeScreenTypeAndProceed(
+  profiles::testing::ExpectPickerManagedUserNoticeScreenTypeAndProceed(
       /*expected_type=*/
-      EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncDisabled,
+      ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncDisabled,
       /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE);
 
   Browser* new_browser = BrowserAddedWaiter(2u).Wait();
@@ -2207,7 +2207,7 @@
                        MAYBE_CreateSignedInEnterpriseProfileSettings) {
   ASSERT_EQ(1u, BrowserList::GetInstance()->size());
   // Simulate a successful sign-in and wait for the sign-in to propagate to the
-  // flow, resulting in enterprise welcome screen getting displayed.
+  // flow, resulting in managed user notice screen getting displayed.
   // Consumer-looking gmail address avoids code that forces the sync service to
   // actually start which would add overhead in mocking further stuff.
   // Enterprise domain needed for this profile being detected as Work.
@@ -2215,13 +2215,13 @@
       SignInForNewProfile(GURL("chrome://enterprise-profile-welcome/"),
                           "joe.enterprise@gmail.com", "Joe", "enterprise.com");
 
-  // Wait for the sign-in to propagate to the flow, resulting in enterprise
-  // welcome screen getting displayed.
+  // Wait for the sign-in to propagate to the flow, resulting in managed user
+  // notice screen getting displayed.
   WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/"));
 
-  profiles::testing::ExpectPickerWelcomeScreenTypeAndProceed(
+  profiles::testing::ExpectPickerManagedUserNoticeScreenTypeAndProceed(
       /*expected_type=*/
-      EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled,
+      ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled,
       /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE);
 
   WaitForLoadStop(GetSyncConfirmationURL());
@@ -2266,7 +2266,7 @@
 IN_PROC_BROWSER_TEST_F(ProfilePickerEnterpriseCreationFlowBrowserTest, Cancel) {
   ASSERT_EQ(1u, BrowserList::GetInstance()->size());
   // Simulate a successful sign-in and wait for the sign-in to propagate to the
-  // flow, resulting in enterprise welcome screen getting displayed.
+  // flow, resulting in managed user notice screen getting displayed.
   // Consumer-looking gmail address avoids code that forces the sync service to
   // actually start which would add overhead in mocking further stuff.
   // Enterprise domain needed for this profile being detected as Work.
@@ -2275,14 +2275,14 @@
                           "joe.enterprise@gmail.com", "Joe", "enterprise.com");
   base::FilePath profile_being_created_path = profile_being_created->GetPath();
 
-  // Wait for the sign-in to propagate to the flow, resulting in enterprise
-  // welcome screen getting displayed.
+  // Wait for the sign-in to propagate to the flow, resulting in managed user
+  // notice screen getting displayed.
   WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/"));
 
   ProfileDeletionObserver observer;
-  profiles::testing::ExpectPickerWelcomeScreenTypeAndProceed(
+  profiles::testing::ExpectPickerManagedUserNoticeScreenTypeAndProceed(
       /*expected_type=*/
-      EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled,
+      ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled,
       /*choice=*/signin::SIGNIN_CHOICE_CANCEL);
 
   // As the profile creation flow was opened directly, the window is closed now.
@@ -2302,7 +2302,7 @@
   ASSERT_EQ(1u, BrowserList::GetInstance()->size());
 
   // Simulate a successful sign-in and wait for the sign-in to propagate to the
-  // flow, resulting in enterprise welcome screen getting displayed.
+  // flow, resulting in managed user notice screen getting displayed.
   // Consumer-looking gmail address avoids code that forces the sync service to
   // actually start which would add overhead in mocking further stuff.
   // Enterprise domain needed for this profile being detected as Work.
@@ -2311,14 +2311,14 @@
       "Joe", "enterprise.com", /*start_on_management_page=*/true);
   base::FilePath profile_being_created_path = profile_being_created->GetPath();
 
-  // Wait for the sign-in to propagate to the flow, resulting in enterprise
-  // welcome screen getting displayed.
+  // Wait for the sign-in to propagate to the flow, resulting in managed user
+  // notice screen getting displayed.
   WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/"));
 
   ProfileDeletionObserver observer;
-  profiles::testing::ExpectPickerWelcomeScreenTypeAndProceed(
+  profiles::testing::ExpectPickerManagedUserNoticeScreenTypeAndProceed(
       /*expected_type=*/
-      EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled,
+      ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled,
       /*choice=*/signin::SIGNIN_CHOICE_CANCEL);
 
   // As the management page was opened, the picker returns to it.
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.cc b/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.cc
index d72e1b3..c8848e83d 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.cc
@@ -17,8 +17,8 @@
 #include "chrome/browser/ui/views/profiles/profile_management_step_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_view.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_view_test_utils.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/browser/web_contents.h"
@@ -311,25 +311,25 @@
   }
 }
 
-EnterpriseProfileWelcomeHandler* ExpectPickerWelcomeScreenType(
-    EnterpriseProfileWelcomeUI::ScreenType expected_type) {
+ManagedUserProfileNoticeHandler* ExpectPickerNoticeScreenType(
+    ManagedUserProfileNoticeUI::ScreenType expected_type) {
   content::WebContents* web_contents = GetPickerWebContents();
   EXPECT_TRUE(web_contents);
-  EnterpriseProfileWelcomeHandler* handler =
+  ManagedUserProfileNoticeHandler* handler =
       web_contents->GetWebUI()
           ->GetController()
-          ->GetAs<EnterpriseProfileWelcomeUI>()
+          ->GetAs<ManagedUserProfileNoticeUI>()
           ->GetHandlerForTesting();
   EXPECT_TRUE(handler);
   EXPECT_EQ(handler->GetTypeForTesting(), expected_type);
   return handler;
 }
 
-void ExpectPickerWelcomeScreenTypeAndProceed(
-    EnterpriseProfileWelcomeUI::ScreenType expected_type,
+void ExpectPickerManagedUserNoticeScreenTypeAndProceed(
+    ManagedUserProfileNoticeUI::ScreenType expected_type,
     signin::SigninChoice choice) {
-  EnterpriseProfileWelcomeHandler* handler =
-      ExpectPickerWelcomeScreenType(expected_type);
+  ManagedUserProfileNoticeHandler* handler =
+      ExpectPickerNoticeScreenType(expected_type);
 
   // Simulate clicking on the next button.
   handler->CallProceedCallbackForTesting(choice);
diff --git a/chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h b/chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h
index efbe7332..5b659b8 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h
+++ b/chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_WEB_CONTENTS_HOST_H_
 
 #include "base/functional/callback.h"
+#include "base/types/strong_alias.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/web_modal/web_contents_modal_dialog_host.h"
 
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
index fd559366..84b05b2 100644
--- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
+++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
@@ -196,15 +196,15 @@
       kEnterpriseConfirmationDialogHeight, kEnterpriseConfirmationDialogWidth,
       InitializeSigninWebDialogUI(false));
 
-  EnterpriseProfileWelcomeUI* web_dialog_ui =
+  ManagedUserProfileNoticeUI* web_dialog_ui =
       web_view->GetWebContents()
           ->GetWebUI()
           ->GetController()
-          ->GetAs<EnterpriseProfileWelcomeUI>();
+          ->GetAs<ManagedUserProfileNoticeUI>();
   DCHECK(web_dialog_ui);
   web_dialog_ui->Initialize(
       browser,
-      EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation,
+      ManagedUserProfileNoticeUI::ScreenType::kEnterpriseAccountCreation,
       account_info, profile_creation_required_by_policy, show_link_data_option,
       std::move(callback));
 
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h
index 5adc244..6c46678 100644
--- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h
+++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h
@@ -12,7 +12,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h"
 #include "chrome/browser/ui/signin/signin_view_controller_delegate.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "content/public/browser/web_contents_delegate.h"
diff --git a/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.cc b/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.cc
index 6faf6eb9..582dc7c 100644
--- a/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.cc
+++ b/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.cc
@@ -64,7 +64,8 @@
           base::BindRepeating(&PinnedActionToolbarButton::ButtonPressed,
                               base::Unretained(this)),
           CreateMenuModel(),
-          nullptr),
+          nullptr,
+          false),
       browser_(browser),
       action_item_(actions::ActionManager::Get().FindAction(
           action_id,
diff --git a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
index e4ea6583..c09fec4b 100644
--- a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
@@ -741,20 +741,16 @@
   signin_artifacts.sync_trusted_vault_keys =
       GetSyncTrustedVaultKeysForUserContext(sync_trusted_vault_keys, gaia_id);
 
-  // Clear collected passwords if a client certificate was used.
-  if (IsSamlUserPasswordless()) {
-    // In the passwordless case, the user data will be protected by non password
-    // based mechanisms. Clear anything that got collected into passwords.
+  // Special case when client certificates are used (SmartCard flow)
+  if (using_saml && ClientCertificatesWereUsed()) {
+    // Clear anything that got collected into passwords since the user data will
+    // be protected via the certificates instead.
     signin_artifacts.scraped_saml_passwords.reset();
     signin_artifacts.password.reset();
-  }
 
-  // Retrieve ChallengeResponseKey from client certificates. Show signin fatal
-  // error if there is an issue retrieving.
-  if (using_saml && IsSamlUserPasswordless()) {
+    // Try to extract the certificate. Failure to do so is fatal at this point.
     auto challenge_response_key_or_error = login::ExtractClientCertificates(
         *extension_provided_client_cert_usage_observer_);
-    // Signin Fatal Error
     if (!challenge_response_key_or_error.has_value()) {
       LoginDisplayHost::default_host()->GetSigninUI()->ShowSigninError(
           challenge_response_key_or_error.error(), /*details=*/std::string());
@@ -804,7 +800,7 @@
   }
 
   if (signin_artifacts.using_saml && !using_saml_api_ &&
-      !IsSamlUserPasswordless()) {
+      !signin_artifacts.challenge_response_key.has_value()) {
     RecordScrapedPasswordCount(
         signin_artifacts.scraped_saml_passwords.has_value()
             ? signin_artifacts.scraped_saml_passwords.value().size()
@@ -869,9 +865,10 @@
   signin_artifacts.cookies->TransferCookiesToUserContext(*user_context);
 
   // Finish the authentication
-  bool confirm_saml_password = signin_artifacts.using_saml &&
-                               !signin_artifacts.password.has_value() &&
-                               !IsSamlUserPasswordless();
+  bool confirm_saml_password =
+      signin_artifacts.using_saml && !signin_artifacts.password.has_value() &&
+      !signin_artifacts.challenge_response_key.has_value();
+
   bool need_password_gaia =
       !signin_artifacts.using_saml &&
       signin_artifacts.password.value_or(std::string()).empty() &&
@@ -1078,7 +1075,7 @@
   // Retrieve ChallengeResponseKey from client certificates. Show signin fatal
   // error if there is an issue retrieving.
   absl::optional<ChallengeResponseKey> challenge_response_key;
-  if (using_saml && IsSamlUserPasswordless()) {
+  if (using_saml && ClientCertificatesWereUsed()) {
     auto challenge_response_key_or_error = login::ExtractClientCertificates(
         *extension_provided_client_cert_usage_observer_);
     // Signin Fatal Error
@@ -1334,7 +1331,7 @@
                                 password_count, 11);
 }
 
-bool GaiaScreenHandler::IsSamlUserPasswordless() {
+bool GaiaScreenHandler::ClientCertificatesWereUsed() {
   return extension_provided_client_cert_usage_observer_ &&
          extension_provided_client_cert_usage_observer_->ClientCertsWereUsed();
 }
diff --git a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.h b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.h
index 70cff92..1199616a 100644
--- a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.h
+++ b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.h
@@ -330,7 +330,10 @@
   void SetSAMLPrincipalsAPIUsed(bool is_third_party_idp, bool is_api_used);
 
   void RecordScrapedPasswordCount(int password_count);
-  bool IsSamlUserPasswordless();
+
+  // True when client certificates were used during authentication. This is only
+  // used for SmartCards and only when using SAML.
+  bool ClientCertificatesWereUsed();
 
   // Shows signin screen after dns cache and cookie cleanup operations finish.
   void ShowGaiaScreenIfReady();
diff --git a/chrome/browser/ui/webui/ash/login/online_login_utils.h b/chrome/browser/ui/webui/ash/login/online_login_utils.h
index a101216..bbcb114 100644
--- a/chrome/browser/ui/webui/ash/login/online_login_utils.h
+++ b/chrome/browser/ui/webui/ash/login/online_login_utils.h
@@ -84,6 +84,7 @@
   absl::optional<::login::StringList> services_list;
   absl::optional<SamlPasswordAttributes> saml_password_attributes;
   absl::optional<SyncTrustedVaultKeys> sync_trusted_vault_keys;
+  // Client certificate data for SmartCard flows. Only for SAML.
   absl::optional<ChallengeResponseKey> challenge_response_key;
   absl::optional<GaiaCookiesData> cookies;
 };
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index a1168db..a0d1a47 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -222,7 +222,7 @@
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/ui/sync/sync_promo_ui.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 #include "chrome/browser/ui/webui/signin/profile_customization_ui.h"
 #include "chrome/browser/ui/webui/signin/profile_picker_ui.h"
 #include "chrome/browser/ui/webui/signin/signin_email_confirmation_ui.h"
@@ -685,8 +685,10 @@
   }
 #endif  // BUILDFLAG(IS_ANDROID)
 #if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_ANDROID)
+  // TODO(b/301931584): Rename url/host to naming pattern
+  // ManagedUserProfileNotice*.
   if (url.host_piece() == chrome::kChromeUIEnterpriseProfileWelcomeHost)
-    return &NewWebUI<EnterpriseProfileWelcomeUI>;
+    return &NewWebUI<ManagedUserProfileNoticeUI>;
   if (url.host_piece() == chrome::kChromeUIIntroHost &&
       base::FeatureList::IsEnabled(kForYouFre))
     return &NewWebUI<IntroUI>;
diff --git a/chrome/browser/ui/webui/password_manager/sync_handler.cc b/chrome/browser/ui/webui/password_manager/sync_handler.cc
index 7b3257f39..4795b91 100644
--- a/chrome/browser/ui/webui/password_manager/sync_handler.cc
+++ b/chrome/browser/ui/webui/password_manager/sync_handler.cc
@@ -91,15 +91,14 @@
     return dict;
   }
 
-  PrefService* pref_service = profile_->GetPrefs();
   syncer::UserSelectableTypeSet types =
       sync_service->GetUserSettings()->GetSelectedTypes();
 
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
   dict.Set("isEligibleForAccountStorage",
            (!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync) &&
-            (IsOptedInForAccountStorage(pref_service, sync_service) ||
-             ShouldShowAccountStorageOptIn(pref_service, sync_service))));
+            (IsOptedInForAccountStorage(sync_service) ||
+             ShouldShowAccountStorageOptIn(sync_service))));
   dict.Set("isSyncingPasswords",
            (sync_service->IsSyncFeatureEnabled() &&
             types.Has(syncer::UserSelectableType::kPasswords)));
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
index e50daed..6fb74d2f 100644
--- a/chrome/browser/ui/webui/settings/reset_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -33,7 +33,6 @@
 #include "ui/base/l10n/l10n_util.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/reset/metrics.h"
 #include "chrome/common/pref_names.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
@@ -117,12 +116,6 @@
       base::BindRepeating(
           &ResetSettingsHandler::HandleGetTriggeredResetToolName,
           base::Unretained(this)));
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterMessageCallback(
-      "onPowerwashDialogShow",
-      base::BindRepeating(&ResetSettingsHandler::OnShowPowerwashDialog,
-                          base::Unretained(this)));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
 void ResetSettingsHandler::HandleResetProfileSettings(
@@ -285,14 +278,4 @@
   ResolveJavascriptCallback(callback_id, string_value);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-void ResetSettingsHandler::OnShowPowerwashDialog(
-    const base::Value::List& args) {
-  UMA_HISTOGRAM_ENUMERATION(
-      "Reset.ChromeOS.PowerwashDialogShown",
-      ash::reset::DialogViewType::kFromOptions,
-      ash::reset::DialogViewType::kCount);
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.h b/chrome/browser/ui/webui/settings/reset_settings_handler.h
index 6adb5ab..96a56aa 100644
--- a/chrome/browser/ui/webui/settings/reset_settings_handler.h
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler.h
@@ -83,11 +83,6 @@
       bool send_feedback,
       reset_report::ChromeResetReport::ResetRequestOrigin request_origin);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  // Will be called when powerwash dialog is shown.
-  void OnShowPowerwashDialog(const base::Value::List& args);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
   const raw_ptr<Profile> profile_;
 
   std::unique_ptr<ProfileResetter> resetter_;
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc b/chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.cc
similarity index 85%
rename from chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
rename to chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.cc
index 6e403a717..e6b361e 100644
--- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
+++ b/chrome/browser/ui/webui/signin/managed_user_profile_notice_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/ui/webui/signin/enterprise_profile_welcome_handler.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.h"
 
 #include <string>
 #include <vector>
@@ -75,9 +75,9 @@
 
 }  // namespace
 
-EnterpriseProfileWelcomeHandler::EnterpriseProfileWelcomeHandler(
+ManagedUserProfileNoticeHandler::ManagedUserProfileNoticeHandler(
     Browser* browser,
-    EnterpriseProfileWelcomeUI::ScreenType type,
+    ManagedUserProfileNoticeUI::ScreenType type,
     bool profile_creation_required_by_policy,
     bool show_link_data_option,
     const AccountInfo& account_info,
@@ -96,57 +96,57 @@
   DCHECK(
       browser_ ||
       type_ !=
-          EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation);
+          ManagedUserProfileNoticeUI::ScreenType::kEnterpriseAccountCreation);
   BrowserList::AddObserver(this);
 }
 
-EnterpriseProfileWelcomeHandler::~EnterpriseProfileWelcomeHandler() {
+ManagedUserProfileNoticeHandler::~ManagedUserProfileNoticeHandler() {
   BrowserList::RemoveObserver(this);
   HandleCancel(base::Value::List());
 }
 
-void EnterpriseProfileWelcomeHandler::RegisterMessages() {
+void ManagedUserProfileNoticeHandler::RegisterMessages() {
   profile_path_ = Profile::FromWebUI(web_ui())->GetPath();
   web_ui()->RegisterMessageCallback(
       "initialized",
-      base::BindRepeating(&EnterpriseProfileWelcomeHandler::HandleInitialized,
+      base::BindRepeating(&ManagedUserProfileNoticeHandler::HandleInitialized,
                           base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
       "initializedWithSize",
       base::BindRepeating(
-          &EnterpriseProfileWelcomeHandler::HandleInitializedWithSize,
+          &ManagedUserProfileNoticeHandler::HandleInitializedWithSize,
           base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
       "proceed",
-      base::BindRepeating(&EnterpriseProfileWelcomeHandler::HandleProceed,
+      base::BindRepeating(&ManagedUserProfileNoticeHandler::HandleProceed,
                           base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
       "cancel",
-      base::BindRepeating(&EnterpriseProfileWelcomeHandler::HandleCancel,
+      base::BindRepeating(&ManagedUserProfileNoticeHandler::HandleCancel,
                           base::Unretained(this)));
 }
 
-void EnterpriseProfileWelcomeHandler::OnProfileAvatarChanged(
+void ManagedUserProfileNoticeHandler::OnProfileAvatarChanged(
     const base::FilePath& profile_path) {
   UpdateProfileInfo(profile_path);
 }
 
-void EnterpriseProfileWelcomeHandler::OnProfileHighResAvatarLoaded(
+void ManagedUserProfileNoticeHandler::OnProfileHighResAvatarLoaded(
     const base::FilePath& profile_path) {
   UpdateProfileInfo(profile_path);
 }
 
-void EnterpriseProfileWelcomeHandler::OnProfileHostedDomainChanged(
+void ManagedUserProfileNoticeHandler::OnProfileHostedDomainChanged(
     const base::FilePath& profile_path) {
   UpdateProfileInfo(profile_path);
 }
 
-void EnterpriseProfileWelcomeHandler::OnBrowserRemoved(Browser* browser) {
+void ManagedUserProfileNoticeHandler::OnBrowserRemoved(Browser* browser) {
   if (browser_ == browser)
     browser_ = nullptr;
 }
 
-void EnterpriseProfileWelcomeHandler::OnExtendedAccountInfoUpdated(
+void ManagedUserProfileNoticeHandler::OnExtendedAccountInfoUpdated(
     const AccountInfo& info) {
   if (info.account_id == account_id_ && !info.account_image.IsEmpty()) {
     UpdateProfileInfo(profile_path_);
@@ -154,9 +154,9 @@
   }
 }
 
-void EnterpriseProfileWelcomeHandler::OnJavascriptAllowed() {
+void ManagedUserProfileNoticeHandler::OnJavascriptAllowed() {
   if (type_ !=
-      EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation) {
+      ManagedUserProfileNoticeUI::ScreenType::kEnterpriseAccountCreation) {
     observed_profile_.Observe(
         &g_browser_process->profile_manager()->GetProfileAttributesStorage());
   } else {
@@ -165,12 +165,12 @@
   }
 }
 
-void EnterpriseProfileWelcomeHandler::OnJavascriptDisallowed() {
+void ManagedUserProfileNoticeHandler::OnJavascriptDisallowed() {
   observed_profile_.Reset();
   observed_account_.Reset();
 }
 
-void EnterpriseProfileWelcomeHandler::HandleInitialized(
+void ManagedUserProfileNoticeHandler::HandleInitialized(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
   AllowJavascript();
@@ -178,7 +178,7 @@
   ResolveJavascriptCallback(callback_id, GetProfileInfoValue());
 }
 
-void EnterpriseProfileWelcomeHandler::HandleInitializedWithSize(
+void ManagedUserProfileNoticeHandler::HandleInitializedWithSize(
     const base::Value::List& args) {
   AllowJavascript();
 
@@ -186,7 +186,7 @@
     signin::SetInitializedModalHeight(browser_, web_ui(), args);
 }
 
-void EnterpriseProfileWelcomeHandler::HandleProceed(
+void ManagedUserProfileNoticeHandler::HandleProceed(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
   if (proceed_callback_) {
@@ -197,13 +197,13 @@
   }
 }
 
-void EnterpriseProfileWelcomeHandler::HandleCancel(
+void ManagedUserProfileNoticeHandler::HandleCancel(
     const base::Value::List& args) {
   if (proceed_callback_)
     std::move(proceed_callback_).Run(signin::SIGNIN_CHOICE_CANCEL);
 }
 
-void EnterpriseProfileWelcomeHandler::UpdateProfileInfo(
+void ManagedUserProfileNoticeHandler::UpdateProfileInfo(
     const base::FilePath& profile_path) {
   DCHECK(IsJavascriptAllowed());
   if (profile_path != profile_path_)
@@ -212,7 +212,7 @@
 }
 
 // static
-std::string EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+std::string ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
     Profile* profile,
     ProfileAttributesEntry* entry,
     const std::string& account_domain_name,
@@ -271,7 +271,7 @@
 #endif  //  !BUILDFLAG(IS_CHROMEOS)
 }
 
-base::Value::Dict EnterpriseProfileWelcomeHandler::GetProfileInfoValue() {
+base::Value::Dict ManagedUserProfileNoticeHandler::GetProfileInfoValue() {
   base::Value::Dict dict;
   dict.Set("pictureUrl", GetPictureUrl());
 
@@ -283,7 +283,7 @@
   ProfileAttributesEntry* entry = GetProfileEntry();
 
   switch (type_) {
-    case EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled:
+    case ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled:
       dict.Set("showEnterpriseBadge", true);
       subtitle = GetManagedAccountTitle(entry, domain_name_);
       enterprise_info = l10n_util::GetStringUTF8(
@@ -291,21 +291,21 @@
       dict.Set("proceedLabel", l10n_util::GetStringUTF8(
                                    IDS_PROFILE_PICKER_IPH_NEXT_BUTTON_LABEL));
       break;
-    case EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncDisabled:
+    case ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncDisabled:
       dict.Set("showEnterpriseBadge", true);
       subtitle = GetManagedAccountTitle(entry, domain_name_);
       enterprise_info = l10n_util ::GetStringUTF8(
           IDS_ENTERPRISE_PROFILE_WELCOME_MANAGED_DESCRIPTION_WITHOUT_SYNC);
       dict.Set("proceedLabel", l10n_util::GetStringUTF8(IDS_DONE));
       break;
-    case EnterpriseProfileWelcomeUI::ScreenType::kConsumerAccountSyncDisabled:
+    case ManagedUserProfileNoticeUI::ScreenType::kConsumerAccountSyncDisabled:
       dict.Set("showEnterpriseBadge", false);
       subtitle = GetManagedDeviceTitle();
       enterprise_info =
           l10n_util::GetStringUTF8(IDS_SYNC_DISABLED_CONFIRMATION_DETAILS);
       dict.Set("proceedLabel", l10n_util::GetStringUTF8(IDS_DONE));
       break;
-    case EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation:
+    case ManagedUserProfileNoticeUI::ScreenType::kEnterpriseAccountCreation:
       title = l10n_util::GetStringUTF8(
           profile_creation_required_by_policy_
               ? IDS_ENTERPRISE_WELCOME_PROFILE_REQUIRED_TITLE
@@ -348,7 +348,7 @@
   return dict;
 }
 
-ProfileAttributesEntry* EnterpriseProfileWelcomeHandler::GetProfileEntry()
+ProfileAttributesEntry* ManagedUserProfileNoticeHandler::GetProfileEntry()
     const {
   ProfileAttributesEntry* entry =
       g_browser_process->profile_manager()
@@ -358,10 +358,10 @@
   return entry;
 }
 
-std::string EnterpriseProfileWelcomeHandler::GetPictureUrl() {
+std::string ManagedUserProfileNoticeHandler::GetPictureUrl() {
   absl::optional<gfx::Image> icon;
   if (type_ ==
-      EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation) {
+      ManagedUserProfileNoticeUI::ScreenType::kEnterpriseAccountCreation) {
     AccountInfo account_info =
         IdentityManagerFactory::GetForProfile(Profile::FromWebUI(web_ui()))
             ->FindExtendedAccountInfoByAccountId(account_id_);
@@ -380,12 +380,12 @@
           .AsBitmap());
 }
 
-EnterpriseProfileWelcomeUI::ScreenType
-EnterpriseProfileWelcomeHandler::GetTypeForTesting() {
+ManagedUserProfileNoticeUI::ScreenType
+ManagedUserProfileNoticeHandler::GetTypeForTesting() {
   return type_;
 }
 
-void EnterpriseProfileWelcomeHandler::CallProceedCallbackForTesting(
+void ManagedUserProfileNoticeHandler::CallProceedCallbackForTesting(
     signin::SigninChoice choice) {
   if (proceed_callback_)
     std::move(proceed_callback_).Run(choice);
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h b/chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.h
similarity index 81%
rename from chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h
rename to chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.h
index 9e5513cf..57dc6766 100644
--- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h
+++ b/chrome/browser/ui/webui/signin/managed_user_profile_notice_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_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_HANDLER_H_
-#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_HANDLER_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_MANAGED_USER_PROFILE_NOTICE_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_MANAGED_USER_PROFILE_NOTICE_HANDLER_H_
 
 #include <string>
 
@@ -15,7 +15,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/profiles/profile_attributes_storage.h"
 #include "chrome/browser/ui/browser_list_observer.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "content/public/browser/web_ui_message_handler.h"
@@ -24,34 +24,33 @@
 
 class Browser;
 class Profile;
-class EnterpriseProfileWelcomeHandleTest;
 struct AccountInfo;
 
 namespace base {
 class FilePath;
 }
 
-// WebUI message handler for the welcome screen for enterprise profiles in the
+// WebUI message handler for the managed user notice screen for profiles in the
 // profile creation flow.
-class EnterpriseProfileWelcomeHandler
+class ManagedUserProfileNoticeHandler
     : public content::WebUIMessageHandler,
       public ProfileAttributesStorage::Observer,
       public BrowserListObserver,
       public signin::IdentityManager::Observer {
  public:
-  EnterpriseProfileWelcomeHandler(
+  ManagedUserProfileNoticeHandler(
       Browser* browser,
-      EnterpriseProfileWelcomeUI::ScreenType type,
+      ManagedUserProfileNoticeUI::ScreenType type,
       bool profile_creation_required_by_policy,
       bool show_link_data_option,
       const AccountInfo& account_info,
       signin::SigninChoiceCallback proceed_callback);
-  ~EnterpriseProfileWelcomeHandler() override;
+  ~ManagedUserProfileNoticeHandler() override;
 
-  EnterpriseProfileWelcomeHandler(const EnterpriseProfileWelcomeHandler&) =
+  ManagedUserProfileNoticeHandler(const ManagedUserProfileNoticeHandler&) =
       delete;
-  EnterpriseProfileWelcomeHandler& operator=(
-      const EnterpriseProfileWelcomeHandler&) = delete;
+  ManagedUserProfileNoticeHandler& operator=(
+      const ManagedUserProfileNoticeHandler&) = delete;
 
   // content::WebUIMessageHandler:
   void RegisterMessages() override;
@@ -72,19 +71,19 @@
   void OnExtendedAccountInfoUpdated(const AccountInfo& info) override;
 
   // Access to construction parameters for tests.
-  EnterpriseProfileWelcomeUI::ScreenType GetTypeForTesting();
+  ManagedUserProfileNoticeUI::ScreenType GetTypeForTesting();
   void CallProceedCallbackForTesting(signin::SigninChoice choice);
   void set_web_ui_for_test(content::WebUI* web_ui) { set_web_ui(web_ui); }
 
  private:
   FRIEND_TEST_ALL_PREFIXES(
-      EnterpriseProfileWelcomeHandleTest,
+      ManagedUserProfileNoticeHandlerTest,
       GetManagedAccountTitleWithEmailInterceptionEnforcedAtMachineLevel);
   FRIEND_TEST_ALL_PREFIXES(
-      EnterpriseProfileWelcomeHandleTest,
+      ManagedUserProfileNoticeHandlerTest,
       GetManagedAccountTitleWithEmailInterceptionEnforcedByExistingProfile);
   FRIEND_TEST_ALL_PREFIXES(
-      EnterpriseProfileWelcomeHandleTest,
+      ManagedUserProfileNoticeHandlerTest,
       GetManagedAccountTitleWithEmailInterceptionEnforcedByInterceptedAccount);
 
   void HandleInitialized(const base::Value::List& args);
@@ -125,7 +124,7 @@
       observed_account_{this};
 
   raw_ptr<Browser> browser_ = nullptr;
-  const EnterpriseProfileWelcomeUI::ScreenType type_;
+  const ManagedUserProfileNoticeUI::ScreenType type_;
   const bool profile_creation_required_by_policy_;
 #if !BUILDFLAG(IS_CHROMEOS)
   const bool show_link_data_option_;
@@ -136,4 +135,4 @@
   signin::SigninChoiceCallback proceed_callback_;
 };
 
-#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_HANDLER_H_
+#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_MANAGED_USER_PROFILE_NOTICE_HANDLER_H_
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc b/chrome/browser/ui/webui/signin/managed_user_profile_notice_handler_unittest.cc
similarity index 86%
rename from chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc
rename to chrome/browser/ui/webui/signin/managed_user_profile_notice_handler_unittest.cc
index 0eb7544c..3f8943e 100644
--- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc
+++ b/chrome/browser/ui/webui/signin/managed_user_profile_notice_handler_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/ui/webui/signin/enterprise_profile_welcome_handler.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.h"
 
 #include <memory>
 
@@ -46,15 +46,15 @@
 
 }  // namespace
 
-class EnterpriseProfileWelcomeHandlerTestBase
+class ManagedUserProfileNoticeHandlerTestBase
     : public BrowserWithTestWindowTest {
  public:
-  EnterpriseProfileWelcomeHandlerTestBase() = default;
-  EnterpriseProfileWelcomeHandlerTestBase(
-      const EnterpriseProfileWelcomeHandlerTestBase&) = delete;
-  EnterpriseProfileWelcomeHandler& operator=(
-      const EnterpriseProfileWelcomeHandlerTestBase&) = delete;
-  ~EnterpriseProfileWelcomeHandlerTestBase() override = default;
+  ManagedUserProfileNoticeHandlerTestBase() = default;
+  ManagedUserProfileNoticeHandlerTestBase(
+      const ManagedUserProfileNoticeHandlerTestBase&) = delete;
+  ManagedUserProfileNoticeHandler& operator=(
+      const ManagedUserProfileNoticeHandlerTestBase&) = delete;
+  ~ManagedUserProfileNoticeHandlerTestBase() override = default;
 
   // BrowserWithTestWindowTest:
   void SetUp() override {
@@ -70,13 +70,13 @@
     account_info_.account_id = CoreAccountId::FromGaiaId(account_info_.gaia);
   }
 
-  void InitializeHandler(EnterpriseProfileWelcomeUI::ScreenType screen_type,
+  void InitializeHandler(ManagedUserProfileNoticeUI::ScreenType screen_type,
                          bool profile_creation_required_by_policy,
                          bool show_link_data_option,
                          signin::SigninChoiceCallback proceed_callback) {
     message_handler_.reset();
 
-    message_handler_ = std::make_unique<EnterpriseProfileWelcomeHandler>(
+    message_handler_ = std::make_unique<ManagedUserProfileNoticeHandler>(
         /*browser=*/nullptr, screen_type, profile_creation_required_by_policy,
         show_link_data_option, account_info_, std::move(proceed_callback));
     message_handler_->set_web_ui_for_test(web_ui());
@@ -89,13 +89,13 @@
   }
 
   content::TestWebUI* web_ui() { return web_ui_.get(); }
-  EnterpriseProfileWelcomeHandler* handler() { return message_handler_.get(); }
+  ManagedUserProfileNoticeHandler* handler() { return message_handler_.get(); }
 
  private:
   std::unique_ptr<content::TestWebUI> web_ui_;
   AccountInfo account_info_;
 
-  std::unique_ptr<EnterpriseProfileWelcomeHandler> message_handler_;
+  std::unique_ptr<ManagedUserProfileNoticeHandler> message_handler_;
 };
 
 struct HandleProceedTestParam {
@@ -110,16 +110,16 @@
     {true, true, signin::SIGNIN_CHOICE_CONTINUE},
 };
 
-class EnterpriseProfileWelcomeHandleProceedTest
-    : public EnterpriseProfileWelcomeHandlerTestBase,
+class ManagedUserProfileNoticeHandleProceedTest
+    : public ManagedUserProfileNoticeHandlerTestBase,
       public testing::WithParamInterface<HandleProceedTestParam> {};
 
 // Tests how `HandleProceed` processes the arguments and the handler's state to
 // notify the registered callback.
-TEST_P(EnterpriseProfileWelcomeHandleProceedTest, HandleProceed) {
+TEST_P(ManagedUserProfileNoticeHandleProceedTest, HandleProceed) {
   base::MockCallback<signin::SigninChoiceCallback> mock_proceed_callback;
   InitializeHandler(
-      EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled,
+      ManagedUserProfileNoticeUI::ScreenType::kEntepriseAccountSyncEnabled,
       GetParam().profile_creation_required_by_policy,
       /*show_link_data_option=*/true, mock_proceed_callback.Get());
 
@@ -130,19 +130,19 @@
 }
 
 INSTANTIATE_TEST_SUITE_P(All,
-                         EnterpriseProfileWelcomeHandleProceedTest,
+                         ManagedUserProfileNoticeHandleProceedTest,
                          testing::ValuesIn(kHandleProceedParams));
 
 #if !BUILDFLAG(IS_CHROMEOS)
-class EnterpriseProfileWelcomeHandleTest
-    : public EnterpriseProfileWelcomeHandlerTestBase {
+class ManagedUserProfileNoticeHandlerTest
+    : public ManagedUserProfileNoticeHandlerTestBase {
  protected:
   ProfileManager* profile_manager() {
     return g_browser_process->profile_manager();
   }
 };
 
-TEST_F(EnterpriseProfileWelcomeHandleTest,
+TEST_F(ManagedUserProfileNoticeHandlerTest,
        GetManagedAccountTitleWithEmailInterceptionEnforcedByExistingProfile) {
   auto& managed_profile = profiles::testing::CreateProfileSync(
       profile_manager(), profile_manager()->GenerateNextProfileDirectoryPath());
@@ -166,7 +166,7 @@
     chrome::ScopedDeviceManagerForTesting unknown_device_manager_for_testing(
         unknown_device_manager.c_str());
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &unmanaged_profile, GetProfileEntry(&unmanaged_profile),
             "intercepted.com", u"alice@intercepted.com");
     EXPECT_EQ(
@@ -181,7 +181,7 @@
     chrome::ScopedDeviceManagerForTesting unknown_device_manager_for_testing(
         device_manager.c_str());
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &unmanaged_profile, GetProfileEntry(&unmanaged_profile),
             "intercepted.com", u"alice@intercepted.com");
     EXPECT_EQ(
@@ -196,7 +196,7 @@
     chrome::ScopedDeviceManagerForTesting unknown_device_manager_for_testing(
         unknown_device_manager.c_str());
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &managed_profile, GetProfileEntry(&managed_profile),
             "intercepted.com", u"alice@intercepted.com");
     EXPECT_EQ(
@@ -211,7 +211,7 @@
     chrome::ScopedDeviceManagerForTesting unknown_device_manager_for_testing(
         device_manager.c_str());
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &managed_profile, GetProfileEntry(&managed_profile),
             "intercepted.com", u"alice@intercepted.com");
     EXPECT_EQ(
@@ -222,7 +222,7 @@
   }
 }
 
-TEST_F(EnterpriseProfileWelcomeHandleTest,
+TEST_F(ManagedUserProfileNoticeHandlerTest,
        GetManagedAccountTitleWithEmailInterceptionEnforcedAtMachineLevel) {
   auto& managed_profile = profiles::testing::CreateProfileSync(
       profile_manager(), profile_manager()->GenerateNextProfileDirectoryPath());
@@ -250,7 +250,7 @@
     chrome::ScopedDeviceManagerForTesting unknown_device_manager_for_testing(
         unknown_device_manager.c_str());
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &unmanaged_profile, GetProfileEntry(&unmanaged_profile),
             "intercepted.com", u"alice@intercepted.com");
     EXPECT_EQ(
@@ -265,7 +265,7 @@
     chrome::ScopedDeviceManagerForTesting unknown_device_manager_for_testing(
         device_manager.c_str());
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &unmanaged_profile, GetProfileEntry(&unmanaged_profile),
             "intercepted.com", u"alice@intercepted.com");
     EXPECT_EQ(
@@ -280,7 +280,7 @@
     chrome::ScopedDeviceManagerForTesting unknown_device_manager_for_testing(
         unknown_device_manager.c_str());
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &managed_profile, GetProfileEntry(&managed_profile),
             "intercepted.com", u"alice@intercepted.com");
     l10n_util::GetStringFUTF8(
@@ -293,7 +293,7 @@
     chrome::ScopedDeviceManagerForTesting unknown_device_manager_for_testing(
         device_manager.c_str());
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &managed_profile, GetProfileEntry(&managed_profile),
             "intercepted.com", u"alice@intercepted.com");
     EXPECT_EQ(
@@ -305,7 +305,7 @@
 }
 
 TEST_F(
-    EnterpriseProfileWelcomeHandleTest,
+    ManagedUserProfileNoticeHandlerTest,
     GetManagedAccountTitleWithEmailInterceptionEnforcedByInterceptedAccount) {
   auto& profile = profiles::testing::CreateProfileSync(
       profile_manager(), profile_manager()->GenerateNextProfileDirectoryPath());
@@ -313,7 +313,7 @@
   // No account manager
   {
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &profile, GetProfileEntry(&profile), "intercepted.com",
             u"alice@intercepted.com");
     EXPECT_EQ(title,
@@ -329,7 +329,7 @@
     // Set account manager
     GetProfileEntry(&profile)->SetHostedDomain("example.com");
     std::string title =
-        EnterpriseProfileWelcomeHandler::GetManagedAccountTitleWithEmail(
+        ManagedUserProfileNoticeHandler::GetManagedAccountTitleWithEmail(
             &profile, GetProfileEntry(&profile), "intercepted.com",
             u"alice@intercepted.com");
     EXPECT_EQ(
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc b/chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.cc
similarity index 87%
copy from chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc
copy to chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.cc
index e953db7d..acf3612 100644
--- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc
+++ b/chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.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/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h"
 
 #include <memory>
 #include <utility>
@@ -13,7 +13,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/signin_features.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h"
+#include "chrome/browser/ui/webui/signin/managed_user_profile_notice_handler.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
 #include "chrome/browser/ui/webui/webui_util.h"
 #include "chrome/common/webui_url_constants.h"
@@ -30,7 +30,7 @@
 #include "ui/base/webui/resource_path.h"
 #include "ui/resources/grit/webui_resources.h"
 
-EnterpriseProfileWelcomeUI::EnterpriseProfileWelcomeUI(content::WebUI* web_ui)
+ManagedUserProfileNoticeUI::ManagedUserProfileNoticeUI(content::WebUI* web_ui)
     : content::WebUIController(web_ui) {
   content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
       Profile::FromWebUI(web_ui),
@@ -78,22 +78,22 @@
   webui::SetupChromeRefresh2023(source);
 }
 
-EnterpriseProfileWelcomeUI::~EnterpriseProfileWelcomeUI() = default;
+ManagedUserProfileNoticeUI::~ManagedUserProfileNoticeUI() = default;
 
-void EnterpriseProfileWelcomeUI::Initialize(
+void ManagedUserProfileNoticeUI::Initialize(
     Browser* browser,
-    EnterpriseProfileWelcomeUI::ScreenType type,
+    ManagedUserProfileNoticeUI::ScreenType type,
     const AccountInfo& account_info,
     bool profile_creation_required_by_policy,
     bool show_link_data_option,
     signin::SigninChoiceCallback proceed_callback) {
-  auto handler = std::make_unique<EnterpriseProfileWelcomeHandler>(
+  auto handler = std::make_unique<ManagedUserProfileNoticeHandler>(
       browser, type, profile_creation_required_by_policy, show_link_data_option,
       account_info, std::move(proceed_callback));
   handler_ = handler.get();
 
   if (type ==
-      EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation) {
+      ManagedUserProfileNoticeUI::ScreenType::kEnterpriseAccountCreation) {
     base::Value::Dict update_data;
     update_data.Set("isModalDialog", true);
 
@@ -113,9 +113,9 @@
   web_ui()->AddMessageHandler(std::move(handler));
 }
 
-EnterpriseProfileWelcomeHandler*
-EnterpriseProfileWelcomeUI::GetHandlerForTesting() {
+ManagedUserProfileNoticeHandler*
+ManagedUserProfileNoticeUI::GetHandlerForTesting() {
   return handler_;
 }
 
-WEB_UI_CONTROLLER_TYPE_IMPL(EnterpriseProfileWelcomeUI)
+WEB_UI_CONTROLLER_TYPE_IMPL(ManagedUserProfileNoticeUI)
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h b/chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h
similarity index 67%
rename from chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h
rename to chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.h
index f84e63e3..a599db3 100644
--- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h
+++ b/chrome/browser/ui/webui/signin/managed_user_profile_notice_ui.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_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_UI_H_
-#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_UI_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_MANAGED_USER_PROFILE_NOTICE_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_MANAGED_USER_PROFILE_NOTICE_UI_H_
 
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
@@ -14,18 +14,16 @@
 #include "third_party/skia/include/core/SkColor.h"
 
 class Browser;
-class EnterpriseProfileWelcomeHandler;
+class ManagedUserProfileNoticeHandler;
 struct AccountInfo;
 
 namespace content {
 class WebUI;
 }
 
-// TODO(crbug.com/1300109): Rename this and all related files to get rid of
-// "Enterprise".
-class EnterpriseProfileWelcomeUI : public content::WebUIController {
+class ManagedUserProfileNoticeUI : public content::WebUIController {
  public:
-  // Type of a welcome screen for the enterprise flow.
+  // Type of a managed user notice screen.
   enum class ScreenType {
     kEntepriseAccountSyncEnabled,
     kEntepriseAccountSyncDisabled,
@@ -33,14 +31,14 @@
     kEnterpriseAccountCreation,
   };
 
-  explicit EnterpriseProfileWelcomeUI(content::WebUI* web_ui);
-  ~EnterpriseProfileWelcomeUI() override;
+  explicit ManagedUserProfileNoticeUI(content::WebUI* web_ui);
+  ~ManagedUserProfileNoticeUI() override;
 
-  EnterpriseProfileWelcomeUI(const EnterpriseProfileWelcomeUI&) = delete;
-  EnterpriseProfileWelcomeUI& operator=(const EnterpriseProfileWelcomeUI&) =
+  ManagedUserProfileNoticeUI(const ManagedUserProfileNoticeUI&) = delete;
+  ManagedUserProfileNoticeUI& operator=(const ManagedUserProfileNoticeUI&) =
       delete;
 
-  // Initializes the EnterpriseProfileWelcomeUI, which will obtain the user's
+  // Initializes the ManagedUserProfileNoticeUI, which will obtain the user's
   // choice about how to set up the profile with the new account.
   // `proceed_callback` will be called when the user performs an action to exit
   // the screen. Their choice will depend on other flags passed to this method.
@@ -59,13 +57,13 @@
                   signin::SigninChoiceCallback proceed_callback);
 
   // Allows tests to trigger page events.
-  EnterpriseProfileWelcomeHandler* GetHandlerForTesting();
+  ManagedUserProfileNoticeHandler* GetHandlerForTesting();
 
  private:
   // Stored for tests.
-  raw_ptr<EnterpriseProfileWelcomeHandler> handler_ = nullptr;
+  raw_ptr<ManagedUserProfileNoticeHandler> handler_ = nullptr;
 
   WEB_UI_CONTROLLER_TYPE_DECL();
 };
 
-#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_ENTERPRISE_PROFILE_WELCOME_UI_H_
+#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_MANAGED_USER_PROFILE_NOTICE_UI_H_
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc b/chrome/browser/ui/webui/signin/profile_welcome_ui.cc
similarity index 87%
rename from chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc
rename to chrome/browser/ui/webui/signin/profile_welcome_ui.cc
index e953db7d..d0d966f 100644
--- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc
+++ b/chrome/browser/ui/webui/signin/profile_welcome_ui.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/ui/webui/signin/enterprise_profile_welcome_ui.h"
+#include "chrome/browser/ui/webui/signin/profile_welcome_ui.h"
 
 #include <memory>
 #include <utility>
@@ -13,7 +13,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/signin_features.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h"
+#include "chrome/browser/ui/webui/signin/profile_welcome_handler.h"
 #include "chrome/browser/ui/webui/signin/signin_utils.h"
 #include "chrome/browser/ui/webui/webui_util.h"
 #include "chrome/common/webui_url_constants.h"
@@ -30,7 +30,7 @@
 #include "ui/base/webui/resource_path.h"
 #include "ui/resources/grit/webui_resources.h"
 
-EnterpriseProfileWelcomeUI::EnterpriseProfileWelcomeUI(content::WebUI* web_ui)
+ManagedUserProfileNoticeUI::ManagedUserProfileNoticeUI(content::WebUI* web_ui)
     : content::WebUIController(web_ui) {
   content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
       Profile::FromWebUI(web_ui),
@@ -78,22 +78,22 @@
   webui::SetupChromeRefresh2023(source);
 }
 
-EnterpriseProfileWelcomeUI::~EnterpriseProfileWelcomeUI() = default;
+ManagedUserProfileNoticeUI::~ManagedUserProfileNoticeUI() = default;
 
-void EnterpriseProfileWelcomeUI::Initialize(
+void ManagedUserProfileNoticeUI::Initialize(
     Browser* browser,
-    EnterpriseProfileWelcomeUI::ScreenType type,
+    ManagedUserProfileNoticeUI::ScreenType type,
     const AccountInfo& account_info,
     bool profile_creation_required_by_policy,
     bool show_link_data_option,
     signin::SigninChoiceCallback proceed_callback) {
-  auto handler = std::make_unique<EnterpriseProfileWelcomeHandler>(
+  auto handler = std::make_unique<ManagedUserProfileNoticeHandler>(
       browser, type, profile_creation_required_by_policy, show_link_data_option,
       account_info, std::move(proceed_callback));
   handler_ = handler.get();
 
   if (type ==
-      EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation) {
+      ManagedUserProfileNoticeUI::ScreenType::kEnterpriseAccountCreation) {
     base::Value::Dict update_data;
     update_data.Set("isModalDialog", true);
 
@@ -113,9 +113,9 @@
   web_ui()->AddMessageHandler(std::move(handler));
 }
 
-EnterpriseProfileWelcomeHandler*
-EnterpriseProfileWelcomeUI::GetHandlerForTesting() {
+ManagedUserProfileNoticeHandler*
+ManagedUserProfileNoticeUI::GetHandlerForTesting() {
   return handler_;
 }
 
-WEB_UI_CONTROLLER_TYPE_IMPL(EnterpriseProfileWelcomeUI)
+WEB_UI_CONTROLLER_TYPE_IMPL(ManagedUserProfileNoticeUI)
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc
index 8dc559f..bf62967 100644
--- a/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc
+++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc
@@ -26,7 +26,6 @@
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/profiles/profile_colors_util.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.h"
 #include "chrome/browser/ui/webui/signin/signin_ui_error.h"
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index f45fb59..91bbe11 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1701063908-925cecbb2d23474d525b1a32bb668e1d70c98cbf.profdata
+chrome-android32-main-1701086311-e84e370776be624889416427b65715d27fb2e9b4.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index e7a11f7..a343198 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1701063908-18d912fa2204d22b47b313932402d7f6f1ddc2db.profdata
+chrome-android64-main-1701086311-d059f872f739aa936a10f64ef5ea7087ea51684e.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 90d99f5..8b980c84 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1701042811-6d94db0968f146523895c636fe5f39801b80056d.profdata
+chrome-linux-main-1701086311-2d63c0ec23f0052e72a91c3c537f0bc7de83ae6f.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index faaf4c1..fc107ae1 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1701063908-c7b4fd8a3dafb163a928e7bb01d0bcdf89cae0a5.profdata
+chrome-mac-arm-main-1701086311-d828a3d8687449462e15db08832c1317bc1cad66.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index cf9733c..f0f8f01 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1701042811-346902c6218402b28223b42b2b5a7fc4cc3aee77.profdata
+chrome-mac-main-1701086311-61314d3b92d790c7783f66416e9f4e971dce80b8.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 596a6f4..4dbe8772 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1701042811-45974bdf6132c8d0bb83ef4a570f39940503fd64.profdata
+chrome-win-arm64-main-1701086311-5d6956aede19c43902c9a7d77c7f48fb7898be22.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index dac32464..556577a 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1701053839-750582b2a210945923f7a6ba3d9cbe2f5049a39a.profdata
+chrome-win32-main-1701086311-977b66fb06001b6bd56ed9174c4dec5689dc0a93.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 59620ae7..4d3ec7ff 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1701053839-6036593c049803bdc408176f211cbc3b6c46e5b6.profdata
+chrome-win64-main-1701086311-3a8364a78f50b382b17beabd6afedc72ec335304.profdata
diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
index 75227320..ecb12a49 100644
--- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
@@ -573,6 +573,7 @@
   EXPECT_CALL(fake_pw_client_, PresaveGeneratedPassword(_, Eq(password)));
 
   password_generation_->GeneratedPasswordAccepted(password);
+  password_generation_->FocusNextFieldAfterPasswords();
 
   // Password fields are filled out and set as being autofilled.
   EXPECT_EQ(password, first_password_element.Value().Utf16());
@@ -1212,6 +1213,7 @@
 
   // Edit some other field.
   EXPECT_CALL(fake_pw_client_, PasswordNoLongerGenerated(testing::_));
+  EXPECT_CALL(fake_pw_client_, GenerationElementLostFocus());
   ExecuteJavaScriptForTests(
       "document.getElementById('first_password').value = '';");
   FocusField("username");
@@ -1430,4 +1432,19 @@
       first_password_element));
 }
 
+TEST_F(PasswordGenerationAgentTest, AdvancesFocusToNextFieldAfterPasswords) {
+  constexpr char kGenerationElementId[] = "first_password";
+  LoadHTMLWithUserGesture(kAccountCreationFormHTML);
+  SetFoundFormEligibleForGeneration(password_generation_,
+                                    GetMainFrame()->GetDocument(),
+                                    /*new_password_id=*/kGenerationElementId,
+                                    /*confirm_password_id=*/"second_password");
+  ExpectAutomaticGenerationAvailable(kGenerationElementId, kAvailable);
+
+  password_generation_->FocusNextFieldAfterPasswords();
+  WebDocument document = GetMainFrame()->GetDocument();
+  EXPECT_EQ(document.FocusedElement(),
+            document.GetElementById(WebString::FromUTF8("address")));
+}
+
 }  // namespace autofill
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index cd439e952..079c11e 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3453,7 +3453,7 @@
     # TODO(crbug.com/1052397): Update guard when pixel tests support widens.
     if (is_win || is_linux || is_chromeos_lacros) {
       sources += [
-        "../browser/ui/views/profiles/enterprise_profile_welcome_ui_browsertest.cc",
+        "../browser/ui/views/profiles/managed_user_profile_notice_ui_browsertest.cc",
         "../browser/ui/views/profiles/profile_menu_view_ui_browsertest.cc",
         "../browser/ui/views/profiles/profile_picker_ui_browsertest.cc",
         "../browser/ui/views/profiles/profile_type_choice_ui_browsertest.cc",
@@ -10140,7 +10140,7 @@
       "../browser/ui/passwords/account_storage_auth_helper_unittest.cc",
       "../browser/ui/profiles/profile_customization_util_unittest.cc",
       "../browser/ui/profiles/profile_picker_unittest.cc",
-      "../browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc",
+      "../browser/ui/webui/signin/managed_user_profile_notice_handler_unittest.cc",
       "../browser/ui/webui/signin/turn_sync_on_helper_unittest.cc",
     ]
   }
diff --git a/chrome/test/chromeos/standalone_browser_test_controller.cc b/chrome/test/chromeos/standalone_browser_test_controller.cc
index 41607ccc..96aae8a 100644
--- a/chrome/test/chromeos/standalone_browser_test_controller.cc
+++ b/chrome/test/chromeos/standalone_browser_test_controller.cc
@@ -8,8 +8,10 @@
 
 #include "base/check_is_test.h"
 #include "base/functional/bind.h"
+#include "base/json/json_reader.h"
 #include "base/memory/raw_ptr.h"
 #include "base/types/expected_macros.h"
+#include "base/values.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/extensions/extension_keeplist_chromeos.h"
@@ -20,8 +22,10 @@
 #include "chrome/browser/web_applications/web_app_command_scheduler.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "chromeos/crosapi/mojom/tts.mojom-forward.h"
+#include "components/prefs/pref_service.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "content/public/browser/tts_utterance.h"
 #include "extensions/browser/extension_registry.h"
@@ -262,6 +266,28 @@
                      std::move(callback)));
 }
 
+void StandaloneBrowserTestController::SetWebAppSettingsPref(
+    const std::string& policy,
+    SetWebAppSettingsPrefCallback callback) {
+  CHECK(callback);
+
+  auto result = base::JSONReader::ReadAndReturnValueWithError(
+      policy, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS);
+  if (!result.has_value()) {
+    std::move(callback).Run(/*success=*/false);
+    return;
+  }
+  if (!result->is_list()) {
+    std::move(callback).Run(/*success=*/false);
+    return;
+  }
+
+  ProfileManager::GetPrimaryUserProfile()->GetPrefs()->SetList(
+      prefs::kWebAppSettings, std::move(*result).TakeList());
+
+  std::move(callback).Run(/*success=*/true);
+}
+
 void StandaloneBrowserTestController::OnUtteranceFinished(int utterance_id) {
   // Delete the utterace event delegate object when the utterance is finished.
   lacros_utterance_event_delegates_.erase(utterance_id);
diff --git a/chrome/test/chromeos/standalone_browser_test_controller.h b/chrome/test/chromeos/standalone_browser_test_controller.h
index 8842b27..c2ea4c4 100644
--- a/chrome/test/chromeos/standalone_browser_test_controller.h
+++ b/chrome/test/chromeos/standalone_browser_test_controller.h
@@ -52,6 +52,9 @@
                              bool dev_mode,
                              InstallIsolatedWebAppCallback callback) override;
 
+  void SetWebAppSettingsPref(const std::string& web_app_settings_json,
+                             SetWebAppSettingsPrefCallback callback) override;
+
  private:
   class LacrosUtteranceEventDelegate;
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_reset_page/reset_settings_card_test.ts b/chrome/test/data/webui/settings/chromeos/os_reset_page/reset_settings_card_test.ts
index 38fed30b8..70dcd5f 100644
--- a/chrome/test/data/webui/settings/chromeos/os_reset_page/reset_settings_card_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_reset_page/reset_settings_card_test.ts
@@ -89,10 +89,7 @@
     });
 
     closeButtonFn(dialog).click();
-    await Promise.all([
-      onDialogClosedPromise,
-      resetPageBrowserProxy.whenCalled('onPowerwashDialogShow'),
-    ]);
+    await onDialogClosedPromise;
   }
 
   async function openDialogWithESimWarning(): Promise<void> {
diff --git a/chrome/test/data/webui/settings/chromeos/os_reset_page/test_os_reset_browser_proxy.ts b/chrome/test/data/webui/settings/chromeos/os_reset_page/test_os_reset_browser_proxy.ts
index 9a89b48..065d01c6 100644
--- a/chrome/test/data/webui/settings/chromeos/os_reset_page/test_os_reset_browser_proxy.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_reset_page/test_os_reset_browser_proxy.ts
@@ -9,15 +9,10 @@
     OsResetBrowserProxy {
   constructor() {
     super([
-      'onPowerwashDialogShow',
       'requestFactoryResetRestart',
     ]);
   }
 
-  onPowerwashDialogShow(): void {
-    this.methodCalled('onPowerwashDialogShow');
-  }
-
   requestFactoryResetRestart(): void {
     this.methodCalled('requestFactoryResetRestart');
   }
diff --git a/chrome/test/data/webui/settings/clear_browsing_data_test.ts b/chrome/test/data/webui/settings/clear_browsing_data_test.ts
index 43d6c42..53647bd8 100644
--- a/chrome/test/data/webui/settings/clear_browsing_data_test.ts
+++ b/chrome/test/data/webui/settings/clear_browsing_data_test.ts
@@ -6,8 +6,8 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.js';
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
-import {ClearBrowsingDataBrowserProxyImpl, ClearBrowsingDataResult, SettingsCheckboxElement, SettingsClearBrowsingDataDialogElement, SettingsHistoryDeletionDialogElement, SettingsPasswordsDeletionDialogElement, TimePeriodExperiment} from 'chrome://settings/lazy_load.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
+import {ClearBrowsingDataBrowserProxyImpl, ClearBrowsingDataResult, SettingsCheckboxElement, SettingsClearBrowsingDataDialogElement, SettingsHistoryDeletionDialogElement, SettingsPasswordsDeletionDialogElement, TimePeriodExperiment, TimePeriod} from 'chrome://settings/lazy_load.js';
 import {CrButtonElement, loadTimeData, StatusAction, SyncBrowserProxyImpl, SettingsDropdownMenuElement} from 'chrome://settings/settings.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js';
@@ -111,13 +111,20 @@
   };
 }
 
+function getTimePeriodDropdown(
+    tabName: string, element: SettingsClearBrowsingDataDialogElement):
+    SettingsDropdownMenuElement {
+  const timePeriodDropdown =
+      element.shadowRoot!.getElementById(tabName)!
+          .querySelector<SettingsDropdownMenuElement>('.time-range-select');
+  assertTrue(!!timePeriodDropdown);
+  return timePeriodDropdown;
+}
+
 // TODO(crbug.com/1487530): Remove once CbdTimeframeRequired finished.
 function testChangeDefaultAndAdd15minForTab(
     tabName: string, element: SettingsClearBrowsingDataDialogElement) {
-  const timeframe =
-      element.shadowRoot!.getElementById(tabName)!
-          .querySelector<SettingsDropdownMenuElement>('.time-range-select');
-  assertTrue(!!timeframe);
+  const timeframe = getTimePeriodDropdown(tabName, element);
   assertTrue(!!timeframe.menuOptions);
   assertEquals(7, timeframe.menuOptions.length);
 
@@ -151,6 +158,7 @@
     testSyncBrowserProxy = new TestSyncBrowserProxy();
     SyncBrowserProxyImpl.setInstance(testSyncBrowserProxy);
     document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    loadTimeData.overrideValues({enableCbdTimeframeRequired: false});
     element = document.createElement('settings-clear-browsing-data-dialog');
     element.set('prefs', getClearBrowsingDataPrefs());
     document.body.appendChild(element);
@@ -327,10 +335,7 @@
   });
 
   test('ClearBrowsingData_MenuOptions', function() {
-    const timeframe =
-        element.shadowRoot!.querySelector<SettingsDropdownMenuElement>(
-            '.time-range-select');
-    assertTrue(!!timeframe);
+    const timeframe = getTimePeriodDropdown('basic-tab', element);
     assertTrue(!!timeframe.menuOptions);
     assertTrue(timeframe.menuOptions.length === 5);
 
@@ -358,6 +363,48 @@
     testChangeDefaultAndAdd15minForTab('basic-tab', element);
     testChangeDefaultAndAdd15minForTab('advanced-tab', element);
   });
+
+  test('ClearBrowsingData_UnsupportedTimePeriod_Advanced', async function() {
+    const timePeriodDropdown = getTimePeriodDropdown('advanced-tab', element);
+    const selectElement =
+        timePeriodDropdown.shadowRoot!.querySelector('select')!;
+    assertTrue(!!selectElement);
+
+    const unsupported_pref_value = 100;
+
+    element.setPrefValue(
+        'browser.clear_data.time_period', unsupported_pref_value);
+
+    await waitAfterNextRender(timePeriodDropdown);
+
+    // Assert unsupported value in Advanced tab is replaced by the Default value
+    // (Last hour).
+    assertEquals(
+        TimePeriod.LAST_HOUR,
+        element.getPref('browser.clear_data.time_period').value);
+    assertEquals(TimePeriod.LAST_HOUR.toString(), selectElement.value);
+  });
+
+  test('ClearBrowsingData_UnsupportedTimePeriod_Basic', async function() {
+    const timePeriodDropdown = getTimePeriodDropdown('basic-tab', element);
+    const selectElement =
+        timePeriodDropdown.shadowRoot!.querySelector('select')!;
+    assertTrue(!!selectElement);
+
+    const unsupported_pref_value = 100;
+
+    element.setPrefValue(
+        'browser.clear_data.time_period_basic', unsupported_pref_value);
+
+    await waitAfterNextRender(timePeriodDropdown);
+
+    // Assert unsupported value in Basic tab is replaced by the Default value
+    // (Last hour).
+    assertEquals(
+        TimePeriod.LAST_HOUR,
+        element.getPref('browser.clear_data.time_period_basic').value);
+    assertEquals(TimePeriod.LAST_HOUR.toString(), selectElement.value);
+  });
 });
 
 suite('ClearBrowsingDataAllPlatforms', function() {
diff --git a/chrome/test/data/webui/settings/site_list_test.ts b/chrome/test/data/webui/settings/site_list_test.ts
index 4af0e5c..2aa92f9 100644
--- a/chrome/test/data/webui/settings/site_list_test.ts
+++ b/chrome/test/data/webui/settings/site_list_test.ts
@@ -1464,9 +1464,6 @@
         dialog.set('category', ContentSettingsTypes.COOKIES);
         dialog.set('cookiesExceptionType', CookiesExceptionType.COMBINED);
         flush();
-        // TODO(crbug.com/1378703): Remove after crbug/1378703 launched and the
-        // checkbox is deprecated.
-        assertTrue(dialog.$.thirdParties.hidden);
 
         // Enter a pattern and click the button.
         const expectedPattern = 'foo-bar.com';
@@ -1485,9 +1482,6 @@
     dialog.set('category', ContentSettingsTypes.COOKIES);
     dialog.set('cookiesExceptionType', CookiesExceptionType.THIRD_PARTY);
     flush();
-    // TODO(crbug.com/1378703): Remove after crbug/1378703 launched and the
-    // checkbox is deprecated.
-    assertTrue(dialog.$.thirdParties.hidden);
 
     // Enter a pattern and click the button.
     const expectedPattern = 'foo-bar.com';
@@ -1506,9 +1500,6 @@
     dialog.set('category', ContentSettingsTypes.COOKIES);
     dialog.set('cookiesExceptionType', CookiesExceptionType.SITE_DATA);
     flush();
-    // TODO(crbug.com/1378703): Remove after crbug/1378703 launched and the
-    // checkbox is deprecated.
-    assertTrue(dialog.$.thirdParties.hidden);
 
     // Enter a pattern and click the button.
     const expectedPattern = 'foo-bar.com';
diff --git a/chrome/test/data/webui/signin/signin_browsertest.cc b/chrome/test/data/webui/signin/signin_browsertest.cc
index 3fc714c9..d8fe716 100644
--- a/chrome/test/data/webui/signin/signin_browsertest.cc
+++ b/chrome/test/data/webui/signin/signin_browsertest.cc
@@ -61,7 +61,7 @@
   RunTest("signin/profile_customization_test.js", "mocha.run()");
 }
 
-IN_PROC_BROWSER_TEST_F(SigninTest, SigninEnterpriseProfileWelcome) {
+IN_PROC_BROWSER_TEST_F(SigninTest, SigninManagedUserProfileNotice) {
   set_test_loader_host(chrome::kChromeUIEnterpriseProfileWelcomeHost);
   RunTest("signin/enterprise_profile_welcome_test.js", "mocha.run()");
 }
diff --git a/chromeos/crosapi/mojom/test_controller.mojom b/chromeos/crosapi/mojom/test_controller.mojom
index 11ef3481..6498696 100644
--- a/chromeos/crosapi/mojom/test_controller.mojom
+++ b/chromeos/crosapi/mojom/test_controller.mojom
@@ -71,8 +71,8 @@
 // Implemented in lacros-chrome.
 // Lets the Ash browser tests that require Lacros to send commands to this
 // lacros-chrome instance.
-// Next version: 7
-// Next method id: 7
+// Next version: 8
+// Next method id: 8
 [Stable, Uuid="20e7f031-f4e1-4ad9-bd91-ad59eb8b1504"]
 interface StandaloneBrowserTestController {
   // Installs a test web app in lacros-chrome given a start URL and mode (open
@@ -110,6 +110,10 @@
   [MinVersion=6]
   InstallIsolatedWebApp@6(IsolatedWebAppLocation location, bool dev_mode)
     => (InstallWebAppResult result);
+
+  // Sets WebAppSettings pref for a primary user profile.
+  [MinVersion=7]
+  SetWebAppSettingsPref@7(string policy) => (bool success);
 };
 
 // Allows callers running in lacros to trigger test events that are passed to
diff --git a/chromeos/dbus/tpm_manager/fake_tpm_manager_client.cc b/chromeos/dbus/tpm_manager/fake_tpm_manager_client.cc
index 7af1744..4e9f89c 100644
--- a/chromeos/dbus/tpm_manager/fake_tpm_manager_client.cc
+++ b/chromeos/dbus/tpm_manager/fake_tpm_manager_client.cc
@@ -80,6 +80,13 @@
                     ::tpm_manager::ClearStoredOwnerPasswordReply());
 }
 
+void FakeTpmManagerClient::ClearTpm(
+    const ::tpm_manager::ClearTpmRequest& request,
+    ClearTpmCallback callback) {
+  ++clear_tpm_count_;
+  PostProtoResponse(std::move(callback), ::tpm_manager::ClearTpmReply());
+}
+
 void FakeTpmManagerClient::AddObserver(Observer* observer) {
   observer_list_.AddObserver(observer);
 }
@@ -124,6 +131,10 @@
   return clear_stored_owner_password_count_;
 }
 
+int FakeTpmManagerClient::clear_tpm_count() const {
+  return clear_tpm_count_;
+}
+
 void FakeTpmManagerClient::EmitOwnershipTakenSignal() {
   for (auto& observer : observer_list_) {
     observer.OnOwnershipTaken();
diff --git a/chromeos/dbus/tpm_manager/fake_tpm_manager_client.h b/chromeos/dbus/tpm_manager/fake_tpm_manager_client.h
index 6f8bdfeb..7cd6b1d7 100644
--- a/chromeos/dbus/tpm_manager/fake_tpm_manager_client.h
+++ b/chromeos/dbus/tpm_manager/fake_tpm_manager_client.h
@@ -43,6 +43,8 @@
   void ClearStoredOwnerPassword(
       const ::tpm_manager::ClearStoredOwnerPasswordRequest& request,
       ClearStoredOwnerPasswordCallback callback) override;
+  void ClearTpm(const ::tpm_manager::ClearTpmRequest& request,
+                ClearTpmCallback callback) override;
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
 
@@ -59,6 +61,7 @@
   mutable_dictionary_attack_info_reply() override;
   int take_ownership_count() const override;
   int clear_stored_owner_password_count() const override;
+  int clear_tpm_count() const override;
   void EmitOwnershipTakenSignal() override;
 
  private:
@@ -69,6 +72,7 @@
   ::tpm_manager::GetDictionaryAttackInfoReply dictionary_attack_info_reply_;
   int take_ownership_count_ = 0;
   int clear_stored_owner_password_count_ = 0;
+  int clear_tpm_count_ = 0;
 
   // The observer list of ownership taken signal.
   base::ObserverList<Observer> observer_list_;
diff --git a/chromeos/dbus/tpm_manager/tpm_manager_client.cc b/chromeos/dbus/tpm_manager/tpm_manager_client.cc
index 0cd9ee1..12740e4 100644
--- a/chromeos/dbus/tpm_manager/tpm_manager_client.cc
+++ b/chromeos/dbus/tpm_manager/tpm_manager_client.cc
@@ -110,6 +110,10 @@
     CallProtoMethod(::tpm_manager::kClearStoredOwnerPassword, request,
                     std::move(callback));
   }
+  void ClearTpm(const ::tpm_manager::ClearTpmRequest& request,
+                ClearTpmCallback callback) override {
+    CallProtoMethod(::tpm_manager::kClearTpm, request, std::move(callback));
+  }
 
   void AddObserver(Observer* observer) override {
     observer_list_.AddObserver(observer);
diff --git a/chromeos/dbus/tpm_manager/tpm_manager_client.h b/chromeos/dbus/tpm_manager/tpm_manager_client.h
index 507a37a..992ea30 100644
--- a/chromeos/dbus/tpm_manager/tpm_manager_client.h
+++ b/chromeos/dbus/tpm_manager/tpm_manager_client.h
@@ -43,6 +43,8 @@
       base::OnceCallback<void(const ::tpm_manager::TakeOwnershipReply&)>;
   using ClearStoredOwnerPasswordCallback = base::OnceCallback<void(
       const ::tpm_manager::ClearStoredOwnerPasswordReply&)>;
+  using ClearTpmCallback =
+      base::OnceCallback<void(const ::tpm_manager::ClearTpmReply&)>;
 
   // Interface with testing functionality. Accessed through GetTestInterface(),
   // only implemented in the fake implementation.
@@ -70,6 +72,8 @@
     virtual int take_ownership_count() const = 0;
     // Gets the count of `ClearStoredOwnerPassword()` being called.
     virtual int clear_stored_owner_password_count() const = 0;
+    // Gets the count of `ClearTpm()` being called.
+    virtual int clear_tpm_count() const = 0;
     // Emits ownership taken signal.
     virtual void EmitOwnershipTakenSignal() = 0;
   };
@@ -124,6 +128,9 @@
   virtual void ClearStoredOwnerPassword(
       const ::tpm_manager::ClearStoredOwnerPasswordRequest& request,
       ClearStoredOwnerPasswordCallback callback) = 0;
+  // Requests tpm manager to clear TPM after reboot.
+  virtual void ClearTpm(const ::tpm_manager::ClearTpmRequest& request,
+                        ClearTpmCallback callback) = 0;
 
   // Adds an observer.
   virtual void AddObserver(Observer* observer) = 0;
diff --git a/chromeos/dbus/tpm_manager/tpm_manager_client_unittest.cc b/chromeos/dbus/tpm_manager/tpm_manager_client_unittest.cc
index 43b99db3..6a20a7b 100644
--- a/chromeos/dbus/tpm_manager/tpm_manager_client_unittest.cc
+++ b/chromeos/dbus/tpm_manager/tpm_manager_client_unittest.cc
@@ -118,6 +118,7 @@
   ::tpm_manager::GetDictionaryAttackInfoReply expected_get_da_info_reply_;
   ::tpm_manager::TakeOwnershipReply expected_take_ownership_reply_;
   ::tpm_manager::ClearStoredOwnerPasswordReply expected_clear_password_reply_;
+  ::tpm_manager::ClearTpmReply expected_clear_tpm_reply_;
 
   // When it is set `true`, the parsing failure is expected to be translated by
   // proxy to status `STATUS_DBUS_ERROR`.
@@ -152,6 +153,8 @@
     } else if (method_call->GetMember() ==
                ::tpm_manager::kClearStoredOwnerPassword) {
       writer.AppendProtoAsArrayOfBytes(expected_clear_password_reply_);
+    } else if (method_call->GetMember() == ::tpm_manager::kClearTpm) {
+      writer.AppendProtoAsArrayOfBytes(expected_clear_tpm_reply_);
     } else {
       ASSERT_FALSE(true) << "Unrecognized member: " << method_call->GetMember();
     }
@@ -347,6 +350,19 @@
   EXPECT_EQ(expected_clear_password_reply_.status(), result_reply.status());
 }
 
+TEST_F(TpmManagerClientTest, ClearTpm) {
+  // Use a non-zero status value to make sure the value is correctly set.
+  expected_clear_password_reply_.set_status(::tpm_manager::STATUS_DEVICE_ERROR);
+  ::tpm_manager::ClearTpmReply result_reply;
+  auto callback = base::BindOnce(
+      [](::tpm_manager::ClearTpmReply* result_reply,
+         const ::tpm_manager::ClearTpmReply& reply) { *result_reply = reply; },
+      &result_reply);
+  client_->ClearTpm(::tpm_manager::ClearTpmRequest(), std::move(callback));
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(expected_clear_tpm_reply_.status(), result_reply.status());
+}
+
 TEST_F(TpmManagerClientTest, OnwershipTakenSignal) {
   TestObserver observer;
   ASSERT_EQ(observer.signal_count(), 0);
diff --git a/chromeos/profiles/arm.afdo.newest.txt b/chromeos/profiles/arm.afdo.newest.txt
index 0dc19f35..69b792c 100644
--- a/chromeos/profiles/arm.afdo.newest.txt
+++ b/chromeos/profiles/arm.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-none-121-6099.25-1700484597-benchmark-121.0.6148.0-r1-redacted.afdo.xz
+chromeos-chrome-arm-none-121-6099.25-1700484597-benchmark-121.0.6149.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index 4312cb6..78189be 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-121-6126.0-1700479769-benchmark-121.0.6148.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-121-6126.0-1700479769-benchmark-121.0.6149.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index d909287a..b74685b 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-121-6099.25-1700476772-benchmark-121.0.6148.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-121-6099.25-1700476772-benchmark-121.0.6149.0-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb
index 489f76a..3e910c0 100644
--- a/chromeos/strings/chromeos_strings_fa.xtb
+++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -1101,7 +1101,7 @@
 <translation id="9149391708638971077">اجرای آزمایش حافظه</translation>
 <translation id="9161276708550942948">فاصله</translation>
 <translation id="9173638680043580060">کمتر از یک دقیقه باقیمانده است</translation>
-<translation id="9174334653006917325">رنگ میانای کاربری</translation>
+<translation id="9174334653006917325">رنگ واسط کاربر</translation>
 <translation id="917720651393141712">آزمایش کردن</translation>
 <translation id="9188992814426075118">صفحه‌کلیدتان می‌تواند به‌طور خودکار با کاغذدیواری منطبق شود</translation>
 <translation id="9189000703457422362">‏نمی‌توان بااستفاده از نقطه‌های APN که به‌طور خودکار شناسایی شده است به این شبکه متصل شد. برای کسب اطلاعات بیشتر با شرکت مخابراتی‌تان تماس بگیرید.</translation>
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index 4303c3a..e017098 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -109,11 +109,6 @@
   # https://crbug.com/1402224
   "audio.PlaybackAudioControls",
 
-  # https://crbug.com/1415861, b/302636099
-  "crostini.ResizeRestart.bullseye_stable",
-  "crostini.ResizeRestart.buster_stable",
-  "crostini.ResizeRestart.bookworm_stable",
-
   # b/287525851
   "arc.AudioValidity.playback",
   "arc.AudioValidity.record",
diff --git a/clank b/clank
index 3e758b9..116890a 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 3e758b938a904b48f4618173377ce9ad2c6ba408
+Subproject commit 116890a11c4b85dd9bf6604fe4a1e690db8d5834
diff --git a/components/autofill/content/common/mojom/autofill_agent.mojom b/components/autofill/content/common/mojom/autofill_agent.mojom
index 0291db8..6d2ef6eb 100644
--- a/components/autofill/content/common/mojom/autofill_agent.mojom
+++ b/components/autofill/content/common/mojom/autofill_agent.mojom
@@ -177,4 +177,8 @@
   // Tells the renderer that a password can be generated on the fields
   // identified by |form|.
   FoundFormEligibleForGeneration(PasswordFormGenerationData form);
+
+  // Tells the renderer to advance focus to the next field after password fields
+  // (assuming that password fields are adjacent in account creation).
+  FocusNextFieldAfterPasswords();
 };
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc
index fd0b300..f529453 100644
--- a/components/autofill/content/renderer/password_generation_agent.cc
+++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -362,10 +362,6 @@
       return;
     }
     password_agent_->TrackAutofilledElement(password_element);
-
-    // Advance focus to the next input field. We assume password fields in
-    // an account creation form are always adjacent.
-    render_frame()->GetWebView()->AdvanceFocus(false);
   }
   CHECK(base::Contains(current_generation_item_->password_elements_,
                        current_generation_item_->generation_element_));
@@ -391,6 +387,20 @@
   }
 }
 
+void PasswordGenerationAgent::FocusNextFieldAfterPasswords() {
+  if (!current_generation_item_ || !render_frame()) {
+    return;
+  }
+
+  for (const WebInputElement& password_element :
+       current_generation_item_->password_elements_) {
+    if (password_element ==
+        password_agent_->focused_element().DynamicTo<WebInputElement>()) {
+      render_frame()->GetWebView()->AdvanceFocus(false);
+    }
+  }
+}
+
 std::unique_ptr<FormData> PasswordGenerationAgent::CreateFormDataToPresave() {
   DCHECK(current_generation_item_);
   DCHECK(!current_generation_item_->generation_element_.IsNull());
diff --git a/components/autofill/content/renderer/password_generation_agent.h b/components/autofill/content/renderer/password_generation_agent.h
index ded9dcc..fa6f561 100644
--- a/components/autofill/content/renderer/password_generation_agent.h
+++ b/components/autofill/content/renderer/password_generation_agent.h
@@ -64,6 +64,7 @@
   // if the generation was triggered successfully.
   void TriggeredGeneratePassword(
       TriggeredGeneratePasswordCallback callback) override;
+  void FocusNextFieldAfterPasswords() override;
 
   // Returns true if the field being changed is one where a generated password
   // is being offered. Updates the state of the popup if necessary.
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 5c73088..f2df8c2e 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -101,16 +101,12 @@
     "autofill_granular_filling_utils.h",
     "autofill_manager.cc",
     "autofill_manager.h",
-    "autofill_observer.cc",
-    "autofill_observer.h",
     "autofill_optimization_guide.cc",
     "autofill_optimization_guide.h",
     "autofill_profile_import_process.cc",
     "autofill_profile_import_process.h",
     "autofill_profile_sync_util.cc",
     "autofill_profile_sync_util.h",
-    "autofill_subject.cc",
-    "autofill_subject.h",
     "autofill_suggestion_generator.cc",
     "autofill_suggestion_generator.h",
     "autofill_trigger_details.h",
@@ -848,8 +844,6 @@
     "strike_databases/test_inmemory_strike_database.h",
     "test_address_normalizer.cc",
     "test_address_normalizer.h",
-    "test_autofill_async_observer.cc",
-    "test_autofill_async_observer.h",
     "test_autofill_client.h",
     "test_autofill_clock.cc",
     "test_autofill_clock.h",
@@ -1007,7 +1001,6 @@
     "autofill_optimization_guide_unittest.cc",
     "autofill_profile_import_process_unittest.cc",
     "autofill_profile_sync_util_unittest.cc",
-    "autofill_subject_unittest.cc",
     "autofill_suggestion_generator_unittest.cc",
     "autofill_type_unittest.cc",
     "browser_autofill_manager_unittest.cc",
diff --git a/components/autofill/core/browser/autocomplete_history_manager.cc b/components/autofill/core/browser/autocomplete_history_manager.cc
index a13b945..0495cc4 100644
--- a/components/autofill/core/browser/autocomplete_history_manager.cc
+++ b/components/autofill/core/browser/autocomplete_history_manager.cc
@@ -29,8 +29,6 @@
 
 namespace autofill {
 
-using NotificationType = AutofillObserver::NotificationType;
-
 namespace {
 
 // Limit on the number of suggestions to appear in the pop-up menu under an
@@ -82,18 +80,19 @@
     AutofillSuggestionTriggerSource trigger_source,
     const FormFieldData& field,
     const AutofillClient& client,
-    base::WeakPtr<SuggestionsHandler> handler,
+    OnSuggestionsReturnedCallback on_suggestions_returned,
     const SuggestionsContext& context) {
   if (!field.should_autocomplete)
     return false;
 
-  CancelPendingQueries(handler.get());
+  CancelPendingQueries();
 
   if (!IsMeaningfulFieldName(field.name) || !client.IsAutocompleteEnabled() ||
       field.form_control_type == FormControlType::kTextArea ||
       IsInAutofillSuggestionsDisabledExperiment()) {
-    SendSuggestions({}, QueryHandler(field.global_id(), trigger_source,
-                                     field.value, handler));
+    SendSuggestions({},
+                    QueryHandler(field.global_id(), trigger_source, field.value,
+                                 std::move(on_suggestions_returned)));
     return true;
   }
 
@@ -103,8 +102,9 @@
 
     // We can simply insert, since |query_handle| is always unique.
     pending_queries_.insert(
-        {query_handle, QueryHandler(field.global_id(), trigger_source,
-                                    field.value, handler)});
+        {query_handle,
+         QueryHandler(field.global_id(), trigger_source, field.value,
+                      std::move(on_suggestions_returned))});
     return true;
   }
 
@@ -118,7 +118,6 @@
     const std::vector<FormFieldData>& fields,
     bool is_autocomplete_enabled) {
   if (!is_autocomplete_enabled || is_off_the_record_) {
-    Notify(NotificationType::AutocompleteFormSkipped);
     return;
   }
   std::vector<FormFieldData> autocomplete_saveable_fields;
@@ -130,23 +129,16 @@
   }
   if (!autocomplete_saveable_fields.empty() && profile_database_.get()) {
     profile_database_->AddFormFields(autocomplete_saveable_fields);
-    Notify(NotificationType::AutocompleteFormSubmitted);
   }
 }
 
-void AutocompleteHistoryManager::CancelPendingQueries(
-    const SuggestionsHandler* handler) {
-  if (handler && profile_database_) {
+void AutocompleteHistoryManager::CancelPendingQueries() {
+  if (profile_database_) {
     for (const auto& [handle, query_handler] : pending_queries_) {
-      if (query_handler.handler_ && query_handler.handler_.get() == handler) {
-        profile_database_->CancelRequest(handle);
-      }
+      profile_database_->CancelRequest(handle);
     }
   }
-
-  // Cleaning up the map with the cancelled handler to remove cancelled
-  // requests.
-  CleanupEntries(handler);
+  pending_queries_.clear();
 }
 
 void AutocompleteHistoryManager::OnRemoveCurrentSingleFieldSuggestion(
@@ -230,14 +222,24 @@
   request_callbacks_iter->second.Run(current_handle, std::move(result));
 }
 
+AutocompleteHistoryManager::QueryHandler::QueryHandler(
+    FieldGlobalId field_id,
+    AutofillSuggestionTriggerSource trigger_source,
+    std::u16string prefix,
+    OnSuggestionsReturnedCallback on_suggestions_returned)
+    : field_id_(field_id),
+      trigger_source_(trigger_source),
+      prefix_(std::move(prefix)),
+      on_suggestions_returned_(std::move(on_suggestions_returned)) {}
+
+AutocompleteHistoryManager::QueryHandler::QueryHandler(QueryHandler&&) =
+    default;
+
+AutocompleteHistoryManager::QueryHandler::~QueryHandler() = default;
+
 void AutocompleteHistoryManager::SendSuggestions(
     const std::vector<AutocompleteEntry>& entries,
-    const QueryHandler& query_handler) {
-  if (!query_handler.handler_) {
-    // Either the handler has been destroyed, or it is invalid.
-    return;
-  }
-
+    QueryHandler query_handler) {
   // If there is only one suggestion that is the exact same string as
   // what is in the input box, then don't show the suggestion.
   bool hide_suggestions =
@@ -253,8 +255,8 @@
     }
   }
 
-  query_handler.handler_->OnSuggestionsReturned(
-      query_handler.field_id_, query_handler.trigger_source_, suggestions);
+  std::move(query_handler.on_suggestions_returned_)
+      .Run(query_handler.field_id_, query_handler.trigger_source_, suggestions);
 }
 
 void AutocompleteHistoryManager::CancelAllPendingQueries() {
@@ -267,14 +269,6 @@
   pending_queries_.clear();
 }
 
-void AutocompleteHistoryManager::CleanupEntries(
-    const SuggestionsHandler* handler) {
-  std::erase_if(pending_queries_, [handler](const auto& pending_query) {
-    const QueryHandler& query_handler = pending_query.second;
-    return !query_handler.handler_ || query_handler.handler_.get() == handler;
-  });
-}
-
 void AutocompleteHistoryManager::OnAutofillValuesReturned(
     WebDataServiceBase::Handle current_handle,
     std::unique_ptr<WDTypedResult> result) {
@@ -297,7 +291,7 @@
       static_cast<const WDResult<std::vector<AutocompleteEntry>>*>(
           result.get());
   std::vector<AutocompleteEntry> entries = autocomplete_result->GetValue();
-  SendSuggestions(entries, query_handler);
+  SendSuggestions(entries, std::move(query_handler));
 }
 
 void AutocompleteHistoryManager::OnAutofillCleanupReturned(
@@ -309,8 +303,6 @@
   // Cleanup was successful, update the latest run milestone.
   pref_service_->SetInteger(prefs::kAutocompleteLastVersionRetentionPolicy,
                             CHROME_VERSION_MAJOR);
-
-  Notify(NotificationType::AutocompleteCleanupDone);
 }
 
 // We put the following restriction on stored FormFields:
diff --git a/components/autofill/core/browser/autocomplete_history_manager.h b/components/autofill/core/browser/autocomplete_history_manager.h
index 88644ca7..f5ef98e2e 100644
--- a/components/autofill/core/browser/autocomplete_history_manager.h
+++ b/components/autofill/core/browser/autocomplete_history_manager.h
@@ -12,7 +12,6 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "components/autofill/core/browser/autofill_subject.h"
 #include "components/autofill/core/browser/single_field_form_filler.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/autofill/core/browser/webdata/autocomplete_entry.h"
@@ -33,8 +32,7 @@
 // through WebDataServiceBase.
 class AutocompleteHistoryManager : public SingleFieldFormFiller,
                                    public KeyedService,
-                                   public WebDataServiceConsumer,
-                                   public AutofillSubject {
+                                   public WebDataServiceConsumer {
  public:
   AutocompleteHistoryManager();
 
@@ -49,11 +47,11 @@
       AutofillSuggestionTriggerSource trigger_source,
       const FormFieldData& field,
       const AutofillClient& client,
-      base::WeakPtr<SuggestionsHandler> handler,
+      OnSuggestionsReturnedCallback on_suggestions_returned,
       const SuggestionsContext& context) override;
   void OnWillSubmitFormWithFields(const std::vector<FormFieldData>& fields,
                                   bool is_autocomplete_enabled) override;
-  void CancelPendingQueries(const SuggestionsHandler* handler) override;
+  void CancelPendingQueries() override;
   void OnRemoveCurrentSingleFieldSuggestion(const std::u16string& field_name,
                                             const std::u16string& value,
                                             PopupItemId popup_item_id) override;
@@ -79,20 +77,42 @@
  private:
   friend class AutocompleteHistoryManagerTest;
 
-  // Sends the autocomplete |suggestions| to the |query_handler|'s handler for
-  // display in the associated Autofill popup. The parameter may be empty if
-  // there are no new autocomplete additions.
+  // Internal data object used to keep a request's context to associate it
+  // with the appropriate response.
+  struct QueryHandler {
+    QueryHandler(FieldGlobalId field_id,
+                 AutofillSuggestionTriggerSource trigger_source,
+                 std::u16string prefix,
+                 OnSuggestionsReturnedCallback on_suggestions_returned);
+    QueryHandler(const QueryHandler&) = delete;
+    QueryHandler(QueryHandler&&);
+    ~QueryHandler();
+
+    // The queried field ID.
+    FieldGlobalId field_id_;
+
+    // Describes what caused the suggestions to trigger. This value was provided
+    // by the handler when requesting suggestions. It is temporarily stored
+    // while suggestions are queried, so it can be passed on to the
+    // `on_suggestions_returned_` callback.
+    AutofillSuggestionTriggerSource trigger_source_;
+
+    // Prefix used to search suggestions, submitted by the handler.
+    std::u16string prefix_;
+
+    // Callback to-be-executed once a response from the DB is available.
+    OnSuggestionsReturnedCallback on_suggestions_returned_;
+  };
+
+  // Sends the autocomplete `entries` to the `query_handler` for display in the
+  // associated Autofill popup. The parameter may be empty if there are no new
+  // autocomplete additions.
   void SendSuggestions(const std::vector<AutocompleteEntry>& entries,
-                       const QueryHandler& query_handler);
+                       QueryHandler query_handler);
 
   // Cancels all outstanding queries and clears out the |pending_queries_| map.
   void CancelAllPendingQueries();
 
-  // Cleans-up the dictionary of |pending_queries_| by checking
-  // - If any handler instance was destroyed (known via WeakPtr)
-  // - If the given |handler| pointer is associated with a query.
-  void CleanupEntries(const SuggestionsHandler* handler);
-
   // Function handling WebDataService responses of type AUTOFILL_VALUE_RESULT.
   // |current_handle| is the DB query handle, and is used to retrieve the
   // handler associated with that query.
diff --git a/components/autofill/core/browser/autocomplete_history_manager_unittest.cc b/components/autofill/core/browser/autocomplete_history_manager_unittest.cc
index 754c32c79..f699ee6 100644
--- a/components/autofill/core/browser/autocomplete_history_manager_unittest.cc
+++ b/components/autofill/core/browser/autocomplete_history_manager_unittest.cc
@@ -5,12 +5,14 @@
 #include <string>
 #include <vector>
 
+#include "base/functional/callback_helpers.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
 #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/time.h"
@@ -38,6 +40,8 @@
 
 namespace {
 
+using MockSuggestionsReturnedCallback =
+    base::MockCallback<SingleFieldFormFiller::OnSuggestionsReturnedCallback>;
 using test::CreateTestFormField;
 using ::testing::_;
 using ::testing::Eq;
@@ -45,28 +49,6 @@
 using ::testing::Return;
 using ::testing::UnorderedElementsAre;
 
-class MockSuggestionsHandler
-    : public AutocompleteHistoryManager::SuggestionsHandler {
- public:
-  MockSuggestionsHandler() {}
-
-  MockSuggestionsHandler(const MockSuggestionsHandler&) = delete;
-  MockSuggestionsHandler& operator=(const MockSuggestionsHandler&) = delete;
-
-  MOCK_METHOD(void,
-              OnSuggestionsReturned,
-              (FieldGlobalId field_id,
-               AutofillSuggestionTriggerSource trigger_source,
-               const std::vector<Suggestion>& suggestions),
-              (override));
-
-  base::WeakPtr<MockSuggestionsHandler> GetWeakPtr() {
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
- private:
-  base::WeakPtrFactory<MockSuggestionsHandler> weak_ptr_factory_{this};
-};
 }  // namespace
 
 class AutocompleteHistoryManagerTest : public testing::Test {
@@ -454,19 +436,17 @@
        OnGetSingleFieldSuggestions_FieldShouldNotAutocomplete) {
   test_field_.should_autocomplete = false;
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   // Setting up mock to verify that call to the handler's OnSuggestionsReturned
   // is not triggered.
-  EXPECT_CALL(*suggestions_handler, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   EXPECT_CALL(*web_data_service_, GetFormValuesForElementName).Times(0);
 
   // Simulate request for suggestions.
   EXPECT_FALSE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 }
 
 // Make sure our handler is called at the right time.
@@ -474,8 +454,6 @@
        SuggestionsReturned_InvokeHandler_Empty) {
   int mocked_db_query_id = 100;
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   std::vector<AutocompleteEntry> expected_values;
 
   std::unique_ptr<WDTypedResult> mocked_results =
@@ -487,16 +465,15 @@
       .WillOnce(Return(mocked_db_query_id));
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response triggers a call to the handler's
   // OnSuggestionsReturned
-  EXPECT_CALL(*suggestions_handler.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
+  EXPECT_CALL(mock_callback,
+              Run(test_field_.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::Truly(IsEmptySuggestionVector)));
 
@@ -509,7 +486,6 @@
 // it has a meaningless sub string that is allowed for sub string matches.
 TEST_F(AutocompleteHistoryManagerTest,
        DoQuerySuggestionsForMeaninglessFieldNames_FilterSubStringName) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   test_field_ = CreateTestFormField(/*label=*/"", "payment_cvv_info",
                                     /*value=*/"", FormControlType::kInputText);
 
@@ -520,17 +496,16 @@
       .Times(0);
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response does not trigger a call to the
   // handler's OnSuggestionsReturned.
   EXPECT_CALL(
-      *suggestions_handler.get(),
-      OnSuggestionsReturned(
-          test_field_.global_id(),
+      mock_callback,
+      Run(test_field_.global_id(),
           AutofillSuggestionTriggerSource::kFormControlElementClicked, _))
       .Times(0);
 }
@@ -539,7 +514,6 @@
 // it has a meaningless name.
 TEST_F(AutocompleteHistoryManagerTest,
        DoQuerySuggestionsForMeaninglessFieldNames_FilterName) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   test_field_ = CreateTestFormField(/*label=*/"", "input_123", /*value=*/"",
                                     FormControlType::kInputText);
 
@@ -550,17 +524,16 @@
       .Times(0);
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response does not trigger a call to the
   // handler's OnSuggestionsReturned.
   EXPECT_CALL(
-      *suggestions_handler.get(),
-      OnSuggestionsReturned(
-          test_field_.global_id(),
+      mock_callback,
+      Run(test_field_.global_id(),
           AutofillSuggestionTriggerSource::kFormControlElementClicked, _))
       .Times(0);
 }
@@ -569,7 +542,6 @@
 // which is not allowed for substring matches.
 TEST_F(AutocompleteHistoryManagerTest,
        DoQuerySuggestionsForMeaninglessFieldNames_PassNameWithSubstring) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   int mocked_db_query_id = 100;
   test_field_ = CreateTestFormField(/*label=*/"", "foOTPace", /*value=*/"",
                                     FormControlType::kInputText);
@@ -586,16 +558,15 @@
       .WillOnce(Return(mocked_db_query_id));
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response triggers a call to the handler's
   EXPECT_CALL(
-      *suggestions_handler.get(),
-      OnSuggestionsReturned(
-          test_field_.global_id(),
+      mock_callback,
+      Run(test_field_.global_id(),
           AutofillSuggestionTriggerSource::kFormControlElementClicked, _));
 
   autocomplete_manager_->OnWebDataServiceRequestDone(mocked_db_query_id,
@@ -605,7 +576,6 @@
 // because the field's name is meaningful.
 TEST_F(AutocompleteHistoryManagerTest,
        DoQuerySuggestionsForMeaninglessFieldNames_PassName) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   int mocked_db_query_id = 100;
   test_field_ = CreateTestFormField(/*label=*/"", "addressline_1", /*value=*/"",
                                     FormControlType::kInputText);
@@ -622,16 +592,15 @@
       .WillOnce(Return(mocked_db_query_id));
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response triggers a call to the handler's
   EXPECT_CALL(
-      *suggestions_handler.get(),
-      OnSuggestionsReturned(
-          test_field_.global_id(),
+      mock_callback,
+      Run(test_field_.global_id(),
           AutofillSuggestionTriggerSource::kFormControlElementClicked, _));
 
   autocomplete_manager_->OnWebDataServiceRequestDone(mocked_db_query_id,
@@ -642,8 +611,6 @@
        SuggestionsReturned_InvokeHandler_SingleValue) {
   int mocked_db_query_id = 100;
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   std::vector<AutocompleteEntry> expected_values = {
       GetAutocompleteEntry(test_field_.name, u"SomePrefixOne")};
 
@@ -656,15 +623,14 @@
       .WillOnce(Return(mocked_db_query_id));
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response triggers a call to the handler's
-  EXPECT_CALL(*suggestions_handler.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
+  EXPECT_CALL(mock_callback,
+              Run(test_field_.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   UnorderedElementsAre(Field(
                       &Suggestion::main_text,
@@ -682,8 +648,6 @@
        SuggestionsReturned_InvokeHandler_PassesTriggerSource) {
   int mocked_db_query_id = 100;
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   std::vector<AutocompleteEntry> expected_values = {
       GetAutocompleteEntry(test_field_.name, u"SomePrefixOne")};
 
@@ -696,15 +660,14 @@
       .WillOnce(Return(mocked_db_query_id));
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response triggers a call to the handler's
-  EXPECT_CALL(*suggestions_handler.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
+  EXPECT_CALL(mock_callback,
+              Run(test_field_.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   UnorderedElementsAre(Field(
                       &Suggestion::main_text,
@@ -722,8 +685,6 @@
        SuggestionsReturned_InvokeHandler_SingleValue_EqualsPrefix) {
   int mocked_db_query_id = 100;
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   std::vector<AutocompleteEntry> expected_values = {
       GetAutocompleteEntry(test_field_.name, test_field_.value)};
 
@@ -736,15 +697,14 @@
       .WillOnce(Return(mocked_db_query_id));
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response triggers a call to the handler's
-  EXPECT_CALL(*suggestions_handler.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
+  EXPECT_CALL(mock_callback,
+              Run(test_field_.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::Truly(IsEmptySuggestionVector)));
 
@@ -759,8 +719,6 @@
        SuggestionsReturned_InvokeHandler_SingleValue_EqualsPrefix_DiffCase) {
   int mocked_db_query_id = 100;
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   std::vector<AutocompleteEntry> expected_values = {
       GetAutocompleteEntry(test_field_.name, u"someprefix")};
 
@@ -773,15 +731,14 @@
       .WillOnce(Return(mocked_db_query_id));
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that DB response triggers a call to the handler's
-  EXPECT_CALL(*suggestions_handler.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
+  EXPECT_CALL(mock_callback,
+              Run(test_field_.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   UnorderedElementsAre(Field(
                       &Suggestion::main_text,
@@ -799,7 +756,6 @@
   // suggestions, and that two values were found.
   int mocked_db_query_id = 100;
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::u16string test_value = u"SomePrefixOne";
   std::u16string other_test_value = u"SomePrefixOne";
   int days_since_last_use = 10;
@@ -821,13 +777,13 @@
                                           _, autocomplete_manager_.get()))
       .WillOnce(Return(mocked_db_query_id));
 
-  EXPECT_CALL(*suggestions_handler.get(), OnSuggestionsReturned);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run);
 
   // Simulate request for suggestions.
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Simulate response from DB.
   autocomplete_manager_->OnWebDataServiceRequestDone(mocked_db_query_id,
@@ -849,8 +805,6 @@
   int mocked_db_query_id_first = 100;
   int mocked_db_query_id_second = 101;
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   std::vector<AutocompleteEntry> expected_values_first = {
       GetAutocompleteEntry(test_field_.name, u"SomePrefixOne")};
 
@@ -870,10 +824,10 @@
       .WillOnce(Return(mocked_db_query_id_second));
 
   // Simulate request for the first suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Simulate request for the second suggestions (this will cancel the first
   // one).
@@ -881,13 +835,11 @@
       .Times(1);
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
   // Setting up mock to verify that we can get the second response first.
-  EXPECT_CALL(*suggestions_handler.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
+  EXPECT_CALL(mock_callback,
+              Run(test_field_.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   UnorderedElementsAre(Field(
                       &Suggestion::main_text,
@@ -901,9 +853,8 @@
   // Setting up mock to verify that the handler doesn't get called for the first
   // request, which was cancelled.
   EXPECT_CALL(
-      *suggestions_handler.get(),
-      OnSuggestionsReturned(
-          test_field_.global_id(),
+      mock_callback,
+      Run(test_field_.global_id(),
           AutofillSuggestionTriggerSource::kFormControlElementClicked, _))
       .Times(0);
 
@@ -913,135 +864,36 @@
 }
 
 TEST_F(AutocompleteHistoryManagerTest,
-       SuggestionsReturned_InvokeHandler_TwoRequests_TwoHandlers) {
-  int mocked_db_query_id_first = 100;
-  int mocked_db_query_id_second = 101;
-
-  auto suggestions_handler_first = std::make_unique<MockSuggestionsHandler>();
-  auto suggestions_handler_second = std::make_unique<MockSuggestionsHandler>();
-
-  std::vector<AutocompleteEntry> expected_values_first = {
-      GetAutocompleteEntry(test_field_.name, u"SomePrefixOne")};
-
-  std::vector<AutocompleteEntry> expected_values_second = {
-      GetAutocompleteEntry(test_field_.name, u"SomePrefixTwo")};
-
-  std::unique_ptr<WDTypedResult> mocked_results_first =
-      GetMockedDbResults(expected_values_first);
-
-  std::unique_ptr<WDTypedResult> mocked_results_second =
-      GetMockedDbResults(expected_values_second);
-
-  EXPECT_CALL(*web_data_service_,
-              GetFormValuesForElementName(test_field_.name, test_field_.value,
-                                          _, autocomplete_manager_.get()))
-      .WillOnce(Return(mocked_db_query_id_first))
-      .WillOnce(Return(mocked_db_query_id_second));
-
-  // Simulate request for the first suggestions.
-  EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
-      AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler_first->GetWeakPtr(),
-      SuggestionsContext()));
-
-  // Simulate request for the second suggestions.
-  EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
-      AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler_second->GetWeakPtr(),
-      SuggestionsContext()));
-
-  // Setting up mock to verify that we get the second response first.
-  EXPECT_CALL(*suggestions_handler_second.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
-                  AutofillSuggestionTriggerSource::kFormControlElementClicked,
-                  UnorderedElementsAre(Field(
-                      &Suggestion::main_text,
-                      Suggestion::Text(expected_values_second[0].key().value(),
-                                       Suggestion::Text::IsPrimary(true))))));
-
-  // Simulate response from DB, second request comes back before.
-  autocomplete_manager_->OnWebDataServiceRequestDone(
-      mocked_db_query_id_second, std::move(mocked_results_second));
-
-  // Setting up mock to verify that we get the first response second.
-  EXPECT_CALL(*suggestions_handler_first.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
-                  AutofillSuggestionTriggerSource::kFormControlElementClicked,
-                  UnorderedElementsAre(Field(
-                      &Suggestion::main_text,
-                      Suggestion::Text(expected_values_first[0].key().value(),
-                                       Suggestion::Text::IsPrimary(true))))));
-
-  // Simulate response from DB, first request comes back after.
-  autocomplete_manager_->OnWebDataServiceRequestDone(
-      mocked_db_query_id_first, std::move(mocked_results_first));
-}
-
-TEST_F(AutocompleteHistoryManagerTest,
-       SuggestionsReturned_CancelOne_ReturnOne) {
-  // Initialize variables for the first handler, which is the one that will be
-  // cancelled.
-  auto suggestions_handler_one = std::make_unique<MockSuggestionsHandler>();
-  int mocked_db_query_id_one = 100;
+       SuggestionsReturned_CancelPendingQueries) {
+  int mocked_db_query_id = 100;
   std::vector<AutocompleteEntry> expected_values_one = {
       GetAutocompleteEntry(test_field_.name, u"SomePrefixOne")};
   std::unique_ptr<WDTypedResult> mocked_results_one =
       GetMockedDbResults(expected_values_one);
 
-  // Initialize variables for the second handler, which will be fulfilled.
-  auto suggestions_handler_two = std::make_unique<MockSuggestionsHandler>();
-  int mocked_db_query_id_two = 101;
-  std::vector<AutocompleteEntry> expected_values_two = {
-      GetAutocompleteEntry(test_field_.name, u"SomePrefixTwo")};
-  std::unique_ptr<WDTypedResult> mocked_results_two =
-      GetMockedDbResults(expected_values_two);
-
-  // Simulate first handler request for autocomplete suggestions.
+  // Simulate a request for autocomplete suggestions.
   EXPECT_CALL(*web_data_service_,
               GetFormValuesForElementName(test_field_.name, test_field_.value,
                                           _, autocomplete_manager_.get()))
-      .WillOnce(Return(mocked_db_query_id_one))
-      .WillOnce(Return(mocked_db_query_id_two));
+      .WillOnce(Return(mocked_db_query_id));
 
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler_one->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 
-  // Simulate second handler request for autocomplete suggestions.
-  EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
-      AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler_two->GetWeakPtr(),
-      SuggestionsContext()));
+  // Simulate cancelling the request.
+  EXPECT_CALL(*web_data_service_, CancelRequest(mocked_db_query_id));
+  autocomplete_manager_->CancelPendingQueries();
 
-  // Simulate first handler cancelling its request.
-  EXPECT_CALL(*web_data_service_, CancelRequest(mocked_db_query_id_one))
-      .Times(1);
-  autocomplete_manager_->CancelPendingQueries(suggestions_handler_one.get());
-
-  // Simulate second handler receiving the suggestions.
-  EXPECT_CALL(*suggestions_handler_two.get(),
-              OnSuggestionsReturned(
-                  test_field_.global_id(),
-                  AutofillSuggestionTriggerSource::kFormControlElementClicked,
-                  UnorderedElementsAre(Field(
-                      &Suggestion::main_text,
-                      Suggestion::Text(expected_values_two[0].key().value(),
-                                       Suggestion::Text::IsPrimary(true))))));
-  autocomplete_manager_->OnWebDataServiceRequestDone(
-      mocked_db_query_id_two, std::move(mocked_results_two));
-
-  // Make sure first handler is not called when the DB responds.
+  // Make sure the handler is not called when the DB responds.
   EXPECT_CALL(
-      *suggestions_handler_one.get(),
-      OnSuggestionsReturned(
-          test_field_.global_id(),
+      mock_callback,
+      Run(test_field_.global_id(),
           AutofillSuggestionTriggerSource::kFormControlElementClicked, _))
       .Times(0);
   autocomplete_manager_->OnWebDataServiceRequestDone(
-      mocked_db_query_id_one, std::move(mocked_results_one));
+      mocked_db_query_id, std::move(mocked_results_one));
 }
 
 // Verify that no autocomplete suggestion is returned for a textarea.
@@ -1054,49 +906,32 @@
   FormFieldData field =
       CreateTestFormField("Address", "address", "", FormControlType::kTextArea);
 
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-  EXPECT_CALL(*suggestions_handler.get(),
-              OnSuggestionsReturned(
-                  field.global_id(),
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::Truly(IsEmptySuggestionVector)));
 
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, field,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, mock_callback.Get(), SuggestionsContext()));
 }
 
 TEST_F(AutocompleteHistoryManagerTest, DestructorCancelsRequests) {
-  int mocked_db_query_id_first = 100;
-  int mocked_db_query_id_second = 101;
-
-  auto suggestions_handler_first = std::make_unique<MockSuggestionsHandler>();
-  auto suggestions_handler_second = std::make_unique<MockSuggestionsHandler>();
+  int mocked_db_query_id = 100;
 
   EXPECT_CALL(*web_data_service_,
               GetFormValuesForElementName(test_field_.name, test_field_.value,
                                           _, autocomplete_manager_.get()))
-      .WillOnce(Return(mocked_db_query_id_first))
-      .WillOnce(Return(mocked_db_query_id_second));
+      .WillOnce(Return(mocked_db_query_id));
 
-  // Simulate request for the first suggestions.
+  // Simulate request for suggestions.
   EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler_first->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, base::DoNothing(), SuggestionsContext()));
 
-  // Simulate request for the second suggestions.
-  EXPECT_TRUE(autocomplete_manager_->OnGetSingleFieldSuggestions(
-      AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler_second->GetWeakPtr(),
-      SuggestionsContext()));
-
-  // Expect cancel calls for both requests.
-  EXPECT_CALL(*web_data_service_, CancelRequest(mocked_db_query_id_first))
-      .Times(1);
-  EXPECT_CALL(*web_data_service_, CancelRequest(mocked_db_query_id_second))
-      .Times(1);
+  // Expect a cancel call.
+  EXPECT_CALL(*web_data_service_, CancelRequest(mocked_db_query_id));
 
   autocomplete_manager_.reset();
 
diff --git a/components/autofill/core/browser/autofill_observer.cc b/components/autofill/core/browser/autofill_observer.cc
deleted file mode 100644
index 8a64b04..0000000
--- a/components/autofill/core/browser/autofill_observer.cc
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/autofill_observer.h"
-
-#include "base/run_loop.h"
-
-namespace autofill {
-
-AutofillObserver::AutofillObserver(NotificationType notification_type,
-                                   bool detach_on_notify)
-    : notification_type_(notification_type),
-      detach_on_notify_(detach_on_notify) {}
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_observer.h b/components/autofill/core/browser/autofill_observer.h
deleted file mode 100644
index e2bb64b..0000000
--- a/components/autofill/core/browser/autofill_observer.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_OBSERVER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_OBSERVER_H_
-
-#include "base/observer_list_types.h"
-
-namespace autofill {
-
-class AutofillObserver : public base::CheckedObserver {
- public:
-  enum NotificationType {
-    AutocompleteFormSubmitted,
-    AutocompleteFormSkipped,
-    AutocompleteCleanupDone
-  };
-
-  // |notification_type| is the notification type that this observer observes.
-  // |detach_on_notify| will let the AutofillSubject know that this
-  // observer only wants to watch for the first notification of that type.
-  AutofillObserver(NotificationType notification_type, bool detach_on_notify);
-
-  // Invoked by the watched AutofillSubject.
-  virtual void OnNotify() = 0;
-
-  NotificationType notification_type() { return notification_type_; }
-  bool detach_on_notify() { return detach_on_notify_; }
-
- private:
-  NotificationType notification_type_;
-  bool detach_on_notify_;
-};
-
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_OBSERVER_H_
diff --git a/components/autofill/core/browser/autofill_subject.cc b/components/autofill/core/browser/autofill_subject.cc
deleted file mode 100644
index 88c91fe..0000000
--- a/components/autofill/core/browser/autofill_subject.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/autofill_subject.h"
-
-#include <vector>
-
-#include "base/observer_list.h"
-#include "components/autofill/core/browser/autofill_observer.h"
-
-namespace autofill {
-
-AutofillSubject::AutofillSubject() = default;
-AutofillSubject::~AutofillSubject() = default;
-
-void AutofillSubject::Attach(AutofillObserver* observer) {
-  observers_map_[observer->notification_type()].AddObserver(observer);
-}
-
-void AutofillSubject::Detach(AutofillObserver* observer) {
-  auto it = observers_map_.find(observer->notification_type());
-  if (it == observers_map_.end()) {
-    return;
-  }
-  it->second.RemoveObserver(observer);
-}
-
-void AutofillSubject::Notify(NotificationType notification_type) {
-  auto it = observers_map_.find(notification_type);
-  if (it == observers_map_.end()) {
-    return;
-  }
-
-  std::vector<AutofillObserver*> observers_to_remove;
-  for (AutofillObserver& observer : it->second) {
-    if (notification_type == observer.notification_type()) {
-      observer.OnNotify();
-
-      if (observer.detach_on_notify()) {
-        observers_to_remove.push_back(&observer);
-      }
-    }
-  }
-
-  for (AutofillObserver* observer : observers_to_remove) {
-    it->second.RemoveObserver(observer);
-  }
-}
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_subject.h b/components/autofill/core/browser/autofill_subject.h
deleted file mode 100644
index 04317f3..0000000
--- a/components/autofill/core/browser/autofill_subject.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SUBJECT_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SUBJECT_H_
-
-#include <map>
-
-#include "base/observer_list.h"
-#include "components/autofill/core/browser/autofill_observer.h"
-
-namespace autofill {
-
-// Subject that can emit notifications of specific types to observers that were
-// opted-in.
-class AutofillSubject {
- public:
-  using NotificationType = AutofillObserver::NotificationType;
-
-  AutofillSubject();
-  ~AutofillSubject();
-
-  void Attach(AutofillObserver* observer);
-  void Detach(AutofillObserver* observer);
-
-  // Will notify observers that are watching for the same |notification_type|.
-  // This function is O(n^2) in case all observers are auto-detaching.
-  void Notify(NotificationType notification_type);
-
- private:
-  std::map<NotificationType, base::ObserverList<AutofillObserver>>
-      observers_map_;
-};
-
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SUBJECT_H_
diff --git a/components/autofill/core/browser/autofill_subject_unittest.cc b/components/autofill/core/browser/autofill_subject_unittest.cc
deleted file mode 100644
index 1d91cd0..0000000
--- a/components/autofill/core/browser/autofill_subject_unittest.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/autofill_subject.h"
-
-#include "components/autofill/core/browser/autofill_observer.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using NotificationType = autofill::AutofillObserver::NotificationType;
-
-namespace autofill {
-
-namespace {
-
-class TestAutofillObserver : public AutofillObserver {
- public:
-  TestAutofillObserver(NotificationType notification_type,
-                       bool detach_on_notify)
-      : AutofillObserver(notification_type, detach_on_notify) {}
-
-  void OnNotify() override { was_notified_ = true; }
-
-  void Reset() { was_notified_ = false; }
-
-  bool IsActive() { return IsInObserverList(); }
-
-  bool was_notified() { return was_notified_; }
-
- private:
-  bool was_notified_ = false;
-};
-
-}  // namespace
-
-class AutofillSubjectTest : public testing::Test {
- public:
-  AutofillSubjectTest() : subject_() {}
-
- protected:
-  AutofillSubject subject_;
-};
-
-// Tests that a basic notification works.
-TEST_F(AutofillSubjectTest, Simple_Notification_NoAutoDetach) {
-  TestAutofillObserver observer(NotificationType::AutocompleteFormSubmitted,
-                                /*detach_on_notify=*/false);
-
-  subject_.Attach(&observer);
-
-  EXPECT_TRUE(observer.IsActive());
-
-  subject_.Notify(NotificationType::AutocompleteFormSubmitted);
-
-  EXPECT_TRUE(observer.was_notified());
-
-  // Still active.
-  EXPECT_TRUE(observer.IsActive());
-
-  subject_.Detach(&observer);
-
-  observer.Reset();
-  subject_.Notify(NotificationType::AutocompleteFormSubmitted);
-
-  EXPECT_FALSE(observer.was_notified());
-  EXPECT_FALSE(observer.IsActive());
-}
-
-// Tests that a basic notification with auto-detach works.
-TEST_F(AutofillSubjectTest, Simple_Notification_WithAutoDetach) {
-  TestAutofillObserver observer(NotificationType::AutocompleteFormSubmitted,
-                                /*detach_on_notify=*/true);
-
-  subject_.Attach(&observer);
-
-  subject_.Notify(NotificationType::AutocompleteFormSubmitted);
-
-  EXPECT_TRUE(observer.was_notified());
-  EXPECT_FALSE(observer.IsActive());
-
-  observer.Reset();
-  subject_.Notify(NotificationType::AutocompleteFormSubmitted);
-
-  EXPECT_FALSE(observer.was_notified());
-  EXPECT_FALSE(observer.IsActive());
-}
-
-// Tests that NotificationType properly isolates notifications.
-TEST_F(AutofillSubjectTest, MultipleObservers_SimpleNotification) {
-  TestAutofillObserver submit_observer(
-      NotificationType::AutocompleteFormSubmitted,
-      /*detach_on_notify=*/false);
-  TestAutofillObserver cleanup_observer(
-      NotificationType::AutocompleteCleanupDone,
-      /*detach_on_notify=*/false);
-
-  subject_.Attach(&submit_observer);
-  subject_.Attach(&cleanup_observer);
-
-  subject_.Notify(NotificationType::AutocompleteCleanupDone);
-
-  EXPECT_FALSE(submit_observer.was_notified());
-  EXPECT_TRUE(cleanup_observer.was_notified());
-}
-
-// Tests that auto-detach doesn't detach all observers.
-TEST_F(AutofillSubjectTest,
-       MultipleObservers_SimpleNotification_OneAutoDetach) {
-  TestAutofillObserver detach_submit_observer(
-      NotificationType::AutocompleteFormSubmitted,
-      /*detach_on_notify=*/true);
-  TestAutofillObserver stay_submit_observer(
-      NotificationType::AutocompleteFormSubmitted,
-      /*detach_on_notify=*/false);
-
-  subject_.Attach(&detach_submit_observer);
-  subject_.Attach(&stay_submit_observer);
-
-  subject_.Notify(NotificationType::AutocompleteFormSubmitted);
-
-  EXPECT_TRUE(detach_submit_observer.was_notified());
-  EXPECT_TRUE(stay_submit_observer.was_notified());
-
-  EXPECT_FALSE(detach_submit_observer.IsActive());
-  EXPECT_TRUE(stay_submit_observer.IsActive());
-
-  detach_submit_observer.Reset();
-  stay_submit_observer.Reset();
-
-  subject_.Notify(NotificationType::AutocompleteFormSubmitted);
-
-  EXPECT_FALSE(detach_submit_observer.was_notified());
-  EXPECT_TRUE(stay_submit_observer.was_notified());
-
-  EXPECT_FALSE(detach_submit_observer.IsActive());
-  EXPECT_TRUE(stay_submit_observer.IsActive());
-}
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index d47163a7..44274614 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -615,7 +615,7 @@
     ProcessFieldLogEventsInForm(*form_structure);
   }
 
-  single_field_form_fill_router_->CancelPendingQueries(this);
+  single_field_form_fill_router_->CancelPendingQueries();
 
   address_form_event_logger_->OnDestroyed();
   credit_card_form_event_logger_->OnDestroyed();
@@ -1164,7 +1164,7 @@
         break;
 
       case SuppressReason::kAblation:
-        single_field_form_fill_router_->CancelPendingQueries(this);
+        single_field_form_fill_router_->CancelPendingQueries();
         external_delegate_->OnSuggestionsReturned(field.global_id(),
                                                   suggestions, trigger_source);
         LOG_AF(log_manager())
@@ -1268,16 +1268,28 @@
     if (ShouldOfferSingleFieldFormFill()) {
       // Suggestions come back asynchronously, so the SingleFieldFormFillRouter
       // will handle sending the results back to the renderer.
+      // TODO(crbug.com/1007974): The callback will only be called once.
       bool handled_by_single_field_form_filler =
           single_field_form_fill_router_->OnGetSingleFieldSuggestions(
-              trigger_source, field, client(), weak_ptr_factory_.GetWeakPtr(),
+              trigger_source, field, client(),
+              base::BindRepeating(
+                  [](base::WeakPtr<BrowserAutofillManager> self,
+                     FieldGlobalId field_id,
+                     AutofillSuggestionTriggerSource trigger_source,
+                     const std::vector<Suggestion>& suggestions) {
+                    if (self) {
+                      self->external_delegate_->OnSuggestionsReturned(
+                          field_id, suggestions, trigger_source);
+                    }
+                  },
+                  weak_ptr_factory_.GetWeakPtr()),
               context);
       if (handled_by_single_field_form_filler) {
         return false;
       }
     }
 
-    single_field_form_fill_router_->CancelPendingQueries(this);
+    single_field_form_fill_router_->CancelPendingQueries();
     if (touch_to_fill_delegate_ &&
         (touch_to_fill_delegate_->IsShowingTouchToFill() ||
          (form_element_was_clicked &&
@@ -1310,6 +1322,24 @@
   }
 }
 
+bool BrowserAutofillManager::ShouldFetchCreditCard(
+    const FormData& form,
+    const FormFieldData& field,
+    const CreditCard& credit_card) {
+  FormStructure* form_structure = nullptr;
+  AutofillField* autofill_field = nullptr;
+  if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field)) {
+    return false;
+  }
+  if (WillFillCreditCardNumber(form.fields, form_structure->fields(),
+                               *autofill_field)) {
+    return true;
+  }
+  return credit_card.record_type() == CreditCard::RecordType::kVirtualCard &&
+         autofill_field->Type().GetStorableType() ==
+             CREDIT_CARD_STANDALONE_VERIFICATION_CODE;
+}
+
 void BrowserAutofillManager::FillOrPreviewCreditCardForm(
     mojom::ActionPersistence action_persistence,
     const FormData& form,
@@ -1324,15 +1354,8 @@
   // TODO(crbug.com/1330108): Accept credit card by reference.
   credit_card_ = credit_card ? *credit_card : CreditCard();
   bool is_preview = action_persistence != mojom::ActionPersistence::kFill;
-  bool is_virtual_card_standalone_cvc_field =
-      credit_card->record_type() == CreditCard::RecordType::kVirtualCard &&
-      (autofill_field->Type().GetStorableType() ==
-       CREDIT_CARD_STANDALONE_VERIFICATION_CODE);
   bool should_fetch_card =
-      !is_preview &&
-      (WillFillCreditCardNumber(form.fields, form_structure->fields(),
-                                *autofill_field) ||
-       is_virtual_card_standalone_cvc_field);
+      !is_preview && ShouldFetchCreditCard(form, field, *credit_card);
 
   if (should_fetch_card) {
     credit_card_form_event_logger_->OnDidSelectCardSuggestion(
@@ -1630,7 +1653,7 @@
   if (!IsAutofillEnabled())
     return;
 
-  single_field_form_fill_router_->CancelPendingQueries(this);
+  single_field_form_fill_router_->CancelPendingQueries();
   client().HideAutofillPopup(PopupHidingReason::kRendererEvent);
   if (fast_checkout_delegate_) {
     fast_checkout_delegate_->HideFastCheckout(/*allow_further_runs=*/false);
@@ -1935,15 +1958,6 @@
          form.ShouldBeUploaded();
 }
 
-// AutocompleteHistoryManager::SuggestionsHandler implementation
-void BrowserAutofillManager::OnSuggestionsReturned(
-    FieldGlobalId field_id,
-    AutofillSuggestionTriggerSource trigger_source,
-    const std::vector<Suggestion>& suggestions) {
-  external_delegate_->OnSuggestionsReturned(field_id, suggestions,
-                                            trigger_source);
-}
-
 void BrowserAutofillManager::
     FetchPotentialCardLastFourDigitsCombinationFromDOM() {
   driver().GetFourDigitCombinationsFromDOM(base::BindOnce(
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h
index d90d18a..3657dd3b 100644
--- a/components/autofill/core/browser/browser_autofill_manager.h
+++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -100,9 +100,7 @@
 
 // Manages saving and restoring the user's personal information entered into web
 // forms. One per frame; owned by the AutofillDriver.
-class BrowserAutofillManager
-    : public AutofillManager,
-      public SingleFieldFormFiller::SuggestionsHandler {
+class BrowserAutofillManager : public AutofillManager {
  public:
   BrowserAutofillManager(AutofillDriver* driver,
                          AutofillClient* client,
@@ -165,6 +163,21 @@
       const AutofillProfile& profile,
       const AutofillTriggerDetails& trigger_details);
 
+  // Retrieves the parsed form structure from cache and checks if the
+  // `credit_card` needs to be fetched in order to complete the current filling
+  // flow. This is the case if the `form` contains a credit card number field,
+  // which is going to be filled. Or it is the case when the `credit_card` is
+  // virtual and the `field` is of type
+  // `CREDIT_CARD_STANDALONE_VERIFICATION_CODE`. This happens for the web sites,
+  // which cache all credit card details except for the cvc, which is different
+  // every time the virtual credit card is being used.
+  // TODO(crbug.com/1331312): Remove this function once all callers use already
+  // parsed form. This function is needed only to make the query to the form
+  // cache, which must remain private to the `BrowserAutofillManager`.
+  bool ShouldFetchCreditCard(const FormData& form,
+                             const FormFieldData& field,
+                             const CreditCard& credit_card);
+
   // Fills or previews the credit card form.
   // Assumes the form and field are valid.
   // Asks for authentication via CVC before filling with server card data.
@@ -248,11 +261,6 @@
   void Reset() override;
   void OnContextMenuShownInField(const FormGlobalId& form_global_id,
                                  const FieldGlobalId& field_global_id) override;
-  // SingleFieldFormFiller::SuggestionsHandler:
-  void OnSuggestionsReturned(
-      FieldGlobalId field_id,
-      AutofillSuggestionTriggerSource trigger_source,
-      const std::vector<Suggestion>& suggestions) override;
 
   // Retrieves the four digit combinations from the DOM of the current web page
   // and stores them in `four_digit_combinations_in_dom_`. This is used to check
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
index 96219ea..dfff8f0 100644
--- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -779,19 +779,6 @@
             : AutofillSuggestionTriggerSource::kTextFieldDidChange);
   }
 
-  void AutocompleteSuggestionsReturned(
-      FieldGlobalId field_id,
-      const std::vector<std::u16string>& results) {
-    std::vector<Suggestion> suggestions;
-    base::ranges::transform(
-        results, std::back_inserter(suggestions),
-        [](const auto& result) { return Suggestion(result); });
-
-    browser_autofill_manager_->OnSuggestionsReturned(
-        field_id, AutofillSuggestionTriggerSource::kFormControlElementClicked,
-        suggestions);
-  }
-
   void FormsSeen(const std::vector<FormData>& forms) {
     browser_autofill_manager_->OnFormsSeen(/*updated_forms=*/forms,
                                            /*removed_forms=*/{});
@@ -2122,20 +2109,32 @@
 
 TEST_F(BrowserAutofillManagerTest,
        OnSuggestionsReturned_CallsExternalDelegate) {
-  FieldGlobalId field_id = test::MakeFieldGlobalId();
-  std::vector<Suggestion> suggestions = {
-      Suggestion("Charles", "123 Apple St.", Suggestion::Icon::kNoIcon,
-                 PopupItemId::kAddressEntry),
-      Suggestion("Elvis", "3734 Elvis Presley Blvd.", Suggestion::Icon::kNoIcon,
-                 PopupItemId::kAddressEntry)};
+  FormData form = CreateTestAddressFormData();
+  form.fields = {CreateTestFormField("Some Field", "somefield", "",
+                                     FormControlType::kInputText)};
+  FormsSeen({form});
 
-  browser_autofill_manager_->OnSuggestionsReturned(
-      field_id, AutofillSuggestionTriggerSource::kFormControlElementClicked,
-      suggestions);
+  std::vector<Suggestion> suggestions = {Suggestion(u"one"),
+                                         Suggestion(u"two")};
+
+  // Mock returning some autocomplete `suggestions`.
+  EXPECT_CALL(*single_field_form_fill_router(), OnGetSingleFieldSuggestions)
+      .WillOnce([&](AutofillSuggestionTriggerSource trigger_source,
+                    const FormFieldData& field, const AutofillClient& client,
+                    SingleFieldFormFiller::OnSuggestionsReturnedCallback
+                        on_suggestions_returned,
+                    const SuggestionsContext& context) {
+        std::move(on_suggestions_returned)
+            .Run(field.global_id(), trigger_source, suggestions);
+        return true;
+      });
+  GetAutofillSuggestions(
+      form, form.fields[0],
+      AutofillSuggestionTriggerSource::kFormControlElementClicked);
 
   EXPECT_EQ(external_delegate()->trigger_source(),
             AutofillSuggestionTriggerSource::kFormControlElementClicked);
-  CheckSuggestions(field_id, suggestions[0], suggestions[1]);
+  CheckSuggestions(form.fields[0].global_id(), suggestions[0], suggestions[1]);
 }
 
 // Test that we return all credit card profile suggestions when all form fields
@@ -3618,33 +3617,6 @@
                               PopupItemId::kAddressEntry));
 }
 
-// Test that nothing breaks when there are single field form fill (Autocomplete)
-// suggestions but no autofill suggestions.
-TEST_F(BrowserAutofillManagerTest,
-       GetFieldSuggestionsForSingleFieldFormFillOnly) {
-  // Set up our form data.
-  FormData form = CreateTestAddressFormData();
-  form.fields = {CreateTestFormField("Some Field", "somefield", "",
-                                     FormControlType::kInputText)};
-  FormsSeen({form});
-
-  GetAutofillSuggestions(form, form.fields.back());
-
-  // Add some Autocomplete suggestions.
-  // This triggers the combined message send.
-  std::vector<std::u16string> suggestions;
-  suggestions.push_back(u"one");
-  suggestions.push_back(u"two");
-  AutocompleteSuggestionsReturned(form.fields.back().global_id(), suggestions);
-
-  // Test that we sent the right values to the external delegate.
-  CheckSuggestions(form.fields.back().global_id(),
-                   Suggestion("one", "", Suggestion::Icon::kNoIcon,
-                              PopupItemId::kAutocompleteEntry),
-                   Suggestion("two", "", Suggestion::Icon::kNoIcon,
-                              PopupItemId::kAutocompleteEntry));
-}
-
 // The method `AutofillSuggestionGenerator::GetPrefixMatchedProfiles` prevents
 // that Android users see values that would override already filled fields
 // due to the narrow surface and a missing preview.
@@ -6836,7 +6808,7 @@
 
 TEST_F(BrowserAutofillManagerTest,
        DestructorCancelsSingleFieldFormFillQueries) {
-  EXPECT_CALL(*single_field_form_fill_router(), CancelPendingQueries).Times(1);
+  EXPECT_CALL(*single_field_form_fill_router(), CancelPendingQueries);
   browser_autofill_manager_.reset();
 }
 
diff --git a/components/autofill/core/browser/field_filling_address_util.cc b/components/autofill/core/browser/field_filling_address_util.cc
index f153a569..586a6ae 100644
--- a/components/autofill/core/browser/field_filling_address_util.cc
+++ b/components/autofill/core/browser/field_filling_address_util.cc
@@ -347,14 +347,13 @@
     const FormFieldData& field_data,
     std::string* failure_to_fill) {
   const std::u16string value = profile.GetInfo(field_type, app_locale);
+  if (value.empty()) {
+    return std::nullopt;
+  }
   if (field_type.group() == FieldTypeGroup::kPhone) {
-    return field_data.IsSelectOrSelectListElement() &&
-                   field_type.GetStorableType() == PHONE_HOME_COUNTRY_CODE
-               ? GetPhoneCountryCodeSelectControlForInput(
-                     value, field_data.options, failure_to_fill)
-               : GetPhoneNumberValueForInput(
-                     field_data.max_length, value,
-                     profile.GetInfo(PHONE_HOME_CITY_AND_NUMBER, app_locale));
+    return GetPhoneNumberValueForInput(
+        field_data.max_length, value,
+        profile.GetInfo(PHONE_HOME_CITY_AND_NUMBER, app_locale));
   }
   if (field_type.GetStorableType() == ADDRESS_HOME_STREET_ADDRESS) {
     return GetStreetAddressForInput(value, profile.language_code(),
diff --git a/components/autofill/core/browser/iban_manager.cc b/components/autofill/core/browser/iban_manager.cc
index 0fc9d84..d5496c1 100644
--- a/components/autofill/core/browser/iban_manager.cc
+++ b/components/autofill/core/browser/iban_manager.cc
@@ -30,7 +30,7 @@
     AutofillSuggestionTriggerSource trigger_source,
     const FormFieldData& field,
     const AutofillClient& client,
-    base::WeakPtr<SuggestionsHandler> handler,
+    OnSuggestionsReturnedCallback on_suggestions_returned,
     const SuggestionsContext& context) {
   // The field is eligible only if it's focused on an IBAN field.
   AutofillField* focused_field = context.focused_field;
@@ -73,9 +73,8 @@
                                 const Iban* iban0, const Iban* iban1) {
     return iban0->HasGreaterRankingThan(iban1, comparison_time);
   });
-  SendIbanSuggestions(
-      QueryHandler(field.global_id(), trigger_source, field.value, handler),
-      ibans);
+  SendIbanSuggestions(std::move(ibans), field,
+                      std::move(on_suggestions_returned), trigger_source);
 
   return true;
 }
@@ -116,34 +115,29 @@
       most_recent_suggestions_shown_field_global_id_;
 }
 
-void IbanManager::SendIbanSuggestions(const QueryHandler& query_handler,
-                                      std::vector<const Iban*>& ibans) {
-  if (!query_handler.handler_) {
-    // Either the handler has been destroyed, or it is invalid.
-    return;
-  }
-
-  const std::u16string& field_value = query_handler.prefix_;
-
+void IbanManager::SendIbanSuggestions(
+    std::vector<const Iban*> ibans,
+    const FormFieldData& field,
+    OnSuggestionsReturnedCallback on_suggestions_returned,
+    AutofillSuggestionTriggerSource trigger_source) {
   // If the input box content equals any of the available IBANs, then
   // assume the IBAN has been filled, and don't show any suggestions.
-  if (!field_value.empty() &&
-      base::Contains(ibans, query_handler.prefix_, &Iban::value)) {
+  if (!field.value.empty() &&
+      base::Contains(ibans, field.value, &Iban::value)) {
     return;
   }
 
-  FilterIbansToSuggest(field_value, ibans);
+  FilterIbansToSuggest(field.value, ibans);
 
   if (ibans.empty()) {
     return;
   }
 
-  // Return suggestions to query handler.
-  query_handler.handler_->OnSuggestionsReturned(
-      query_handler.field_id_, query_handler.trigger_source_,
-      AutofillSuggestionGenerator::GetSuggestionsForIbans(ibans));
+  std::move(on_suggestions_returned)
+      .Run(field.global_id(), trigger_source,
+           AutofillSuggestionGenerator::GetSuggestionsForIbans(ibans));
 
-  uma_recorder_.OnIbanSuggestionsShown(query_handler.field_id_);
+  uma_recorder_.OnIbanSuggestionsShown(field.global_id());
 }
 
 void IbanManager::FilterIbansToSuggest(const std::u16string& field_value,
diff --git a/components/autofill/core/browser/iban_manager.h b/components/autofill/core/browser/iban_manager.h
index f577ea80..d299634 100644
--- a/components/autofill/core/browser/iban_manager.h
+++ b/components/autofill/core/browser/iban_manager.h
@@ -7,7 +7,6 @@
 
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
-#include "components/autofill/core/browser/autofill_subject.h"
 #include "components/autofill/core/browser/data_model/iban.h"
 #include "components/autofill/core/browser/metrics/payments/iban_metrics.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
@@ -26,9 +25,7 @@
 // such as retrieving IBAN data from PersonalDataManager, managing IBAN
 // suggestions, filling IBAN fields, and handling form submission data when
 // there is an IBAN field present.
-class IbanManager : public SingleFieldFormFiller,
-                    public KeyedService,
-                    public AutofillSubject {
+class IbanManager : public SingleFieldFormFiller, public KeyedService {
  public:
   // Initializes the instance with the given parameters. `personal_data_manager`
   // is a profile-scope data manager used to retrieve IBAN data from the
@@ -45,11 +42,11 @@
       AutofillSuggestionTriggerSource trigger_source,
       const FormFieldData& field,
       const AutofillClient& client,
-      base::WeakPtr<SuggestionsHandler> handler,
+      OnSuggestionsReturnedCallback on_suggestions_returned,
       const SuggestionsContext& context) override;
   void OnWillSubmitFormWithFields(const std::vector<FormFieldData>& fields,
                                   bool is_autocomplete_enabled) override {}
-  void CancelPendingQueries(const SuggestionsHandler* handler) override {}
+  void CancelPendingQueries() override {}
   void OnRemoveCurrentSingleFieldSuggestion(
       const std::u16string& field_name,
       const std::u16string& value,
@@ -75,10 +72,13 @@
     FieldGlobalId most_recent_suggestion_selected_field_global_id_;
   };
 
-  // Sends suggestions for `ibans` to the `query_handler`'s handler for display
-  // in the associated Autofill popup.
-  void SendIbanSuggestions(const QueryHandler& query_handler,
-                           std::vector<const Iban*>& ibans);
+  // Filters the `ibans` based on the `field`'s value and returns the resulting
+  // suggestions via `on_suggestions_returned`.
+  void SendIbanSuggestions(
+      std::vector<const Iban*> ibans,
+      const FormFieldData& field,
+      OnSuggestionsReturnedCallback on_suggestions_returned,
+      AutofillSuggestionTriggerSource trigger_source);
 
   // Filter out IBAN-based suggestions based on the following criteria:
   // For local IBANs: Filter out the IBAN value which does not starts with the
diff --git a/components/autofill/core/browser/iban_manager_unittest.cc b/components/autofill/core/browser/iban_manager_unittest.cc
index a76ca7a..8d80afd 100644
--- a/components/autofill/core/browser/iban_manager_unittest.cc
+++ b/components/autofill/core/browser/iban_manager_unittest.cc
@@ -6,7 +6,9 @@
 
 #include <string_view>
 
+#include "base/functional/callback_helpers.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/mock_callback.h"
 #include "base/test/task_environment.h"
 #include "base/uuid.h"
 #include "components/autofill/core/browser/autofill_field.h"
@@ -36,27 +38,8 @@
 
 namespace {
 
-class MockSuggestionsHandler : public IbanManager::SuggestionsHandler {
- public:
-  MockSuggestionsHandler() = default;
-  MockSuggestionsHandler(const MockSuggestionsHandler&) = delete;
-  MockSuggestionsHandler& operator=(const MockSuggestionsHandler&) = delete;
-  ~MockSuggestionsHandler() override = default;
-
-  MOCK_METHOD(void,
-              OnSuggestionsReturned,
-              (FieldGlobalId field_id,
-               AutofillSuggestionTriggerSource trigger_source,
-               const std::vector<Suggestion>& suggestions),
-              (override));
-
-  base::WeakPtr<MockSuggestionsHandler> GetWeakPtr() {
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
- private:
-  base::WeakPtrFactory<MockSuggestionsHandler> weak_ptr_factory_{this};
-};
+using MockSuggestionsReturnedCallback =
+    base::MockCallback<SingleFieldFormFiller::OnSuggestionsReturnedCallback>;
 
 }  // namespace
 
@@ -146,7 +129,6 @@
 
   base::test::TaskEnvironment task_environment_;
   test::AutofillUnitTestEnvironment autofill_test_environment_;
-  testing::NiceMock<MockSuggestionsHandler> suggestions_handler_;
   TestAutofillClient autofill_client_;
   TestPersonalDataManager personal_data_manager_;
   std::unique_ptr<FormStructure> form_structure_;
@@ -180,9 +162,9 @@
 
   // Setting up mock to verify that the handler is returned a list of
   // IBAN-based suggestions.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::UnorderedElementsAre(
                       MatchesTextAndPopupItemId(local_iban_suggestion_0),
@@ -197,7 +179,7 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 TEST_F(IbanManagerTest, PaymentsAutofillEnabledPrefOff_NoIbanSuggestionsShown) {
@@ -208,13 +190,14 @@
   AutofillField test_field;
   SuggestionsContext context = GetIbanFocusedSuggestionsContext(test_field);
 
-  EXPECT_CALL(suggestions_handler_, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Because the "Save and autofill payment methods" toggle is off, the
   // suggestion handler should not be triggered.
   EXPECT_FALSE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 TEST_F(IbanManagerTest, IbanSuggestions_SeparatorAndFooter) {
@@ -229,9 +212,9 @@
   // Setting up mock to verify that the handler is returned IBAN-based
   // suggestions. A separator and the "Manage payment methods..." row should
   // also be returned.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::UnorderedElementsAre(
                       MatchesTextAndPopupItemId(iban_suggestion_0),
@@ -243,7 +226,7 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 TEST_F(IbanManagerTest,
@@ -259,14 +242,15 @@
 
   // The field contains value matches existing IBAN already, so check that we do
   // not return suggestions to the handler.
-  EXPECT_CALL(suggestions_handler_, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   // Because all criteria are met to trigger returning to the handler,
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 TEST_F(IbanManagerTest,
@@ -286,9 +270,9 @@
   // IBAN-based suggestions whose prefixes match `prefix_`. Both values should
   // be returned because they both start with CH56. Other than that, there are
   // one separator and one footer suggestion displayed.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::UnorderedElementsAre(
                       MatchesTextAndPopupItemId(iban_suggestion_0),
@@ -301,7 +285,7 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 
   test_field.value = u"CH5604";
 
@@ -309,9 +293,8 @@
   // IBAN-based suggestion whose prefix matches `prefix_`. Only one of the two
   // IBANs should stay because the other will be filtered out. Other than that,
   // there are one separator and one footer suggestion displayed.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::UnorderedElementsAre(
                       MatchesTextAndPopupItemId(iban_suggestion_0),
@@ -323,20 +306,20 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 
   test_field.value = u"AB56";
 
   // Verify that the handler is not triggered because no IBAN suggestions match
   // the given prefix.
-  EXPECT_CALL(suggestions_handler_, OnSuggestionsReturned).Times(0);
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   // Because all criteria are met to trigger returning to the handler,
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 // Test that when the input text field is shorter than IBAN's prefix, all IBANs
@@ -362,9 +345,9 @@
   // Expect that a list of IBAN suggestions whose prefixes match input field is
   // returned because they both start with "CH". Other than that, there is one
   // separator and one footer suggestion displayed.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::UnorderedElementsAre(
                       MatchesTextAndPopupItemId(server_iban_suggestion_0),
@@ -377,7 +360,7 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 // Test that when the input text field is shorter than IBAN's prefix, only IBANs
@@ -403,9 +386,9 @@
   // Expect that only one of the two IBANs should stay because the other will be
   // filtered out. Other than that, there is one separator and one footer
   // suggestion displayed.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::UnorderedElementsAre(
                       MatchesTextAndPopupItemId(server_iban_suggestion_0),
@@ -417,7 +400,7 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 // Test that when there is no prefix present, all server IBANs should be
@@ -444,9 +427,9 @@
   SuggestionsContext context = GetIbanFocusedSuggestionsContext(test_field);
 
   // Expect that all server IBANs are returned.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::UnorderedElementsAre(
                       MatchesTextAndPopupItemId(server_iban_suggestion_0),
@@ -460,15 +443,14 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 
   test_field.value = u"AB567";
 
   // Expect that all server IBANs are returned because the count of input
   // character is less than `kFieldLengthLimitOnServerIbanSuggestion`.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::UnorderedElementsAre(
                       MatchesTextAndPopupItemId(server_iban_suggestion_0),
@@ -482,7 +464,7 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 // Test that when there is no prefix present, no server IBANs should be
@@ -511,14 +493,15 @@
 
   // Expect that no suggestions are returned because length of input field
   // exceeds `kFieldLengthLimitOnServerIbanSuggestion`.
-  EXPECT_CALL(suggestions_handler_, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   // Because all criteria are met to trigger returning to the handler,
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 TEST_F(IbanManagerTest, DoesNotShowIbansForBlockedWebsite) {
@@ -528,7 +511,8 @@
 
   // Setting up mock to verify that suggestions returning is not triggered if
   // the website is blocked.
-  EXPECT_CALL(suggestions_handler_, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
   ON_CALL(*static_cast<MockAutofillOptimizationGuide*>(
               autofill_client_.GetAutofillOptimizationGuide()),
           ShouldBlockSingleFieldSuggestions)
@@ -537,7 +521,7 @@
   // Simulate request for suggestions.
   EXPECT_FALSE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 // Test that suggestions are returned on platforms that don't have an
@@ -554,9 +538,9 @@
 
   // Setting up mock to verify that the handler is returned a list of
   // IBAN-based suggestions.
-  EXPECT_CALL(suggestions_handler_,
-              OnSuggestionsReturned(
-                  test_field.global_id(),
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(test_field.global_id(),
                   AutofillSuggestionTriggerSource::kFormControlElementClicked,
                   testing::IsSupersetOf(
                       {MatchesTextAndPopupItemId(iban_suggestion_0)})));
@@ -566,7 +550,7 @@
   // the handler should be triggered and this should return true.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 TEST_F(IbanManagerTest, NotIbanFieldFocused_NoSuggestionsShown) {
@@ -580,12 +564,13 @@
 
   // Setting up mock to verify that suggestions returning is not triggered if
   // we are not focused on an IBAN field.
-  EXPECT_CALL(suggestions_handler_, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   EXPECT_FALSE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 }
 
 // Tests that when showing IBAN suggestions is allowed by the site-specific
@@ -601,7 +586,7 @@
   // TODO: handle return value.
   std::ignore = iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context);
+      autofill_client_, base::DoNothing(), context);
 
   histogram_tester.ExpectUniqueSample(
       "Autofill.Iban.ShowSuggestionsBlocklistDecision",
@@ -618,7 +603,8 @@
 
   // Setting up mock to verify that suggestions returning is not triggered if
   // the website is blocked.
-  EXPECT_CALL(suggestions_handler_, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
   ON_CALL(*static_cast<MockAutofillOptimizationGuide*>(
               autofill_client_.GetAutofillOptimizationGuide()),
           ShouldBlockSingleFieldSuggestions)
@@ -627,7 +613,7 @@
   // TODO: handle return value.
   std::ignore = iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(),
+      autofill_client_, mock_callback.Get(),
       /*context=*/context);
 
   histogram_tester.ExpectUniqueSample(
@@ -649,7 +635,7 @@
   // TODO: handle return value.
   std::ignore = iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(),
+      autofill_client_, base::DoNothing(),
       /*context=*/context);
 
   histogram_tester.ExpectUniqueSample(
@@ -669,13 +655,14 @@
   SuggestionsContext context = GetIbanFocusedSuggestionsContext(test_field);
 
   // Simulate request for suggestions.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
 
   EXPECT_THAT(
       histogram_tester.GetAllSamples("Autofill.Iban.Suggestions"),
@@ -700,9 +687,10 @@
   SuggestionsContext context = GetIbanFocusedSuggestionsContext(test_field);
 
   // Simulate request for suggestions and select one suggested IBAN.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
   iban_manager_.OnSingleFieldSuggestionSelected(u"", PopupItemId::kIbanEntry);
 
   histogram_tester.ExpectBucketCount(
@@ -714,7 +702,7 @@
 
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
   iban_manager_.OnSingleFieldSuggestionSelected(u"", PopupItemId::kIbanEntry);
 
   histogram_tester.ExpectBucketCount(
@@ -735,13 +723,14 @@
   test_field.value = u"XY";
   SuggestionsContext context = GetIbanFocusedSuggestionsContext(test_field);
 
-  EXPECT_CALL(suggestions_handler_, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // The suggestion handler should be triggered as some IBANs are available.
   // However, no suggestions are returned due to the prefix match requirement.
   EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field,
-      autofill_client_, suggestions_handler_.GetWeakPtr(), context));
+      autofill_client_, mock_callback.Get(), context));
   EXPECT_THAT(
       histogram_tester.GetAllSamples("Autofill.Iban.Suggestions"),
       BucketsAre(
diff --git a/components/autofill/core/browser/merchant_promo_code_manager.cc b/components/autofill/core/browser/merchant_promo_code_manager.cc
index 7c4d05c..71b1404 100644
--- a/components/autofill/core/browser/merchant_promo_code_manager.cc
+++ b/components/autofill/core/browser/merchant_promo_code_manager.cc
@@ -22,7 +22,7 @@
     AutofillSuggestionTriggerSource trigger_source,
     const FormFieldData& field,
     const AutofillClient& client,
-    base::WeakPtr<SuggestionsHandler> handler,
+    OnSuggestionsReturnedCallback on_suggestions_returned,
     const SuggestionsContext& context) {
   // The field is eligible only if it's focused on a merchant promo code.
   bool field_is_eligible =
@@ -38,9 +38,9 @@
         personal_data_manager_->GetActiveAutofillPromoCodeOffersForOrigin(
             context.form_structure->main_frame_origin().GetURL());
     if (!promo_code_offers.empty()) {
-      SendPromoCodeSuggestions(promo_code_offers, field.global_id(),
-                               QueryHandler(field.global_id(), trigger_source,
-                                            field.value, handler));
+      SendPromoCodeSuggestions(std::move(promo_code_offers), field,
+                               std::move(on_suggestions_returned),
+                               trigger_source);
       return true;
     }
   }
@@ -51,9 +51,6 @@
     const std::vector<FormFieldData>& fields,
     bool is_autocomplete_enabled) {}
 
-void MerchantPromoCodeManager::CancelPendingQueries(
-    const SuggestionsHandler* handler) {}
-
 void MerchantPromoCodeManager::OnRemoveCurrentSingleFieldSuggestion(
     const std::u16string& field_name,
     const std::u16string& value,
@@ -148,35 +145,27 @@
 }
 
 void MerchantPromoCodeManager::SendPromoCodeSuggestions(
-    const std::vector<const AutofillOfferData*>& promo_code_offers,
-    const FieldGlobalId& field_global_id,
-    const QueryHandler& query_handler) {
-  if (!query_handler.handler_) {
-    // Either the handler has been destroyed, or it is invalid.
-    return;
-  }
-
+    std::vector<const AutofillOfferData*> promo_code_offers,
+    const FormFieldData& field,
+    OnSuggestionsReturnedCallback on_suggestions_returned,
+    AutofillSuggestionTriggerSource trigger_source) {
   // If the input box content equals any of the available promo codes, then
   // assume the promo code has been filled, and don't show any suggestions.
   for (const AutofillOfferData* promo_code_offer : promo_code_offers) {
-    if (query_handler.prefix_ ==
-        base::ASCIIToUTF16(promo_code_offer->GetPromoCode())) {
-      // Return empty suggestions to query handler. This will result in no
-      // suggestions being displayed.
-      query_handler.handler_->OnSuggestionsReturned(
-          query_handler.field_id_, query_handler.trigger_source_, {});
+    if (field.value == base::ASCIIToUTF16(promo_code_offer->GetPromoCode())) {
+      std::move(on_suggestions_returned)
+          .Run(field.global_id(), trigger_source, {});
       return;
     }
   }
 
-  // Return suggestions to query handler.
-  query_handler.handler_->OnSuggestionsReturned(
-      query_handler.field_id_, query_handler.trigger_source_,
-      AutofillSuggestionGenerator::GetPromoCodeSuggestionsFromPromoCodeOffers(
-          promo_code_offers));
+  std::move(on_suggestions_returned)
+      .Run(field.global_id(), trigger_source,
+           AutofillSuggestionGenerator::
+               GetPromoCodeSuggestionsFromPromoCodeOffers(promo_code_offers));
 
   // Log that promo code autofill suggestions were shown.
-  uma_recorder_.OnOffersSuggestionsShown(field_global_id, promo_code_offers);
+  uma_recorder_.OnOffersSuggestionsShown(field.global_id(), promo_code_offers);
 }
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/merchant_promo_code_manager.h b/components/autofill/core/browser/merchant_promo_code_manager.h
index 52f15b3..c5586a5 100644
--- a/components/autofill/core/browser/merchant_promo_code_manager.h
+++ b/components/autofill/core/browser/merchant_promo_code_manager.h
@@ -6,7 +6,6 @@
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_MERCHANT_PROMO_CODE_MANAGER_H_
 
 #include "base/gtest_prod_util.h"
-#include "components/autofill/core/browser/autofill_subject.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/single_field_form_filler.h"
 #include "components/autofill/core/browser/ui/popup_item_ids.h"
@@ -26,8 +25,7 @@
 // promo code suggestions, filling promo code fields, and handling form
 // submission data when there is a merchant promo code field present.
 class MerchantPromoCodeManager : public SingleFieldFormFiller,
-                                 public KeyedService,
-                                 public AutofillSubject {
+                                 public KeyedService {
  public:
   MerchantPromoCodeManager();
 
@@ -41,11 +39,11 @@
       AutofillSuggestionTriggerSource trigger_source,
       const FormFieldData& field,
       const AutofillClient& client,
-      base::WeakPtr<SuggestionsHandler> handler,
+      OnSuggestionsReturnedCallback on_suggestions_returned,
       const SuggestionsContext& context) override;
   void OnWillSubmitFormWithFields(const std::vector<FormFieldData>& fields,
                                   bool is_autocomplete_enabled) override;
-  void CancelPendingQueries(const SuggestionsHandler* handler) override;
+  void CancelPendingQueries() override {}
   void OnRemoveCurrentSingleFieldSuggestion(const std::u16string& field_name,
                                             const std::u16string& value,
                                             PopupItemId popup_item_id) override;
@@ -93,17 +91,17 @@
     FieldGlobalId most_recent_suggestion_selected_field_global_id_;
   };
 
-  // Sends suggestions for `promo_code_offers` to the `query_handler`'s handler
-  // for display in the associated Autofill popup. If suggestions were
-  // displayed, this function also logs metrics for promo code suggestions
-  // shown. `field_global_id` is used for this metrics logging, as it checks
-  // whether the field where promo code suggestions are being shown has just had
-  // suggestions shown. This ensures we to log to the correct histogram, as we
-  // have separate histograms for unique shows and repetitive shows.
+  // Generates suggestions from the `promo_code_offers` and return them via
+  // `on_suggestions_returned`. If suggestions were sent, this function also
+  // logs metrics for promo code suggestions shown. Data is filtered based on
+  // the `field`'s value`. For metrics, this ensures we log the correct
+  // histogram, as we have separate histograms for unique shows and repetitive
+  // shows.
   void SendPromoCodeSuggestions(
-      const std::vector<const AutofillOfferData*>& promo_code_offers,
-      const FieldGlobalId& field_global_id,
-      const QueryHandler& query_handler);
+      std::vector<const AutofillOfferData*> promo_code_offers,
+      const FormFieldData& field,
+      OnSuggestionsReturnedCallback on_suggestions_returned,
+      AutofillSuggestionTriggerSource trigger_source);
 
   raw_ptr<PersonalDataManager> personal_data_manager_ = nullptr;
 
diff --git a/components/autofill/core/browser/merchant_promo_code_manager_unittest.cc b/components/autofill/core/browser/merchant_promo_code_manager_unittest.cc
index a43a58c71..3e26809 100644
--- a/components/autofill/core/browser/merchant_promo_code_manager_unittest.cc
+++ b/components/autofill/core/browser/merchant_promo_code_manager_unittest.cc
@@ -3,7 +3,10 @@
 // found in the LICENSE file.
 
 #include "components/autofill/core/browser/merchant_promo_code_manager.h"
+
+#include "base/functional/callback_helpers.h"
 #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 "components/autofill/core/browser/autofill_test_utils.h"
@@ -24,34 +27,14 @@
 
 namespace {
 
+using MockSuggestionsReturnedCallback =
+    base::MockCallback<SingleFieldFormFiller::OnSuggestionsReturnedCallback>;
 using test::CreateTestFormField;
 using ::testing::_;
 using ::testing::Field;
 using ::testing::Truly;
 using ::testing::UnorderedElementsAre;
 
-class MockSuggestionsHandler
-    : public MerchantPromoCodeManager::SuggestionsHandler {
- public:
-  MockSuggestionsHandler() = default;
-  MockSuggestionsHandler(const MockSuggestionsHandler&) = delete;
-  MockSuggestionsHandler& operator=(const MockSuggestionsHandler&) = delete;
-  ~MockSuggestionsHandler() override = default;
-
-  MOCK_METHOD(void,
-              OnSuggestionsReturned,
-              (FieldGlobalId field_id,
-               AutofillSuggestionTriggerSource trigger_source,
-               const std::vector<Suggestion>& suggestions),
-              (override));
-
-  base::WeakPtr<MockSuggestionsHandler> GetWeakPtr() {
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
- private:
-  base::WeakPtrFactory<MockSuggestionsHandler> weak_ptr_factory_{this};
-};
 }  // namespace
 
 class MerchantPromoCodeManagerTest : public testing::Test {
@@ -103,7 +86,6 @@
 
 TEST_F(MerchantPromoCodeManagerTest, ShowsPromoCodeSuggestions) {
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   const auto trigger_source =
       AutofillSuggestionTriggerSource::kFormControlElementClicked;
   std::string last_committed_origin_url = "https://www.example.com";
@@ -122,10 +104,10 @@
 
   // Setting up mock to verify that the handler is returned a list of
   // promo-code-based suggestions and the promo code details line.
+  MockSuggestionsReturnedCallback mock_callback;
   EXPECT_CALL(
-      *suggestions_handler.get(),
-      OnSuggestionsReturned(
-          _, trigger_source,
+      mock_callback,
+      Run(_, trigger_source,
           UnorderedElementsAre(
               Field(&Suggestion::main_text, promo_code_suggestion.main_text),
               Field(&Suggestion::popup_item_id, PopupItemId::kSeparator),
@@ -137,15 +119,13 @@
   // merchant site will be displayed instead of requesting Autocomplete
   // suggestions.
   EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-      trigger_source, test_field_, autofill_client_,
-      suggestions_handler->GetWeakPtr(),
+      trigger_source, test_field_, autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   // Trigger offers suggestions popup again to be able to test that we do not
   // log metrics twice for the same field.
   EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-      trigger_source, test_field_, autofill_client_,
-      suggestions_handler->GetWeakPtr(),
+      trigger_source, test_field_, autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   // Trigger offers suggestions popup again to be able to test that we log
@@ -154,8 +134,7 @@
       CreateTestFormField(/*label=*/"", "Some Other Name", "SomePrefix",
                           FormControlType::kInputTelephone);
   EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-      trigger_source, other_field, autofill_client_,
-      suggestions_handler->GetWeakPtr(),
+      trigger_source, other_field, autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   histogram_tester.ExpectBucketCount(
@@ -179,16 +158,15 @@
 TEST_F(MerchantPromoCodeManagerTest,
        DoesNotShowPromoCodeOffersIfFieldIsNotAPromoCodeField) {
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   // Setting up mock to verify that suggestions returning is not triggered if
   // the field is not a promo code field.
-  EXPECT_CALL(*suggestions_handler, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   EXPECT_FALSE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
+      autofill_client_, mock_callback.Get(),
       /*context=*/SuggestionsContext()));
 
   // Ensure that no metrics were logged.
@@ -213,7 +191,6 @@
 TEST_F(MerchantPromoCodeManagerTest,
        DoesNotShowPromoCodeOffersForOffTheRecord) {
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::string last_committed_origin_url = "https://www.example.com";
   std::string promo_code = SetUpPromoCodeOffer(
       last_committed_origin_url, GURL("https://offer-details-url.com/"));
@@ -228,12 +205,13 @@
 
   // Setting up mock to verify that suggestions returning is not triggered if
   // the user is off the record.
-  EXPECT_CALL(*suggestions_handler, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   EXPECT_FALSE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
+      autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   // Ensure that no metrics were logged.
@@ -258,7 +236,6 @@
 TEST_F(MerchantPromoCodeManagerTest,
        DoesNotShowPromoCodeOffersIfPersonalDataManagerDoesNotExist) {
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::string last_committed_origin_url = "https://www.example.com";
   FormData form_data;
   form_data.main_frame_origin =
@@ -271,12 +248,13 @@
 
   // Setting up mock to verify that suggestions returning is not triggered if
   // personal data manager does not exist.
-  EXPECT_CALL(*suggestions_handler, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   EXPECT_FALSE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
+      autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   // Ensure that no metrics were logged.
@@ -300,7 +278,6 @@
 
 TEST_F(MerchantPromoCodeManagerTest, NoPromoCodeOffers) {
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::string last_committed_origin_url = "https://www.example.com";
   personal_data_manager_.get()->SetAutofillWalletImportEnabled(true);
   personal_data_manager_.get()->SetAutofillPaymentMethodsEnabled(true);
@@ -314,12 +291,13 @@
 
   // Setting up mock to verify that suggestions returning is not triggered if
   // there are no promo code offers to suggest.
-  EXPECT_CALL(*suggestions_handler, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   EXPECT_FALSE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
+      autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   // Ensure that no metrics were logged.
@@ -346,7 +324,6 @@
 // toggle) disables offering suggestions and autofilling for promo codes.
 TEST_F(MerchantPromoCodeManagerTest, AutofillWalletImportDisabled) {
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::string last_committed_origin_url = "https://www.example.com";
   FormData form_data;
   form_data.main_frame_origin =
@@ -361,12 +338,13 @@
 
   // Autofill wallet import is disabled, so check that we do not return
   // suggestions to the handler.
-  EXPECT_CALL(*suggestions_handler, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   EXPECT_FALSE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
+      autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   // Ensure that no metrics were logged.
@@ -393,7 +371,6 @@
 // suggestions and autofilling for promo codes.
 TEST_F(MerchantPromoCodeManagerTest, AutofillCreditCardDisabled) {
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::string last_committed_origin_url = "https://www.example.com";
   FormData form_data;
   form_data.main_frame_origin =
@@ -408,12 +385,13 @@
 
   // Autofill credit card is disabled, so check that we do not return
   // suggestions to the handler.
-  EXPECT_CALL(*suggestions_handler, OnSuggestionsReturned).Times(0);
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback, Run).Times(0);
 
   // Simulate request for suggestions.
   EXPECT_FALSE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
+      autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   // Ensure that no metrics were logged.
@@ -436,51 +414,9 @@
 }
 
 // This test case exists to ensure that we do not offer promo code offer
-// suggestions if the handler is invalid or destroyed.
-TEST_F(MerchantPromoCodeManagerTest, NoQueryHandler) {
-  base::HistogramTester histogram_tester;
-  std::string last_committed_origin_url = "https://www.example.com";
-  FormData form_data;
-  form_data.main_frame_origin =
-      url::Origin::Create(GURL(last_committed_origin_url));
-  FormStructure form_structure{form_data};
-  SuggestionsContext context;
-  context.form_structure = &form_structure;
-  AddPromoCodeFocusedFieldToSuggestionsContext(&context);
-  SetUpPromoCodeOffer(last_committed_origin_url,
-                      GURL("https://offer-details-url.com/"));
-
-  // Simulate request for suggestions, but with an empty handler.
-  EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-      AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_,
-      /*handler=*/nullptr,
-      /*context=*/context));
-
-  // No metrics should be logged because no suggestions were shown.
-  histogram_tester.ExpectBucketCount(
-      "Autofill.Offer.SuggestionsPopupShown2",
-      autofill_metrics::OffersSuggestionsPopupEvent::
-          kOffersSuggestionsPopupShownOnce,
-      0);
-  histogram_tester.ExpectBucketCount(
-      "Autofill.Offer.SuggestionsPopupShown2",
-      autofill_metrics::OffersSuggestionsPopupEvent::
-          kOffersSuggestionsPopupShown,
-      0);
-  histogram_tester.ExpectBucketCount(
-      "Autofill.Offer.Suggestion2.GPayPromoCodeOffer",
-      autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionShownOnce, 0);
-  histogram_tester.ExpectBucketCount(
-      "Autofill.Offer.Suggestion2.GPayPromoCodeOffer",
-      autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionShown, 0);
-}
-
-// This test case exists to ensure that we do not offer promo code offer
 // suggestions if the field already contains a promo code.
 TEST_F(MerchantPromoCodeManagerTest, PrefixMatched) {
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::string last_committed_origin_url = "https://www.example.com";
   FormData form_data;
   form_data.main_frame_origin =
@@ -494,9 +430,9 @@
 
   // The field contains the promo code already, so check that we do not return
   // suggestions to the handler.
-  EXPECT_CALL(*suggestions_handler,
-              OnSuggestionsReturned(
-                  _, _,
+  MockSuggestionsReturnedCallback mock_callback;
+  EXPECT_CALL(mock_callback,
+              Run(_, _,
                   testing::Truly(
                       [](const std::vector<Suggestion>& returned_suggestions) {
                         return returned_suggestions.empty();
@@ -505,7 +441,7 @@
   // Simulate request for suggestions.
   EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
+      autofill_client_, mock_callback.Get(),
       /*context=*/context));
 
   // No metrics should be logged because no suggestions were shown.
@@ -531,7 +467,6 @@
        OnSingleFieldSuggestion_GPayPromoCodeOfferSuggestion) {
   // Set up the test.
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::u16string test_promo_code = u"test_promo_code";
   const auto trigger_source =
       AutofillSuggestionTriggerSource::kFormControlElementClicked;
@@ -556,8 +491,7 @@
 
   // Simulate showing the promo code offers suggestions popup.
   EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-      trigger_source, test_field_, autofill_client_,
-      suggestions_handler->GetWeakPtr(),
+      trigger_source, test_field_, autofill_client_, base::DoNothing(),
       /*context=*/context));
 
   // Simulate selecting a promo code offer suggestion.
@@ -575,8 +509,7 @@
 
   // Simulate showing the promo code offers suggestions popup.
   EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-      trigger_source, test_field_, autofill_client_,
-      suggestions_handler->GetWeakPtr(),
+      trigger_source, test_field_, autofill_client_, base::DoNothing(),
       /*context=*/context));
 
   // Simulate selecting a promo code offer suggestion.
@@ -597,7 +530,6 @@
        OnSingleFieldSuggestion_GPayPromoCodeOfferFooter) {
   // Set up the test.
   base::HistogramTester histogram_tester;
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
   std::u16string test_promo_code = u"test_promo_code";
   const auto trigger_source =
       AutofillSuggestionTriggerSource::kFormControlElementClicked;
@@ -624,8 +556,7 @@
 
   // Simulate showing the promo code offers suggestions popup.
   EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-      trigger_source, test_field_, autofill_client_,
-      suggestions_handler->GetWeakPtr(),
+      trigger_source, test_field_, autofill_client_, base::DoNothing(),
       /*context=*/context));
 
   // Simulate selecting a promo code offer suggestion.
@@ -646,8 +577,7 @@
 
   // Simulate showing the promo code offers suggestions popup.
   EXPECT_TRUE(merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-      trigger_source, test_field_, autofill_client_,
-      suggestions_handler->GetWeakPtr(),
+      trigger_source, test_field_, autofill_client_, base::DoNothing(),
       /*context=*/context));
 
   // Simulate selecting a promo code offer suggestion.
diff --git a/components/autofill/core/browser/mock_autocomplete_history_manager.h b/components/autofill/core/browser/mock_autocomplete_history_manager.h
index 266c5ac..fa5d5b4 100644
--- a/components/autofill/core/browser/mock_autocomplete_history_manager.h
+++ b/components/autofill/core/browser/mock_autocomplete_history_manager.h
@@ -16,15 +16,14 @@
   MockAutocompleteHistoryManager();
   ~MockAutocompleteHistoryManager() override;
 
-  MOCK_METHOD(
-      bool,
-      OnGetSingleFieldSuggestions,
-      (AutofillSuggestionTriggerSource trigger_source,
-       const FormFieldData& field,
-       const AutofillClient& client,
-       base::WeakPtr<AutocompleteHistoryManager::SuggestionsHandler> handler,
-       const SuggestionsContext& context),
-      (override));
+  MOCK_METHOD(bool,
+              OnGetSingleFieldSuggestions,
+              (AutofillSuggestionTriggerSource trigger_source,
+               const FormFieldData& field,
+               const AutofillClient& client,
+               SingleFieldFormFiller::OnSuggestionsReturnedCallback callback,
+               const SuggestionsContext& context),
+              (override));
   MOCK_METHOD(void,
               OnWillSubmitFormWithFields,
               (const std::vector<FormFieldData>& fields,
@@ -34,10 +33,7 @@
               OnWebDataServiceRequestDone,
               (WebDataServiceBase::Handle, std::unique_ptr<WDTypedResult>),
               (override));
-  MOCK_METHOD(void,
-              CancelPendingQueries,
-              (const AutocompleteHistoryManager::SuggestionsHandler*),
-              (override));
+  MOCK_METHOD(void, CancelPendingQueries, (), (override));
   MOCK_METHOD(void,
               OnRemoveCurrentSingleFieldSuggestion,
               (const std::u16string&, const std::u16string&, PopupItemId),
diff --git a/components/autofill/core/browser/mock_iban_manager.h b/components/autofill/core/browser/mock_iban_manager.h
index 05f0d9ae..fd9d2ce 100644
--- a/components/autofill/core/browser/mock_iban_manager.h
+++ b/components/autofill/core/browser/mock_iban_manager.h
@@ -24,7 +24,7 @@
               (AutofillSuggestionTriggerSource trigger_source,
                const FormFieldData& field,
                const AutofillClient& client,
-               base::WeakPtr<IbanManager::SuggestionsHandler> handler,
+               SingleFieldFormFiller::OnSuggestionsReturnedCallback callback,
                const SuggestionsContext& context),
               (override));
   MOCK_METHOD(void,
@@ -32,10 +32,7 @@
               (const std::vector<FormFieldData>& fields,
                bool is_autocomplete_enabled),
               (override));
-  MOCK_METHOD(void,
-              CancelPendingQueries,
-              (const IbanManager::SuggestionsHandler*),
-              (override));
+  MOCK_METHOD(void, CancelPendingQueries, (), (override));
   MOCK_METHOD(void,
               OnRemoveCurrentSingleFieldSuggestion,
               (const std::u16string&, const std::u16string&, PopupItemId),
diff --git a/components/autofill/core/browser/mock_merchant_promo_code_manager.h b/components/autofill/core/browser/mock_merchant_promo_code_manager.h
index 851ba73..8954490c 100644
--- a/components/autofill/core/browser/mock_merchant_promo_code_manager.h
+++ b/components/autofill/core/browser/mock_merchant_promo_code_manager.h
@@ -16,24 +16,20 @@
   MockMerchantPromoCodeManager();
   ~MockMerchantPromoCodeManager() override;
 
-  MOCK_METHOD(
-      bool,
-      OnGetSingleFieldSuggestions,
-      (AutofillSuggestionTriggerSource trigger_source,
-       const FormFieldData& field,
-       const AutofillClient& client,
-       base::WeakPtr<MerchantPromoCodeManager::SuggestionsHandler> handler,
-       const SuggestionsContext& context),
-      (override));
+  MOCK_METHOD(bool,
+              OnGetSingleFieldSuggestions,
+              (AutofillSuggestionTriggerSource trigger_source,
+               const FormFieldData& field,
+               const AutofillClient& client,
+               SingleFieldFormFiller::OnSuggestionsReturnedCallback callback,
+               const SuggestionsContext& context),
+              (override));
   MOCK_METHOD(void,
               OnWillSubmitFormWithFields,
               (const std::vector<FormFieldData>& fields,
                bool is_autocomplete_enabled),
               (override));
-  MOCK_METHOD(void,
-              CancelPendingQueries,
-              (const MerchantPromoCodeManager::SuggestionsHandler*),
-              (override));
+  MOCK_METHOD(void, CancelPendingQueries, (), (override));
   MOCK_METHOD(void,
               OnRemoveCurrentSingleFieldSuggestion,
               (const std::u16string&, const std::u16string&, PopupItemId),
diff --git a/components/autofill/core/browser/mock_single_field_form_fill_router.h b/components/autofill/core/browser/mock_single_field_form_fill_router.h
index 3d5ee94..8aa6cd1 100644
--- a/components/autofill/core/browser/mock_single_field_form_fill_router.h
+++ b/components/autofill/core/browser/mock_single_field_form_fill_router.h
@@ -32,7 +32,7 @@
               (AutofillSuggestionTriggerSource trigger_source,
                const FormFieldData& field,
                const AutofillClient& client,
-               base::WeakPtr<SingleFieldFormFiller::SuggestionsHandler> handler,
+               SingleFieldFormFiller::OnSuggestionsReturnedCallback callback,
                const SuggestionsContext& context),
               (override));
   MOCK_METHOD(void,
@@ -40,10 +40,7 @@
               (const std::vector<FormFieldData>& fields,
                bool is_autocomplete_enabled),
               (override));
-  MOCK_METHOD(void,
-              CancelPendingQueries,
-              (const SingleFieldFormFiller::SuggestionsHandler*),
-              (override));
+  MOCK_METHOD(void, CancelPendingQueries, (), (override));
   MOCK_METHOD(void,
               OnRemoveCurrentSingleFieldSuggestion,
               (const std::u16string&, const std::u16string&, PopupItemId),
diff --git a/components/autofill/core/browser/single_field_form_fill_router.cc b/components/autofill/core/browser/single_field_form_fill_router.cc
index d862362..29ebea5 100644
--- a/components/autofill/core/browser/single_field_form_fill_router.cc
+++ b/components/autofill/core/browser/single_field_form_fill_router.cc
@@ -65,37 +65,38 @@
     AutofillSuggestionTriggerSource trigger_source,
     const FormFieldData& field,
     const AutofillClient& client,
-    base::WeakPtr<SingleFieldFormFiller::SuggestionsHandler> handler,
+    OnSuggestionsReturnedCallback on_suggestions_returned,
     const SuggestionsContext& context) {
   // Retrieving suggestions for a new field; select the appropriate filler.
   if (merchant_promo_code_manager_ &&
       merchant_promo_code_manager_->OnGetSingleFieldSuggestions(
-          trigger_source, field, client, handler, context)) {
+          trigger_source, field, client, on_suggestions_returned, context)) {
     return true;
   }
-  if (iban_manager_ && iban_manager_->OnGetSingleFieldSuggestions(
-                           trigger_source, field, client, handler, context)) {
+  if (iban_manager_ &&
+      iban_manager_->OnGetSingleFieldSuggestions(
+          trigger_source, field, client, on_suggestions_returned, context)) {
     return true;
   }
-  if (autocomplete_history_manager_->OnGetSingleFieldSuggestions(
-          trigger_source, field, client, handler, context)) {
-    return true;
-  }
-  return false;
+  return autocomplete_history_manager_->OnGetSingleFieldSuggestions(
+      trigger_source, field, client, std::move(on_suggestions_returned),
+      context);
 }
 
 void SingleFieldFormFillRouter::OnWillSubmitFormWithFields(
     const std::vector<FormFieldData>& fields,
     bool is_autocomplete_enabled) {}
 
-void SingleFieldFormFillRouter::CancelPendingQueries(
-    const SingleFieldFormFiller::SuggestionsHandler* handler) {
-  if (autocomplete_history_manager_)
-    autocomplete_history_manager_->CancelPendingQueries(handler);
-  if (merchant_promo_code_manager_)
-    merchant_promo_code_manager_->CancelPendingQueries(handler);
-  if (iban_manager_)
-    iban_manager_->CancelPendingQueries(handler);
+void SingleFieldFormFillRouter::CancelPendingQueries() {
+  if (autocomplete_history_manager_) {
+    autocomplete_history_manager_->CancelPendingQueries();
+  }
+  if (merchant_promo_code_manager_) {
+    merchant_promo_code_manager_->CancelPendingQueries();
+  }
+  if (iban_manager_) {
+    iban_manager_->CancelPendingQueries();
+  }
 }
 
 void SingleFieldFormFillRouter::OnRemoveCurrentSingleFieldSuggestion(
diff --git a/components/autofill/core/browser/single_field_form_fill_router.h b/components/autofill/core/browser/single_field_form_fill_router.h
index 5cc5a3be..0421d06 100644
--- a/components/autofill/core/browser/single_field_form_fill_router.h
+++ b/components/autofill/core/browser/single_field_form_fill_router.h
@@ -49,12 +49,11 @@
       AutofillSuggestionTriggerSource trigger_source,
       const FormFieldData& field,
       const AutofillClient& client,
-      base::WeakPtr<SingleFieldFormFiller::SuggestionsHandler> handler,
+      OnSuggestionsReturnedCallback on_suggestions_returned,
       const SuggestionsContext& context) override;
   void OnWillSubmitFormWithFields(const std::vector<FormFieldData>& fields,
                                   bool is_autocomplete_enabled) override;
-  void CancelPendingQueries(
-      const SingleFieldFormFiller::SuggestionsHandler* handler) override;
+  void CancelPendingQueries() override;
   void OnRemoveCurrentSingleFieldSuggestion(const std::u16string& field_name,
                                             const std::u16string& value,
                                             PopupItemId popup_item_id) override;
diff --git a/components/autofill/core/browser/single_field_form_fill_router_unittest.cc b/components/autofill/core/browser/single_field_form_fill_router_unittest.cc
index 7a8cc738..73e904bb 100644
--- a/components/autofill/core/browser/single_field_form_fill_router_unittest.cc
+++ b/components/autofill/core/browser/single_field_form_fill_router_unittest.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "components/autofill/core/browser/single_field_form_fill_router.h"
+
+#include "base/functional/callback_helpers.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
@@ -22,36 +24,13 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using testing::_;
-using testing::DoAll;
-using testing::SaveArg;
-
 namespace autofill {
 
 namespace {
 
-class MockSuggestionsHandler
-    : public SingleFieldFormFiller::SuggestionsHandler {
- public:
-  MockSuggestionsHandler() = default;
-  MockSuggestionsHandler(const MockSuggestionsHandler&) = delete;
-  MockSuggestionsHandler& operator=(const MockSuggestionsHandler&) = delete;
-  ~MockSuggestionsHandler() override = default;
-
-  MOCK_METHOD(void,
-              OnSuggestionsReturned,
-              (FieldGlobalId field_id,
-               AutofillSuggestionTriggerSource trigger_source,
-               const std::vector<Suggestion>& suggestions),
-              (override));
-
-  base::WeakPtr<MockSuggestionsHandler> GetWeakPtr() {
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
- private:
-  base::WeakPtrFactory<MockSuggestionsHandler> weak_ptr_factory_{this};
-};
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::SaveArg;
 
 }  // namespace
 
@@ -107,7 +86,6 @@
   for (bool test_field_should_autocomplete : {true, false}) {
     SCOPED_TRACE(testing::Message() << "test_field_should_autocomplete = "
                                     << test_field_should_autocomplete);
-    auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
     test_field_.should_autocomplete = test_field_should_autocomplete;
 
     // If `test_field_.should_autocomplete` is true, that means autocomplete is
@@ -121,12 +99,11 @@
         .Times(1)
         .WillOnce(testing::Return(test_field_.should_autocomplete));
 
-    EXPECT_EQ(
-        test_field_.should_autocomplete,
-        single_field_form_fill_router_->OnGetSingleFieldSuggestions(
-            AutofillSuggestionTriggerSource::kFormControlElementClicked,
-            test_field_, autofill_client_, suggestions_handler->GetWeakPtr(),
-            /*context=*/SuggestionsContext()));
+    EXPECT_EQ(test_field_.should_autocomplete,
+              single_field_form_fill_router_->OnGetSingleFieldSuggestions(
+                  AutofillSuggestionTriggerSource::kFormControlElementClicked,
+                  test_field_, autofill_client_, base::DoNothing(),
+                  /*context=*/SuggestionsContext()));
   }
 }
 
@@ -200,16 +177,11 @@
 // CancelPendingQueries call.
 TEST_F(SingleFieldFormFillRouterTest,
        RouteToAllSingleFieldFormFillers_CancelPendingQueries) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   EXPECT_CALL(*autocomplete_history_manager_, CancelPendingQueries);
-
   EXPECT_CALL(*merchant_promo_code_manager_, CancelPendingQueries);
-
   EXPECT_CALL(*iban_manager_, CancelPendingQueries);
 
-  single_field_form_fill_router_->CancelPendingQueries(
-      suggestions_handler.get());
+  single_field_form_fill_router_->CancelPendingQueries();
 }
 
 // Ensure that the router routes to AutocompleteHistoryManager for this
@@ -241,7 +213,6 @@
   for (bool test_field_should_autocomplete : {true, false}) {
     SCOPED_TRACE(testing::Message() << "test_field_should_autocomplete = "
                                     << test_field_should_autocomplete);
-    auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
     test_field_.should_autocomplete = test_field_should_autocomplete;
 
     // `test_field_.should_autocomplete` should not affect merchant promo code
@@ -254,7 +225,7 @@
 
     EXPECT_TRUE(single_field_form_fill_router_->OnGetSingleFieldSuggestions(
         AutofillSuggestionTriggerSource::kFormControlElementClicked,
-        test_field_, autofill_client_, suggestions_handler->GetWeakPtr(),
+        test_field_, autofill_client_, base::DoNothing(),
         SuggestionsContext()));
   }
 }
@@ -262,8 +233,6 @@
 // Ensure that the router routes to AutocompleteHistoryManager for this
 // OnGetSingleFieldSuggestions call if MerchantPromoCodeManager is not present.
 TEST_F(SingleFieldFormFillRouterTest, MerchantPromoCodeManagerNotPresent) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   // This also invalidates the WeakPtr that the `single_field_form_fill_router_`
   // holds on the promo code manager.
   merchant_promo_code_manager_.reset();
@@ -279,16 +248,13 @@
   // should return true.
   EXPECT_TRUE(single_field_form_fill_router_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, base::DoNothing(), SuggestionsContext()));
 }
 
 // Ensure that the router routes to AutocompleteHistoryManager for this
 // OnGetSingleFieldSuggestions call if
 // MerchantPromoCodeManager::OnGetSingleFieldSuggestions() returns false.
 TEST_F(SingleFieldFormFillRouterTest, MerchantPromoCodeManagerReturnedFalse) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   // Mock MerchantPromoCodeManager::OnGetSingleFieldSuggestions() returning
   // false.
   EXPECT_CALL(*merchant_promo_code_manager_, OnGetSingleFieldSuggestions)
@@ -307,8 +273,7 @@
   // should return true.
   EXPECT_TRUE(single_field_form_fill_router_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, base::DoNothing(), SuggestionsContext()));
 }
 
 // Ensure that the router routes to MerchantPromoCodeManager for this
@@ -338,8 +303,6 @@
 TEST_F(
     SingleFieldFormFillRouterTest,
     FieldNotEligibleForAnySingleFieldFormFiller_OnGetSingleFieldSuggestions) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   EXPECT_CALL(*merchant_promo_code_manager_, OnGetSingleFieldSuggestions)
       .Times(1)
       .WillOnce(testing::Return(false));
@@ -352,15 +315,12 @@
   // did not attempt to display any single field form fill suggestions.
   EXPECT_FALSE(single_field_form_fill_router_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, base::DoNothing(), SuggestionsContext()));
 }
 
 // Ensure that the router routes to AutocompleteHistoryManager for this
 // OnGetSingleFieldSuggestions call if IbanManager is not present.
 TEST_F(SingleFieldFormFillRouterTest, IbanManagerNotPresent) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   // This also invalidates the WeakPtr that the |single_field_form_fill_router_|
   // holds on the iban manager.
   iban_manager_.reset();
@@ -376,16 +336,13 @@
   // should return true.
   EXPECT_TRUE(single_field_form_fill_router_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, base::DoNothing(), SuggestionsContext()));
 }
 
 // Ensure that the router routes to AutocompleteHistoryManager for this
 // OnGetSingleFieldSuggestions call if
 // IbanManager::OnGetSingleFieldSuggestions() returns false.
 TEST_F(SingleFieldFormFillRouterTest, IbanManagerReturnedFalse) {
-  auto suggestions_handler = std::make_unique<MockSuggestionsHandler>();
-
   // Mock IbanManager::OnGetSingleFieldSuggestions() returning
   // false.
   EXPECT_CALL(*iban_manager_, OnGetSingleFieldSuggestions)
@@ -404,8 +361,7 @@
   // should return true.
   EXPECT_TRUE(single_field_form_fill_router_->OnGetSingleFieldSuggestions(
       AutofillSuggestionTriggerSource::kFormControlElementClicked, test_field_,
-      autofill_client_, suggestions_handler->GetWeakPtr(),
-      SuggestionsContext()));
+      autofill_client_, base::DoNothing(), SuggestionsContext()));
 }
 
 // Ensure that the router routes to IbanManager for this
diff --git a/components/autofill/core/browser/single_field_form_filler.cc b/components/autofill/core/browser/single_field_form_filler.cc
index a84fae3..cbaaa98 100644
--- a/components/autofill/core/browser/single_field_form_filler.cc
+++ b/components/autofill/core/browser/single_field_form_filler.cc
@@ -10,19 +10,4 @@
 
 SingleFieldFormFiller::~SingleFieldFormFiller() = default;
 
-SingleFieldFormFiller::QueryHandler::QueryHandler(
-    FieldGlobalId field_id,
-    AutofillSuggestionTriggerSource trigger_source,
-    std::u16string prefix,
-    base::WeakPtr<SuggestionsHandler> handler)
-    : field_id_(field_id),
-      trigger_source_(trigger_source),
-      prefix_(prefix),
-      handler_(std::move(handler)) {}
-
-SingleFieldFormFiller::QueryHandler::QueryHandler(
-    const QueryHandler& original) = default;
-
-SingleFieldFormFiller::QueryHandler::~QueryHandler() = default;
-
 }  // namespace autofill
diff --git a/components/autofill/core/browser/single_field_form_filler.h b/components/autofill/core/browser/single_field_form_filler.h
index 1bb1750..b84cd4ad 100644
--- a/components/autofill/core/browser/single_field_form_filler.h
+++ b/components/autofill/core/browser/single_field_form_filler.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_SINGLE_FIELD_FORM_FILLER_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_SINGLE_FIELD_FORM_FILLER_H_
 
+#include "base/functional/callback_forward.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/autofill/core/common/aliases.h"
 #include "components/autofill/core/common/form_data.h"
@@ -18,20 +19,20 @@
 // time, such as autocomplete or merchant promo codes.
 class SingleFieldFormFiller {
  public:
-  // Interface to be implemented by classes that want to fetch autocomplete
+  // Some `SingleFieldFormFillers` return suggestions asynchronously. This
+  // callback is used to eventually return suggestions. `field_id` identifies
+  // the field the query refer to. `suggestions` is the list of fetched
   // suggestions.
-  class SuggestionsHandler {
-   public:
-    virtual ~SuggestionsHandler() = default;
-
-    // Will be called-back once SingleFieldFormFiller gets the corresponding
-    // response from the DB. `field_id` identifies the field the query refers
-    // to. `suggestions` is the list of fetched suggestions.
-    virtual void OnSuggestionsReturned(
-        FieldGlobalId field_id,
-        AutofillSuggestionTriggerSource trigger_source,
-        const std::vector<Suggestion>& suggestions) = 0;
-  };
+  // TODO(crbug.com/1007974): This should be a `base::OnceCallback<>`. It is
+  // currently a repeating callback, because the `SingleFieldFormFillRouter`
+  // asks all available `SingleFieldFormFiller`s using
+  // `OnGetSingleFieldSuggestions()`, until the first one returns true. This
+  // requires passing the callback to all `SingleFieldFormFillers` (even though
+  // only one of them will end up calling it).
+  using OnSuggestionsReturnedCallback =
+      base::RepeatingCallback<void(FieldGlobalId,
+                                   AutofillSuggestionTriggerSource,
+                                   const std::vector<Suggestion>&)>;
 
   SingleFieldFormFiller();
   virtual ~SingleFieldFormFiller();
@@ -58,7 +59,7 @@
       AutofillSuggestionTriggerSource trigger_source,
       const FormFieldData& field,
       const AutofillClient& client,
-      base::WeakPtr<SuggestionsHandler> handler,
+      OnSuggestionsReturnedCallback on_suggestions_returned,
       const SuggestionsContext& context) = 0;
 
   // Runs when a form is going to be submitted. In the case of Autocomplete, it
@@ -70,9 +71,9 @@
       const std::vector<FormFieldData>& fields,
       bool is_autocomplete_enabled) = 0;
 
-  // Cancels the currently pending WebDataService queries associated with the
-  // given |handler|.
-  virtual void CancelPendingQueries(const SuggestionsHandler* handler) = 0;
+  // Cancels all pending queries. This is only applicable to
+  // `SingleFieldFormFillers`` that fetch suggestions asynchronously.
+  virtual void CancelPendingQueries() = 0;
 
   // If applicable, removes the currently-selected suggestion from the database.
   // `popup_item_id` is the PopupItemId of the suggestion to be removed.
@@ -87,34 +88,6 @@
   // suggestion selected.
   virtual void OnSingleFieldSuggestionSelected(const std::u16string& value,
                                                PopupItemId popup_item_id) = 0;
-
- protected:
-  // Internal data object used to keep a request's context to associate it
-  // with the appropriate response.
-  struct QueryHandler {
-    QueryHandler(FieldGlobalId field_id,
-                 AutofillSuggestionTriggerSource trigger_source,
-                 std::u16string prefix,
-                 base::WeakPtr<SuggestionsHandler> handler);
-    QueryHandler(const QueryHandler& original);
-    ~QueryHandler();
-
-    // The queried field ID.
-    FieldGlobalId field_id_;
-
-    // Describes what caused the suggestions to trigger. This value was provided
-    // by the handler when requesting suggestions. It is temporarily stored
-    // while suggestions are queried, so it can be passed on to
-    // `OnSuggestionsReturned()`.
-    AutofillSuggestionTriggerSource trigger_source_;
-
-    // Prefix used to search suggestions, submitted by the handler.
-    std::u16string prefix_;
-
-    // Weak pointer to the handler instance which will be called-back when
-    // we get the response for the associate query.
-    base::WeakPtr<SuggestionsHandler> handler_;
-  };
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/test_autofill_async_observer.cc b/components/autofill/core/browser/test_autofill_async_observer.cc
deleted file mode 100644
index fe6be40..0000000
--- a/components/autofill/core/browser/test_autofill_async_observer.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/test_autofill_async_observer.h"
-
-#include "base/run_loop.h"
-
-namespace autofill {
-namespace test {
-
-TestAutofillAsyncObserver::TestAutofillAsyncObserver(
-    NotificationType notification_type,
-    bool detach_on_notify)
-    : AutofillObserver(notification_type, detach_on_notify), run_loop_() {}
-
-TestAutofillAsyncObserver::~TestAutofillAsyncObserver() = default;
-
-void TestAutofillAsyncObserver::OnNotify() {
-  run_loop_.Quit();
-}
-
-void TestAutofillAsyncObserver::Wait() {
-  run_loop_.Run();
-}
-
-}  // namespace test
-}  // namespace autofill
diff --git a/components/autofill/core/browser/test_autofill_async_observer.h b/components/autofill/core/browser/test_autofill_async_observer.h
deleted file mode 100644
index 28a4b63..0000000
--- a/components/autofill/core/browser/test_autofill_async_observer.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_AUTOFILL_ASYNC_OBSERVER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_AUTOFILL_ASYNC_OBSERVER_H_
-
-#include "base/observer_list_types.h"
-#include "base/run_loop.h"
-#include "components/autofill/core/browser/autofill_observer.h"
-
-namespace autofill {
-namespace test {
-
-// Observer which allows to block a thread (wait) until it gets notified with a
-// specific NotificationType. Blocks the thread via a base::RunLoop.
-// This is a very useful mechanism for browsers tests.
-class TestAutofillAsyncObserver : public AutofillObserver {
- public:
-  // |notification_type| is the notification type that this observer observes.
-  // |detach_on_notify| will let the AutofillSubject know that this
-  // observer only wants to watch for the first notification of that type.
-  TestAutofillAsyncObserver(NotificationType notification_type,
-                            bool detach_on_notify = false);
-
-  ~TestAutofillAsyncObserver() override;
-
-  // Invoked by the watched AutofillSubject, this will effectively quit the
-  // current run loop.
-  void OnNotify() override;
-
-  // Blocks the thread until the expected notification occurs.
-  void Wait();
-
- private:
-  base::RunLoop run_loop_;
-};
-
-}  // namespace test
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_AUTOFILL_ASYNC_OBSERVER_H_
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp
index 77502f02..f973b541 100644
--- a/components/autofill_strings.grdp
+++ b/components/autofill_strings.grdp
@@ -126,12 +126,11 @@
     You are currently on a menu
   </message>
 
-  <!--TODO(crbug.com/1459990): Align with writers about related strings and remove translateable=false-->
-  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that edit autofill profile option was selected." translateable="false">
+  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that edit autofill profile option was selected.">
     The edit address option was selected
   </message>
 
-  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that delete autofill profile option was selected." translateable="false">
+  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that delete autofill profile option was selected.">
     The delete address option was selected
   </message>
 
@@ -139,23 +138,23 @@
     The autofilled info was cleared from the form
   </message>
 
-  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that filling address fields option was selected." translateable="false">
-    The fill full address fields option was selected
+  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that filling address fields option was selected.">
+    The fill full address option was selected
   </message>
 
-  <message name="IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED" desc="The text displayed at one of the autofill submenus options allowing the users to fill all address related fields at once." meaning="Fills all address related fields" translateable="false">
+  <message name="IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED" desc="The text displayed at one of the autofill submenus options allowing the users to fill all address related fields at once." meaning="Fills all address related fields">
     Fill full address
   </message>
 
-  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_NAME_GROUP_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that filling name fields option was selected." translateable="false">
+  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_NAME_GROUP_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that filling name fields option was selected.">
     The fill full name option was selected
   </message>
 
-  <message name="IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED" desc="The text displayed at one of the autofill submenus options allowing the users to fill all name related fields at once." meaning="Fills all name related fields" translateable="false">
+  <message name="IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED" desc="The text displayed at one of the autofill submenus options allowing the users to fill all name related fields at once." meaning="Fills all name related fields">
     Fill full name
   </message>
 
-  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that the fill everything option was selected." translateable="false">
+  <message name="IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="Screen reader announcement indicating that the fill everything option was selected.">
     The fill everything option was selected
   </message>
 
@@ -167,31 +166,31 @@
     Manage...
   </message>
 
-  <message name="IDS_AUTOFILL_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="The text displayed at the bottom of the Autofill sub meny to open the edit address profile dialog." meaning="Entry point to address profile deletion." translateable="false">
+  <message name="IDS_AUTOFILL_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="The text displayed at the bottom of the Autofill sub meny to open the edit address profile dialog." meaning="Entry point to address profile deletion.">
     Edit address
   </message>
 
-  <message name="IDS_AUTOFILL_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="The text displayed at the bottom of the Autofill sub menu to open the delete address profile dialog." meaning="Entry point to address profile deletion." translateable="false">
+  <message name="IDS_AUTOFILL_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="The text displayed at the bottom of the Autofill sub menu to open the delete address profile dialog." meaning="Entry point to address profile deletion.">
     Delete address
   </message>
 
-  <message name="IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED" desc="The secondary text displayed on a house number suggestion was selected." meaning="The label for the house number field type store by autofill has been selected in the subpopup." translateable="false">
+  <message name="IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED" desc="The secondary text displayed on a house number suggestion was selected." meaning="The label for the house number field type store by autofill has been selected in the subpopup.">
     Building number option selected
   </message>
 
-  <message name="IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED" desc="The secondary text displayed on a street name suggestion was selected." meaning="The label for the street namefield type store by autofill has been selected in the subpopup." translateable="false">
-    Street option selected
+  <message name="IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED" desc="The secondary text displayed on a street name suggestion was selected." meaning="The label for the street namefield type store by autofill has been selected in the subpopup.">
+    Street name option selected
   </message>
 
-  <message name="IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT" desc="The secondary text displayed on a house number suggestion." meaning="The label for the house number field type store by autofill." translateable="false">
+  <message name="IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT" desc="The secondary text displayed on a house number suggestion." meaning="The label for the house number field type store by autofill.">
     Building number
   </message>
 
-  <message name="IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT" desc="The secondary text displayed on a street name suggestion." meaning="The label for the street namefield type store by autofill." translateable="false">
+  <message name="IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT" desc="The secondary text displayed on a street name suggestion." meaning="The label for the street namefield type store by autofill.">
     Street
   </message>
 
-  <message name="IDS_AUTOFILL_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="The text displayed at the footer of the Autofill sub menu to fill everything from the address profile." meaning="Fill every available information from the address profile." translateable="false">
+  <message name="IDS_AUTOFILL_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED" desc="The text displayed at the footer of the Autofill sub menu to fill everything from the address profile." meaning="Fill every available information from the address profile.">
     Fill everything
   </message>
 
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
index 74e31fb9..6f57e80d 100644
--- a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
@@ -1 +1 @@
-17826b77d5857cf55c1bab23a41c02bd05d502e4
\ No newline at end of file
+f32f7207d9f9b41446626e09bde23dac4a37dcbf
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
new file mode 100644
index 0000000..bf508d9
--- /dev/null
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
@@ -0,0 +1 @@
+349a332b6c0079608fc480126353380048364c83
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED.png.sha1
index ccc66947..8714bae 100644
--- a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED.png.sha1
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED.png.sha1
@@ -1 +1 @@
-502573071ff1cd40353abd774963fa62b04b5c55
\ No newline at end of file
+06e6741e46476cd7c299c203b78cd79963747cdd
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
index d56e54b9..3b9ac3c 100644
--- a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
@@ -1 +1 @@
-63d2810765d4eba31b18059049fed42ad99e15a0
\ No newline at end of file
+58c94849054a20224d6b31866e1169be378dc961
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_NAME_GROUP_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_NAME_GROUP_POPUP_OPTION_SELECTED.png.sha1
index 698e12d..7a5aea0 100644
--- a/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_NAME_GROUP_POPUP_OPTION_SELECTED.png.sha1
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_NAME_GROUP_POPUP_OPTION_SELECTED.png.sha1
@@ -1 +1 @@
-ba00f57cdbd679fd8ee5aa62bd90fc6a2d6fe49a
\ No newline at end of file
+bb429f678cc398113dac5cb3ec413bf1e674e2ca
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
index 74e31fb9..6f57e80d 100644
--- a/components/autofill_strings_grdp/IDS_AUTOFILL_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
@@ -1 +1 @@
-17826b77d5857cf55c1bab23a41c02bd05d502e4
\ No newline at end of file
+f32f7207d9f9b41446626e09bde23dac4a37dcbf
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
new file mode 100644
index 0000000..bf508d9
--- /dev/null
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
@@ -0,0 +1 @@
+349a332b6c0079608fc480126353380048364c83
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED.png.sha1
index ccc66947..8714bae 100644
--- a/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED.png.sha1
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED.png.sha1
@@ -1 +1 @@
-502573071ff1cd40353abd774963fa62b04b5c55
\ No newline at end of file
+06e6741e46476cd7c299c203b78cd79963747cdd
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
index d56e54b9..3b9ac3c 100644
--- a/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED.png.sha1
@@ -1 +1 @@
-63d2810765d4eba31b18059049fed42ad99e15a0
\ No newline at end of file
+58c94849054a20224d6b31866e1169be378dc961
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED.png.sha1
index 698e12d..7a5aea0 100644
--- a/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED.png.sha1
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED.png.sha1
@@ -1 +1 @@
-ba00f57cdbd679fd8ee5aa62bd90fc6a2d6fe49a
\ No newline at end of file
+bb429f678cc398113dac5cb3ec413bf1e674e2ca
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT.png.sha1
new file mode 100644
index 0000000..67c5254
--- /dev/null
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT.png.sha1
@@ -0,0 +1 @@
+c7680c9a2bc71b47bd03bb24842a0a4f563e1455
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED.png.sha1
new file mode 100644
index 0000000..67c5254
--- /dev/null
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED.png.sha1
@@ -0,0 +1 @@
+c7680c9a2bc71b47bd03bb24842a0a4f563e1455
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT.png.sha1
new file mode 100644
index 0000000..4dd527b
--- /dev/null
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT.png.sha1
@@ -0,0 +1 @@
+84fb09da25395edbfcc0236e3089b3a576f46002
\ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED.png.sha1
new file mode 100644
index 0000000..4dd527b
--- /dev/null
+++ b/components/autofill_strings_grdp/IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED.png.sha1
@@ -0,0 +1 @@
+84fb09da25395edbfcc0236e3089b3a576f46002
\ No newline at end of file
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index defbcb00..d87bb2a3 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "27.1",
-  "log_list_timestamp": "2023-11-26T12:54:39Z",
+  "version": "27.2",
+  "log_list_timestamp": "2023-11-27T12:54:25Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/content_settings/core/common/features.cc b/components/content_settings/core/common/features.cc
index 9de2a02..deeceef 100644
--- a/components/content_settings/core/common/features.cc
+++ b/components/content_settings/core/common/features.cc
@@ -72,7 +72,7 @@
 
 BASE_FEATURE(kImprovedSemanticsActivityIndicators,
              "ImprovedSemanticsActivityIndicators",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kTrackingProtection3pcd,
              "TrackingProtection3pcd",
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index b468a1a..968f3527 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -498,6 +498,7 @@
 android_library("httpengine_native_provider_base_java") {
   sources = [
     "java/src/org/chromium/net/impl/AndroidBidirectionalStreamBuilderWrapper.java",
+    "java/src/org/chromium/net/impl/AndroidBidirectionalStreamCallbackWrapper.java",
     "java/src/org/chromium/net/impl/AndroidBidirectionalStreamWrapper.java",
     "java/src/org/chromium/net/impl/AndroidCallbackExceptionWrapper.java",
     "java/src/org/chromium/net/impl/AndroidHeaderBlockWrapper.java",
@@ -506,16 +507,15 @@
     "java/src/org/chromium/net/impl/AndroidHttpExceptionWrapper.java",
     "java/src/org/chromium/net/impl/AndroidNetworkExceptionWrapper.java",
     "java/src/org/chromium/net/impl/AndroidQuicExceptionWrapper.java",
+    "java/src/org/chromium/net/impl/AndroidUploadDataProviderWrapper.java",
     "java/src/org/chromium/net/impl/AndroidUploadDataSinkWrapper.java",
     "java/src/org/chromium/net/impl/AndroidUrlRequestBuilderWrapper.java",
+    "java/src/org/chromium/net/impl/AndroidUrlRequestCallbackWrapper.java",
+    "java/src/org/chromium/net/impl/AndroidUrlRequestStatusListenerWrapper.java",
     "java/src/org/chromium/net/impl/AndroidUrlRequestWrapper.java",
     "java/src/org/chromium/net/impl/AndroidUrlResponseInfoWrapper.java",
-    "java/src/org/chromium/net/impl/BidirectionalStreamCallbackWrapper.java",
     "java/src/org/chromium/net/impl/CronetExceptionTranslationUtils.java",
     "java/src/org/chromium/net/impl/HttpEngineNativeProvider.java",
-    "java/src/org/chromium/net/impl/UploadDataProviderWrapper.java",
-    "java/src/org/chromium/net/impl/UrlRequestCallbackWrapper.java",
-    "java/src/org/chromium/net/impl/UrlRequestStatusListenerWrapper.java",
   ]
 
   deps = [
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamBuilderWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamBuilderWrapper.java
index 25ab1dd..8f4c7ed 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamBuilderWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamBuilderWrapper.java
@@ -4,13 +4,16 @@
 
 package org.chromium.net.impl;
 
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
 import android.net.Network;
 
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresExtension;
 
 import org.chromium.net.CronetEngine;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidBidirectionalStreamBuilderWrapper
         extends org.chromium.net.ExperimentalBidirectionalStream.Builder {
     private final android.net.http.BidirectionalStream.Builder mBackend;
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamCallbackWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamCallbackWrapper.java
similarity index 92%
rename from components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamCallbackWrapper.java
rename to components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamCallbackWrapper.java
index b49650a..aa8ecf1 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamCallbackWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamCallbackWrapper.java
@@ -4,21 +4,25 @@
 
 package org.chromium.net.impl;
 
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
 import android.net.http.HttpException;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresExtension;
 
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 @SuppressWarnings("Override")
-class BidirectionalStreamCallbackWrapper implements android.net.http.BidirectionalStream.Callback {
+class AndroidBidirectionalStreamCallbackWrapper implements
+    android.net.http.BidirectionalStream.Callback {
     private final org.chromium.net.BidirectionalStream.Callback mBackend;
 
-    public BidirectionalStreamCallbackWrapper(
+    public AndroidBidirectionalStreamCallbackWrapper(
             org.chromium.net.BidirectionalStream.Callback backend) {
         Objects.requireNonNull(backend, "Callback is required.");
         this.mBackend = backend;
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamWrapper.java
index 034190d..c0586ba 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidBidirectionalStreamWrapper.java
@@ -4,11 +4,14 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
+import androidx.annotation.RequiresExtension;
 
 import java.nio.ByteBuffer;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidBidirectionalStreamWrapper extends org.chromium.net.ExperimentalBidirectionalStream {
     private final android.net.http.BidirectionalStream mBackend;
 
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidCallbackExceptionWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidCallbackExceptionWrapper.java
index 0d5cc1d..904e914d 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidCallbackExceptionWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidCallbackExceptionWrapper.java
@@ -4,9 +4,12 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
 
-@RequiresApi(api = 34)
+import androidx.annotation.RequiresExtension;
+
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidCallbackExceptionWrapper extends org.chromium.net.CallbackException {
     protected AndroidCallbackExceptionWrapper(android.net.http.CallbackException e) {
         // The CallbackException contract states the cause of the top level exception is the
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHeaderBlockWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHeaderBlockWrapper.java
index 6ecba80..2f2f9b8 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHeaderBlockWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHeaderBlockWrapper.java
@@ -4,13 +4,16 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
+import androidx.annotation.RequiresExtension;
 
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidHeaderBlockWrapper extends org.chromium.net.UrlResponseInfo.HeaderBlock {
     private final android.net.http.HeaderBlock mBackend;
 
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineBuilderWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineBuilderWrapper.java
index d0eb5791..5ed9109e 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineBuilderWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineBuilderWrapper.java
@@ -4,9 +4,12 @@
 
 package org.chromium.net.impl;
 
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
 import android.net.http.HttpEngine;
 
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresExtension;
 
 import org.chromium.base.Log;
 import org.chromium.net.CronetEngine;
@@ -16,7 +19,7 @@
 import java.util.Date;
 import java.util.Set;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidHttpEngineBuilderWrapper extends ICronetEngineBuilder {
     private static final String TAG = "HttpEngBuilderWrap";
 
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineWrapper.java
index 066a0cf..9b35112 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpEngineWrapper.java
@@ -4,10 +4,13 @@
 
 package org.chromium.net.impl;
 
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
 import android.net.Network;
 import android.net.http.HttpEngine;
 
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresExtension;
 
 import org.chromium.net.ExperimentalCronetEngine;
 
@@ -18,7 +21,7 @@
 import java.net.URLStreamHandlerFactory;
 import java.util.concurrent.Executor;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidHttpEngineWrapper extends ExperimentalCronetEngine {
     private final HttpEngine mBackend;
 
@@ -94,7 +97,7 @@
             String url, org.chromium.net.BidirectionalStream.Callback callback, Executor executor) {
         return new AndroidBidirectionalStreamBuilderWrapper(
                 mBackend.newBidirectionalStreamBuilder(
-                        url, executor, new BidirectionalStreamCallbackWrapper(callback)));
+                        url, executor, new AndroidBidirectionalStreamCallbackWrapper(callback)));
     }
 
     @Override
@@ -102,6 +105,6 @@
             String url, org.chromium.net.UrlRequest.Callback callback, Executor executor) {
         return new AndroidUrlRequestBuilderWrapper(
                 mBackend.newUrlRequestBuilder(
-                        url, executor, new UrlRequestCallbackWrapper(callback)));
+                        url, executor, new AndroidUrlRequestCallbackWrapper(callback)));
     }
 }
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpExceptionWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpExceptionWrapper.java
index eb2fc8ac..ff9bb93 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpExceptionWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidHttpExceptionWrapper.java
@@ -4,13 +4,16 @@
 
 package org.chromium.net.impl;
 
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
 import android.net.http.HttpException;
 
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresExtension;
 
 import org.chromium.net.CronetException;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidHttpExceptionWrapper extends CronetException {
     AndroidHttpExceptionWrapper(HttpException e) {
         super(e.getMessage(), e);
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidNetworkExceptionWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidNetworkExceptionWrapper.java
index 04b281523..49c583f 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidNetworkExceptionWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidNetworkExceptionWrapper.java
@@ -4,9 +4,12 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
 
-@RequiresApi(api = 34)
+import androidx.annotation.RequiresExtension;
+
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidNetworkExceptionWrapper extends org.chromium.net.NetworkException {
     private final android.net.http.NetworkException mBackend;
 
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidQuicExceptionWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidQuicExceptionWrapper.java
index 5e1a08a..13e9c9f 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidQuicExceptionWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidQuicExceptionWrapper.java
@@ -4,9 +4,12 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
 
-@RequiresApi(api = 34)
+import androidx.annotation.RequiresExtension;
+
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidQuicExceptionWrapper extends org.chromium.net.QuicException {
     private final AndroidNetworkExceptionWrapper mBackend;
 
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/UploadDataProviderWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUploadDataProviderWrapper.java
similarity index 73%
rename from components/cronet/android/java/src/org/chromium/net/impl/UploadDataProviderWrapper.java
rename to components/cronet/android/java/src/org/chromium/net/impl/AndroidUploadDataProviderWrapper.java
index f432188..80f9b4b 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/UploadDataProviderWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUploadDataProviderWrapper.java
@@ -4,18 +4,20 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
 
+import androidx.annotation.RequiresExtension;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 @SuppressWarnings("Override")
-class UploadDataProviderWrapper extends android.net.http.UploadDataProvider {
+class AndroidUploadDataProviderWrapper extends android.net.http.UploadDataProvider {
     private final org.chromium.net.UploadDataProvider mBackend;
 
-    public UploadDataProviderWrapper(org.chromium.net.UploadDataProvider backend) {
+    public AndroidUploadDataProviderWrapper(org.chromium.net.UploadDataProvider backend) {
         Objects.requireNonNull(backend, "Invalid UploadDataProvider.");
         this.mBackend = backend;
     }
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUploadDataSinkWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUploadDataSinkWrapper.java
index b31305ea..20fb168 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUploadDataSinkWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUploadDataSinkWrapper.java
@@ -4,9 +4,12 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
 
-@RequiresApi(api = 34)
+import androidx.annotation.RequiresExtension;
+
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidUploadDataSinkWrapper extends org.chromium.net.UploadDataSink {
     private final android.net.http.UploadDataSink mBackend;
 
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestBuilderWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestBuilderWrapper.java
index b7313c5e..63bc86b 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestBuilderWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestBuilderWrapper.java
@@ -4,15 +4,18 @@
 
 package org.chromium.net.impl;
 
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
 import android.net.Network;
 
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresExtension;
 
 import org.chromium.net.CronetEngine;
 
 import java.util.concurrent.Executor;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidUrlRequestBuilderWrapper extends org.chromium.net.ExperimentalUrlRequest.Builder {
     private final android.net.http.UrlRequest.Builder mBackend;
 
@@ -47,7 +50,8 @@
     @Override
     public org.chromium.net.ExperimentalUrlRequest.Builder setUploadDataProvider(
             org.chromium.net.UploadDataProvider uploadDataProvider, Executor executor) {
-        mBackend.setUploadDataProvider(new UploadDataProviderWrapper(uploadDataProvider), executor);
+        mBackend.setUploadDataProvider(
+                new AndroidUploadDataProviderWrapper(uploadDataProvider), executor);
         return this;
     }
 
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestCallbackWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestCallbackWrapper.java
similarity index 91%
rename from components/cronet/android/java/src/org/chromium/net/impl/UrlRequestCallbackWrapper.java
rename to components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestCallbackWrapper.java
index 81ad807..98efbd8 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestCallbackWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestCallbackWrapper.java
@@ -4,21 +4,24 @@
 
 package org.chromium.net.impl;
 
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
 import android.net.http.HttpException;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
 
+import androidx.annotation.RequiresExtension;
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 @SuppressWarnings("Override")
-class UrlRequestCallbackWrapper implements android.net.http.UrlRequest.Callback {
+class AndroidUrlRequestCallbackWrapper implements android.net.http.UrlRequest.Callback {
     private final org.chromium.net.UrlRequest.Callback mBackend;
 
-    public UrlRequestCallbackWrapper(org.chromium.net.UrlRequest.Callback backend) {
+    public AndroidUrlRequestCallbackWrapper(org.chromium.net.UrlRequest.Callback backend) {
         Objects.requireNonNull(backend, "Callback is required.");
         this.mBackend = backend;
     }
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestStatusListenerWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestStatusListenerWrapper.java
new file mode 100644
index 0000000..bfff4bbd
--- /dev/null
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestStatusListenerWrapper.java
@@ -0,0 +1,26 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.net.impl;
+
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
+import androidx.annotation.RequiresExtension;
+
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
+@SuppressWarnings("Override")
+class AndroidUrlRequestStatusListenerWrapper implements android.net.http.UrlRequest.StatusListener {
+    private final org.chromium.net.UrlRequest.StatusListener mBackend;
+
+    public AndroidUrlRequestStatusListenerWrapper(
+            org.chromium.net.UrlRequest.StatusListener backend) {
+        this.mBackend = backend;
+    }
+
+    @Override
+    public void onStatus(int i) {
+        mBackend.onStatus(i);
+    }
+}
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestWrapper.java
index bfc9d03..3d42ed4 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlRequestWrapper.java
@@ -4,11 +4,14 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
+import androidx.annotation.RequiresExtension;
 
 import java.nio.ByteBuffer;
 
-@RequiresApi(34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidUrlRequestWrapper extends org.chromium.net.ExperimentalUrlRequest {
     private final android.net.http.UrlRequest mBackend;
 
@@ -43,6 +46,6 @@
 
     @Override
     public void getStatus(StatusListener listener) {
-        mBackend.getStatus(new UrlRequestStatusListenerWrapper(listener));
+        mBackend.getStatus(new AndroidUrlRequestStatusListenerWrapper(listener));
     }
 }
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlResponseInfoWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlResponseInfoWrapper.java
index 07476ee..dad595e 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlResponseInfoWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidUrlResponseInfoWrapper.java
@@ -4,12 +4,15 @@
 
 package org.chromium.net.impl;
 
-import androidx.annotation.RequiresApi;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
+import androidx.annotation.RequiresExtension;
 
 import java.util.List;
 import java.util.Map;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class AndroidUrlResponseInfoWrapper extends org.chromium.net.UrlResponseInfo {
     private final android.net.http.UrlResponseInfo mBackend;
     /* org.chromium.net.UrlRequest and org.chromium.net.BidirectionalStream map the direct or
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionTranslationUtils.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionTranslationUtils.java
index 21dd726..0261afb 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionTranslationUtils.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetExceptionTranslationUtils.java
@@ -4,13 +4,16 @@
 
 package org.chromium.net.impl;
 
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
+import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
+
 import android.net.http.HttpException;
 
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresExtension;
 
 import org.chromium.net.CronetException;
 
-@RequiresApi(api = 34)
+@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
 class CronetExceptionTranslationUtils {
     @SuppressWarnings("unchecked")
     public static <T, E extends Exception> T executeTranslatingCronetExceptions(
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/HttpEngineNativeProvider.java b/components/cronet/android/java/src/org/chromium/net/impl/HttpEngineNativeProvider.java
index 1fed541..736eff9 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/HttpEngineNativeProvider.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/HttpEngineNativeProvider.java
@@ -34,8 +34,8 @@
     // TODO(crbug/1499829): Move this to CronetProvider
     public static final String PROVIDER_NAME_HTTPENGINE_NATIVE = "HttpEngine-Native-Provider";
 
-    private static final int EXT_API_LEVEL = Build.VERSION_CODES.S;
-    private static final int EXT_VERSION = 7;
+    static final int EXT_API_LEVEL = Build.VERSION_CODES.S;
+    static final int EXT_VERSION = 7;
 
     public HttpEngineNativeProvider(Context context) {
         super(context);
@@ -54,6 +54,7 @@
     }
 
     @Override
+    @RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
     public String getVersion() {
         return HttpEngine.getVersionString();
     }
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestStatusListenerWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestStatusListenerWrapper.java
deleted file mode 100644
index c73e1f4..0000000
--- a/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestStatusListenerWrapper.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.net.impl;
-
-import androidx.annotation.RequiresApi;
-
-@RequiresApi(api = 34)
-@SuppressWarnings("Override")
-class UrlRequestStatusListenerWrapper implements android.net.http.UrlRequest.StatusListener {
-    private final org.chromium.net.UrlRequest.StatusListener mBackend;
-
-    public UrlRequestStatusListenerWrapper(org.chromium.net.UrlRequest.StatusListener backend) {
-        this.mBackend = backend;
-    }
-
-    @Override
-    public void onStatus(int i) {
-        mBackend.onStatus(i);
-    }
-}
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRule.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRule.java
index bbc4009c..efe866d 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRule.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRule.java
@@ -17,7 +17,6 @@
 import android.os.StrictMode;
 
 import androidx.annotation.Nullable;
-import androidx.core.os.BuildCompat;
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.rules.TestRule;
@@ -208,7 +207,7 @@
             excludedImplementations.addAll(
                     Arrays.asList(ignoreDueToMethodAnnotation.implementations()));
         }
-        if (!BuildCompat.isAtLeastU()) {
+        if (Build.VERSION.SDK_INT < 34) {
             excludedImplementations.add(CronetImplementation.AOSP_PLATFORM);
         }
 
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc
index 594204c..8cef00e 100644
--- a/components/feature_engagement/public/feature_configurations.cc
+++ b/components/feature_engagement/public/feature_configurations.cc
@@ -1922,6 +1922,25 @@
                     kMaxStorageDaysForIOSPullToRefresh));
     return config;
   }
+  if (kIPHiOSReplaceSyncPromosWithSignInPromos.name == feature->name) {
+    // A config to show a user education bubble from the account row in the
+    // settings page. Will be shown only the first time user signs-in from
+    // settings. Subsequent sign-ins will not trigger it.
+    absl::optional<FeatureConfig> config = FeatureConfig();
+    config->valid = true;
+    config->availability = Comparator(ANY, 0);
+    config->session_rate = Comparator(ANY, 0);
+    config->trigger =
+        EventConfig("signin_from_settings_trigger", Comparator(LESS_THAN, 1),
+                    feature_engagement::kMaxStoragePeriod,
+                    feature_engagement::kMaxStoragePeriod);
+    config->used =
+        EventConfig("signin_from_settings_used", Comparator(EQUAL, 0),
+                    feature_engagement::kMaxStoragePeriod,
+                    feature_engagement::kMaxStoragePeriod);
+    config->blocked_by.type = BlockedBy::Type::NONE;
+    return config;
+  }
 
   // iOS Promo Configs are split out into a separate file, so check that too.
   if (absl::optional<FeatureConfig> ios_promo_feature_config =
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index e02af5b5..26b9731 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -560,6 +560,9 @@
 BASE_FEATURE(kIPHiOSPullToRefreshFeature,
              "IPH_iOSPullToRefreshFeature",
              base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kIPHiOSReplaceSyncPromosWithSignInPromos,
+             "IPH_iOSReplaceSyncPromosWithSignInPromos",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Non-FET feature.
 BASE_FEATURE(kDefaultBrowserEligibilitySlidingWindow,
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index fd384a8..7c7462f 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -226,6 +226,7 @@
 BASE_DECLARE_FEATURE(kIPHiOSChoiceScreenFeature);
 BASE_DECLARE_FEATURE(kIPHiOSParcelTrackingFeature);
 BASE_DECLARE_FEATURE(kIPHiOSPullToRefreshFeature);
+BASE_DECLARE_FEATURE(kIPHiOSReplaceSyncPromosWithSignInPromos);
 
 // A feature flag to enable and parametrize the sliding window of time for a
 // user's eligibility to be shown a default browser promo. This is not an FET
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc
index d3f3300c..7afacf3 100644
--- a/components/feature_engagement/public/feature_list.cc
+++ b/components/feature_engagement/public/feature_list.cc
@@ -145,6 +145,7 @@
     &kIPHiOSChoiceScreenFeature,
     &kIPHiOSParcelTrackingFeature,
     &kIPHiOSPullToRefreshFeature,
+    &kIPHiOSReplaceSyncPromosWithSignInPromos,
 #endif  // BUILDFLAG(IS_IOS)
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h
index 1b232df8..fcb6b3eb 100644
--- a/components/feature_engagement/public/feature_list.h
+++ b/components/feature_engagement/public/feature_list.h
@@ -269,6 +269,8 @@
                        "IPH_iOSParcelTrackingFeature");
 DEFINE_VARIATION_PARAM(kIPHiOSPullToRefreshFeature,
                        "IPH_iOSPullToRefreshFeature");
+DEFINE_VARIATION_PARAM(kIPHiOSReplaceSyncPromosWithSignInPromos,
+                       "IPH_iOSReplaceSyncPromosWithSignInPromos");
 #endif  // BUILDFLAG(IS_IOS)
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
@@ -581,6 +583,7 @@
         VARIATION_ENTRY(kIPHiOSChoiceScreenFeature),
         VARIATION_ENTRY(kIPHiOSParcelTrackingFeature),
         VARIATION_ENTRY(kIPHiOSPullToRefreshFeature),
+        VARIATION_ENTRY(kIPHiOSReplaceSyncPromosWithSignInPromos),
 #elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
         VARIATION_ENTRY(kIPHBatterySaverModeFeature),
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.cc b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.cc
index 4fe1084..db7ff2d 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.cc
@@ -19,6 +19,7 @@
     const {
   switch (GetPrerenderingState()) {
     case PrerenderingState::kNoPrerendering:
+    case PrerenderingState::kInPreview:
       return false;
     case PrerenderingState::kInPrerendering:
     case PrerenderingState::kActivatedNoActivationStart:
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
index cd988e9..4d25f79 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
+++ b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
@@ -38,22 +38,28 @@
 };
 
 // Represents the page's state of prerendering.
+// If the page is previewed, the state starts with kInPreview, and may be
+// transitted to kNoPrerendering after its activation and promotion.
+// If the page is prerendereed, the state starts with kInPrerendering, and may
+// be transmitted to kActivatedNoActivationStart, and kActivated.
+// Otherwise, it sticks on kNoPrerendering.
 //
 // TODO(crbug.com/1348097): Remove kActivatedNoActivationStart if possible.
 enum class PrerenderingState {
   // Not prerenedered
-  kNoPrerendering = 0,
+  kNoPrerendering,
+  // Previewed before acitvation and promotion
+  kInPreview,
   // Prerendered before activation
-  kInPrerendering = 1,
+  kInPrerendering,
   // Prerendered and activated, but `PageLoadTiming.activation_start` is not
   // arrived
   //
   // In many cases, PageLoadMetricsObservers can regard this state
   // kInPrerendering.
-  kActivatedNoActivationStart = 2,
+  kActivatedNoActivationStart,
   // Prerendered and activated
-  kActivated = 3,
-  kMaxValue = kActivated,
+  kActivated,
 };
 
 // This class tracks global state for the page load that should be accessible
diff --git a/components/page_load_metrics/browser/page_load_metrics_util.cc b/components/page_load_metrics/browser/page_load_metrics_util.cc
index 6c0f5b0..8ddfc92e 100644
--- a/components/page_load_metrics/browser/page_load_metrics_util.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_util.cc
@@ -163,6 +163,7 @@
     const PageLoadMetricsObserverDelegate& delegate) {
   switch (delegate.GetPrerenderingState()) {
     case PrerenderingState::kNoPrerendering:
+    case PrerenderingState::kInPreview:
       if (delegate.StartedInForeground()) {
         return delegate.GetTimeToFirstBackground();
       } else {
@@ -208,6 +209,7 @@
 
   switch (delegate.GetPrerenderingState()) {
     case PrerenderingState::kNoPrerendering:
+    case PrerenderingState::kInPreview:
       return event;
     case PrerenderingState::kInPrerendering:
     case PrerenderingState::kActivatedNoActivationStart:
diff --git a/components/page_load_metrics/browser/page_load_metrics_util_unittest.cc b/components/page_load_metrics/browser/page_load_metrics_util_unittest.cc
index 8f9942b..5c08c62 100644
--- a/components/page_load_metrics/browser/page_load_metrics_util_unittest.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_util_unittest.cc
@@ -305,6 +305,7 @@
 
     switch (test_case.prerendering_state) {
       case PrerenderingState::kNoPrerendering:
+      case PrerenderingState::kInPreview:
         DCHECK_NE(test_case.visibility_at_start_or_activation_,
                   PageVisibility::kNotInitialized);
         delegate.started_in_foreground_ =
diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc
index 2eae801..91e20f2 100644
--- a/components/page_load_metrics/browser/page_load_tracker.cc
+++ b/components/page_load_metrics/browser/page_load_tracker.cc
@@ -30,6 +30,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_delegate.h"
 #include "content/public/browser/web_contents_observer.h"
+#include "page_load_metrics_observer_delegate.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 
@@ -373,6 +374,7 @@
       break;
     case internal::PageLoadTrackerPageType::kPreviewPrimaryPage:
       CHECK_NE(ukm::kInvalidSourceId, source_id_);
+      prerendering_state_ = PrerenderingState::kInPreview;
       InvokeAndPruneObservers(
           "PageLoadMetricsObserver::OnPreviewStart",
           base::BindRepeating(
@@ -448,7 +450,8 @@
     //
     // Here we check that the first background follows some event in foreground.
     if (!first_background_time_.has_value()) {
-      if (prerendering_state_ == PrerenderingState::kNoPrerendering) {
+      if (prerendering_state_ == PrerenderingState::kNoPrerendering ||
+          prerendering_state_ == PrerenderingState::kInPreview) {
         DCHECK_EQ(!started_in_foreground_, first_foreground_time_.has_value());
       } else {
         DCHECK(!first_foreground_time_.has_value());
@@ -488,7 +491,8 @@
     // See comment about visibility state transitions in PageHidden.
     //
     // Here we check that the first foreground follows some event in background.
-    if (prerendering_state_ == PrerenderingState::kNoPrerendering) {
+    if (prerendering_state_ == PrerenderingState::kNoPrerendering ||
+        prerendering_state_ == PrerenderingState::kInPreview) {
       DCHECK_EQ(started_in_foreground_, first_background_time_.has_value());
     } else {
       DCHECK(first_background_time_.has_value());
@@ -637,6 +641,12 @@
 
 void PageLoadTracker::DidActivatePreviewedPage(
     base::TimeTicks activation_time) {
+  CHECK_EQ(prerendering_state_, PrerenderingState::kInPreview);
+  prerendering_state_ = PrerenderingState::kNoPrerendering;
+
+  // We don't keep `activation_time` as `activation_start_` because we measure
+  // preview mode performance as navigation originated rather than activation.
+
   for (const auto& observer : observers_) {
     observer->DidActivatePreviewedPage(activation_time);
   }
@@ -992,16 +1002,10 @@
   const mojom::PageLoadTiming& new_timing = metrics_update_dispatcher_.timing();
 
   if (new_timing.activation_start &&
-      !last_dispatched_merged_page_timing_->activation_start) {
-    // Link Preview doesn't emit activation event yet and assertion of event
-    // orders fail.
-    //
-    // TODO(b:302999778): Reenable it.
-    if (!base::FeatureList::IsEnabled(
-            blink::features::kLinkPreviewNavigation)) {
-      DCHECK(prerendering_state_ ==
+      !last_dispatched_merged_page_timing_->activation_start &&
+      prerendering_state_ != PrerenderingState::kNoPrerendering) {
+    CHECK_EQ(prerendering_state_,
              PrerenderingState::kActivatedNoActivationStart);
-    }
     prerendering_state_ = PrerenderingState::kActivated;
     activation_start_ = new_timing.activation_start;
   }
diff --git a/components/password_manager/content/browser/content_password_manager_driver.cc b/components/password_manager/content/browser/content_password_manager_driver.cc
index 86f8a30..f1306ee 100644
--- a/components/password_manager/content/browser/content_password_manager_driver.cc
+++ b/components/password_manager/content/browser/content_password_manager_driver.cc
@@ -177,6 +177,10 @@
       generation_element_id, password);
 }
 
+void ContentPasswordManagerDriver::FocusNextFieldAfterPasswords() {
+  GetPasswordGenerationAgent()->FocusNextFieldAfterPasswords();
+}
+
 void ContentPasswordManagerDriver::FillSuggestion(
     const std::u16string& username,
     const std::u16string& password) {
diff --git a/components/password_manager/content/browser/content_password_manager_driver.h b/components/password_manager/content/browser/content_password_manager_driver.h
index d1fdb6bd..fb97ca7 100644
--- a/components/password_manager/content/browser/content_password_manager_driver.h
+++ b/components/password_manager/content/browser/content_password_manager_driver.h
@@ -67,6 +67,7 @@
       const autofill::FormData& form_data,
       autofill::FieldRendererId generation_element_id,
       const std::u16string& password) override;
+  void FocusNextFieldAfterPasswords() override;
   void FillSuggestion(const std::u16string& username,
                       const std::u16string& password) override;
   void FillIntoFocusedField(bool is_password,
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
index 173fead..b73e679 100644
--- a/components/password_manager/core/browser/BUILD.gn
+++ b/components/password_manager/core/browser/BUILD.gn
@@ -146,6 +146,7 @@
     "password_ui_utils.h",
     "possible_username_data.cc",
     "possible_username_data.h",
+    "shared_preferences_delegate.h",
     "store_metrics_reporter.cc",
     "store_metrics_reporter.h",
     "sync_credentials_filter.cc",
diff --git a/components/password_manager/core/browser/features/password_features.cc b/components/password_manager/core/browser/features/password_features.cc
index 1dcd595..9249f1fe 100644
--- a/components/password_manager/core/browser/features/password_features.cc
+++ b/components/password_manager/core/browser/features/password_features.cc
@@ -52,6 +52,10 @@
 BASE_FEATURE(kFillingAcrossAffiliatedWebsitesAndroid,
              "FillingAcrossAffiliatedWebsitesAndroid",
              base::FEATURE_DISABLED_BY_DEFAULT);
+// Enables reading credentials from SharedPreferences.
+BASE_FEATURE(kFetchGaiaHashOnSignIn,
+             "FetchGaiaHashOnSignIn",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 #endif
 
 // This flag enables password filling across grouped websites. Information about
diff --git a/components/password_manager/core/browser/features/password_features.h b/components/password_manager/core/browser/features/password_features.h
index 44dba81..44b10fb 100644
--- a/components/password_manager/core/browser/features/password_features.h
+++ b/components/password_manager/core/browser/features/password_features.h
@@ -23,6 +23,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
 BASE_DECLARE_FEATURE(kFillingAcrossAffiliatedWebsitesAndroid);
+BASE_DECLARE_FEATURE(kFetchGaiaHashOnSignIn);
 #endif  // BUILDFLAG(IS_ANDROID)
 
 BASE_DECLARE_FEATURE(kFillingAcrossGroupedSites);
diff --git a/components/password_manager/core/browser/features/password_manager_features_util.h b/components/password_manager/core/browser/features/password_manager_features_util.h
index a7f0e281..55addd1 100644
--- a/components/password_manager/core/browser/features/password_manager_features_util.h
+++ b/components/password_manager/core/browser/features/password_manager_features_util.h
@@ -75,25 +75,19 @@
 // Whether the current signed-in user (aka unconsented primary account) has
 // opted in to use the Google account storage for passwords (as opposed to
 // local/profile storage). This always returns false for sync-the-feature users.
-// |pref_service| must not be null.
 // |sync_service| may be null (commonly the case in incognito mode), in which
 // case this will simply return false.
 // See PasswordFeatureManager::IsOptedInForAccountStorage.
-// TODO(crbug.com/1484531): Remove the `pref_service` parameter, it's unused
-// now. Possibly also from other functions in this file.
-bool IsOptedInForAccountStorage(const PrefService* pref_service,
-                                const syncer::SyncService* sync_service);
+bool IsOptedInForAccountStorage(const syncer::SyncService* sync_service);
 
 // Whether it makes sense to ask the user to opt-in for account-based
 // password storage. This is true if the opt-in doesn't exist yet, but all
 // other requirements are met (i.e. there is a signed-in user, Sync-the-feature
 // is not enabled, etc).
-// |pref_service| must not be null.
 // |sync_service| may be null (commonly the case in incognito mode), in which
 // case this will simply return false.
 // See PasswordFeatureManager::ShouldShowAccountStorageOptIn.
-bool ShouldShowAccountStorageOptIn(const PrefService* pref_service,
-                                   const syncer::SyncService* sync_service);
+bool ShouldShowAccountStorageOptIn(const syncer::SyncService* sync_service);
 
 // Whether it makes sense to ask the user to signin again to access the
 // account-based password storage. This is true if a user on this device
@@ -103,8 +97,7 @@
 // already doing that). For non-web contexts (e.g. native UIs), it is valid to
 // pass an empty GURL.
 // See PasswordFeatureManager::ShouldShowAccountStorageReSignin.
-bool ShouldShowAccountStorageReSignin(const PrefService* pref_service,
-                                      const syncer::SyncService* sync_service,
+bool ShouldShowAccountStorageReSignin(const syncer::SyncService* sync_service,
                                       const GURL& current_page_url);
 
 // Whether it makes sense to ask the user to move a password to their account or
diff --git a/components/password_manager/core/browser/features/password_manager_features_util_common.cc b/components/password_manager/core/browser/features/password_manager_features_util_common.cc
index 7256f32..d010020 100644
--- a/components/password_manager/core/browser/features/password_manager_features_util_common.cc
+++ b/components/password_manager/core/browser/features/password_manager_features_util_common.cc
@@ -76,10 +76,7 @@
 
 }  // namespace internal
 
-bool IsOptedInForAccountStorage(const PrefService* pref_service,
-                                const syncer::SyncService* sync_service) {
-  DCHECK(pref_service);
-
+bool IsOptedInForAccountStorage(const syncer::SyncService* sync_service) {
   if (!internal::IsUserEligibleForAccountStorage(sync_service)) {
     return false;
   }
@@ -137,7 +134,7 @@
   if (sync_service->HasDisableReason(
           syncer::SyncService::DisableReason::DISABLE_REASON_NOT_SIGNED_IN)) {
     // Signed out. Check if any account storage opt-in exists.
-    return ShouldShowAccountStorageReSignin(pref_service, sync_service, GURL())
+    return ShouldShowAccountStorageReSignin(sync_service, GURL())
                ? PasswordAccountStorageUserState::kSignedOutAccountStoreUser
                : PasswordAccountStorageUserState::kSignedOutUser;
   }
@@ -147,7 +144,7 @@
                             PasswordForm::Store::kProfileStore;
 
   // Signed in. Check for account storage opt-in.
-  if (IsOptedInForAccountStorage(pref_service, sync_service)) {
+  if (IsOptedInForAccountStorage(sync_service)) {
     // Signed in and opted in. Check default storage location.
     return saving_locally
                ? PasswordAccountStorageUserState::
diff --git a/components/password_manager/core/browser/features/password_manager_features_util_desktop.cc b/components/password_manager/core/browser/features/password_manager_features_util_desktop.cc
index d70aab4..655c60c 100644
--- a/components/password_manager/core/browser/features/password_manager_features_util_desktop.cc
+++ b/components/password_manager/core/browser/features/password_manager_features_util_desktop.cc
@@ -118,20 +118,14 @@
 
 }  // namespace
 
-bool ShouldShowAccountStorageOptIn(const PrefService* pref_service,
-                                   const syncer::SyncService* sync_service) {
-  DCHECK(pref_service);
-
+bool ShouldShowAccountStorageOptIn(const syncer::SyncService* sync_service) {
   // Show the opt-in if the user is eligible, but not yet opted in.
   return internal::IsUserEligibleForAccountStorage(sync_service) &&
-         !IsOptedInForAccountStorage(pref_service, sync_service);
+         !IsOptedInForAccountStorage(sync_service);
 }
 
-bool ShouldShowAccountStorageReSignin(const PrefService* pref_service,
-                                      const syncer::SyncService* sync_service,
+bool ShouldShowAccountStorageReSignin(const syncer::SyncService* sync_service,
                                       const GURL& current_page_url) {
-  DCHECK(pref_service);
-
   // Checks that the sync_service is not null and the feature is enabled.
   // IsUserEligibleForAccountStorage() doesn't fit because it's false for
   // signed-out users.
@@ -181,8 +175,7 @@
     // in, then saves go to the profile store by default. If the user *has*
     // opted in, then they've chosen to save to the account, so that becomes the
     // default.
-    bool save_to_profile_store =
-        !IsOptedInForAccountStorage(pref_service, sync_service);
+    bool save_to_profile_store = !IsOptedInForAccountStorage(sync_service);
     return save_to_profile_store ? PasswordForm::Store::kProfileStore
                                  : PasswordForm::Store::kAccountStore;
   }
@@ -328,7 +321,7 @@
   DCHECK(sync_service);
   std::string gaia_id = sync_service->GetAccountInfo().gaia;
   DCHECK(!gaia_id.empty());
-  DCHECK(!IsOptedInForAccountStorage(pref_service, sync_service));
+  DCHECK(!IsOptedInForAccountStorage(sync_service));
   ScopedAccountStorageSettingsUpdate(pref_service,
                                      GaiaIdHash::FromGaiaId(gaia_id))
       .RecordMoveOfferedToNonOptedInUser();
@@ -341,7 +334,7 @@
   DCHECK(sync_service);
   std::string gaia_id = sync_service->GetAccountInfo().gaia;
   DCHECK(!gaia_id.empty());
-  DCHECK(!IsOptedInForAccountStorage(pref_service, sync_service));
+  DCHECK(!IsOptedInForAccountStorage(sync_service));
   AccountStorageSettingsReader reader(pref_service,
                                       GaiaIdHash::FromGaiaId(gaia_id));
   return reader.GetMoveOfferedToNonOptedInUserCount();
diff --git a/components/password_manager/core/browser/features/password_manager_features_util_mobile.cc b/components/password_manager/core/browser/features/password_manager_features_util_mobile.cc
index 7b1f425..ee7b8a3 100644
--- a/components/password_manager/core/browser/features/password_manager_features_util_mobile.cc
+++ b/components/password_manager/core/browser/features/password_manager_features_util_mobile.cc
@@ -12,13 +12,11 @@
 
 namespace password_manager::features_util {
 
-bool ShouldShowAccountStorageOptIn(const PrefService* pref_service,
-                                   const syncer::SyncService* sync_service) {
+bool ShouldShowAccountStorageOptIn(const syncer::SyncService* sync_service) {
   return false;
 }
 
-bool ShouldShowAccountStorageReSignin(const PrefService* pref_service,
-                                      const syncer::SyncService* sync_service,
+bool ShouldShowAccountStorageReSignin(const syncer::SyncService* sync_service,
                                       const GURL& current_page_url) {
   // On Android and iOS, there is no re-signin promo.
   return false;
@@ -33,7 +31,7 @@
     return PasswordForm::Store::kProfileStore;
   }
 
-  return IsOptedInForAccountStorage(pref_service, sync_service)
+  return IsOptedInForAccountStorage(sync_service)
              ? PasswordForm::Store::kAccountStore
              : PasswordForm::Store::kProfileStore;
 }
diff --git a/components/password_manager/core/browser/features/password_manager_features_util_unittest.cc b/components/password_manager/core/browser/features/password_manager_features_util_unittest.cc
index 66bb52b..01dfbfe 100644
--- a/components/password_manager/core/browser/features/password_manager_features_util_unittest.cc
+++ b/components/password_manager/core/browser/features/password_manager_features_util_unittest.cc
@@ -108,14 +108,14 @@
 
   // Since the account storage feature is disabled, the profile store should be
   // the default.
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
             PasswordForm::Store::kProfileStore);
 
   // Same if the user is signed out.
   SetSyncStateNotSignedIn();
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
             PasswordForm::Store::kProfileStore);
 }
@@ -130,8 +130,8 @@
   SetSyncStateNotSignedIn();
 
   // Initially the user is not signed in, so everything is off/local.
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   EXPECT_FALSE(
       ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
@@ -141,16 +141,16 @@
   SetSyncStateTransportActive(account);
 
   // By default, the user is not opted in, but eligible.
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_TRUE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_TRUE(ShouldShowAccountStorageOptIn(&sync_service_));
   EXPECT_FALSE(IsDefaultPasswordStoreSet(&pref_service_, &sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
             PasswordForm::Store::kProfileStore);
 
   // Opt in!
   OptInToAccountStorage(&pref_service_, &sync_service_);
-  EXPECT_TRUE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  EXPECT_TRUE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   // Now the default is saving to the account.
   EXPECT_FALSE(IsDefaultPasswordStoreSet(&pref_service_, &sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
@@ -166,8 +166,8 @@
   // Sign out. Now the settings should have reasonable default values (not opted
   // in, save to profile store).
   SetSyncStateNotSignedIn();
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   EXPECT_FALSE(IsDefaultPasswordStoreSet(&pref_service_, &sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
             PasswordForm::Store::kProfileStore);
@@ -204,7 +204,7 @@
 
   // Sign out. The store settings still exist, but don't apply anymore.
   SetSyncStateNotSignedIn();
-  ASSERT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  ASSERT_FALSE(IsOptedInForAccountStorage(&sync_service_));
 
   // Keep the settings only for |first_account| (and some unknown other user).
   KeepAccountStorageSettingsOnlyForUsers(&pref_service_,
@@ -232,8 +232,8 @@
   SetSyncStateTransportActive(account);
 
   // In this state, the user could opt in to the account storage.
-  ASSERT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  ASSERT_TRUE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  ASSERT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  ASSERT_TRUE(ShouldShowAccountStorageOptIn(&sync_service_));
   ASSERT_TRUE(ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_));
 
   // Now the user enables Sync-the-feature.
@@ -241,8 +241,8 @@
   ASSERT_TRUE(sync_service_.IsSyncFeatureEnabled());
 
   // Now the account-storage opt-in should *not* be available anymore.
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   EXPECT_FALSE(
       ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_));
 }
@@ -257,13 +257,13 @@
   SetSyncStateNotSignedIn();
 
   // Without a signed-in user, there can be no opt-in.
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
 
   // Sign in and enable Sync-transport.
   SetSyncStateTransportActive(account);
 
   // Now the user should be considered opted-in.
-  EXPECT_TRUE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  EXPECT_TRUE(IsOptedInForAccountStorage(&sync_service_));
 
   // Disable the Passwords data type, which corresponds to the user opting out.
   syncer::UserSelectableTypeSet selected_types =
@@ -273,7 +273,7 @@
                                                     selected_types);
 
   // The user should not be considered opted-in anymore.
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
 }
 #endif  // !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
 
@@ -283,15 +283,15 @@
   account.gaia = "name";
   account.account_id = CoreAccountId::FromGaiaId(account.gaia);
 
-  ASSERT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  ASSERT_FALSE(IsOptedInForAccountStorage(&sync_service_));
 
   // The SyncService is running in transport mode.
   SetSyncStateTransportActive(account);
 
 #if !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
   // The account storage is available in principle, so the opt-in will be shown.
-  ASSERT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  ASSERT_TRUE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  ASSERT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  ASSERT_TRUE(ShouldShowAccountStorageOptIn(&sync_service_));
   ASSERT_TRUE(ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_));
   ASSERT_FALSE(IsDefaultPasswordStoreSet(&pref_service_, &sync_service_));
 
@@ -299,8 +299,8 @@
   OptInToAccountStorage(&pref_service_, &sync_service_);
 #endif  // !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
 
-  ASSERT_TRUE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  ASSERT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  ASSERT_TRUE(IsOptedInForAccountStorage(&sync_service_));
+  ASSERT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   ASSERT_TRUE(ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_));
   EXPECT_FALSE(IsDefaultPasswordStoreSet(&pref_service_, &sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
@@ -313,8 +313,8 @@
   // On desktop, the opt-in pref wasn't actually cleared, but
   // IsOptedInForAccountStorage() must return false because the user is syncing.
   // On mobile, since no explicit opt-in exists, the (implicit) opt-in is gone.
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   EXPECT_FALSE(
       ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
@@ -335,8 +335,8 @@
   sync_service_.SetLocalSyncEnabled(true);
 
   // The account-scoped storage should be unavailable.
-  ASSERT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  ASSERT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   EXPECT_FALSE(
       ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
@@ -349,8 +349,8 @@
   OptInToAccountStorage(&pref_service_, &sync_service_);
   // The user is *not* considered opted in (even though the corresponding pref
   // is set) since the account storage is completely unavailable.
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
-  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
+  EXPECT_FALSE(ShouldShowAccountStorageOptIn(&sync_service_));
   EXPECT_FALSE(
       ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
@@ -372,7 +372,7 @@
 
   // Opt in and set default store to profile.
   OptInToAccountStorage(&pref_service_, &sync_service_);
-  ASSERT_TRUE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  ASSERT_TRUE(IsOptedInForAccountStorage(&sync_service_));
   SetDefaultPasswordStore(&pref_service_, &sync_service_,
                           PasswordForm::Store::kProfileStore);
 
@@ -381,7 +381,7 @@
 
   // The default store pref should have been erased.
   EXPECT_FALSE(IsDefaultPasswordStoreSet(&pref_service_, &sync_service_));
-  EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  EXPECT_FALSE(IsOptedInForAccountStorage(&sync_service_));
   EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_),
             PasswordForm::Store::kProfileStore);
 
@@ -399,7 +399,7 @@
   account.gaia = "name";
   account.account_id = CoreAccountId::FromGaiaId(account.gaia);
   SetSyncStateTransportActive(account);
-  ASSERT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_));
+  ASSERT_FALSE(IsOptedInForAccountStorage(&sync_service_));
 
   EXPECT_EQ(
       0, GetMoveOfferedToNonOptedInUserCount(&pref_service_, &sync_service_));
diff --git a/components/password_manager/core/browser/hash_password_manager.cc b/components/password_manager/core/browser/hash_password_manager.cc
index 12b58b8..982f8b9 100644
--- a/components/password_manager/core/browser/hash_password_manager.cc
+++ b/components/password_manager/core/browser/hash_password_manager.cc
@@ -96,8 +96,8 @@
 std::string BooleanToString(bool bool_value) {
   return bool_value ? "true" : "false";
 }
+}  // namespace
 
-// Helper function to convert a dictionary value to PasswordWordHashData.
 std::optional<PasswordHashData> ConvertToPasswordHashData(
     const base::Value& dict) {
   PasswordHashData result;
@@ -120,8 +120,6 @@
   return result;
 }
 
-}  // namespace
-
 HashPasswordManager::HashPasswordManager(PrefService* prefs) : prefs_(prefs) {}
 HashPasswordManager::HashPasswordManager() = default;
 HashPasswordManager::~HashPasswordManager() = default;
diff --git a/components/password_manager/core/browser/hash_password_manager.h b/components/password_manager/core/browser/hash_password_manager.h
index 89704de..3ce55e1 100644
--- a/components/password_manager/core/browser/hash_password_manager.h
+++ b/components/password_manager/core/browser/hash_password_manager.h
@@ -12,12 +12,17 @@
 #include "base/callback_list.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
+#include "base/values.h"
 #include "components/password_manager/core/browser/password_hash_data.h"
 
 class PrefService;
 
 namespace password_manager {
 
+// Helper function to convert a dictionary value to PasswordWordHashData.
+std::optional<PasswordHashData> ConvertToPasswordHashData(
+    const base::Value& dict);
+
 // Responsible for saving, clearing, retrieving and encryption of a password
 // hash data in preferences.
 // All methods should be called on UI thread.
diff --git a/components/password_manager/core/browser/mock_password_reuse_manager.h b/components/password_manager/core/browser/mock_password_reuse_manager.h
index 9766d73..f5dfbfb8 100644
--- a/components/password_manager/core/browser/mock_password_reuse_manager.h
+++ b/components/password_manager/core/browser/mock_password_reuse_manager.h
@@ -20,7 +20,9 @@
               Init,
               (PrefService * prefs,
                PasswordStoreInterface* profile_store,
-               PasswordStoreInterface* account_store),
+               PasswordStoreInterface* account_store,
+               signin::IdentityManager* identity_manager,
+               std::unique_ptr<SharedPreferencesDelegate> shared_pref_delegate),
               (override));
   MOCK_METHOD(void,
               ReportMetrics,
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.cc b/components/password_manager/core/browser/password_feature_manager_impl.cc
index 53f93192a..4907eb7 100644
--- a/components/password_manager/core/browser/password_feature_manager_impl.cc
+++ b/components/password_manager/core/browser/password_feature_manager_impl.cc
@@ -58,19 +58,17 @@
 }
 
 bool PasswordFeatureManagerImpl::IsOptedInForAccountStorage() const {
-  return features_util::IsOptedInForAccountStorage(pref_service_,
-                                                   sync_service_);
+  return features_util::IsOptedInForAccountStorage(sync_service_);
 }
 
 bool PasswordFeatureManagerImpl::ShouldShowAccountStorageOptIn() const {
-  return features_util::ShouldShowAccountStorageOptIn(pref_service_,
-                                                      sync_service_);
+  return features_util::ShouldShowAccountStorageOptIn(sync_service_);
 }
 
 bool PasswordFeatureManagerImpl::ShouldShowAccountStorageReSignin(
     const GURL& current_page_url) const {
-  return features_util::ShouldShowAccountStorageReSignin(
-      pref_service_, sync_service_, current_page_url);
+  return features_util::ShouldShowAccountStorageReSignin(sync_service_,
+                                                         current_page_url);
 }
 
 bool PasswordFeatureManagerImpl::ShouldShowAccountStorageBubbleUi() const {
diff --git a/components/password_manager/core/browser/password_manager_driver.h b/components/password_manager/core/browser/password_manager_driver.h
index c8acf0d..9a2652b 100644
--- a/components/password_manager/core/browser/password_manager_driver.h
+++ b/components/password_manager/core/browser/password_manager_driver.h
@@ -81,6 +81,11 @@
       autofill::FieldRendererId generation_element_id,
       const std::u16string& password) {}
 
+  // Notifies the driver that the focus should be advanced to the next input
+  // field after password fields (assuming that password fields are adjacent
+  // in account creation).
+  virtual void FocusNextFieldAfterPasswords() {}
+
   // Tells the driver to fill the form with the |username| and |password|.
   virtual void FillSuggestion(const std::u16string& username,
                               const std::u16string& password) = 0;
diff --git a/components/password_manager/core/browser/password_reuse_manager.h b/components/password_manager/core/browser/password_reuse_manager.h
index 526fab15..7281487 100644
--- a/components/password_manager/core/browser/password_reuse_manager.h
+++ b/components/password_manager/core/browser/password_reuse_manager.h
@@ -12,6 +12,11 @@
 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
 #include "components/password_manager/core/browser/password_reuse_detector.h"
 #include "components/password_manager/core/browser/password_reuse_detector_consumer.h"
+#include "components/password_manager/core/browser/shared_preferences_delegate.h"
+
+namespace signin {
+class IdentityManager;
+}  // namespace signin
 
 class PrefService;
 
@@ -32,7 +37,10 @@
   // Always call this on the UI thread.
   virtual void Init(PrefService* prefs,
                     PasswordStoreInterface* profile_store,
-                    PasswordStoreInterface* account_store) = 0;
+                    PasswordStoreInterface* account_store,
+                    signin::IdentityManager* identity_manager = nullptr,
+                    std::unique_ptr<SharedPreferencesDelegate>
+                        shared_pref_delegate = nullptr) = 0;
 
   // Log whether a sync password hash saved.
   virtual void ReportMetrics(const std::string& username,
diff --git a/components/password_manager/core/browser/password_reuse_manager_impl.cc b/components/password_manager/core/browser/password_reuse_manager_impl.cc
index c29e546..84e4486 100644
--- a/components/password_manager/core/browser/password_reuse_manager_impl.cc
+++ b/components/password_manager/core/browser/password_reuse_manager_impl.cc
@@ -18,6 +18,14 @@
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
+#include "components/signin/public/base/consent_level.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+#if BUILDFLAG(IS_ANDROID)
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "google_apis/gaia/gaia_auth_util.h"
+#endif
 
 using base::RecordAction;
 using base::UserMetricsAction;
@@ -30,6 +38,11 @@
 // Time in seconds by which calls to the password store happening on startup
 // should be delayed.
 constexpr base::TimeDelta kPasswordStoreCallDelaySeconds = base::Seconds(5);
+// Keys for accessing credentials passed from Android.
+// Must be kept in sync with PasswordProtectionBroadcastReceiver.java.
+constexpr char kLoginAccountIdentifier[] = "Login.accountIdentifier";
+constexpr char kLoginHashedPassword[] = "Login.hashedPassword";
+constexpr char kLoginSalt[] = "Login.salt";
 #endif
 
 bool IsPasswordReuseDetectionEnabled() {
@@ -107,7 +120,9 @@
     account_store_->RemoveObserver(this);
     profile_store_.reset();
   }
-
+  if (identity_manager_) {
+    identity_manager_->RemoveObserver(this);
+  }
   if (notifier_)
     notifier_->UnsubscribeFromSigninEvents();
 
@@ -116,11 +131,21 @@
   }
 }
 
-void PasswordReuseManagerImpl::Init(PrefService* prefs,
-                                    PasswordStoreInterface* profile_store,
-                                    PasswordStoreInterface* account_store) {
+void PasswordReuseManagerImpl::Init(
+    PrefService* prefs,
+    PasswordStoreInterface* profile_store,
+    PasswordStoreInterface* account_store,
+    signin::IdentityManager* identity_manager,
+    std::unique_ptr<SharedPreferencesDelegate> shared_pref_delegate) {
   prefs_ = prefs;
   hash_password_manager_.set_prefs(prefs_);
+  identity_manager_ = identity_manager;
+#if BUILDFLAG(IS_ANDROID)
+  if (shared_pref_delegate) {
+    shared_pref_delegate_ = std::move(shared_pref_delegate);
+    identity_manager_->AddObserver(this);
+  }
+#endif
   main_task_runner_ = base::SequencedTaskRunner::GetCurrentDefault();
   DCHECK(main_task_runner_);
 
@@ -409,4 +434,61 @@
   account_store_->GetAutofillableLogins(weak_ptr_factory_.GetWeakPtr());
 }
 
+void PasswordReuseManagerImpl::OnPrimaryAccountChanged(
+    const signin::PrimaryAccountChangeEvent& event_details) {
+  if (!shared_pref_delegate_) {
+    return;
+  }
+#if BUILDFLAG(IS_ANDROID)
+  // Check for a Chrome sign-in event.
+  if (event_details.GetEventTypeFor(signin::ConsentLevel::kSignin) ==
+      signin::PrimaryAccountChangeEvent::Type::kSet) {
+    // On Android, check if there are any gaia credentials saved for this user.
+    auto saved_creds = shared_pref_delegate_->GetCredentials("");
+    if (saved_creds.empty()) {
+      return;
+    }
+    auto parsed_json = base::JSONReader::ReadAndReturnValueWithError(
+        saved_creds, base::JSON_ALLOW_TRAILING_COMMAS);
+    if (!parsed_json.has_value()) {
+      LOG(ERROR) << "Error parsing JSON: " << parsed_json.error().message;
+      return;
+    }
+    if (!parsed_json->is_list()) {
+      LOG(ERROR) << "Error parsing JSON: Expected a list but got non-list.";
+      return;
+    }
+    auto& saved_creds_list = parsed_json->GetList();
+    if (saved_creds_list.empty()) {
+      return;
+    }
+    for (size_t i = 0; i < saved_creds_list.size(); i++) {
+      base::Value::Dict* saved_creds_entry = saved_creds_list[i].GetIfDict();
+      const std::string* account_id =
+          saved_creds_entry->FindString(kLoginAccountIdentifier);
+      CHECK(account_id);
+      if (identity_manager_
+              ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
+              .email == *account_id) {
+        PasswordHashData password_hash_data;
+        password_hash_data.username = gaia::CanonicalizeEmail(*account_id);
+        password_hash_data.length = 8;  // Min size for gaia passwords is 8.
+        password_hash_data.salt = *saved_creds_entry->FindString(kLoginSalt);
+        password_hash_data.hash = static_cast<uint64_t>(
+            saved_creds_entry->FindDouble(kLoginHashedPassword).value());
+        password_hash_data.force_update = true;
+        hash_password_manager_.SavePasswordHash(password_hash_data);
+        metrics_util::LogGaiaPasswordHashChange(
+            metrics_util::GaiaPasswordHashChange::SAVED_ON_CHROME_SIGNIN,
+            /*is_sync_password=*/true);
+        // Remove the saved credential that matched the signed in user.
+        saved_creds_list.EraseValue(saved_creds_list[i]);
+        shared_pref_delegate_->SetCredentials(
+            base::WriteJson(saved_creds_list).value());
+        break;
+      }
+    }
+  }
+#endif
+}
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_reuse_manager_impl.h b/components/password_manager/core/browser/password_reuse_manager_impl.h
index 42ebaf2..a737c2e4 100644
--- a/components/password_manager/core/browser/password_reuse_manager_impl.h
+++ b/components/password_manager/core/browser/password_reuse_manager_impl.h
@@ -15,12 +15,16 @@
 #include "components/password_manager/core/browser/password_reuse_manager.h"
 #include "components/password_manager/core/browser/password_store/password_store_consumer.h"
 #include "components/password_manager/core/browser/password_store/password_store_interface.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/primary_account_change_event.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace password_manager {
 
 class PasswordReuseManagerImpl : public PasswordReuseManager,
                                  public PasswordStoreConsumer,
-                                 public PasswordStoreInterface::Observer {
+                                 public PasswordStoreInterface::Observer,
+                                 public signin::IdentityManager::Observer {
  public:
   PasswordReuseManagerImpl();
   ~PasswordReuseManagerImpl() override;
@@ -38,7 +42,10 @@
   // Implements PasswordReuseManager interface.
   void Init(PrefService* prefs,
             PasswordStoreInterface* profile_store,
-            PasswordStoreInterface* account_store) override;
+            PasswordStoreInterface* account_store,
+            signin::IdentityManager* identity_manager = nullptr,
+            std::unique_ptr<SharedPreferencesDelegate> shared_pref_delegate =
+                nullptr) override;
   void ReportMetrics(const std::string& username,
                      bool is_under_advanced_protection) override;
   void CheckReuse(const std::u16string& input,
@@ -86,6 +93,10 @@
       PasswordStoreInterface* store,
       const std::vector<PasswordForm>& retained_passwords) override;
 
+  // Implements signin::IdentityManager::Observer.
+  void OnPrimaryAccountChanged(
+      const signin::PrimaryAccountChangeEvent& event_details) override;
+
   // Saves |username| and a hash of |password| for password reuse checking.
   // |is_gaia_password| indicates if it is a Gaia account. |event| is used for
   // metric logging. |is_sync_password_for_metrics| is whether account belong to
@@ -115,6 +126,10 @@
 
   scoped_refptr<PasswordStoreInterface> account_store_;
 
+  raw_ptr<signin::IdentityManager> identity_manager_ = nullptr;
+
+  std::unique_ptr<SharedPreferencesDelegate> shared_pref_delegate_;
+
   // Return value of PasswordStoreInterface::AddSyncEnabledOrDisabledCallback().
   base::CallbackListSubscription account_store_cb_list_subscription_;
 
diff --git a/components/password_manager/core/browser/password_reuse_manager_impl_unittest.cc b/components/password_manager/core/browser/password_reuse_manager_impl_unittest.cc
index 5ced30e..8aec40875 100644
--- a/components/password_manager/core/browser/password_reuse_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/password_reuse_manager_impl_unittest.cc
@@ -18,6 +18,7 @@
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
+#include "components/signin/public/identity_manager/identity_test_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -68,6 +69,13 @@
   MOCK_METHOD(void, UnsubscribeFromSigninEvents, (), (override));
 };
 
+class MockSharedPreferencesDelegateAndroid : public SharedPreferencesDelegate {
+ public:
+  MockSharedPreferencesDelegateAndroid() = default;
+  MOCK_METHOD(std::string, GetCredentials, (const std::string&), (override));
+  MOCK_METHOD(void, SetCredentials, (const std::string&), (override));
+};
+
 class PasswordReuseManagerImplTest : public testing::Test {
  public:
   PasswordReuseManagerImplTest() = default;
@@ -90,7 +98,18 @@
     profile_store_->Init(&prefs_, /*affiliated_match_helper=*/nullptr);
     account_store_ = base::MakeRefCounted<TestPasswordStore>();
     account_store_->Init(&prefs_, /*affiliated_match_helper=*/nullptr);
-    reuse_manager_.Init(&prefs(), profile_store(), account_store());
+    signin::IdentityManager* identity_manager = nullptr;
+    std::unique_ptr<MockSharedPreferencesDelegateAndroid>
+        mock_shared_pref_delegate_android;
+#if BUILDFLAG(IS_ANDROID)
+    identity_manager = identity_test_env_.identity_manager();
+    mock_shared_pref_delegate_android =
+        std::make_unique<MockSharedPreferencesDelegateAndroid>();
+    shared_pref_delegate_android_ = mock_shared_pref_delegate_android.get();
+#endif
+    reuse_manager_.Init(&prefs(), profile_store(), account_store(),
+                        identity_manager,
+                        std::move(mock_shared_pref_delegate_android));
     FastForwardUntilNoTasksRemain();
   }
 
@@ -110,6 +129,12 @@
   TestPasswordStore* account_store() { return account_store_.get(); }
   PasswordReuseManager* reuse_manager() { return &reuse_manager_; }
   TestingPrefServiceSimple& prefs() { return prefs_; }
+  signin::IdentityTestEnvironment& identity_test_env() {
+    return identity_test_env_;
+  }
+  MockSharedPreferencesDelegateAndroid* shared_pref_delegate_android() {
+    return shared_pref_delegate_android_;
+  }
 
  private:
   base::test::TaskEnvironment task_environment_{
@@ -118,6 +143,8 @@
   TestingPrefServiceSimple prefs_;
   scoped_refptr<TestPasswordStore> profile_store_;
   scoped_refptr<TestPasswordStore> account_store_;
+  signin::IdentityTestEnvironment identity_test_env_;
+  raw_ptr<MockSharedPreferencesDelegateAndroid> shared_pref_delegate_android_;
   PasswordReuseManagerImpl reuse_manager_;
 };
 
@@ -445,6 +472,66 @@
   RunUntilIdle();
 }
 
+#if BUILDFLAG(IS_ANDROID)
+TEST_F(PasswordReuseManagerImplTest, GaiaPasswordSavedFromSharedPref) {
+  ON_CALL(*shared_pref_delegate_android(), GetCredentials(_))
+      .WillByDefault(Return(
+          "[{\"Login.accountIdentifier\": \"test_user@gmail.com\", "
+          "\"Login.hashedPassword\": 23423423432, \"Login.salt\": \"salt\"}]"));
+  EXPECT_CALL(*shared_pref_delegate_android(), SetCredentials("[]"));
+  identity_test_env().SetPrimaryAccount("test_user@gmail.com",
+                                        signin::ConsentLevel::kSignin);
+
+  RunUntilIdle();
+
+  PasswordHashData password_hash_data =
+      ConvertToPasswordHashData(
+          prefs().GetList(prefs::kPasswordHashDataList)[0])
+          .value();
+  EXPECT_EQ("test_user@gmail.com", password_hash_data.username);
+  EXPECT_EQ("salt", password_hash_data.salt);
+  EXPECT_EQ(23423423432u, password_hash_data.hash);
+  EXPECT_EQ(8u, password_hash_data.length);
+  EXPECT_EQ(1u, prefs().GetList(prefs::kPasswordHashDataList).size());
+}
+
+TEST_F(PasswordReuseManagerImplTest,
+       NoPasswordSavedFromEmptyJsonArraySharedPref) {
+  ON_CALL(*shared_pref_delegate_android(), GetCredentials(_))
+      .WillByDefault(Return("[]"));
+  identity_test_env().SetPrimaryAccount("test_user@gmail.com",
+                                        signin::ConsentLevel::kSignin);
+
+  RunUntilIdle();
+
+  EXPECT_EQ(0u, prefs().GetList(prefs::kPasswordHashDataList).size());
+}
+
+TEST_F(PasswordReuseManagerImplTest, NoPasswordSavedFromEmptySharedPref) {
+  ON_CALL(*shared_pref_delegate_android(), GetCredentials(_))
+      .WillByDefault(Return(""));
+  identity_test_env().SetPrimaryAccount("test_user@gmail.com",
+                                        signin::ConsentLevel::kSignin);
+
+  RunUntilIdle();
+
+  EXPECT_EQ(0u, prefs().GetList(prefs::kPasswordHashDataList).size());
+}
+
+TEST_F(PasswordReuseManagerImplTest, NoPasswordSavedFromDifferentUsernames) {
+  ON_CALL(*shared_pref_delegate_android(), GetCredentials(_))
+      .WillByDefault(Return(
+          "[{\"Login.accountIdentifier\": \"test_user@gmail.com\", "
+          "\"Login.hashedPassword\": 23423423432, \"Login.salt\": \"salt\"}]"));
+  identity_test_env().SetPrimaryAccount("different_test_user@gmail.com",
+                                        signin::ConsentLevel::kSignin);
+
+  RunUntilIdle();
+
+  EXPECT_EQ(0u, prefs().GetList(prefs::kPasswordHashDataList).size());
+}
+#endif
+
 }  // namespace
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_sync_util.cc b/components/password_manager/core/browser/password_sync_util.cc
index 62dc3ee..7024d38 100644
--- a/components/password_manager/core/browser/password_sync_util.cc
+++ b/components/password_manager/core/browser/password_sync_util.cc
@@ -95,13 +95,12 @@
 }
 
 std::optional<std::string> GetAccountForSaving(
-    const PrefService* pref_service,
     const syncer::SyncService* sync_service) {
   if (!sync_service) {
     return std::nullopt;
   }
   if (IsSyncFeatureEnabledIncludingPasswords(sync_service) ||
-      features_util::IsOptedInForAccountStorage(pref_service, sync_service)) {
+      features_util::IsOptedInForAccountStorage(sync_service)) {
     return sync_service->GetAccountInfo().email;
   }
   return std::nullopt;
diff --git a/components/password_manager/core/browser/password_sync_util.h b/components/password_manager/core/browser/password_sync_util.h
index f5371af5..f99c265 100644
--- a/components/password_manager/core/browser/password_sync_util.h
+++ b/components/password_manager/core/browser/password_sync_util.h
@@ -73,7 +73,6 @@
 // are being saved only locally. In practice, this returns a non-empty
 // value if the user is syncing or signed in and opted in to account storage.
 std::optional<std::string> GetAccountForSaving(
-    const PrefService* pref_service,
     const syncer::SyncService* sync_service);
 
 // Reports whether and how passwords are currently synced. In particular, for a
diff --git a/components/password_manager/core/browser/shared_preferences_delegate.h b/components/password_manager/core/browser/shared_preferences_delegate.h
new file mode 100644
index 0000000..1e3f947
--- /dev/null
+++ b/components/password_manager/core/browser/shared_preferences_delegate.h
@@ -0,0 +1,29 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SHARED_PREFERENCES_DELEGATE_H_
+#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SHARED_PREFERENCES_DELEGATE_H_
+
+#include <string>
+
+namespace password_manager {
+
+// A wrapper class for reading and writing credentials to shared preferences.
+class SharedPreferencesDelegate {
+ public:
+  SharedPreferencesDelegate() = default;
+  virtual ~SharedPreferencesDelegate() = default;
+
+  SharedPreferencesDelegate(const SharedPreferencesDelegate&) = delete;
+  SharedPreferencesDelegate& operator=(const SharedPreferencesDelegate&) =
+      delete;
+
+  // Accessor for getting credentials as serialized JSON.
+  virtual std::string GetCredentials(const std::string& default_value) = 0;
+  // Mutator for writing credentials as serialized JSON.
+  virtual void SetCredentials(const std::string& value) = 0;
+};
+}  // namespace password_manager
+
+#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SHARED_PREFERENCES_DELEGATE_H_
diff --git a/components/password_manager/core/browser/store_metrics_reporter.cc b/components/password_manager/core/browser/store_metrics_reporter.cc
index 750f69e..b5d8b255 100644
--- a/components/password_manager/core/browser/store_metrics_reporter.cc
+++ b/components/password_manager/core/browser/store_metrics_reporter.cc
@@ -690,7 +690,7 @@
       password_manager::sync_util::GetPasswordSyncState(sync_service));
 
   is_opted_in_account_storage_ =
-      features_util::IsOptedInForAccountStorage(prefs, sync_service);
+      features_util::IsOptedInForAccountStorage(sync_service);
 
   is_safe_browsing_enabled_ = safe_browsing::IsSafeBrowsingEnabled(*prefs);
 
diff --git a/components/password_manager/core/browser/stub_password_manager_driver.cc b/components/password_manager/core/browser/stub_password_manager_driver.cc
index 9dce3afc..9a8bfe1a 100644
--- a/components/password_manager/core/browser/stub_password_manager_driver.cc
+++ b/components/password_manager/core/browser/stub_password_manager_driver.cc
@@ -21,6 +21,8 @@
 void StubPasswordManagerDriver::GeneratedPasswordAccepted(
     const std::u16string& password) {}
 
+void StubPasswordManagerDriver::FocusNextFieldAfterPasswords() {}
+
 void StubPasswordManagerDriver::FillSuggestion(const std::u16string& username,
                                                const std::u16string& password) {
 }
diff --git a/components/password_manager/core/browser/stub_password_manager_driver.h b/components/password_manager/core/browser/stub_password_manager_driver.h
index 9bbf8b8..2560b9c5 100644
--- a/components/password_manager/core/browser/stub_password_manager_driver.h
+++ b/components/password_manager/core/browser/stub_password_manager_driver.h
@@ -27,6 +27,7 @@
   void SetPasswordFillData(
       const autofill::PasswordFormFillData& form_data) override;
   void GeneratedPasswordAccepted(const std::u16string& password) override;
+  void FocusNextFieldAfterPasswords() override;
   void FillSuggestion(const std::u16string& username,
                       const std::u16string& password) override;
 #if BUILDFLAG(IS_ANDROID)
diff --git a/components/permissions/permission_util.cc b/components/permissions/permission_util.cc
index e31e2311..57adc5d 100644
--- a/components/permissions/permission_util.cc
+++ b/components/permissions/permission_util.cc
@@ -6,6 +6,7 @@
 
 #include "base/check.h"
 #include "base/feature_list.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
@@ -60,6 +61,11 @@
   }
   return PermissionDelegationMode::kDelegated;
 }
+
+#if BUILDFLAG(IS_ANDROID)
+constexpr const char* kIsFileURLHistogram =
+    "Permissions.GetLastCommittedOriginAsURL.IsFileURL";
+#endif
 }  // namespace
 
 // The returned strings must match any Field Trial configs for the Permissions
@@ -238,7 +244,10 @@
   if (web_contents->GetOrCreateWebPreferences()
           .allow_universal_access_from_file_urls &&
       render_frame_host->GetLastCommittedOrigin().GetURL().SchemeIsFile()) {
+    base::UmaHistogramBoolean(kIsFileURLHistogram, true);
     return render_frame_host->GetLastCommittedURL().DeprecatedGetOriginAsURL();
+  } else {
+    base::UmaHistogramBoolean(kIsFileURLHistogram, false);
   }
 #endif
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 793fc819..c50a331 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -3038,7 +3038,7 @@
 <translation id="3540935459049973317">Ограничения времени использования отдельных приложений</translation>
 <translation id="3547954654003013442">Настройки прокси-сервера</translation>
 <translation id="3548064438634502368">Закрыть браузеры</translation>
-<translation id="3548642468619496972">Заблокировать скачивание вредоносных, необычных, нежелательных и опасных типов файлов.</translation>
+<translation id="3548642468619496972">Блокировать скачивание вредоносных, необычных, нежелательных и опасных типов файлов</translation>
 <translation id="3550122827225052130">Правило больше не поддерживается и будет удалено из <ph name="PRODUCT_OS_NAME" /> 85. Вместо него используйте следующее: <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
 
           Определяет время бездействия при работе от сети электропитания, после которого блокируется экран.
diff --git a/components/policy/resources/templates/policy_definitions/DeviceUpdate/DeviceRollbackAllowedMilestones.yaml b/components/policy/resources/templates/policy_definitions/DeviceUpdate/DeviceRollbackAllowedMilestones.yaml
index 051e6e5..beb39c7 100644
--- a/components/policy/resources/templates/policy_definitions/DeviceUpdate/DeviceRollbackAllowedMilestones.yaml
+++ b/components/policy/resources/templates/policy_definitions/DeviceUpdate/DeviceRollbackAllowedMilestones.yaml
@@ -15,8 +15,8 @@
 features:
   dynamic_refresh: true
 owners:
-- file://components/policy/OWNERS
-- rsorokin@chromium.org
+- mpolzer@google.com
+- chromeos-commercial-remote-management@google.com
 schema:
   maximum: 4
   minimum: 0
diff --git a/components/signin/ios/OWNERS b/components/signin/ios/OWNERS
index 610d1b6..ce565ea 100644
--- a/components/signin/ios/OWNERS
+++ b/components/signin/ios/OWNERS
@@ -1,3 +1,4 @@
+arthurmilchior@chromium.org
 fernandex@chromium.org
 jlebel@chromium.org
 msarda@chromium.org
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 8748a83..b8689867 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -1784,7 +1784,7 @@
 <translation id="457875822857220463">Levering</translation>
 <translation id="4579699065574932398">Bankrelaterede handlinger</translation>
 <translation id="4582204425268416675">Fjern kort</translation>
-<translation id="4582595824823167856">Få en sms-besked</translation>
+<translation id="4582595824823167856">Få en besked</translation>
 <translation id="4586607503179159908">Betalingsmetoden er verificeret</translation>
 <translation id="4587425331216688090">Vil du fjerne adressen fra Chrome?</translation>
 <translation id="459089498662672729">Administratorpolitikken tillader ikke, at du indsætter indhold fra <ph name="ORIGIN_NAME" /> på denne placering</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index ef383f8c..3ae36bf 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -1564,7 +1564,7 @@
 <translation id="4150099059797363385">Kinesiskt nr 4-kuvert</translation>
 <translation id="4151403195736952345">Använd global standardinställning (Upptäck)</translation>
 <translation id="4152318981910038897">{COUNT,plural, =1{Sida 1}other{Sida {COUNT}}}</translation>
-<translation id="4154277373259957087">Nu verifierar Chrome din identitet innan betalningsmetoder autofylls. Du kan uppdatera detta när som helst i <ph name="IDS_AUTOFILL_MANDATORY_REAUTH_CONFIRMATION_SETTINGS_LINK" />.</translation>
+<translation id="4154277373259957087">Nu verifierar Chrome din identitet innan betalningsmetoder fylls i. Du kan uppdatera detta när som helst i <ph name="IDS_AUTOFILL_MANDATORY_REAUTH_CONFIRMATION_SETTINGS_LINK" />.</translation>
 <translation id="4159149286839604525">Det betyder att de flesta webbplatsfunktionerna bör fungera, men du är mindre skyddad</translation>
 <translation id="4159784952369912983">Lila</translation>
 <translation id="4165986682804962316">Webbplatsinställningar</translation>
diff --git a/components/sync/service/sync_prefs.cc b/components/sync/service/sync_prefs.cc
index 1c708d6..b248590 100644
--- a/components/sync/service/sync_prefs.cc
+++ b/components/sync/service/sync_prefs.cc
@@ -254,7 +254,7 @@
 
   switch (account_state) {
     case SyncAccountState::kNotSignedIn: {
-      break;
+      NOTREACHED_NORETURN();
     }
     case SyncAccountState::kSignedInNotSyncing: {
       NOTREACHED_NORETURN() << "Call GetSelectedTypesForAccount() instead";
diff --git a/components/sync/service/sync_user_settings_impl.cc b/components/sync/service/sync_user_settings_impl.cc
index 362a0a77..6dd103c8 100644
--- a/components/sync/service/sync_user_settings_impl.cc
+++ b/components/sync/service/sync_user_settings_impl.cc
@@ -92,12 +92,20 @@
 UserSelectableTypeSet SyncUserSettingsImpl::GetSelectedTypes() const {
   UserSelectableTypeSet types;
 
-  if (ShouldUsePerAccountPrefs()) {
-    signin::GaiaIdHash gaia_id_hash = signin::GaiaIdHash::FromGaiaId(
-        delegate_->GetSyncAccountInfoForPrefs().gaia);
-    types = prefs_->GetSelectedTypesForAccount(gaia_id_hash);
-  } else {
-    types = prefs_->GetSelectedTypes(delegate_->GetSyncAccountStateForPrefs());
+  switch (delegate_->GetSyncAccountStateForPrefs()) {
+    case SyncPrefs::SyncAccountState::kNotSignedIn: {
+      return UserSelectableTypeSet();
+    }
+    case SyncPrefs::SyncAccountState::kSignedInNotSyncing: {
+      signin::GaiaIdHash gaia_id_hash = signin::GaiaIdHash::FromGaiaId(
+          delegate_->GetSyncAccountInfoForPrefs().gaia);
+      types = prefs_->GetSelectedTypesForAccount(gaia_id_hash);
+      break;
+    }
+    case SyncPrefs::SyncAccountState::kSyncing: {
+      types = prefs_->GetSelectedTypes(SyncPrefs::SyncAccountState::kSyncing);
+      break;
+    }
   }
   types.RetainAll(GetRegisteredSelectableTypes());
 
@@ -139,13 +147,21 @@
       << "\n registered: " << UserSelectableTypeSetToString(registered_types)
       << "\n setting to: " << UserSelectableTypeSetToString(types);
 
-  if (ShouldUsePerAccountPrefs()) {
-    for (UserSelectableType type : registered_types) {
-      SetSelectedType(type, types.Has(type) || sync_everything);
-    }
-    return;
+  switch (delegate_->GetSyncAccountStateForPrefs()) {
+    case SyncPrefs::SyncAccountState::kNotSignedIn:
+      // TODO(crbug.com/1505100): Convert to NOTREACHED_NORETURN.
+      DUMP_WILL_BE_NOTREACHED_NORETURN()
+          << "Must not set selected types while signed out";
+      break;
+    case SyncPrefs::SyncAccountState::kSignedInNotSyncing:
+      for (UserSelectableType type : registered_types) {
+        SetSelectedType(type, types.Has(type) || sync_everything);
+      }
+      break;
+    case SyncPrefs::SyncAccountState::kSyncing:
+      prefs_->SetSelectedTypes(sync_everything, registered_types, types);
+      break;
   }
-  prefs_->SetSelectedTypes(sync_everything, registered_types, types);
 }
 
 void SyncUserSettingsImpl::SetSelectedType(UserSelectableType type,
@@ -153,19 +169,27 @@
   UserSelectableTypeSet registered_types = GetRegisteredSelectableTypes();
   CHECK(registered_types.Has(type));
 
-  if (ShouldUsePerAccountPrefs()) {
-    signin::GaiaIdHash gaia_id_hash = signin::GaiaIdHash::FromGaiaId(
-        delegate_->GetSyncAccountInfoForPrefs().gaia);
-    prefs_->SetSelectedTypeForAccount(type, is_type_on, gaia_id_hash);
-  } else {
-    DUMP_WILL_BE_CHECK(!IsSyncEverythingEnabled());
-    syncer::UserSelectableTypeSet selected_types = GetSelectedTypes();
-    if (is_type_on) {
-      selected_types.Put(type);
-    } else {
-      selected_types.Remove(type);
+  switch (delegate_->GetSyncAccountStateForPrefs()) {
+    case SyncPrefs::SyncAccountState::kNotSignedIn: {
+      // TODO(crbug.com/1505100): Convert to NOTREACHED_NORETURN.
+      DUMP_WILL_BE_NOTREACHED_NORETURN()
+          << "Must not set selected types while signed out";
+      break;
     }
-    SetSelectedTypes(IsSyncEverythingEnabled(), selected_types);
+    case SyncPrefs::SyncAccountState::kSignedInNotSyncing: {
+      signin::GaiaIdHash gaia_id_hash = signin::GaiaIdHash::FromGaiaId(
+          delegate_->GetSyncAccountInfoForPrefs().gaia);
+      prefs_->SetSelectedTypeForAccount(type, is_type_on, gaia_id_hash);
+      break;
+    }
+    case SyncPrefs::SyncAccountState::kSyncing: {
+      DUMP_WILL_BE_CHECK(!IsSyncEverythingEnabled());
+      syncer::UserSelectableTypeSet selected_types =
+          is_type_on ? base::Union(GetSelectedTypes(), {type})
+                     : base::Difference(GetSelectedTypes(), {type});
+      SetSelectedTypes(IsSyncEverythingEnabled(), selected_types);
+      break;
+    }
   }
 }
 
@@ -383,13 +407,4 @@
   return !Intersection(preferred_types, encrypted_types).Empty();
 }
 
-// TODO(crbug.com/1485015): Inline.
-bool SyncUserSettingsImpl::ShouldUsePerAccountPrefs() const {
-  // Note: If Sync-the-feature users are ever migrated to use the account-scoped
-  // prefs, also update the migration code in sync_to_signin_migration.cc
-  // accordingly!
-  return delegate_->GetSyncAccountStateForPrefs() ==
-         SyncPrefs::SyncAccountState::kSignedInNotSyncing;
-}
-
 }  // namespace syncer
diff --git a/components/variations/synthetic_trial_registry.h b/components/variations/synthetic_trial_registry.h
index 93b9aa4..23f5993e 100644
--- a/components/variations/synthetic_trial_registry.h
+++ b/components/variations/synthetic_trial_registry.h
@@ -18,6 +18,10 @@
 class MetricsServiceAccessor;
 }  // namespace metrics
 
+namespace content {
+class SyntheticTrialSyncer;
+}  // namespace content
+
 namespace tpcd::experiment {
 class ExperimentManagerImplBrowserTest;
 }  // namespace tpcd::experiment
@@ -87,6 +91,7 @@
   friend FieldTrialsProviderTest;
   friend SyntheticTrialRegistryTest;
   friend ::tpcd::experiment::ExperimentManagerImplBrowserTest;
+  friend content::SyntheticTrialSyncer;
   FRIEND_TEST_ALL_PREFIXES(SyntheticTrialRegistryTest, RegisterSyntheticTrial);
   FRIEND_TEST_ALL_PREFIXES(SyntheticTrialRegistryTest,
                            GetSyntheticFieldTrialsOlderThanSuffix);
@@ -132,6 +137,12 @@
       std::vector<ActiveGroupId>* synthetic_trials,
       base::StringPiece suffix = "") const;
 
+  // SyntheticTrialSyncer needs to know all current synthetic trial
+  // groups after launching new child processes.
+  const std::vector<SyntheticTrialGroup>& GetSyntheticTrialGroups() const {
+    return synthetic_trial_groups_;
+  }
+
   // Notifies observers on a synthetic trial list change.
   void NotifySyntheticTrialObservers(
       const std::vector<SyntheticTrialGroup>& trials_updated,
diff --git a/components/variations/variations_crash_keys.cc b/components/variations/variations_crash_keys.cc
index 776f1b29..83c052f 100644
--- a/components/variations/variations_crash_keys.cc
+++ b/components/variations/variations_crash_keys.cc
@@ -59,10 +59,6 @@
 crash_reporter::CrashKeyString<64> g_variations_seed_version_crash_key(
     kVariationsSeedVersionKey);
 
-std::string ActiveGroupToString(const ActiveGroupId& active_group) {
-  return base::StringPrintf("%x-%x,", active_group.name, active_group.group);
-}
-
 std::string GetVariationsSeedVersion() {
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   // kVariationsSeedVersion should be set by the browser process in
@@ -300,4 +296,9 @@
   DCHECK(g_variations_crash_keys);
   return g_variations_crash_keys->GetExperimentListInfo();
 }
+
+std::string ActiveGroupToString(const ActiveGroupId& active_group) {
+  return base::StringPrintf("%x-%x,", active_group.name, active_group.group);
+}
+
 }  // namespace variations
diff --git a/components/variations/variations_crash_keys.h b/components/variations/variations_crash_keys.h
index b4993de6..01bb7e9 100644
--- a/components/variations/variations_crash_keys.h
+++ b/components/variations/variations_crash_keys.h
@@ -13,6 +13,7 @@
 namespace variations {
 
 class SyntheticTrialGroup;
+struct ActiveGroupId;
 
 // The key used in crash reports to indicate the number of active experiments.
 // Should match the number of entries in kExperimentListKey.
@@ -55,6 +56,10 @@
 // in that list in |num_experiments|. Must be called on the UI thread.
 COMPONENT_EXPORT(VARIATIONS) ExperimentListInfo GetExperimentListInfo();
 
+// Gets the hash code of the experiment.
+COMPONENT_EXPORT(VARIATIONS)
+std::string ActiveGroupToString(const ActiveGroupId& active_group);
+
 }  // namespace variations
 
 #endif  // COMPONENTS_VARIATIONS_VARIATIONS_CRASH_KEYS_H_
diff --git a/components/viz/service/display/skia_output_surface.h b/components/viz/service/display/skia_output_surface.h
index e9cd1dae..70f3a7b 100644
--- a/components/viz/service/display/skia_output_surface.h
+++ b/components/viz/service/display/skia_output_surface.h
@@ -45,10 +45,7 @@
 struct RenderPassGeometry;
 }  // namespace copy_output
 
-// This class extends the OutputSurface for SkiaRenderer needs. In future, the
-// SkiaRenderer will be the only renderer. When other renderers are removed,
-// we will replace OutputSurface with SkiaOutputSurface, and remove all
-// OutputSurface's methods which are not useful for SkiaRenderer.
+// This class extends the OutputSurface for SkiaRenderer needs.
 class VIZ_SERVICE_EXPORT SkiaOutputSurface : public OutputSurface,
                                              public ExternalUseClient {
  public:
diff --git a/components/viz/test/test_context_provider.cc b/components/viz/test/test_context_provider.cc
index 6405f6c7..944a96c 100644
--- a/components/viz/test/test_context_provider.cc
+++ b/components/viz/test/test_context_provider.cc
@@ -348,7 +348,9 @@
 }
 
 std::unique_ptr<gpu::SharedImageInterface::ScopedMapping>
-TestSharedImageInterface::MapSharedImage(const gpu::Mailbox& mailbox) {
+TestSharedImageInterface::MapSharedImage(
+    const scoped_refptr<gpu::ClientSharedImage>& client_shared_image) {
+  const auto& mailbox = client_shared_image->mailbox();
   auto it = mailbox_to_gmb_map_.find(mailbox);
   // The mailbox for which the query is made must be present.
   CHECK(it != mailbox_to_gmb_map_.end());
@@ -357,12 +359,6 @@
   return SharedImageInterface::ScopedMapping::Create(gmb);
 }
 
-std::unique_ptr<gpu::SharedImageInterface::ScopedMapping>
-TestSharedImageInterface::MapSharedImage(
-    const scoped_refptr<gpu::ClientSharedImage>& client_shared_image) {
-  return MapSharedImage(client_shared_image->mailbox());
-}
-
 bool TestSharedImageInterface::CheckSharedImageExists(
     const gpu::Mailbox& mailbox) const {
   base::AutoLock locked(lock_);
diff --git a/components/viz/test/test_context_provider.h b/components/viz/test/test_context_provider.h
index db5fa70..49b053c5b 100644
--- a/components/viz/test/test_context_provider.h
+++ b/components/viz/test/test_context_provider.h
@@ -136,8 +136,6 @@
       const gpu::Mailbox& mailbox) override;
 
   std::unique_ptr<gpu::SharedImageInterface::ScopedMapping> MapSharedImage(
-      const gpu::Mailbox& mailbox) override;
-  std::unique_ptr<gpu::SharedImageInterface::ScopedMapping> MapSharedImage(
       const scoped_refptr<gpu::ClientSharedImage>& client_shared_image)
       override;
 
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/WebappsUtils.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/WebappsUtils.java
index e0a5546..77f11e9 100644
--- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/WebappsUtils.java
+++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/WebappsUtils.java
@@ -16,6 +16,7 @@
 import android.os.Build;
 
 import androidx.annotation.RequiresApi;
+import androidx.annotation.WorkerThread;
 
 import org.jni_zero.CalledByNative;
 
@@ -35,10 +36,14 @@
     private static final String INSTALL_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
 
     // True when Android O's ShortcutManager.requestPinShortcut() is supported.
-    private static boolean sIsRequestPinShortcutSupported;
+    private static volatile boolean sIsRequestPinShortcutSupported;
 
     // True when it is already checked if ShortcutManager.requestPinShortcut() is supported.
-    private static boolean sCheckedIfRequestPinShortcutSupported;
+    private static volatile boolean sCheckedIfRequestPinShortcutSupported;
+
+    // Synchronization locks for thread-safe access to variables
+    // sCheckedIfRequestPinShortcutSupported and sIsRequestPinShortcutSupported.
+    private static final Object sLock = new Object();
 
     /**
      * Creates an intent that will add a shortcut to the home screen.
@@ -153,13 +158,30 @@
         return !receivers.isEmpty();
     }
 
+    /** Prepares whether Android O's ShortcutManager.requestPinShortcut() is supported. */
+    @WorkerThread
+    public static void prepareIsRequestPinShortcutSupported() {
+        isRequestPinShortcutSupported();
+    }
+
     /** Returns whether Android O's ShortcutManager.requestPinShortcut() is supported. */
     public static boolean isRequestPinShortcutSupported() {
         if (!sCheckedIfRequestPinShortcutSupported) {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                checkIfRequestPinShortcutSupported();
+            synchronized (sLock) {
+                if (!sCheckedIfRequestPinShortcutSupported) {
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                        ShortcutManager shortcutManager =
+                                ContextUtils.getApplicationContext()
+                                        .getSystemService(ShortcutManager.class);
+                        try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
+                            sIsRequestPinShortcutSupported =
+                                    shortcutManager != null
+                                            && shortcutManager.isRequestPinShortcutSupported();
+                        }
+                    }
+                    sCheckedIfRequestPinShortcutSupported = true;
+                }
             }
-            sCheckedIfRequestPinShortcutSupported = true;
         }
         return sIsRequestPinShortcutSupported;
     }
@@ -173,16 +195,6 @@
         return WebApkValidator.queryFirstWebApkPackage(ContextUtils.getApplicationContext(), url);
     }
 
-    @RequiresApi(Build.VERSION_CODES.O)
-    private static void checkIfRequestPinShortcutSupported() {
-        ShortcutManager shortcutManager =
-                ContextUtils.getApplicationContext().getSystemService(ShortcutManager.class);
-        try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
-            sIsRequestPinShortcutSupported =
-                    shortcutManager != null && shortcutManager.isRequestPinShortcutSupported();
-        }
-    }
-
     /**
      * Override whether shortcuts are considered supported for testing.
      *
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index a29d5b6..0f6f693 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -2195,6 +2195,7 @@
     "storage_partition_impl.h",
     "storage_partition_impl_map.cc",
     "storage_partition_impl_map.h",
+    "synthetic_trial_syncer.cc",
     "theme_helper.cc",
     "theme_helper.h",
     "tracing/background_startup_tracing_observer.cc",
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index f9d7cb6..ec1d40e 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -699,6 +699,7 @@
       head_update_params.load_timing_info.service_worker_start_time;
   intercepting_worker_ready_time_ =
       head_update_params.load_timing_info.service_worker_ready_time;
+  intercepting_worker_router_info_ = head_update_params.router_info.Clone();
 
   scoped_refptr<network::SharedURLLoaderFactory> factory =
       PrepareForNonInterceptedRequest();
@@ -859,14 +860,18 @@
     head_->load_timing.service_worker_ready_time =
         intercepting_worker_ready_time_;
   }
+  if (!intercepting_worker_router_info_.is_null()) {
+    head_->service_worker_router_info =
+        intercepting_worker_router_info_.Clone();
+  }
 
   // If the default loader (network) was used to handle the URL load request
   // we need to see if the interceptors want to potentially create a new
   // loader for the response. e.g. service workers.
   //
   // As the navigation request has received a response, the URLLoader has
-  // completed without any network errors. Some interceptors may still wish to
-  // handle the response.
+  // completed without any network errors. Some interceptors may still wish
+  // to handle the response.
   auto status = network::URLLoaderCompletionStatus(net::OK);
   if (MaybeCreateLoaderForResponse(status, &head_)) {
     return;
diff --git a/content/browser/loader/navigation_url_loader_impl.h b/content/browser/loader/navigation_url_loader_impl.h
index 3849f483..b24a05b2 100644
--- a/content/browser/loader/navigation_url_loader_impl.h
+++ b/content/browser/loader/navigation_url_loader_impl.h
@@ -25,6 +25,7 @@
 #include "services/network/public/cpp/record_ontransfersizeupdate_utils.h"
 #include "services/network/public/cpp/single_request_url_loader_factory.h"
 #include "services/network/public/mojom/accept_ch_frame_observer.mojom.h"
+#include "services/network/public/mojom/service_worker_router_info.mojom-forward.h"
 #include "services/network/public/mojom/shared_dictionary_access_observer.mojom.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
@@ -352,6 +353,8 @@
   base::TimeTicks intercepting_worker_start_time_;
   base::TimeTicks intercepting_worker_ready_time_;
 
+  network::mojom::ServiceWorkerRouterInfoPtr intercepting_worker_router_info_;
+
   base::WeakPtrFactory<NavigationURLLoaderImpl> weak_factory_{this};
 };
 
diff --git a/content/browser/loader/response_head_update_params.h b/content/browser/loader/response_head_update_params.h
index 8a006694..3974b87 100644
--- a/content/browser/loader/response_head_update_params.h
+++ b/content/browser/loader/response_head_update_params.h
@@ -7,6 +7,7 @@
 
 #include "content/common/content_export.h"
 #include "net/base/load_timing_info.h"
+#include "services/network/public/mojom/service_worker_router_info.mojom.h"
 
 namespace content {
 
@@ -21,6 +22,7 @@
   ResponseHeadUpdateParams& operator=(ResponseHeadUpdateParams&& other);
 
   net::LoadTimingInfo load_timing_info;
+  network::mojom::ServiceWorkerRouterInfoPtr router_info;
 };
 
 }  // namespace content
diff --git a/content/browser/permissions/permission_util.cc b/content/browser/permissions/permission_util.cc
index fa29ad2fa..fb4a45b 100644
--- a/content/browser/permissions/permission_util.cc
+++ b/content/browser/permissions/permission_util.cc
@@ -5,6 +5,7 @@
 #include "content/browser/permissions/permission_util.h"
 
 #include "base/check.h"
+#include "base/metrics/histogram_functions.h"
 #include "build/build_config.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
@@ -17,6 +18,13 @@
 
 namespace content {
 
+#if BUILDFLAG(IS_ANDROID)
+namespace {
+constexpr const char* kIsFileURLHistogram =
+    "Permissions.GetLastCommittedOriginAsURL.IsFileURL";
+}
+#endif
+
 // Due to dependency issues, this method is duplicated from
 // components/permissions/permission_util.cc.
 GURL PermissionUtil::GetLastCommittedOriginAsURL(
@@ -33,7 +41,10 @@
   if (web_contents->GetOrCreateWebPreferences()
           .allow_universal_access_from_file_urls &&
       render_frame_host->GetLastCommittedOrigin().GetURL().SchemeIsFile()) {
+    base::UmaHistogramBoolean(kIsFileURLHistogram, true);
     return render_frame_host->GetLastCommittedURL().DeprecatedGetOriginAsURL();
+  } else {
+    base::UmaHistogramBoolean(kIsFileURLHistogram, false);
   }
 #endif
 
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index dc69b7d..659cd973 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -3168,11 +3168,11 @@
                            UnloadACKArrivesPriorToProcessShutdownRequest);
   FRIEND_TEST_ALL_PREFIXES(WebContentsImplBrowserTest,
                            FullscreenAfterFrameUnload);
-  FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, UnloadHandlerSubframes);
-  FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, Unload_ABAB);
+  FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, PagehideHandlerSubframes);
+  FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, PagehideHandlerABAB);
   FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest,
                            UnloadNestedPendingDeletion);
-  FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, PartialUnloadHandler);
+  FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, PartialPagehideHandler);
   FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest,
                            PendingDeletionCheckCompletedOnSubtree);
   FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest,
@@ -3235,7 +3235,7 @@
   FRIEND_TEST_ALL_PREFIXES(NavigationRequestTest, SharedStorageWritable);
   FRIEND_TEST_ALL_PREFIXES(WebContentsImplBrowserTest, SetTitleOnPagehide);
   FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest,
-                           DetachedIframeUnloadHandlerABCB);
+                           DetachedIframePagehideHandlerABCB);
 
   class SubresourceLoaderFactoriesConfig;
 
diff --git a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
index 78d1336..016f633 100644
--- a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
@@ -5782,10 +5782,10 @@
                             .root();
   RenderFrameHostImpl* rfh = root->current_frame_host();
 
-  // Set up an unload handler which never finishes to force |rfh| to stay
+  // Set up a pagehide handler which never finishes to force |rfh| to stay
   // around in pending delete state and never receive the
   // mojo::AgentSchedulingGroupHost::DidUnloadRenderFrame.
-  EXPECT_TRUE(ExecJs(rfh, "window.onunload = function(e) { while(1); };\n"));
+  EXPECT_TRUE(ExecJs(rfh, "window.onpagehide = function(e) { while(1); };\n"));
   rfh->DisableUnloadTimerForTesting();
 
   // Navigate to another page with two subframes.
diff --git a/content/browser/service_worker/service_worker_main_resource_loader.cc b/content/browser/service_worker/service_worker_main_resource_loader.cc
index b741b32..8cdae23 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader.cc
@@ -313,10 +313,13 @@
               base::BindOnce(
                   [](NavigationLoaderInterceptor::FallbackCallback
                          fallback_callback,
-                     scoped_refptr<ServiceWorkerVersion> active_worker) {
+                     scoped_refptr<ServiceWorkerVersion> active_worker,
+                     network::mojom::ServiceWorkerRouterInfoPtr router_info) {
+                    ResponseHeadUpdateParams head_update_params;
+                    head_update_params.router_info = std::move(router_info);
                     std::move(fallback_callback)
                         .Run(false /* reset_subresource_loader_params */,
-                             ResponseHeadUpdateParams());
+                             head_update_params);
                     if (active_worker->running_status() !=
                             blink::EmbeddedWorkerStatus::kRunning &&
                         base::FeatureList::IsEnabled(
@@ -327,7 +330,8 @@
                           base::DoNothing());
                     }
                   },
-                  std::move(fallback_callback_), active_worker));
+                  std::move(fallback_callback_), active_worker,
+                  std::move(response_head_->service_worker_router_info)));
           return;
         case blink::ServiceWorkerRouterSource::Type::kRace:
           race_network_request_mode = RaceNetworkRequestMode::kForced;
diff --git a/content/browser/site_per_process_unload_browsertest.cc b/content/browser/site_per_process_unload_browsertest.cc
index 828b4f9..781bec1 100644
--- a/content/browser/site_per_process_unload_browsertest.cc
+++ b/content/browser/site_per_process_unload_browsertest.cc
@@ -54,9 +54,9 @@
 
 namespace {
 
-void UnloadPrint(const ToRenderFrameHost& target, const char* message) {
+void AddPagehideHandler(const ToRenderFrameHost& target, const char* message) {
   EXPECT_TRUE(
-      ExecJs(target, JsReplace("window.onunload = function() { "
+      ExecJs(target, JsReplace("window.onpagehide = function() { "
                                "  window.domAutomationController.send($1);"
                                "}",
                                message)));
@@ -64,9 +64,9 @@
 
 }  // namespace
 
-// Tests that there are no crashes if a subframe is detached in its unload
+// Tests that there are no crashes if a subframe is detached in its pagehide
 // handler. See https://crbug.com/590054.
-IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, DetachInUnloadHandler) {
+IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, DetachInPagehideHandler) {
   GURL main_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(b))"));
   EXPECT_TRUE(NavigateToURL(shell(), main_url));
@@ -88,11 +88,11 @@
   RenderFrameDeletedObserver deleted_observer(
       root->child_at(0)->child_at(0)->current_frame_host());
 
-  // Add an unload handler to the grandchild that causes it to be synchronously
+  // Add a pagehide handler to the grandchild that causes it to be synchronously
   // detached, then navigate it.
   EXPECT_TRUE(
       ExecJs(root->child_at(0)->child_at(0),
-             "window.onunload=function(e){\n"
+             "window.onpagehide=function(e){\n"
              "    window.parent.document.getElementById('child-0').remove();\n"
              "};\n"));
   auto script = JsReplace("window.document.getElementById('child-0').src = $1",
@@ -112,9 +112,9 @@
       DepictFrameTree(root));
 }
 
-// Tests that trying to navigate in the unload handler doesn't crash the
+// Tests that trying to navigate in the pagehide handler doesn't crash the
 // browser.
-IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, NavigateInUnloadHandler) {
+IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, NavigateInPagehideHandler) {
   GURL main_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(b))"));
   EXPECT_TRUE(NavigateToURL(shell(), main_url));
@@ -134,9 +134,9 @@
   EXPECT_EQ(1,
             EvalJs(root->child_at(0)->current_frame_host(), "frames.length;"));
 
-  // Add an unload handler to B's subframe.
+  // Add a pagehide handler to B's subframe.
   EXPECT_TRUE(ExecJs(root->child_at(0)->child_at(0)->current_frame_host(),
-                     "window.onunload=function(e){\n"
+                     "window.onpagehide=function(e){\n"
                      "    window.location = '#navigate';\n"
                      "};\n"));
 
@@ -151,7 +151,7 @@
   // Wait until B's subframe RenderFrameHost is destroyed.
   deleted_observer.WaitUntilDeleted();
 
-  // Check that C's subframe is alive and the navigation in the unload handler
+  // Check that C's subframe is alive and the navigation in the pagehide handler
   // was ignored.
   EXPECT_EQ(0, EvalJs(root->child_at(0)->child_at(0)->current_frame_host(),
                       "frames.length;"));
@@ -237,10 +237,10 @@
 }
 
 // Ensure that after a main frame with an OOPIF is navigated cross-site, the
-// unload handler in the OOPIF sees correct main frame origin, namely the old
+// pagehide handler in the OOPIF sees correct main frame origin, namely the old
 // and not the new origin.  See https://crbug.com/825283.
 IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest,
-                       ParentOriginDoesNotChangeInUnloadHandler) {
+                       ParentOriginDoesNotChangeInPagehideHandler) {
   GURL main_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b)"));
   EXPECT_TRUE(NavigateToURL(shell(), main_url));
@@ -249,7 +249,7 @@
                             .root();
 
   // Open a popup on b.com.  The b.com subframe on the main frame will use this
-  // in its unload handler.
+  // in its pagehide handler.
   GURL b_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
 
   // Save the WebContents instance created via the popup to be able to listen
@@ -257,19 +257,19 @@
   auto* popup_shell = OpenPopup(shell()->web_contents(), b_url, "popup");
   WebContents* popup_web_contents = popup_shell->web_contents();
 
-  // Add an unload handler to b.com subframe, which will look up the top
+  // Add a pagehide handler to b.com subframe, which will look up the top
   // frame's origin and send it via domAutomationController.  Unfortunately,
   // the subframe's browser-side state will have been torn down when it runs
-  // the unload handler, so to ensure that the message can be received, send it
-  // through the popup.
+  // the pagehide handler, so to ensure that the message can be received, send
+  // it through the popup.
   EXPECT_TRUE(ExecJs(root->child_at(0),
-                     "window.onunload = function(e) {"
+                     "window.onpagehide = function(e) {"
                      "  window.open('','popup').domAutomationController.send("
                      "      'top-origin ' + location.ancestorOrigins[0]);"
                      "};"));
 
   // Navigate the main frame to c.com and wait for the message from the
-  // subframe's unload handler.
+  // subframe's pagehide handler.
   GURL c_url(embedded_test_server()->GetURL("c.com", "/title1.html"));
 
   // NOTE: The message occurs in the WebContents for the popup.
@@ -392,7 +392,7 @@
   NavigationRequest::SetCommitTimeoutForTesting(base::TimeDelta());
 }
 
-// Test that unload handlers in iframes are run, even when the removed subtree
+// Test that pagehide handlers in iframes are run, even when the removed subtree
 // is complicated with nested iframes in different processes.
 //     A1                         A1
 //    / \                        / \
@@ -403,21 +403,26 @@
 // B2  A2
 //     |
 //     C3
-IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, UnloadHandlerSubframes) {
+IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, PagehideHandlerSubframes) {
+  // The test expects the previous document to be deleted on navigation.
+  DisableBackForwardCacheForTesting(
+      web_contents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
+
   GURL main_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(c(b),c(a(c))),d)"));
   EXPECT_TRUE(NavigateToURL(shell(), main_url));
 
-  // Add a unload handler to every frames. It notifies the browser using the
+  // Add a pagehide handler to every frames. It notifies the browser using the
   // DomAutomationController it has been executed.
   FrameTreeNode* root = web_contents()->GetPrimaryFrameTree().root();
-  UnloadPrint(root, "A1");
-  UnloadPrint(root->child_at(0), "B1");
-  UnloadPrint(root->child_at(0)->child_at(0), "C1");
-  UnloadPrint(root->child_at(0)->child_at(1), "C2");
-  UnloadPrint(root->child_at(0)->child_at(0)->child_at(0), "B2");
-  UnloadPrint(root->child_at(0)->child_at(1)->child_at(0), "A2");
-  UnloadPrint(root->child_at(0)->child_at(1)->child_at(0)->child_at(0), "C3");
+  AddPagehideHandler(root, "A1");
+  AddPagehideHandler(root->child_at(0), "B1");
+  AddPagehideHandler(root->child_at(0)->child_at(0), "C1");
+  AddPagehideHandler(root->child_at(0)->child_at(1), "C2");
+  AddPagehideHandler(root->child_at(0)->child_at(0)->child_at(0), "B2");
+  AddPagehideHandler(root->child_at(0)->child_at(1)->child_at(0), "A2");
+  AddPagehideHandler(root->child_at(0)->child_at(1)->child_at(0)->child_at(0),
+                     "C3");
   DOMMessageQueue dom_message_queue(
       WebContents::FromRenderFrameHost(web_contents()->GetPrimaryMainFrame()));
 
@@ -437,7 +442,7 @@
   GURL e_url(embedded_test_server()->GetURL("e.com", "/title1.html"));
   NavigateFrameToURL(root->child_at(0), e_url);
 
-  // Collect unload handler messages.
+  // Collect pagehide handler messages.
   std::string message;
   std::vector<std::string> messages;
   for (int i = 0; i < 6; ++i) {
@@ -447,7 +452,8 @@
   }
   EXPECT_FALSE(dom_message_queue.PopMessage(&message));
 
-  // Check every frame in the replaced subtree has executed its unload handler.
+  // Check every frame in the replaced subtree has executed its pagehide
+  // handler.
   EXPECT_THAT(messages,
               WhenSorted(ElementsAre("A2", "B1", "B2", "C1", "C2", "C3")));
 
@@ -502,13 +508,12 @@
   deleted_observer.WaitUntilDeleted();
 }
 
-// Navigate from A(B(A(B)) to C. Check the unload handler are executed, executed
-// in the right order and the processes for A and B are removed.
-IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, Unload_ABAB) {
-  // With BackForwardCache, old document doesn't fire unload handlers as the
-  // page is stored in BackForwardCache on navigation.
-  web_contents()->GetController().GetBackForwardCache().DisableForTesting(
-      content::BackForwardCache::TEST_USES_UNLOAD_EVENT);
+// Navigate from A(B(A(B)) to C. Check the pagehide handler are executed,
+// executed in the right order and the processes for A and B are removed.
+IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, PagehideHandlerABAB) {
+  // The test expects the previous document to be deleted on navigation.
+  DisableBackForwardCacheForTesting(
+      web_contents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
 
   GURL initial_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(a(b)))"));
@@ -517,12 +522,12 @@
   // 1) Navigate on a page with an iframe.
   EXPECT_TRUE(NavigateToURL(shell(), initial_url));
 
-  // 2) Add unload handler on every frame.
+  // 2) Add pagehide handler on every frame.
   FrameTreeNode* root = web_contents()->GetPrimaryFrameTree().root();
-  UnloadPrint(root, "A1");
-  UnloadPrint(root->child_at(0), "B1");
-  UnloadPrint(root->child_at(0)->child_at(0), "A2");
-  UnloadPrint(root->child_at(0)->child_at(0)->child_at(0), "B2");
+  AddPagehideHandler(root, "A1");
+  AddPagehideHandler(root->child_at(0), "B1");
+  AddPagehideHandler(root->child_at(0)->child_at(0), "A2");
+  AddPagehideHandler(root->child_at(0)->child_at(0)->child_at(0), "B2");
   root->current_frame_host()->DisableUnloadTimerForTesting();
 
   DOMMessageQueue dom_message_queue(
@@ -537,7 +542,7 @@
   // 3) Navigate cross process.
   EXPECT_TRUE(NavigateToURL(shell(), next_url));
 
-  // 4) Wait for unload handler messages and check they are sent in order.
+  // 4) Wait for pagehide handler messages and check they are sent in order.
   std::vector<std::string> messages;
   std::string message;
   for (int i = 0; i < 4; ++i) {
@@ -648,14 +653,13 @@
 }
 
 // A set of nested frames A1(B1(A2)) are pending deletion because of a
-// navigation. This tests what happens if only A2 has an unload handler.
+// navigation. This tests what happens if only A2 has a pagehide handler.
 // If B1's mojom::FrameHost::Detach is called before A2, it should not destroy
 // itself and its children, but rather wait for A2.
-IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, PartialUnloadHandler) {
-  // With BackForwardCache, old document doesn't fire unload handlers as the
-  // page is stored in BackForwardCache on navigation.
-  web_contents()->GetController().GetBackForwardCache().DisableForTesting(
-      content::BackForwardCache::TEST_USES_UNLOAD_EVENT);
+IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, PartialPagehideHandler) {
+  // The test expects the previous document to be deleted on navigation.
+  DisableBackForwardCacheForTesting(
+      web_contents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
 
   GURL url_aba(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(a))"));
@@ -684,8 +688,8 @@
   // fire before we call OnDetach().
   b1->SetSubframeUnloadTimeoutForTesting(base::Seconds(30));
 
-  // Add unload handler on A2, but not on the other frames.
-  UnloadPrint(a2->frame_tree_node(), "A2");
+  // Add pagehide handler on A2, but not on the other frames.
+  AddPagehideHandler(a2->frame_tree_node(), "A2");
 
   DOMMessageQueue dom_message_queue(
       WebContents::FromRenderFrameHost(web_contents()->GetPrimaryMainFrame()));
@@ -693,7 +697,7 @@
   // 2) Navigate cross process.
   EXPECT_TRUE(NavigateToURL(shell(), url_c));
 
-  // Check that unload handlers are executed.
+  // Check that pagehide handlers are executed.
   std::string message, message_unused;
   EXPECT_TRUE(dom_message_queue.WaitForMessage(&message));
   EXPECT_FALSE(dom_message_queue.PopMessage(&message_unused));
@@ -741,13 +745,13 @@
 
 // Test RenderFrameHostImpl::PendingDeletionCheckCompletedOnSubtree.
 //
-// After a navigation commit, some children with no unload handler may be
+// After a navigation commit, some children with no pagehide handler may be
 // eligible for immediate deletion. Several configurations are tested:
 //
 // Before navigation commit
 //
-//              0               |  N  : No unload handler
-//   ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑      | [N] : Unload handler
+//              0               |  N  : No pagehide handler
+//   ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑      | [N] : Pagehide handler
 //  |  |  |  |  |   |     |     |
 // [1] 2 [3] 5  7   9     12    |
 //        |  |  |  / \   / \    |
@@ -755,18 +759,17 @@
 //
 // After navigation commit (expected)
 //
-//              0               |  N  : No unload handler
-//   ---------------------      | [N] : Unload handler
+//              0               |  N  : No pagehide handler
+//   ---------------------      | [N] : Pagehide handler
 //  |     |  |            |     |
 // [1]   [3] 5            12    |
 //           |             \    |
 //          [6]            [14] |
 IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest,
                        PendingDeletionCheckCompletedOnSubtree) {
-  // With BackForwardCache, old document doesn't fire unload handlers as the
-  // page is stored in BackForwardCache on navigation.
-  web_contents()->GetController().GetBackForwardCache().DisableForTesting(
-      content::BackForwardCache::TEST_USES_UNLOAD_EVENT);
+  // The test expects the previous document to be deleted on navigation.
+  DisableBackForwardCacheForTesting(
+      web_contents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
 
   GURL url_1(embedded_test_server()->GetURL(
       "a.com",
@@ -799,11 +802,11 @@
       delete_a10(rfh_10), delete_a11(rfh_11), delete_a12(rfh_12),
       delete_a13(rfh_13), delete_a14(rfh_14);
 
-  // Add the unload handlers.
-  UnloadPrint(rfh_1->frame_tree_node(), "");
-  UnloadPrint(rfh_3->frame_tree_node(), "");
-  UnloadPrint(rfh_6->frame_tree_node(), "");
-  UnloadPrint(rfh_14->frame_tree_node(), "");
+  // Add the pagehide handlers.
+  AddPagehideHandler(rfh_1->frame_tree_node(), "");
+  AddPagehideHandler(rfh_3->frame_tree_node(), "");
+  AddPagehideHandler(rfh_6->frame_tree_node(), "");
+  AddPagehideHandler(rfh_14->frame_tree_node(), "");
 
   // Disable Detach and mojo::AgentSchedulingGroupHost::DidUnloadRenderFrame.
   auto unload_ack_filter = base::BindRepeating([] { return true; });
@@ -837,10 +840,10 @@
   EXPECT_FALSE(delete_a14.deleted());
 }
 
-// When an iframe is detached, check that unload handlers execute in all of its
-// child frames. Start from A(B(C)) and delete B from A.
+// When an iframe is detached, check that pagehide handlers execute in all of
+// its child frames. Start from A(B(C)) and delete B from A.
 IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest,
-                       DetachedIframeUnloadHandlerABC) {
+                       DetachedIframePagehideHandlerABC) {
   GURL initial_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(c))"));
 
@@ -851,9 +854,9 @@
   RenderFrameHostImpl* rfh_b = rfh_a->child_at(0)->current_frame_host();
   RenderFrameHostImpl* rfh_c = rfh_b->child_at(0)->current_frame_host();
 
-  // 2) Add unload handlers on B and C.
-  UnloadPrint(rfh_b->frame_tree_node(), "B");
-  UnloadPrint(rfh_c->frame_tree_node(), "C");
+  // 2) Add pagehide handlers on B and C.
+  AddPagehideHandler(rfh_b->frame_tree_node(), "B");
+  AddPagehideHandler(rfh_c->frame_tree_node(), "C");
 
   DOMMessageQueue dom_message_queue(web_contents());
   RenderProcessHostWatcher shutdown_B(
@@ -864,7 +867,7 @@
   // 3) Detach B from A.
   ExecuteScriptAsync(root, "document.querySelector('iframe').remove();");
 
-  // 4) Wait for unload handler.
+  // 4) Wait for pagehide handler.
   std::vector<std::string> messages(2);
   EXPECT_TRUE(dom_message_queue.WaitForMessage(&messages[0]));
   EXPECT_TRUE(dom_message_queue.WaitForMessage(&messages[1]));
@@ -881,22 +884,23 @@
 }
 
 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
-    !defined(NDEBUG) || BUILDFLAG(IS_LINUX)
+    !defined(NDEBUG) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)
 // Too slow under sanitizers and debug builds, even with increased timeout:
 // https://crbug.com/1096612
-// Disabled for Linux due to failures: https://crbug.com/1494811
-#define MAYBE_DetachedIframeUnloadHandlerABCB \
-  DISABLED_DetachedIframeUnloadHandlerABCB
+// Disabled for Linux/Android due to failures: https://crbug.com/1494811
+#define MAYBE_DetachedIframePagehideHandlerABCB \
+  DISABLED_DetachedIframePagehideHandlerABCB
 #else
-#define MAYBE_DetachedIframeUnloadHandlerABCB DetachedIframeUnloadHandlerABCB
+#define MAYBE_DetachedIframePagehideHandlerABCB \
+  DetachedIframePagehideHandlerABCB
 #endif
 
-// When an iframe is detached, check that unload handlers execute in all of its
-// child frames. Start from A(B1(C(B2))) and delete B1 from A.
+// When an iframe is detached, check that pagehide handlers execute in all of
+// its child frames. Start from A(B1(C(B2))) and delete B1 from A.
 IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest,
-                       MAYBE_DetachedIframeUnloadHandlerABCB) {
+                       MAYBE_DetachedIframePagehideHandlerABCB) {
   // This test takes longer to run, because multiple processes are waiting on
-  // each other's documents to execute unload handler before destroying their
+  // each other's documents to execute pagehide handler before destroying their
   // documents. https://crbug.com/1311985
   base::test::ScopedRunLoopTimeout increase_timeout(
       FROM_HERE, TestTimeouts::action_max_timeout());
@@ -912,12 +916,12 @@
   RenderFrameHostImplWrapper rfh_c(rfh_b1->child_at(0)->current_frame_host());
   RenderFrameHostImplWrapper rfh_b2(rfh_c->child_at(0)->current_frame_host());
 
-  // 2) Add unload handlers on B1, B2 and C.
-  UnloadPrint(rfh_b1->frame_tree_node(), "B1");
+  // 2) Add pagehide handlers on B1, B2 and C.
+  AddPagehideHandler(rfh_b1->frame_tree_node(), "B1");
   rfh_b1->DisableUnloadTimerForTesting();
-  UnloadPrint(rfh_b2->frame_tree_node(), "B2");
+  AddPagehideHandler(rfh_b2->frame_tree_node(), "B2");
   rfh_b2->DisableUnloadTimerForTesting();
-  UnloadPrint(rfh_c->frame_tree_node(), "C");
+  AddPagehideHandler(rfh_c->frame_tree_node(), "C");
   rfh_c->DisableUnloadTimerForTesting();
 
   DOMMessageQueue dom_message_queue(web_contents());
@@ -929,7 +933,7 @@
   // 3) Detach B from A.
   ExecuteScriptAsync(root, "document.querySelector('iframe').remove();");
 
-  // 4) Wait for unload handler.
+  // 4) Wait for pagehide handler.
   std::vector<std::string> messages(3);
   EXPECT_TRUE(dom_message_queue.WaitForMessage(&messages[0]));
   EXPECT_TRUE(dom_message_queue.WaitForMessage(&messages[1]));
@@ -947,10 +951,10 @@
   shutdown_C.Wait();
 }
 
-// When an iframe is detached, check that unload handlers execute in all of its
-// child frames. Start from A1(A2(B)), delete A2 from itself.
+// When an iframe is detached, check that pagehide handlers execute in all of
+// its child frames. Start from A1(A2(B)), delete A2 from itself.
 IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest,
-                       DetachedIframeUnloadHandlerAAB) {
+                       DetachedIframePagehideHandlerAAB) {
   GURL initial_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(a(b))"));
 
@@ -961,9 +965,9 @@
   RenderFrameHostImpl* rfh_a2 = rfh_a1->child_at(0)->current_frame_host();
   RenderFrameHostImpl* rfh_b = rfh_a2->child_at(0)->current_frame_host();
 
-  // 2) Add unload handlers on A2 ad B.
-  UnloadPrint(rfh_a2->frame_tree_node(), "A2");
-  UnloadPrint(rfh_b->frame_tree_node(), "B");
+  // 2) Add pagehide handlers on A2 ad B.
+  AddPagehideHandler(rfh_a2->frame_tree_node(), "A2");
+  AddPagehideHandler(rfh_b->frame_tree_node(), "B");
 
   DOMMessageQueue dom_message_queue(web_contents());
   RenderProcessHostWatcher shutdown_B(
@@ -973,7 +977,7 @@
   ExecuteScriptAsync(rfh_a2->frame_tree_node(),
                      "parent.document.querySelector('iframe').remove();");
 
-  // 4) Wait for unload handler.
+  // 4) Wait for pagehide handler.
   std::vector<std::string> messages(2);
   EXPECT_TRUE(dom_message_queue.WaitForMessage(&messages[0]));
   EXPECT_TRUE(dom_message_queue.WaitForMessage(&messages[1]));
@@ -1319,7 +1323,7 @@
   RenderFrameHostImpl* A2 = A1->child_at(0)->current_frame_host();
   RenderFrameDeletedObserver delete_A1(A2);
   EXPECT_TRUE(ExecJs(A2, R"(
-    window.addEventListener("unload", function() {
+    window.addEventListener("pagehide", function() {
       window.parent.postMessage("A2 message", "*");
     });
   )"));
@@ -1364,15 +1368,16 @@
 
 #if BUILDFLAG(IS_LINUX) && defined(THREAD_SANITIZER)
 // See crbug.com/1275848.
-#define MAYBE_NestedSubframeWithUnloadHandler \
-  DISABLED_NestedSubframeWithUnloadHandler
+#define MAYBE_NestedSubframeWithPagehideHandler \
+  DISABLED_NestedSubframeWithPagehideHandler
 #else
-#define MAYBE_NestedSubframeWithUnloadHandler NestedSubframeWithUnloadHandler
+#define MAYBE_NestedSubframeWithPagehideHandler \
+  NestedSubframeWithPagehideHandler
 #endif
-// After a same-origin iframe navigation, check that gradchild iframe are
-// properly deleted and their unload handler executed.
+// After a same-origin iframe navigation, check that grandchild iframe are
+// properly deleted and their pagehide handler executed.
 IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest,
-                       MAYBE_NestedSubframeWithUnloadHandler) {
+                       MAYBE_NestedSubframeWithPagehideHandler) {
   GURL main_url = embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(b,c))");
   GURL iframe_new_url = embedded_test_server()->GetURL("b.com", "/title1.html");
@@ -1388,9 +1393,9 @@
   RenderFrameDeletedObserver delete_B3(B3);
   RenderFrameDeletedObserver delete_C4(C4);
 
-  UnloadPrint(B2, "B2");
-  UnloadPrint(B3, "B3");
-  UnloadPrint(C4, "C4");
+  AddPagehideHandler(B2, "B2");
+  AddPagehideHandler(B3, "B3");
+  AddPagehideHandler(C4, "C4");
 
   // Navigate the iframe same-process.
   bool will_delete_b2 = B2->ShouldChangeRenderFrameHostOnSameSiteNavigation();
@@ -1406,7 +1411,7 @@
   delete_B3.WaitUntilDeleted();
   delete_C4.WaitUntilDeleted();
 
-  // The unload handlers must have run:
+  // The pagehide handlers must have run:
   std::string message;
   std::vector<std::string> messages;
   for (int i = 0; i < 3; ++i) {
@@ -1668,11 +1673,11 @@
   }
 }
 
-// Execute an unload handler from the initial empty document.
+// Execute a pagehide handler from the initial empty document.
 //
 // Start from A1(B2(B3)).
-// B3 is the initial empty document created by B2. An unload handler is added to
-// B3. A1 deletes B2.
+// B3 is the initial empty document created by B2. A pagehide handler is added
+// to B3. A1 deletes B2.
 IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest,
                        UnloadInInitialEmptyDocument) {
   // 1. Start from A1(B2).
@@ -1688,27 +1693,27 @@
   EXPECT_TRUE(ExecJs(b2, R"(
     let iframe = document.createElement("iframe");
     document.body.appendChild(iframe);
-    iframe.contentWindow.onunload = () => {
+    iframe.contentWindow.onpagehide = () => {
       window.domAutomationController.send("B3 unloaded");
     }
   )"));
   ASSERT_EQ(1u, b2->child_count());
   RenderFrameHostImpl* b3 = b2->child_at(0)->current_frame_host();
 
-  auto has_unload_handler = [](RenderFrameHostImpl* rfh) {
+  auto has_pagehide_handler = [](RenderFrameHostImpl* rfh) {
     return rfh->GetSuddenTerminationDisablerState(
-        blink::mojom::SuddenTerminationDisablerType::kUnloadHandler);
+        blink::mojom::SuddenTerminationDisablerType::kPageHideHandler);
   };
-  EXPECT_FALSE(has_unload_handler(a1));
-  EXPECT_FALSE(has_unload_handler(b2));
-  EXPECT_TRUE(has_unload_handler(b3));
+  EXPECT_FALSE(has_pagehide_handler(a1));
+  EXPECT_FALSE(has_pagehide_handler(b2));
+  EXPECT_TRUE(has_pagehide_handler(b3));
 
-  // 3. A1 deletes B2. This triggers the unload handler from B3.
+  // 3. A1 deletes B2. This triggers the pagehide handler from B3.
   DOMMessageQueue dom_message_queue(
       WebContents::FromRenderFrameHost(web_contents()->GetPrimaryMainFrame()));
   ExecuteScriptAsync(a1, "document.querySelector('iframe').remove();");
 
-  // Check the unload handler is executed.
+  // Check the pagehide handler is executed.
   std::string message;
   EXPECT_TRUE(dom_message_queue.WaitForMessage(&message));
   EXPECT_EQ("\"B3 unloaded\"", message);
diff --git a/content/browser/synthetic_trial_syncer.cc b/content/browser/synthetic_trial_syncer.cc
new file mode 100644
index 0000000..14752b7
--- /dev/null
+++ b/content/browser/synthetic_trial_syncer.cc
@@ -0,0 +1,188 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/synthetic_trial_syncer.h"
+
+#include "base/functional/bind.h"
+#include "base/no_destructor.h"
+#include "components/variations/synthetic_trial_registry.h"
+#include "content/common/synthetic_trial_configuration.mojom.h"
+#include "content/public/browser/browser_child_process_host_iterator.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/child_process_data.h"
+#include "content/public/browser/child_process_host.h"
+#include "content/public/browser/render_process_host.h"
+#include "mojo/public/cpp/bindings/remote.h"
+
+namespace content {
+
+namespace {
+
+std::vector<mojom::SyntheticTrialGroupPtr> ConvertTrialGroupsToMojo(
+    const std::vector<variations::SyntheticTrialGroup>& trials) {
+  std::vector<mojom::SyntheticTrialGroupPtr> groups;
+  for (const auto& trial : trials) {
+    std::string trial_name(trial.trial_name());
+    std::string group_name(trial.group_name());
+    groups.push_back(mojom::SyntheticTrialGroup::New(trial_name, group_name));
+  }
+  return groups;
+}
+
+void NotifyChildProcess(
+    mojo::Remote<mojom::SyntheticTrialConfiguration>&
+        synthetic_trial_configuration,
+    const std::vector<variations::SyntheticTrialGroup>& trials_updated,
+    const std::vector<variations::SyntheticTrialGroup>& trials_removed) {
+  synthetic_trial_configuration->AddOrUpdateSyntheticTrialGroups(
+      ConvertTrialGroupsToMojo(trials_updated));
+  synthetic_trial_configuration->RemoveSyntheticTrialGroups(
+      ConvertTrialGroupsToMojo(trials_removed));
+}
+
+class RenderProcessIterator {
+ public:
+  using HostType = RenderProcessHost;
+
+  RenderProcessIterator() : iter_(RenderProcessHost::AllHostsIterator()) {}
+
+  bool IsAtEnd() { return iter_.IsAtEnd(); }
+
+  void Advance() { iter_.Advance(); }
+
+  const base::Process& GetProcess() {
+    return iter_.GetCurrentValue()->GetProcess();
+  }
+
+  HostType* GetHost() { return iter_.GetCurrentValue(); }
+
+ private:
+  RenderProcessHost::iterator iter_;
+};
+
+class NonRenderProcessIterator {
+ public:
+  using HostType = ChildProcessHost;
+
+  NonRenderProcessIterator() = default;
+
+  bool IsAtEnd() { return iter_.Done(); }
+
+  void Advance() { ++iter_; }
+
+  const base::Process& GetProcess() { return iter_.GetData().GetProcess(); }
+
+  HostType* GetHost() { return iter_.GetHost(); }
+
+ private:
+  BrowserChildProcessHostIterator iter_;
+};
+
+template <typename Iterator>
+void NotifySyntheticTrialsChange(
+    base::ProcessId process_id,
+    const std::vector<variations::SyntheticTrialGroup>& trials_updated,
+    const std::vector<variations::SyntheticTrialGroup>& trials_removed) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  base::ProcessId current_pid = base::Process::Current().Pid();
+  for (Iterator iter; !iter.IsAtEnd(); iter.Advance()) {
+    const base::Process& process = iter.GetProcess();
+    if (!process.IsValid() ||
+        (process_id != base::kNullProcessId && process_id != process.Pid())) {
+      continue;
+    }
+
+    // Skip if in-browser process mode, because the browser process
+    // manages synthetic trial groups properly.
+    if (process.Pid() == current_pid) {
+      continue;
+    }
+
+    mojo::Remote<mojom::SyntheticTrialConfiguration>
+        synthetic_trial_configuration;
+    iter.GetHost()->BindReceiver(
+        synthetic_trial_configuration.BindNewPipeAndPassReceiver());
+    NotifyChildProcess(synthetic_trial_configuration, trials_updated,
+                       trials_removed);
+  }
+}
+
+}  // namespace
+
+std::unique_ptr<SyntheticTrialSyncer> SyntheticTrialSyncer::Create(
+    variations::SyntheticTrialRegistry* registry) {
+  // Only 1 instance is allowed for the browser process.
+  static bool s_called = false;
+  CHECK(!s_called);
+  std::unique_ptr<SyntheticTrialSyncer> instance =
+      std::make_unique<SyntheticTrialSyncer>(registry);
+  registry->AddObserver(instance.get());
+  BrowserChildProcessObserver::Add(instance.get());
+  s_called = true;
+  return instance;
+}
+
+SyntheticTrialSyncer::SyntheticTrialSyncer(
+    variations::SyntheticTrialRegistry* registry)
+    : registry_(registry) {}
+
+SyntheticTrialSyncer::~SyntheticTrialSyncer() {
+  registry_->RemoveObserver(this);
+  BrowserChildProcessObserver::Remove(this);
+
+  for (RenderProcessIterator it; !it.IsAtEnd(); it.Advance()) {
+    if (it.GetHost()) {
+      it.GetHost()->RemoveObserver(this);
+    }
+  }
+}
+
+void SyntheticTrialSyncer::OnSyntheticTrialsChanged(
+    const std::vector<variations::SyntheticTrialGroup>& trials_updated,
+    const std::vector<variations::SyntheticTrialGroup>& trials_removed,
+    const std::vector<variations::SyntheticTrialGroup>& groups) {
+  NotifySyntheticTrialsChange<RenderProcessIterator>(
+      base::kNullProcessId, trials_updated, trials_removed);
+  NotifySyntheticTrialsChange<NonRenderProcessIterator>(
+      base::kNullProcessId, trials_updated, trials_removed);
+}
+
+void SyntheticTrialSyncer::BrowserChildProcessLaunchedAndConnected(
+    const ChildProcessData& data) {
+  if (!data.GetProcess().IsValid()) {
+    return;
+  }
+
+  NotifySyntheticTrialsChange<NonRenderProcessIterator>(
+      data.GetProcess().Pid(), registry_->GetSyntheticTrialGroups(), {});
+}
+
+void SyntheticTrialSyncer::OnRenderProcessHostCreated(RenderProcessHost* host) {
+  host->AddObserver(this);
+}
+
+void SyntheticTrialSyncer::RenderProcessReady(RenderProcessHost* host) {
+  const base::Process& process = host->GetProcess();
+  if (!process.IsValid()) {
+    return;
+  }
+
+  NotifySyntheticTrialsChange<RenderProcessIterator>(
+      process.Pid(), registry_->GetSyntheticTrialGroups(), {});
+}
+
+void SyntheticTrialSyncer::RenderProcessExited(
+    RenderProcessHost* host,
+    const ChildProcessTerminationInfo& info) {
+  host->RemoveObserver(this);
+}
+
+void SyntheticTrialSyncer::RenderProcessHostDestroyed(RenderProcessHost* host) {
+  // To ensure this is removed from the observer list, call RemoveObserver()
+  // again.
+  host->RemoveObserver(this);
+}
+
+}  // namespace content
diff --git a/content/child/BUILD.gn b/content/child/BUILD.gn
index c2f44ce..3600663 100644
--- a/content/child/BUILD.gn
+++ b/content/child/BUILD.gn
@@ -45,6 +45,8 @@
     "child_histogram_fetcher_impl.h",
     "child_process.cc",
     "child_process.h",
+    "child_process_synthetic_trial_syncer.cc",
+    "child_process_synthetic_trial_syncer.h",
     "child_thread_impl.cc",
     "child_thread_impl.h",
     "field_trial.cc",
diff --git a/content/child/browser_exposed_child_interfaces.cc b/content/child/browser_exposed_child_interfaces.cc
index bad0fb44..3720297 100644
--- a/content/child/browser_exposed_child_interfaces.cc
+++ b/content/child/browser_exposed_child_interfaces.cc
@@ -7,6 +7,7 @@
 #include "base/functional/bind.h"
 #include "base/task/sequenced_task_runner.h"
 #include "content/child/child_histogram_fetcher_impl.h"
+#include "content/child/child_process_synthetic_trial_syncer.h"
 #include "content/public/common/content_client.h"
 #include "mojo/public/cpp/bindings/binder_map.h"
 #include "services/tracing/public/cpp/traced_process.h"
@@ -16,6 +17,7 @@
 
 void ExposeChildInterfacesToBrowser(
     scoped_refptr<base::SequencedTaskRunner> io_task_runner,
+    const bool in_browser_process,
     mojo::BinderMap* binders) {
   binders->Add<mojom::ChildHistogramFetcherFactory>(
       base::BindRepeating(&ChildHistogramFetcherFactoryImpl::Create),
@@ -24,6 +26,12 @@
       base::BindRepeating(&tracing::TracedProcess::OnTracedProcessRequest),
       base::SequencedTaskRunner::GetCurrentDefault());
 
+  if (!in_browser_process) {
+    binders->Add<mojom::SyntheticTrialConfiguration>(
+        base::BindRepeating(&ChildProcessSyntheticTrialSyncer::Create),
+        base::SequencedTaskRunner::GetCurrentDefault());
+  }
+
   GetContentClient()->ExposeInterfacesToBrowser(io_task_runner, binders);
 }
 
diff --git a/content/child/browser_exposed_child_interfaces.h b/content/child/browser_exposed_child_interfaces.h
index 1108455f..64ae098 100644
--- a/content/child/browser_exposed_child_interfaces.h
+++ b/content/child/browser_exposed_child_interfaces.h
@@ -21,8 +21,17 @@
 // process from all child processes (including renderers, GPU, service
 // processes, etc.). Interfaces exposed here can be acquired in the browser via
 // |RenderProcessHost::BindReceiver()| or |ChildProcessHost::BindReceiver()|.
+//
+// |in_browser_process| is true if the child process is running in the browser
+// process. For example, single-process mode, or in-process gpu mode (forced
+// by low-end device mode) makes all child processes or gpu process run in
+// the browser process. If the services depend on whether the child process
+// is running in the browser process or not (e.g. if using a process-wide
+// global variables and |in_browser_process| is true, the browser process and
+// the child process will use the same global variables.
 void ExposeChildInterfacesToBrowser(
     scoped_refptr<base::SequencedTaskRunner> io_task_runner,
+    bool in_browser_process,
     mojo::BinderMap* binders);
 
 }  // namespace content
diff --git a/content/child/child_process_synthetic_trial_syncer.cc b/content/child/child_process_synthetic_trial_syncer.cc
new file mode 100644
index 0000000..f2aaacf
--- /dev/null
+++ b/content/child/child_process_synthetic_trial_syncer.cc
@@ -0,0 +1,70 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/child/child_process_synthetic_trial_syncer.h"
+
+#include "base/no_destructor.h"
+#include "components/variations/variations_crash_keys.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
+
+namespace content {
+
+ChildProcessSyntheticTrialSyncer::ChildProcessSyntheticTrialSyncer() = default;
+ChildProcessSyntheticTrialSyncer::~ChildProcessSyntheticTrialSyncer() = default;
+
+void ChildProcessSyntheticTrialSyncer::Create(
+    mojo::PendingReceiver<mojom::SyntheticTrialConfiguration> receiver) {
+  mojo::MakeSelfOwnedReceiver(
+      std::make_unique<ChildProcessSyntheticTrialSyncer>(),
+      std::move(receiver));
+}
+
+std::unique_ptr<ChildProcessSyntheticTrialSyncer>
+ChildProcessSyntheticTrialSyncer::CreateInstanceForTesting() {
+  return std::make_unique<ChildProcessSyntheticTrialSyncer>();
+}
+
+void ChildProcessSyntheticTrialSyncer::AddOrUpdateSyntheticTrialGroups(
+    std::vector<mojom::SyntheticTrialGroupPtr> trial_groups) {
+  for (const auto& it : trial_groups) {
+    AddOrUpdateTrialGroupInternal(it->trial_name, it->group_name);
+  }
+  variations::UpdateCrashKeysWithSyntheticTrials(trials_);
+}
+
+void ChildProcessSyntheticTrialSyncer::RemoveSyntheticTrialGroups(
+    std::vector<mojom::SyntheticTrialGroupPtr> trial_groups) {
+  std::vector<variations::SyntheticTrialGroup> new_trials;
+
+  for (auto& trial : trials_) {
+    auto find_it =
+        std::find_if(trial_groups.begin(), trial_groups.end(),
+                     [&trial](mojom::SyntheticTrialGroupPtr& ptr) {
+                       return ptr->trial_name == trial.trial_name() &&
+                              ptr->group_name == trial.group_name();
+                     });
+    if (find_it != trial_groups.end()) {
+      continue;
+    }
+    new_trials.push_back(trial);
+  }
+  trials_.swap(new_trials);
+  variations::UpdateCrashKeysWithSyntheticTrials(trials_);
+}
+
+void ChildProcessSyntheticTrialSyncer::AddOrUpdateTrialGroupInternal(
+    const std::string& trial_name,
+    const std::string& group_name) {
+  for (auto& trial : trials_) {
+    if (trial.trial_name() == trial_name) {
+      trial.SetGroupName(group_name);
+      return;
+    }
+  }
+
+  trials_.emplace_back(trial_name, group_name,
+                       variations::SyntheticTrialAnnotationMode::kCurrentLog);
+}
+
+}  // namespace content
diff --git a/content/child/child_process_synthetic_trial_syncer.h b/content/child/child_process_synthetic_trial_syncer.h
new file mode 100644
index 0000000..4f350e1
--- /dev/null
+++ b/content/child/child_process_synthetic_trial_syncer.h
@@ -0,0 +1,61 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_CHILD_CHILD_PROCESS_SYNTHETIC_TRIAL_SYNCER_H_
+#define CONTENT_CHILD_CHILD_PROCESS_SYNTHETIC_TRIAL_SYNCER_H_
+
+#include <string>
+#include <vector>
+
+#include "components/variations/synthetic_trials.h"
+#include "content/common/content_export.h"
+#include "content/common/synthetic_trial_configuration.mojom.h"
+#include "mojo/public/cpp/bindings/binder_map.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+
+namespace content {
+
+// This class works in child processes and receives synthetic trial groups
+// from SyntheticTrialSyncer running in the browser process via mojo.
+//
+// When receiving any message from SyntheticTrialSyncer, this class updates
+// synthetic trial groups and updates crash keys with synthetic trials.
+// This makes crash dumps from non-browser processes have synthetic trial
+// information.
+class CONTENT_EXPORT ChildProcessSyntheticTrialSyncer
+    : public mojom::SyntheticTrialConfiguration {
+ public:
+  static void Create(
+      mojo::PendingReceiver<mojom::SyntheticTrialConfiguration> receiver);
+
+  ChildProcessSyntheticTrialSyncer();
+  ~ChildProcessSyntheticTrialSyncer() override;
+
+  ChildProcessSyntheticTrialSyncer(const ChildProcessSyntheticTrialSyncer&) =
+      delete;
+  ChildProcessSyntheticTrialSyncer& operator=(
+      const ChildProcessSyntheticTrialSyncer&) = delete;
+  ChildProcessSyntheticTrialSyncer(ChildProcessSyntheticTrialSyncer&&) = delete;
+
+ private:
+  friend class ChildProcessSyntheticTrialSyncerTest;
+
+  static std::unique_ptr<ChildProcessSyntheticTrialSyncer>
+  CreateInstanceForTesting();
+
+  // mojom::SyntheticTrialConfiguration:
+  void AddOrUpdateSyntheticTrialGroups(
+      std::vector<mojom::SyntheticTrialGroupPtr> trial_groups) override;
+  void RemoveSyntheticTrialGroups(
+      std::vector<mojom::SyntheticTrialGroupPtr> trial_groups) override;
+
+  void AddOrUpdateTrialGroupInternal(const std::string& trial_name,
+                                     const std::string& group_name);
+
+  std::vector<variations::SyntheticTrialGroup> trials_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_CHILD_CHILD_PROCESS_SYNTHETIC_TRIAL_SYNCER_H_
diff --git a/content/child/child_process_synthetic_trial_syncer_unittest.cc b/content/child/child_process_synthetic_trial_syncer_unittest.cc
new file mode 100644
index 0000000..5b44b58
--- /dev/null
+++ b/content/child/child_process_synthetic_trial_syncer_unittest.cc
@@ -0,0 +1,119 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/child/child_process_synthetic_trial_syncer.h"
+
+#include "base/test/task_environment.h"
+#include "components/variations/active_field_trials.h"
+#include "components/variations/variations_crash_keys.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+namespace {
+
+std::vector<mojom::SyntheticTrialGroupPtr> Create(
+    std::vector<std::pair<std::string, std::string>> trial_names) {
+  std::vector<mojom::SyntheticTrialGroupPtr> groups;
+  for (auto& it : trial_names) {
+    groups.push_back(mojom::SyntheticTrialGroup::New(it.first, it.second));
+  }
+  return groups;
+}
+
+}  // namespace
+
+class ChildProcessSyntheticTrialSyncerTest : public ::testing::Test {
+ public:
+  void SetUp() override {
+    variations::InitCrashKeys();
+    syncer_ = ChildProcessSyntheticTrialSyncer::CreateInstanceForTesting();
+  }
+
+  void TearDown() override {
+    syncer_.reset();
+    variations::ClearCrashKeysInstanceForTesting();
+  }
+
+  void AddOrUpdateSyntheticTrialGroups(
+      std::vector<std::pair<std::string, std::string>> groups) {
+    syncer_->AddOrUpdateSyntheticTrialGroups(Create(groups));
+  }
+
+  void RemoveSyntheticTrialGroups(
+      std::vector<std::pair<std::string, std::string>> groups) {
+    syncer_->RemoveSyntheticTrialGroups(Create(groups));
+  }
+
+  std::string GetExperimentHash(std::string trial_name,
+                                std::string group_name) {
+    return variations::ActiveGroupToString(
+        variations::MakeActiveGroupId(trial_name, group_name));
+  }
+
+ private:
+  std::unique_ptr<ChildProcessSyntheticTrialSyncer> syncer_;
+  base::test::TaskEnvironment task_environment_;
+};
+
+TEST_F(ChildProcessSyntheticTrialSyncerTest, Basic) {
+  AddOrUpdateSyntheticTrialGroups({{"A", "G1"}, {"B", "G2"}});
+
+  auto info = variations::GetExperimentListInfo();
+  EXPECT_EQ(GetExperimentHash("A", "G1") + GetExperimentHash("B", "G2"),
+            info.experiment_list);
+
+  AddOrUpdateSyntheticTrialGroups({{"C", "G3"}});
+  info = variations::GetExperimentListInfo();
+  EXPECT_EQ(3, info.num_experiments);
+  EXPECT_EQ(GetExperimentHash("A", "G1") + GetExperimentHash("B", "G2") +
+                GetExperimentHash("C", "G3"),
+            info.experiment_list);
+
+  AddOrUpdateSyntheticTrialGroups({{"A", "G4"}});
+  info = variations::GetExperimentListInfo();
+  EXPECT_EQ(3, info.num_experiments);
+  EXPECT_EQ(GetExperimentHash("A", "G4") + GetExperimentHash("B", "G2") +
+                GetExperimentHash("C", "G3"),
+            info.experiment_list);
+
+  RemoveSyntheticTrialGroups({{"B", "G2"}});
+  info = variations::GetExperimentListInfo();
+  EXPECT_EQ(2, info.num_experiments);
+  EXPECT_EQ(GetExperimentHash("A", "G4") + GetExperimentHash("C", "G3"),
+            info.experiment_list);
+
+  RemoveSyntheticTrialGroups({{"C", "G3"}, {"A", "G4"}});
+  info = variations::GetExperimentListInfo();
+  EXPECT_EQ(0, info.num_experiments);
+}
+
+TEST_F(ChildProcessSyntheticTrialSyncerTest, AddSameTrial) {
+  AddOrUpdateSyntheticTrialGroups({{"A", "G1"}, {"A", "G2"}, {"A", "G3"}});
+  auto info = variations::GetExperimentListInfo();
+  EXPECT_EQ(1, info.num_experiments);
+  EXPECT_EQ(GetExperimentHash("A", "G3"), info.experiment_list);
+}
+
+TEST_F(ChildProcessSyntheticTrialSyncerTest, RemoveFromEmpty) {
+  RemoveSyntheticTrialGroups({{"B", "G2"}, {"C", "G1"}});
+  auto info = variations::GetExperimentListInfo();
+  EXPECT_EQ(0, info.num_experiments);
+}
+
+TEST_F(ChildProcessSyntheticTrialSyncerTest, RemoveWrongTrialGroup) {
+  AddOrUpdateSyntheticTrialGroups({{"A", "G1"}, {"B", "G2"}});
+
+  auto info = variations::GetExperimentListInfo();
+  EXPECT_EQ(2, info.num_experiments);
+  EXPECT_EQ(GetExperimentHash("A", "G1") + GetExperimentHash("B", "G2"),
+            info.experiment_list);
+
+  RemoveSyntheticTrialGroups({{"B", "G4"}});
+  EXPECT_EQ(2, info.num_experiments);
+  EXPECT_EQ(GetExperimentHash("A", "G1") + GetExperimentHash("B", "G2"),
+            info.experiment_list);
+}
+
+}  // namespace content
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc
index 873d5d33..9cf5ccb 100644
--- a/content/child/child_thread_impl.cc
+++ b/content/child/child_thread_impl.cc
@@ -42,6 +42,7 @@
 #include "build/build_config.h"
 #include "content/child/browser_exposed_child_interfaces.h"
 #include "content/child/child_process.h"
+#include "content/child/child_process_synthetic_trial_syncer.h"
 #include "content/common/child_process.mojom.h"
 #include "content/common/content_constants_internal.h"
 #include "content/common/features.h"
@@ -876,7 +877,8 @@
   // NOTE: Do not add new binders directly within this method. Instead, modify
   // the definition of |ExposeChildInterfacesToBrowser()|, ensuring security
   // review coverage.
-  ExposeChildInterfacesToBrowser(GetIOTaskRunner(), &binders);
+  ExposeChildInterfacesToBrowser(GetIOTaskRunner(), IsInBrowserProcess(),
+                                 &binders);
 
   ChildThreadImpl::GetIOTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&IOThreadState::ExposeInterfacesToBrowser,
diff --git a/content/child/child_thread_impl.h b/content/child/child_thread_impl.h
index c849289..1c828d5f 100644
--- a/content/child/child_thread_impl.h
+++ b/content/child/child_thread_impl.h
@@ -19,6 +19,7 @@
 #include "base/threading/thread.h"
 #include "build/build_config.h"
 #include "components/variations/child_process_field_trial_syncer.h"
+#include "content/child/child_process_synthetic_trial_syncer.h"
 #include "content/common/associated_interfaces.mojom.h"
 #include "content/common/child_process.mojom.h"
 #include "content/public/child/child_thread.h"
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 30813363..989e06a 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -483,6 +483,7 @@
     "renderer.mojom",
     "renderer_host.mojom",
     "renderer_variations_configuration.mojom",
+    "synthetic_trial_configuration.mojom",
     "web_ui.mojom",
   ]
 
diff --git a/content/common/synthetic_trial_configuration.mojom b/content/common/synthetic_trial_configuration.mojom
new file mode 100644
index 0000000..9f34e4c
--- /dev/null
+++ b/content/common/synthetic_trial_configuration.mojom
@@ -0,0 +1,21 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module content.mojom;
+
+struct SyntheticTrialGroup {
+  string trial_name;
+  string group_name;
+};
+
+// Interface used by the browser process to tell the child processes about
+// the current active synthetic trial groups.
+interface SyntheticTrialConfiguration {
+  // Tells the child process to add new synthetic trial groups or update the
+  // existing synthetic trial groups.
+  AddOrUpdateSyntheticTrialGroups(array<SyntheticTrialGroup> groups);
+
+  // Tells the child process to remove the existing synthetic trial groups.
+  RemoveSyntheticTrialGroups(array<SyntheticTrialGroup> groups);
+};
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index ac49135..49b044dd 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -418,6 +418,7 @@
     "supported_delegations.cc",
     "supported_delegations.h",
     "swap_metrics_driver.h",
+    "synthetic_trial_syncer.h",
     "touch_selection_controller_client_manager.h",
     "tracing_controller.h",
     "tracing_delegate.cc",
@@ -544,6 +545,7 @@
     "//build:chromeos_buildflags",
     "//cc",
     "//components/services/storage/public/cpp",
+    "//components/variations:variations",
     "//components/viz/host",
     "//content/browser",  # Must not be public_deps!
     "//device/fido",
diff --git a/content/public/browser/synthetic_trial_syncer.h b/content/public/browser/synthetic_trial_syncer.h
new file mode 100644
index 0000000..cc65b14
--- /dev/null
+++ b/content/public/browser/synthetic_trial_syncer.h
@@ -0,0 +1,74 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_SYNTHETIC_TRIAL_SYNCER_H_
+#define CONTENT_PUBLIC_BROWSER_SYNTHETIC_TRIAL_SYNCER_H_
+
+#include "base/memory/raw_ptr.h"
+#include "components/variations/synthetic_trials.h"
+#include "content/common/content_export.h"
+#include "content/public/browser/browser_child_process_observer.h"
+#include "content/public/browser/render_process_host_creation_observer.h"
+#include "content/public/browser/render_process_host_observer.h"
+
+namespace variations {
+class SyntheticTrialRegistry;
+}  // namespace variations
+
+namespace content {
+
+// This class is used by the browser process to tell child processes
+// what synthetic trial groups the browser process joins in.
+//
+// This class registers itself as an observer of SyntheticTrialObserver.
+// SyntheticTrialRegistry notifies this class when a synthetic trial group
+// is updated.
+//
+// This class also registers itself as BrowserChildProcessObserver,
+// RenderProcessHostCreationObserver and RenderProcessHostObserver to
+// tell the synthetic trial groups just after a child process is created.
+// At that time, this class gets all joined synthetic groups by calling
+// SyntheticTrialRegistry::GetSyntheticTrialGroups().
+class CONTENT_EXPORT SyntheticTrialSyncer
+    : public variations::SyntheticTrialObserver,
+      public BrowserChildProcessObserver,
+      public RenderProcessHostCreationObserver,
+      public RenderProcessHostObserver {
+ public:
+  static std::unique_ptr<SyntheticTrialSyncer> Create(
+      variations::SyntheticTrialRegistry* registry);
+
+  explicit SyntheticTrialSyncer(variations::SyntheticTrialRegistry* registry);
+  ~SyntheticTrialSyncer() override;
+
+  SyntheticTrialSyncer(const SyntheticTrialSyncer&) = delete;
+  SyntheticTrialSyncer(SyntheticTrialSyncer&&) = delete;
+  SyntheticTrialSyncer& operator=(const SyntheticTrialSyncer&) = delete;
+
+ private:
+  // variations::SyntheticTrialObserver:
+  void OnSyntheticTrialsChanged(
+      const std::vector<variations::SyntheticTrialGroup>& trials_updated,
+      const std::vector<variations::SyntheticTrialGroup>& trials_removed,
+      const std::vector<variations::SyntheticTrialGroup>& groups) override;
+
+  // BrowserChildProcessObserver:
+  void BrowserChildProcessLaunchedAndConnected(
+      const ChildProcessData& data) override;
+
+  // RenderProcessHostCreationObserver:
+  void OnRenderProcessHostCreated(RenderProcessHost* host) override;
+
+  // RenderProcessHostObserver:
+  void RenderProcessReady(RenderProcessHost* host) override;
+  void RenderProcessHostDestroyed(RenderProcessHost* host) override;
+  void RenderProcessExited(RenderProcessHost* host,
+                           const ChildProcessTerminationInfo& info) override;
+
+  const raw_ptr<variations::SyntheticTrialRegistry> registry_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_SYNTHETIC_TRIAL_SYNCER_H_
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc
index be1f39d..0739558 100644
--- a/content/renderer/render_process_impl.cc
+++ b/content/renderer/render_process_impl.cc
@@ -44,10 +44,15 @@
 #include "third_party/blink/public/web/web_frame.h"
 #include "v8/include/v8-initialization.h"
 
+#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \
+    (defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64))
+#define ENABLE_WEB_ASSEMBLY_TRAP_HANDLER_LINUX
+#endif
+
 #if BUILDFLAG(IS_WIN)
 #include "base/win/win_util.h"
 #endif
-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(ARCH_CPU_X86_64)
+#ifdef ENABLE_WEB_ASSEMBLY_TRAP_HANDLER_LINUX
 #include "v8/include/v8-wasm-trap-handler-posix.h"
 #endif
 
@@ -224,7 +229,7 @@
     v8::V8::SetFlagsFromString(kSABPerContextFlag, sizeof(kSABPerContextFlag));
   }
 
-#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(ARCH_CPU_X86_64)
+#ifdef ENABLE_WEB_ASSEMBLY_TRAP_HANDLER_LINUX
   if (base::FeatureList::IsEnabled(features::kWebAssemblyTrapHandler)) {
     base::CommandLine* const command_line =
         base::CommandLine::ForCurrentProcess();
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 3ed642ab..4e5182a 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2765,6 +2765,7 @@
     "../browser/worker_host/worker_script_loader_factory_unittest.cc",
     "../browser/xr/metrics/session_tracker_unittest.cc",
     "../child/blink_platform_impl_unittest.cc",
+    "../child/child_process_synthetic_trial_syncer_unittest.cc",
     "../common/background_fetch/background_fetch_mojom_traits_unittest.cc",
     "../common/color_parser_unittest.cc",
     "../common/common_param_traits_unittest.cc",
@@ -2944,6 +2945,7 @@
     "//components/system_media_controls:test_support",
     "//components/ukm:test_support",
     "//components/user_prefs/test:test_support",
+    "//components/variations:variations",
     "//components/viz/client",
     "//components/viz/common",
     "//components/viz/host",
diff --git a/extensions/strings/extensions_strings_az.xtb b/extensions/strings/extensions_strings_az.xtb
index c5f8e69..7b6a5ea 100644
--- a/extensions/strings/extensions_strings_az.xtb
+++ b/extensions/strings/extensions_strings_az.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">Təsadüfi RSA şəxsi kilidini yaratmaq alınmadı.</translation>
 <translation id="1445572445564823378">Bu artırma yavaşlaşır <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> məhsulunun performansını bərpa etmək üçün onu deaktiv etməlisiniz.</translation>
 <translation id="1468038450257740950">WebGL dəstəklənmir.</translation>
+<translation id="1610570795592207282">Skript üçün css "<ph name="RELATIVE_PATH" />" yüklənmədi.</translation>
 <translation id="1803557475693955505">'<ph name="BACKGROUND_PAGE" />' arxa fon səhifəsini yükləmək alınmadı.</translation>
 <translation id="2159915644201199628">Təsviri deşifrələmək olmadı: '<ph name="IMAGE_NAME" />'</translation>
 <translation id="2350172092385603347">Lokalizasiya işlənir, lakin defolt default_locale manifestdə göstərilməyib.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">İctimai açarı eksport etmək alınmadı.</translation>
 <translation id="5026754133087629784">Veb baxış: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Paketə istiqamət üçün mütləq yol tapmaq olmur</translation>
+<translation id="5160071981665899014">Skript üçün JavaScript "<ph name="RELATIVE_PATH" />" yüklənmədi.</translation>
 <translation id="5356315618422219272">Tətbiqə baxış: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">Fiqurlu pəncərələr dəstəklənmir.</translation>
 <translation id="5456409301717116725">Bu artırma <ph name="KEY_PATH" /> açar faylını içərir.</translation>
diff --git a/extensions/strings/extensions_strings_bs.xtb b/extensions/strings/extensions_strings_bs.xtb
index 93aa6133..397c40a 100644
--- a/extensions/strings/extensions_strings_bs.xtb
+++ b/extensions/strings/extensions_strings_bs.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">Ups! Generiranje nasumičnog RSA privatnog ključa nije uspjelo.</translation>
 <translation id="1445572445564823378">Ova ekstenzija usporava aplikaciju <ph name="PRODUCT_NAME" />. Trebate je onemogućiti kako biste vratili performanse aplikacije <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1468038450257740950">Sistem ne podržava WebGL</translation>
+<translation id="1610570795592207282">Nije uspjelo učitavanje CSS-a <ph name="RELATIVE_PATH" /> za skriptu.</translation>
 <translation id="1803557475693955505">Nije moguće učitati stranicu s pozadinama "<ph name="BACKGROUND_PAGE" />".</translation>
 <translation id="2159915644201199628">Dekodiranje slike nije uspjelo: "<ph name="IMAGE_NAME" />"</translation>
 <translation id="2350172092385603347">Korištena je lokalizacija, ali u deklaraciji nije naveden default_locale.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">Izvoz javnog ključa nije uspio.</translation>
 <translation id="5026754133087629784">WebView: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Nije moguće pronaći apsolutnu putanju do direktorija za pakiranje.</translation>
+<translation id="5160071981665899014">Nije uspjelo učitavanje JavaScripta <ph name="RELATIVE_PATH" /> za skriptu.</translation>
 <translation id="5356315618422219272">Prikaz aplikacije: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">Oblikovanje prozora nije podržano.</translation>
 <translation id="5456409301717116725">Ova ekstenzija uključuje fajl s ključem "<ph name="KEY_PATH" />". Vjerovatno to ne želite učiniti.</translation>
diff --git a/extensions/strings/extensions_strings_fil.xtb b/extensions/strings/extensions_strings_fil.xtb
index 73037a6c..24dc91b 100644
--- a/extensions/strings/extensions_strings_fil.xtb
+++ b/extensions/strings/extensions_strings_fil.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">Hala! Nabigong mabuo ang random RSA pribadong key.</translation>
 <translation id="1445572445564823378">Pinapabagal ng extension na ito ang <ph name="PRODUCT_NAME" />. Dapat mo itong huwag paganahin upang ipanumbalik ang pagganap ng <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1468038450257740950">Hindi sinusuportahan ang WebGL.</translation>
+<translation id="1610570795592207282">Hindi ma-load ang css '<ph name="RELATIVE_PATH" />' para sa script.</translation>
 <translation id="1803557475693955505">Maaaring hindi mai-load ang pahina ng background '<ph name="BACKGROUND_PAGE" />'.</translation>
 <translation id="2159915644201199628">Hindi ma-decode ang larawan: '<ph name="IMAGE_NAME" />'</translation>
 <translation id="2350172092385603347">Ginamit ang localization , subalit hindi natukoy ang default_locale sa manipesto.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">Nabigong i-export ang pampublikong key.</translation>
 <translation id="5026754133087629784">Webview: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Hindi mahanap ang ganap na daanan sa direktoryo sa pack.</translation>
+<translation id="5160071981665899014">Hindi ma-load ang javascript '<ph name="RELATIVE_PATH" />' para sa script.</translation>
 <translation id="5356315618422219272">Appview: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">Hindi sinusuportahan ang mga may hugis na window.</translation>
 <translation id="5456409301717116725">Kasama sa extension na ito ang key file na '<ph name="KEY_PATH" />'. Malamang na hindi mo iyon gustong gawin.</translation>
diff --git a/extensions/strings/extensions_strings_gu.xtb b/extensions/strings/extensions_strings_gu.xtb
index 9d0e0b24..371bc28 100644
--- a/extensions/strings/extensions_strings_gu.xtb
+++ b/extensions/strings/extensions_strings_gu.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">અરેરે! રેંડમ RSA ખાનગી કી જનરેટ કરવામાં નિષ્ફળ.</translation>
 <translation id="1445572445564823378">આ એક્સ્ટેંશન <ph name="PRODUCT_NAME" />ને ધીમુંં કરી રહ્યું છે. <ph name="PRODUCT_NAME" />ના પ્રદર્શનને પહેલાંના જેવું કરવા માટે તમારે તેને બંધ કરવું જોઈએ.</translation>
 <translation id="1468038450257740950">WebGL સમર્થિત નથી.</translation>
+<translation id="1610570795592207282">સ્ક્રિપ્ટ માટે css '<ph name="RELATIVE_PATH" />' લોડ કરી શકાયું નથી.</translation>
 <translation id="1803557475693955505">બૅકગ્રાઉન્ડ પેજ '<ph name="BACKGROUND_PAGE" />' લોડ કરી શકાયું નથી.</translation>
 <translation id="2159915644201199628">છબીને ડિકોડ કરી શક્યાં નથી: '<ph name="IMAGE_NAME" />'</translation>
 <translation id="2350172092385603347">લૉકલાઇઝેશન વપરાયુ, પરંતુ default_locale નો ઉલ્લેખ મેનિફેસ્ટમાં નહોતો.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">ખાનગી કી નિકાસ કરવામાં નિષ્ફળ.</translation>
 <translation id="5026754133087629784">વેબવ્યુ: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">પૅક કરવા માટે ડિરેક્ટરીનો સંપૂર્ણ પાથ શોધી શકાતો નથી.</translation>
+<translation id="5160071981665899014">સ્ક્રિપ્ટ માટે JavaScript '<ph name="RELATIVE_PATH" />' લોડ કરી શકાયું નથી.</translation>
 <translation id="5356315618422219272">Appview: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">આકારિત વિંડોઝ સમર્થિત નથી.</translation>
 <translation id="5456409301717116725">આ એક્સટેન્શનમાં '<ph name="KEY_PATH" />' કી ફાઇલ શામેલ છે. તમે કદાચ એ કરવા માંગતા નથી.</translation>
diff --git a/extensions/strings/extensions_strings_hr.xtb b/extensions/strings/extensions_strings_hr.xtb
index 888b138..5c27fc1c 100644
--- a/extensions/strings/extensions_strings_hr.xtb
+++ b/extensions/strings/extensions_strings_hr.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">Šteta! Nije uspjelo generiranje nasumičnog RSA osobnog ključa.</translation>
 <translation id="1445572445564823378">Ovo proširenje usporava uslugu <ph name="PRODUCT_NAME" />. Trebali biste ga onemogućiti da biste vratili uspješan rad usluge <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1468038450257740950">WebGL nije podržan.</translation>
+<translation id="1610570795592207282">Nije uspjelo učitavanje CSS-a <ph name="RELATIVE_PATH" /> za skriptu.</translation>
 <translation id="1803557475693955505">Nije uspjelo učitavanje pozadinske stranice "<ph name="BACKGROUND_PAGE" />".</translation>
 <translation id="2159915644201199628">Nije uspjelo dekodiranje slike: "<ph name="IMAGE_NAME" />"</translation>
 <translation id="2350172092385603347">Lokalizacija je korištena, ali default_locale nije naveden u manifestu.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">Izvoz javnog ključa nije uspio.</translation>
 <translation id="5026754133087629784">Prikaz web-lokacije: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Nije moguće pronaći apsolutni put prema direktoriju za pakiranje.</translation>
+<translation id="5160071981665899014">Nije uspjelo učitavanje JavaScripta <ph name="RELATIVE_PATH" /> za skriptu.</translation>
 <translation id="5356315618422219272">Appview: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">Oblikovani prozori nisu podržani.</translation>
 <translation id="5456409301717116725">To proširenje uključuje ključnu datoteku "<ph name="KEY_PATH" />". Vjerojatno ne želite to učiniti.</translation>
diff --git a/extensions/strings/extensions_strings_hu.xtb b/extensions/strings/extensions_strings_hu.xtb
index 37cda42..13a77e64 100644
--- a/extensions/strings/extensions_strings_hu.xtb
+++ b/extensions/strings/extensions_strings_hu.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">Ajjaj! Nem sikerült a véletlenszerű RSA privát kulcs generálása.</translation>
 <translation id="1445572445564823378">Ez a bővítmény lassítja a <ph name="PRODUCT_NAME" /> működését. Kapcsolja ki a <ph name="PRODUCT_NAME" /> teljesítményének visszaállításához.</translation>
 <translation id="1468038450257740950">A WebGL nem támogatott.</translation>
+<translation id="1610570795592207282">A(z) „<ph name="RELATIVE_PATH" />” css nem tölthető be a szkripthez.</translation>
 <translation id="1803557475693955505">Nem lehet betölteni a(z) '<ph name="BACKGROUND_PAGE" />' háttéroldalt.</translation>
 <translation id="2159915644201199628">Nem sikerült dekódolni a képet: „<ph name="IMAGE_NAME" />”</translation>
 <translation id="2350172092385603347">Fordítás használatban, de a default_locale (alapértelmezett nyelv- és országkód) nincs megadva a jegyzékfájlban.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">Nem sikerült a nyilvános kulcs exportálása.</translation>
 <translation id="5026754133087629784">Webview: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Nem található a csomagolni kívánt könyvtár abszolút elérési útvonala.</translation>
+<translation id="5160071981665899014">A(z) „<ph name="RELATIVE_PATH" />” javascript nem tölthető be a szkripthez.</translation>
 <translation id="5356315618422219272">Alkalmazásnézet: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">A formázott ablakok nem támogatottak.</translation>
 <translation id="5456409301717116725">Ez a bővítmény a(z) "<ph name="KEY_PATH" />" kulcsfájlt tartalmazza. Ezt Ön valószínűleg nem szeretné.</translation>
diff --git a/extensions/strings/extensions_strings_iw.xtb b/extensions/strings/extensions_strings_iw.xtb
index 4ee7037..0931faf 100644
--- a/extensions/strings/extensions_strings_iw.xtb
+++ b/extensions/strings/extensions_strings_iw.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">‏אוי לא! אירע כשל ביצירת מפתח RSA פרטי אקראי.</translation>
 <translation id="1445572445564823378">תוסף זה מאט את <ph name="PRODUCT_NAME" />. עליך להשבית אותו כדי לשחזר את הביצועים של <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1468038450257740950">‏WebGL אינו נתמך.</translation>
+<translation id="1610570795592207282">‏לא ניתן לטעון את ה-CSS‏ '<ph name="RELATIVE_PATH" />' לסקריפט.</translation>
 <translation id="1803557475693955505">לא היתה אפשרות לטעון את דף הרקע '<ph name="BACKGROUND_PAGE" />'.</translation>
 <translation id="2159915644201199628">לא ניתן לפענח תמונה: '<ph name="IMAGE_NAME" />'</translation>
 <translation id="2350172092385603347">‏נעשה שימוש בהתאמה למקום, אך default_locale לא צוין במניפסט.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">נכשל ייצוא מפתח ציבורי.</translation>
 <translation id="5026754133087629784">צפיות באתר: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">לא ניתן למצוא את הנתיב המוחלט לספריה לאריזה.</translation>
+<translation id="5160071981665899014">‏לא ניתן לטעון את קובץ ה-JavaScript '<ph name="RELATIVE_PATH" />' לסקריפט.</translation>
 <translation id="5356315618422219272">‏Appview‏: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">אין תמיכה בחלונות מעוצבים.</translation>
 <translation id="5456409301717116725">תוסף זה כולל את קובץ המפתח "<ph name="KEY_PATH" />". מומלץ לא לעשות זאת.</translation>
diff --git a/extensions/strings/extensions_strings_mn.xtb b/extensions/strings/extensions_strings_mn.xtb
index cef6fbd..f87c34a4 100644
--- a/extensions/strings/extensions_strings_mn.xtb
+++ b/extensions/strings/extensions_strings_mn.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">Өө өө! Түр зуурын RSA хувийн түлхүүрийг үүсгэж чадсангүй.</translation>
 <translation id="1445572445564823378">Энэ өргөтгөл <ph name="PRODUCT_NAME" /> удааширч байна. Та <ph name="PRODUCT_NAME" />-ийн гүйцэтгэлийг дахин сэргээхийн тулд идэвхгүй болгох хэрэгтэй.</translation>
 <translation id="1468038450257740950">WebGL-ийг дэмжихгүй байна.</translation>
+<translation id="1610570795592207282">Скриптэд css '<ph name="RELATIVE_PATH" />'-г ачаалж чадсангүй.</translation>
 <translation id="1803557475693955505">'<ph name="BACKGROUND_PAGE" />' үндсэн хуудсыг ачаалж чадсангүй.</translation>
 <translation id="2159915644201199628">Дүрсний кодыг тайлах боломжгүй байна: <ph name="IMAGE_NAME" /> '</translation>
 <translation id="2350172092385603347">Байрлалыг ашигласан, анхдагч байрлалыг контентын жагсаалтанд зааж өгсөн.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">Нийтийн түлхүүрийг экспортлох ажиллагаа амжилтгүй боллоо</translation>
 <translation id="5026754133087629784">Webview: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Өргөтгөлийн директорын гол замыг олж чадсангүй.</translation>
+<translation id="5160071981665899014">Скриптэд '<ph name="RELATIVE_PATH" />' javaScript-г ачаалж чадсангүй.</translation>
 <translation id="5356315618422219272">Appview: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">Тодорхой хэлбэртэй цонхнуудыг дэмжихгүй.</translation>
 <translation id="5456409301717116725">Энэхүү өргөтгөлд <ph name="KEY_PATH" /> түлхүүр файл багтана. Та магадгүй энэ үйлдлийг хийх хүсэлгүй байж болох юм.</translation>
diff --git a/extensions/strings/extensions_strings_ms.xtb b/extensions/strings/extensions_strings_ms.xtb
index 332f0bdc..99070c0 100644
--- a/extensions/strings/extensions_strings_ms.xtb
+++ b/extensions/strings/extensions_strings_ms.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">Yikes! Gagal untuk menjanakan kunci persendirian RSA rawak.</translation>
 <translation id="1445572445564823378">Sambungan ini melambatkan <ph name="PRODUCT_NAME" />. Anda perlu melumpuhkannya untuk memulihkan prestasi <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1468038450257740950">WebGL tidak disokong.</translation>
+<translation id="1610570795592207282">Tidak dapat memuatkan css '<ph name="RELATIVE_PATH" />' untuk skrip.</translation>
 <translation id="1803557475693955505">Tidak dapat memuatkan halaman latar belakang '<ph name="BACKGROUND_PAGE" />'.</translation>
 <translation id="2159915644201199628">Tidak dapat menyahkod imej: ' <ph name="IMAGE_NAME" /> '</translation>
 <translation id="2350172092385603347">Penempatan digunakan, tetapi default_locale tidak dinyatakan dalam ketara.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">Gagal intuk mengeksport kunci awam.</translation>
 <translation id="5026754133087629784">Paparan Web: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Tidak dapat mencari laluan mutlak ke direktori ke pek.</translation>
+<translation id="5160071981665899014">Tidak dapat memuatkan javascript '<ph name="RELATIVE_PATH" />' untuk skrip.</translation>
 <translation id="5356315618422219272">Appview: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">Tetingkap berbentuk tidak disokong.</translation>
 <translation id="5456409301717116725">Sambungan ini merangkumi fail utama ' <ph name="KEY_PATH" /> '. Anda mungkin tidak mahu melakukannya.</translation>
diff --git a/extensions/strings/extensions_strings_nl.xtb b/extensions/strings/extensions_strings_nl.xtb
index 4c4977c..3c5de6fb 100644
--- a/extensions/strings/extensions_strings_nl.xtb
+++ b/extensions/strings/extensions_strings_nl.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">O nee! Kan geen willekeurige persoonlijke RSA-sleutel genereren.</translation>
 <translation id="1445572445564823378"><ph name="PRODUCT_NAME" /> wordt door deze extensie vertraagd. Zet de extensie uit om de prestaties van <ph name="PRODUCT_NAME" /> te verbeteren.</translation>
 <translation id="1468038450257740950">WebGL wordt niet ondersteund.</translation>
+<translation id="1610570795592207282">Kan css '<ph name="RELATIVE_PATH" />' niet laden voor het script.</translation>
 <translation id="1803557475693955505">Kan achtergrondpagina '<ph name="BACKGROUND_PAGE" />' niet laden.</translation>
 <translation id="2159915644201199628">Kan afbeelding niet decoderen: '<ph name="IMAGE_NAME" />'</translation>
 <translation id="2350172092385603347">Lokalisatie gebruikt, maar er is geen 'default_locale' opgegeven in het manifest.</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">Exporteren van openbare sleutel is mislukt.</translation>
 <translation id="5026754133087629784">Webweergave: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Kan het absolute pad naar de in te pakken directory niet vinden.</translation>
+<translation id="5160071981665899014">Kan JavaScript '<ph name="RELATIVE_PATH" />' niet laden voor het script.</translation>
 <translation id="5356315618422219272">Appview: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">Gevormde vensters worden niet ondersteund.</translation>
 <translation id="5456409301717116725">Deze extensie bevat het sleutelbestand '<ph name="KEY_PATH" />'. Dit is waarschijnlijk niet je bedoeling.</translation>
diff --git a/extensions/strings/extensions_strings_or.xtb b/extensions/strings/extensions_strings_or.xtb
index 5557e53..366d175 100644
--- a/extensions/strings/extensions_strings_or.xtb
+++ b/extensions/strings/extensions_strings_or.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">ଓହ୍! ଅନିୟମିତ RSA ବ୍ୟକ୍ତିଗତ କୀ ସୃଷ୍ଟି କରିହେଲା ନାହିଁ।</translation>
 <translation id="1445572445564823378">ଏହି ଏକ୍ସଟେନ୍‌ସନ୍‌ଟି <ph name="PRODUCT_NAME" />କୁ ଧୀର କରିଦେଉଛି। <ph name="PRODUCT_NAME" />ର କାର୍ଯ୍ୟଦକ୍ଷତାକୁ ରିଷ୍ଟୋର୍ କରିବା ପାଇଁ ଆପଣ ଏହାକୁ ଅକ୍ଷମ କରିଦେବା ଉଚିତ୍।</translation>
 <translation id="1468038450257740950">WebGL ସମର୍ଥନ କରୁନାହିଁ।</translation>
+<translation id="1610570795592207282">ସ୍କ୍ରିପ୍ଟ ପାଇଁ css '<ph name="RELATIVE_PATH" />'କୁ ଲୋଡ କରାଯାଇପାରିଲା ନାହିଁ।</translation>
 <translation id="1803557475693955505">'<ph name="BACKGROUND_PAGE" />' ପୃଷ୍ଠପଟ ପୃଷ୍ଠା ଲୋଡ୍‌ ହୋଇପାରିଲା ନାହିଁ।</translation>
 <translation id="2159915644201199628">ଛବି ଡିକୋଡ୍ କରିପାରିଲା ନାହିଁ: '<ph name="IMAGE_NAME" />'</translation>
 <translation id="2350172092385603347">ସ୍ଥାନୀୟକରଣ ବ୍ୟବହାର କରାଯାଇଛି, କିନ୍ତୁ ମାନିଫେଷ୍ଟରେ default_locale ନିର୍ଦ୍ଦିଷ୍ଟ କରାଯାଇନାହିଁ।</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">ସାର୍ବଜନିକ କୀ'କୁ ଏକ୍ସପୋର୍ଟ କରିବାରେ ବିଫଳ ହେଲା।</translation>
 <translation id="5026754133087629784">ୱେବ୍‌ଭ୍ୟୁ: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">ପ୍ୟାକ୍ କରିବା ପାଇଁ ଡିରେକ୍ଟୋରୀକୁ ପୂର୍ଣ୍ଣ ପଥ ମିଳୁନାହିଁ।</translation>
+<translation id="5160071981665899014">ସ୍କ୍ରିପ୍ଟ ପାଇଁ javascript '<ph name="RELATIVE_PATH" />'କୁ ଲୋଡ କରାଯାଇପାରିଲା ନାହିଁ।</translation>
 <translation id="5356315618422219272">Appview: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">ଆକାର ଦେବା ୱିଣ୍ଡୋ ସମର୍ଥିତ ନୁହେଁ।</translation>
 <translation id="5456409301717116725">ଏହି ଏକ୍ସଟେସନ୍‌ରେ କୀ ଫାଇଲ୍ '<ph name="KEY_PATH" />' ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି। ସମ୍ଭବତଃ ଆପଣ ତାହା କରିବାକୁ ଚାହାଁନ୍ତି ନାହିଁ।</translation>
diff --git a/extensions/strings/extensions_strings_sw.xtb b/extensions/strings/extensions_strings_sw.xtb
index 91835e38..38f9f03 100644
--- a/extensions/strings/extensions_strings_sw.xtb
+++ b/extensions/strings/extensions_strings_sw.xtb
@@ -8,6 +8,7 @@
 <translation id="1420684932347524586">Lo! Imeshindwa kuzindua ufunguo binafsi wa RSA usio na utaratibu.</translation>
 <translation id="1445572445564823378">Kiendelezi hiki kinapunguza kasi ya <ph name="PRODUCT_NAME" />. Unafa kukilemaza ili kurejesha upya utendaji wa <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1468038450257740950">WebGL haihimiliwi.</translation>
+<translation id="1610570795592207282">Imeshindwa kupakia css ya '<ph name="RELATIVE_PATH" />' kwa hati.</translation>
 <translation id="1803557475693955505">Ukurasa wa mandhari '<ph name="BACKGROUND_PAGE" />' haukuweza kupakiwa.</translation>
 <translation id="2159915644201199628">Isingeweza kusimbua picha: '<ph name="IMAGE_NAME" />'</translation>
 <translation id="2350172092385603347">Usanidi wa eneo umetumiwa, lakini eneo_chaguo-msingi halikubainishwa katika ratiba</translation>
@@ -31,6 +32,7 @@
 <translation id="4988792151665380515">Imeshindwa kuhamisha ufunguo wa umma.</translation>
 <translation id="5026754133087629784">Mwonekano wa wavuti: <ph name="WEBVIEW_TAG_NAME" /></translation>
 <translation id="5098647635849512368">Haiwezi kupata kijia kamili katika saraka hadi kifurushi.</translation>
+<translation id="5160071981665899014">Imeshindwa kupakia javascript ya '<ph name="RELATIVE_PATH" />' kwa hati.</translation>
 <translation id="5356315618422219272">Mwonekano wa programu: <ph name="APPVIEW_TAG_NAME" /></translation>
 <translation id="5436430103864390185">Madirisha yaliyo na umbo hayatumiki.</translation>
 <translation id="5456409301717116725">Kiendelezi hiki kinajumuisha faili muhimu '<ph name="KEY_PATH" />'. Huenda hutaki kufanya hivyo.</translation>
diff --git a/gpu/command_buffer/client/shared_image_interface.cc b/gpu/command_buffer/client/shared_image_interface.cc
index fad286e0..ce1bc54 100644
--- a/gpu/command_buffer/client/shared_image_interface.cc
+++ b/gpu/command_buffer/client/shared_image_interface.cc
@@ -110,12 +110,6 @@
 }
 
 std::unique_ptr<SharedImageInterface::ScopedMapping>
-SharedImageInterface::MapSharedImage(const Mailbox& mailbox) {
-  NOTIMPLEMENTED();
-  return nullptr;
-}
-
-std::unique_ptr<SharedImageInterface::ScopedMapping>
 SharedImageInterface::MapSharedImage(
     const scoped_refptr<ClientSharedImage>& client_shared_image) {
   NOTIMPLEMENTED();
diff --git a/gpu/command_buffer/client/shared_image_interface.h b/gpu/command_buffer/client/shared_image_interface.h
index 3a2085ed..8a68fe9 100644
--- a/gpu/command_buffer/client/shared_image_interface.h
+++ b/gpu/command_buffer/client/shared_image_interface.h
@@ -366,12 +366,8 @@
   // set to do CPU READ/WRITE) and returns a ScopedMapping object which can be
   // used to read/write to the CPU mapped memory. Mailbox must have been created
   // with CPU_READ/CPU_WRITE usage. Note that this call can be blocking
-  // and blocks on the clients thread only the first time for a given |mailbox|.
-  virtual std::unique_ptr<SharedImageInterface::ScopedMapping> MapSharedImage(
-      const Mailbox& mailbox);
-
-  // Same behavior as the above, except that this version takes
-  // a |client_shared_image| parameter (which holds a mailbox).
+  // and blocks on the clients thread only the first time for a given
+  // |client_shared_image|.
   virtual std::unique_ptr<SharedImageInterface::ScopedMapping> MapSharedImage(
       const scoped_refptr<ClientSharedImage>& client_shared_image);
 
diff --git a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
index 6642373..70f4e43 100644
--- a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
@@ -26,6 +26,7 @@
 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
 #include "gpu/command_buffer/common/shared_image_usage.h"
 #include "gpu/command_buffer/service/ahardwarebuffer_utils.h"
+#include "gpu/command_buffer/service/dawn_context_provider.h"
 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
 #include "gpu/command_buffer/service/memory_tracking.h"
 #include "gpu/command_buffer/service/shared_context_state.h"
@@ -36,6 +37,7 @@
 #include "gpu/command_buffer/service/shared_image/shared_image_backing.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_representation.h"
 #include "gpu/command_buffer/service/shared_image/skia_gl_image_representation.h"
+#include "gpu/command_buffer/service/shared_image/skia_graphite_dawn_image_representation.h"
 #include "gpu/command_buffer/service/shared_image/skia_vk_android_image_representation.h"
 #include "gpu/command_buffer/service/skia_utils.h"
 #include "gpu/command_buffer/service/texture_manager.h"
@@ -228,6 +230,11 @@
   ProduceGLTexturePassthrough(SharedImageManager* manager,
                               MemoryTypeTracker* tracker) override;
 
+  std::unique_ptr<SkiaGraphiteImageRepresentation> ProduceSkiaGraphite(
+      SharedImageManager* manager,
+      MemoryTypeTracker* tracker,
+      scoped_refptr<SharedContextState> context_state) override;
+
   std::unique_ptr<SkiaGaneshImageRepresentation> ProduceSkiaGanesh(
       SharedImageManager* manager,
       MemoryTypeTracker* tracker,
@@ -442,6 +449,38 @@
       manager, this, tracker, std::move(egl_image), std::move(texture));
 }
 
+std::unique_ptr<SkiaGraphiteImageRepresentation>
+AHardwareBufferImageBacking::ProduceSkiaGraphite(
+    SharedImageManager* manager,
+    MemoryTypeTracker* tracker,
+    scoped_refptr<SharedContextState> context_state) {
+  CHECK(context_state);
+  CHECK(context_state->graphite_context());
+  CHECK(context_state->gr_context_type() == GrContextType::kGraphiteDawn);
+#if BUILDFLAG(SKIA_USE_DAWN)
+  auto device = context_state->dawn_context_provider()->GetDevice();
+  auto backend_type = context_state->dawn_context_provider()->backend_type();
+  auto dawn_representation =
+      ProduceDawn(manager, tracker, device, backend_type, /*view_formats=*/{});
+  if (!dawn_representation) {
+    LOG(ERROR) << "Could not create Dawn Representation";
+    return nullptr;
+  }
+
+  // Use GPU main recorder since this should only be called for
+  // fulfilling Graphite promise images on GPU main thread.
+  // NOTE: AHardwareBufferImageBacking doesn't support multiplanar formats,
+  // so there is no need to specify the `is_yuv_plane` or
+  // `legacy_plane_index` optional parameters.
+  return SkiaGraphiteDawnImageRepresentation::Create(
+      std::move(dawn_representation), context_state,
+      context_state->gpu_main_graphite_recorder(), manager, this, tracker);
+#else
+  NOTREACHED();
+  return nullptr;
+#endif
+}
+
 std::unique_ptr<SkiaGaneshImageRepresentation>
 AHardwareBufferImageBacking::ProduceSkiaGanesh(
     SharedImageManager* manager,
diff --git a/gpu/command_buffer/service/shared_image_interface_in_process.cc b/gpu/command_buffer/service/shared_image_interface_in_process.cc
index b4f7b5e8..4762286 100644
--- a/gpu/command_buffer/service/shared_image_interface_in_process.cc
+++ b/gpu/command_buffer/service/shared_image_interface_in_process.cc
@@ -434,8 +434,10 @@
   return raw_gpu_memory_buffer;
 }
 
-std::unique_ptr<SharedImageInterface::ScopedMapping>
-SharedImageInterfaceInProcess::MapSharedImage(const Mailbox& mailbox) {
+std::unique_ptr<gpu::SharedImageInterface::ScopedMapping>
+SharedImageInterfaceInProcess::MapSharedImage(
+    const scoped_refptr<gpu::ClientSharedImage>& client_shared_image) {
+  const auto& mailbox = client_shared_image->mailbox();
   auto* gpu_memory_buffer = GetGpuMemoryBuffer(mailbox);
   if (!gpu_memory_buffer) {
     LOG(ERROR) << "Buffer is null.";
@@ -452,12 +454,6 @@
   return scoped_mapping;
 }
 
-std::unique_ptr<gpu::SharedImageInterface::ScopedMapping>
-SharedImageInterfaceInProcess::MapSharedImage(
-    const scoped_refptr<gpu::ClientSharedImage>& client_shared_image) {
-  return MapSharedImage(client_shared_image->mailbox());
-}
-
 void SharedImageInterfaceInProcess::GetGpuMemoryBufferHandleInfoOnGpuThread(
     const Mailbox& mailbox,
     gfx::GpuMemoryBufferHandle* handle,
diff --git a/gpu/command_buffer/service/shared_image_interface_in_process.h b/gpu/command_buffer/service/shared_image_interface_in_process.h
index 00bec023..8eb8c32 100644
--- a/gpu/command_buffer/service/shared_image_interface_in_process.h
+++ b/gpu/command_buffer/service/shared_image_interface_in_process.h
@@ -95,8 +95,6 @@
       base::StringPiece debug_label,
       SurfaceHandle surface_handle,
       gfx::BufferUsage buffer_usage) override;
-  std::unique_ptr<SharedImageInterface::ScopedMapping> MapSharedImage(
-      const Mailbox& mailbox) override;
   std::unique_ptr<gpu::SharedImageInterface::ScopedMapping> MapSharedImage(
       const scoped_refptr<gpu::ClientSharedImage>& client_shared_image)
       override;
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 2c9b514..eb0b4979a 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1364,6 +1364,16 @@
     required_features.push_back(wgpu::FeatureName::DawnMultiPlanarFormats);
   }
 
+  // Require platform-specific SharedTextureMemory features for use by
+  // the relevant SharedImage backings. These features should always be
+  // supported when running on the corresponding backend.
+  if (adapter_obj.HasFeature(wgpu::FeatureName::SharedTextureMemoryIOSurface)) {
+    CHECK(adapter_obj.HasFeature(wgpu::FeatureName::SharedFenceMTLSharedEvent));
+    required_features.push_back(
+        wgpu::FeatureName::SharedTextureMemoryIOSurface);
+    required_features.push_back(wgpu::FeatureName::SharedFenceMTLSharedEvent);
+  }
+
 #if BUILDFLAG(USE_DAWN) && BUILDFLAG(DAWN_ENABLE_BACKEND_OPENGLES)
   // On Desktop GL via ANGLE, require GL texture sharing.
   if (use_webgpu_adapter_ == WebGPUAdapterName::kOpenGLES &&
diff --git a/gpu/ipc/client/client_shared_image_interface.cc b/gpu/ipc/client/client_shared_image_interface.cc
index 83d6f9c..0faf04c 100644
--- a/gpu/ipc/client/client_shared_image_interface.cc
+++ b/gpu/ipc/client/client_shared_image_interface.cc
@@ -261,7 +261,9 @@
 }
 
 std::unique_ptr<SharedImageInterface::ScopedMapping>
-ClientSharedImageInterface::MapSharedImage(const Mailbox& mailbox) {
+ClientSharedImageInterface::MapSharedImage(
+    const scoped_refptr<gpu::ClientSharedImage>& client_shared_image) {
+  const auto& mailbox = client_shared_image->mailbox();
   gfx::GpuMemoryBuffer* gpu_memory_buffer = nullptr;
   {
     base::AutoLock lock(lock_);
@@ -285,12 +287,6 @@
   return scoped_mapping;
 }
 
-std::unique_ptr<gpu::SharedImageInterface::ScopedMapping>
-ClientSharedImageInterface::MapSharedImage(
-    const scoped_refptr<gpu::ClientSharedImage>& client_shared_image) {
-  return MapSharedImage(client_shared_image->mailbox());
-}
-
 uint32_t ClientSharedImageInterface::UsageForMailbox(const Mailbox& mailbox) {
   return proxy_->UsageForMailbox(mailbox);
 }
diff --git a/gpu/ipc/client/client_shared_image_interface.h b/gpu/ipc/client/client_shared_image_interface.h
index fb76bc6..495c9b1 100644
--- a/gpu/ipc/client/client_shared_image_interface.h
+++ b/gpu/ipc/client/client_shared_image_interface.h
@@ -120,8 +120,6 @@
                                  const Mailbox& mailbox,
                                  uint32_t usage) override;
 
-  std::unique_ptr<SharedImageInterface::ScopedMapping> MapSharedImage(
-      const Mailbox& mailbox) override;
   std::unique_ptr<gpu::SharedImageInterface::ScopedMapping> MapSharedImage(
       const scoped_refptr<gpu::ClientSharedImage>& client_shared_image)
       override;
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index fda93216..b3afe22e 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -98679,7 +98679,7 @@
       name: "mac_optional_gpu_tests_rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac_optional_gpu_tests_rel"
-      dimensions: "cpu:x86-64"
+      dimensions: "cpu:arm64"
       dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
index a615664..bc66324e 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -733,6 +733,7 @@
         ),
         build_gs_bucket = "chromium-gpu-fyi-archive",
     ),
+    cpu = cpu.ARM64,
     ssd = None,
     main_list_view = "try",
     tryjob = try_.job(
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 7cac771..9ed2f50 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -3947,6 +3947,9 @@
       <message name="IDS_IOS_SETTINGS_TITLE" desc="Title for the settings panel [iOS].">
         Settings
       </message>
+      <message name="IDS_IOS_SETTING_IPH_SIGNIN" desc="Message for an IPH shown after users signs-in from the sign-in row in settings page. It informs the users that they can control all their data type synchronization to their account from a single page.">
+        You can now control all your account settings in one place
+      </message>
       <message name="IDS_IOS_SETTING_OFF" desc="Generic status label displayed in Settings to show that a setting is currently turned off. [Length: 5em] [iOS only]" meaning="The setting is off.">
         Off
       </message>
@@ -5264,6 +5267,12 @@
       <message name="IDS_IOS_SIGNIN_PROMO_RECENT_TABS_WITH_UNITY" desc="Text to inform the user that they can sign in and sync to get tabs shared between devices. [iOS only]">
         To get your tabs from your other devices, turn on sync.
       </message>
+      <message name="IDS_IOS_SIGNIN_PROMO_REVIEW_BOOKMARKS_SETTINGS" desc="This string is on a promo intended to promote reviewing the user's Google Account settings page to enable bookmarks toggle. It appears on the Bookmarks page when the user is signed in not syncing.">
+        To get your bookmarks on all your devices, turn on “Bookmarks” in settings.
+      </message>
+      <message name="IDS_IOS_SIGNIN_PROMO_REVIEW_SETTINGS_BUTTON" desc="This string is on a promo button intended to promote reviewing the user's Google Account settings page to enable the type toggle. It appears on the Bookmarks or Reading List page when the user is signed in not syncing.">
+        Open Settings
+      </message>
       <message name="IDS_IOS_SIGNIN_SNACKBAR_SIGNED_IN_AS" desc="This confirmation message is intended to help users understand that they have signed in to Chrome with their Google Account. The confirmation message appears at the bottom of the Bookmarks page after users choose an account to sign in to. The tone should be informative. [iOS only]">
         Signed in as <ph name="USER_EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTING_IPH_SIGNIN.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTING_IPH_SIGNIN.png.sha1
new file mode 100644
index 0000000..69e032a2
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTING_IPH_SIGNIN.png.sha1
@@ -0,0 +1 @@
+d9e068c5005543b9a6fd76cc0d8aa3da04f7743c
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_PROMO_REVIEW_BOOKMARKS_SETTINGS.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_PROMO_REVIEW_BOOKMARKS_SETTINGS.png.sha1
new file mode 100644
index 0000000..f7497afc
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_PROMO_REVIEW_BOOKMARKS_SETTINGS.png.sha1
@@ -0,0 +1 @@
+4d4ad52d7b8a7024962a2205d286c04f0b5e0184
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_PROMO_REVIEW_SETTINGS_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_PROMO_REVIEW_SETTINGS_BUTTON.png.sha1
new file mode 100644
index 0000000..f7497afc
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_PROMO_REVIEW_SETTINGS_BUTTON.png.sha1
@@ -0,0 +1 @@
+4d4ad52d7b8a7024962a2205d286c04f0b5e0184
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
index 51e5669b..02dd9c6 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
@@ -100,7 +100,7 @@
 <translation id="4453284704333523777">Kelola Setelan Chrome</translation>
 <translation id="4471662743048412085">Lacak Paket yang Terdeteksi di Chrome</translation>
 <translation id="4508370294876102450">Buka Chrome dari Aplikasi Apa Saja</translation>
-<translation id="4523886039239821078">Beberapa pengaya (pengaya) menyebabkan Chrome mogok. Uninstal:</translation>
+<translation id="4523886039239821078">Beberapa add-on (add-on) menyebabkan Chrome mogok. Uninstal:</translation>
 <translation id="4633328489441962921">Chrome tidak dapat memeriksa update</translation>
 <translation id="4636900170638246267">Login ke situs ini dan Chrome.</translation>
 <translation id="4761869838909035636">Jalankan Pemeriksaan Keamanan Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index 331156a..e965e31 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Göstərin</translation>
 <translation id="5317780077021120954">Yadda saxlayın</translation>
 <translation id="5318298563956633672">Hazırda bu məhsulu izləyirsiniz.</translation>
+<translation id="5329451663851195956">Təzələmək üçün aşağı çəkə bilərsiniz.</translation>
 <translation id="5339316356165661760">Sinxronizasiyanı aktiv edin</translation>
 <translation id="5345598430982201510">Bağlamaları avtomatik aşkarlamayın</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Bu paket izlənsin?}other{{COUNT} paket izlənsin?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
index 4897d74e..48cf731b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Prikaži</translation>
 <translation id="5317780077021120954">Sačuvaj</translation>
 <translation id="5318298563956633672">Već pratite ovaj proizvod.</translation>
+<translation id="5329451663851195956">Možete povući prema dolje radi osvježavanja.</translation>
 <translation id="5339316356165661760">Uključi sinhronizaciju</translation>
 <translation id="5345598430982201510">Nikada nemoj automatski otkrivati pakete</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Pratiti ovaj paket?}one{Pratiti {COUNT} paket?}few{Pratiti {COUNT} paketa?}other{Pratiti {COUNT} paketa?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 02b9def..80bf0289a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Ipakita</translation>
 <translation id="5317780077021120954">I-save</translation>
 <translation id="5318298563956633672">Sinusubaybayan mo na ang produktong ito.</translation>
+<translation id="5329451663851195956">Puwede kang mag-swipe pababa para mag-refresh.</translation>
 <translation id="5339316356165661760">I-on ang Pag-sync</translation>
 <translation id="5345598430982201510">Huwag Awtomatikong Mag-detect ng Mga Package</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Subaybayan ang Package na Ito?}one{Subaybayan ang {COUNT} Package?}other{Subaybayan ang {COUNT} na Package?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index c1170798..1d7c91a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">બતાવો</translation>
 <translation id="5317780077021120954">સાચવો</translation>
 <translation id="5318298563956633672">તમે આ પ્રોડક્ટને પહેલેથી જ ટ્રૅક કરી રહ્યાં છો.</translation>
+<translation id="5329451663851195956">રિફ્રેશ કરવા માટે નીચે તરફ ખેંચી શકો છો.</translation>
 <translation id="5339316356165661760">સિંક કરવાનું ચાલુ કરો</translation>
 <translation id="5345598430982201510">પૅકેજની ક્યારેય ઑટોમૅટિક રીતે ભાળ મેળવશો નહીં</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{શું આ પૅકેજને ટ્રૅક કરીએ?}one{{COUNT} પૅકેજને ટ્રૅક કરીએ?}other{{COUNT} પૅકેજને ટ્રૅક કરીએ?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 13844da..edb82cf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Prikaži</translation>
 <translation id="5317780077021120954">Spremi</translation>
 <translation id="5318298563956633672">Već pratite ovaj proizvod.</translation>
+<translation id="5329451663851195956">Možete povući prema dolje radi osvježavanja.</translation>
 <translation id="5339316356165661760">Uključi sinkronizaciju</translation>
 <translation id="5345598430982201510">Nikad automatski ne otkrivaj pakete</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Pratiti taj paket?}one{Pratiti {COUNT} paket?}few{Pratiti {COUNT} paketa?}other{Pratiti {COUNT} paketa?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index 78edae98..413cc169 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Megjelenítés</translation>
 <translation id="5317780077021120954">Mentés</translation>
 <translation id="5318298563956633672">Ön már nyomon követi ezt a terméket.</translation>
+<translation id="5329451663851195956">Az oldalt ujja lefelé húzásával frissítheti.</translation>
 <translation id="5339316356165661760">Szinkronizálás bekapcsolása</translation>
 <translation id="5345598430982201510">Ne észlelje a rendszer automatikusan a csomagokat</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Nyomon követi ezt a csomagot?}other{Nyomon követi ezt a(z) {COUNT} csomagot?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index 5763b6e0..5c4a080e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">הצגה</translation>
 <translation id="5317780077021120954">שמירה</translation>
 <translation id="5318298563956633672">כבר מתבצע מעקב אחר המוצר הזה.</translation>
+<translation id="5329451663851195956">אפשר למשוך למטה כדי לרענן.</translation>
 <translation id="5339316356165661760">הפעלת הסנכרון</translation>
 <translation id="5345598430982201510">ללא זיהוי אוטומטי של חבילות</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{לעקוב אחרי החבילה הזו?}one{לעקוב אחרי {COUNT} חבילות?}two{לעקוב אחרי {COUNT} חבילות?}other{לעקוב אחרי {COUNT} חבילות?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index 0647387..61b77e0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Харуулах</translation>
 <translation id="5317780077021120954">Хадгалах</translation>
 <translation id="5318298563956633672">Та энэ бүтээгдэхүүнийг аль хэдийн хянаж байна.</translation>
+<translation id="5329451663851195956">Та одоо сэргээхийн тулд доош татах боломжтой.</translation>
 <translation id="5339316356165661760">Синк хийхийг асаах</translation>
 <translation id="5345598430982201510">Илгээмжүүдийг хэзээ ч бүү автоматаар илрүүл</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Энэ илгээмжийг хянах уу?}other{{COUNT} илгээмжийг хянах уу?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index c2b5acf..ed555b386 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Paparkan</translation>
 <translation id="5317780077021120954">Simpan</translation>
 <translation id="5318298563956633672">Anda telah menjejaki produk ini.</translation>
+<translation id="5329451663851195956">Anda boleh menarik ke bawah untuk menyegarkan semula.</translation>
 <translation id="5339316356165661760">Hidupkan Penyegerakan</translation>
 <translation id="5345598430982201510">Jangan sesekali Mengesan Pakej Secara Automatik</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Jejaki Pakej Ini?}other{Jejaki {COUNT} Pakej?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 87541f0..bbdf263 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Tonen</translation>
 <translation id="5317780077021120954">Opslaan</translation>
 <translation id="5318298563956633672">Je volgt dit product al.</translation>
+<translation id="5329451663851195956">Je kunt omlaag swipen om te vernieuwen.</translation>
 <translation id="5339316356165661760">Synchronisatie aanzetten</translation>
 <translation id="5345598430982201510">Pakketten nooit automatisch opsporen</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Dit pakket volgen?}other{{COUNT} pakketten volgen?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index 13c6a89..b588e46 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">ପ୍ରଦର୍ଶନ କରନ୍ତୁ</translation>
 <translation id="5317780077021120954">ସଞ୍ଚୟ</translation>
 <translation id="5318298563956633672">ଆପଣ ପୂର୍ବରୁ ଏହି ପ୍ରଡକ୍ଟକୁ ଟ୍ରାକ କରୁଛନ୍ତି।</translation>
+<translation id="5329451663851195956">ରିଫ୍ରେସ କରିବାକୁ ଆପଣ ତଳକୁ ଟାଣିପାରିବେ।</translation>
 <translation id="5339316356165661760">ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ</translation>
 <translation id="5345598430982201510">ପେକେଜଗୁଡ଼ିକୁ କେବେ ବି ସ୍ୱତଃ-ଚିହ୍ନଟ କରନ୍ତୁ ନାହିଁ</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{ଏହି ପେକେଜକୁ ଟ୍ରାକ କରିବେ?}other{{COUNT} ପେକେଜକୁ ଟ୍ରାକ କରିବେ?}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 5cd26d5..1d9d86f0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -819,6 +819,7 @@
 <translation id="5300589172476337783">Onyesha</translation>
 <translation id="5317780077021120954">Hifadhi</translation>
 <translation id="5318298563956633672">Tayari unafuatilia bidhaa hii.</translation>
+<translation id="5329451663851195956">Unaweza kuvuta chini ili uonyeshe upya.</translation>
 <translation id="5339316356165661760">Washa Kipengele cha Kusawazisha</translation>
 <translation id="5345598430982201510">Kamwe Usigundue Vifurushi Kiotomatiki</translation>
 <translation id="5345660046352249607">{COUNT,plural, =1{Ungependa Kufuatilia Kifurushi Hiki?}other{Ungependa Kufuatilia Vifurushi {COUNT}?}}</translation>
diff --git a/ios/chrome/browser/browser_state/model/BUILD.gn b/ios/chrome/browser/browser_state/model/BUILD.gn
index e639bb13..a95a5d06 100644
--- a/ios/chrome/browser/browser_state/model/BUILD.gn
+++ b/ios/chrome/browser/browser_state/model/BUILD.gn
@@ -121,6 +121,7 @@
     "//ios/chrome/browser/sessions",
     "//ios/chrome/browser/sessions:session_restoration_service_factory",
     "//ios/chrome/browser/shared/model/application_context",
+    "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/model/browser_state",
     "//ios/chrome/browser/shared/model/paths",
     "//ios/chrome/browser/shared/model/prefs:browser_prefs",
diff --git a/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm
index 81eb16f..d463878 100644
--- a/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm
+++ b/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm
@@ -69,6 +69,7 @@
 #import "ios/chrome/browser/search_engines/model/template_url_service_factory.h"
 #import "ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h"
 #import "ios/chrome/browser/sessions/session_restoration_service_factory.h"
+#import "ios/chrome/browser/shared/model/browser/browser_list_factory.h"
 #import "ios/chrome/browser/signin/model/about_signin_internals_factory.h"
 #import "ios/chrome/browser/signin/model/account_consistency_service_factory.h"
 #import "ios/chrome/browser/signin/model/account_reconcilor_factory.h"
@@ -144,6 +145,7 @@
   AuthenticationServiceFactory::GetInstance();
   BreadcrumbManagerKeyedServiceFactory::GetInstance();
   BrowserDownloadServiceFactory::GetInstance();
+  BrowserListFactory::GetInstance();
   BrowsingDataRemoverFactory::GetInstance();
   ChromeAccountManagerServiceFactory::GetInstance();
   ChromePasswordProtectionServiceFactory::GetInstance();
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_service.h b/ios/chrome/browser/credential_provider/model/credential_provider_service.h
index 938c7d0..8c47954e 100644
--- a/ios/chrome/browser/credential_provider/model/credential_provider_service.h
+++ b/ios/chrome/browser/credential_provider/model/credential_provider_service.h
@@ -125,9 +125,6 @@
   MemoryCredentialStore* GetCredentialStore(
       password_manager::PasswordStoreInterface* store) const;
 
-  // The pref service.
-  const raw_ptr<PrefService> prefs_;
-
   // The interfaces for getting and manipulating a user's saved passwords.
   const scoped_refptr<password_manager::PasswordStoreInterface>
       profile_password_store_;
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_service.mm b/ios/chrome/browser/credential_provider/model/credential_provider_service.mm
index 2140065b..e8658a2 100644
--- a/ios/chrome/browser/credential_provider/model/credential_provider_service.mm
+++ b/ios/chrome/browser/credential_provider/model/credential_provider_service.mm
@@ -130,8 +130,7 @@
     syncer::SyncService* sync_service,
     password_manager::AffiliationService* affiliation_service,
     FaviconLoader* favicon_loader)
-    : prefs_(prefs),
-      profile_password_store_(profile_password_store),
+    : profile_password_store_(profile_password_store),
       account_password_store_(account_password_store),
       identity_manager_(identity_manager),
       sync_service_(sync_service),
@@ -295,7 +294,7 @@
 
 void CredentialProviderService::UpdateUserEmail() {
   std::optional accountForSaving =
-      password_manager::sync_util::GetAccountForSaving(prefs_, sync_service_);
+      password_manager::sync_util::GetAccountForSaving(sync_service_);
   [app_group::GetGroupUserDefaults()
       setObject:accountForSaving ? base::SysUTF8ToNSString(*accountForSaving)
                                  : nil
diff --git a/ios/chrome/browser/google/model/BUILD.gn b/ios/chrome/browser/google/model/BUILD.gn
new file mode 100644
index 0000000..776f9aa
--- /dev/null
+++ b/ios/chrome/browser/google/model/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright 2023 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("google_logo") {
+  sources = [
+    "google_logo_service.h",
+    "google_logo_service_factory.h",
+  ]
+  public_deps = [ "//ios/chrome/browser/google" ]
+}
diff --git a/ios/chrome/browser/google/model/google_logo_service.h b/ios/chrome/browser/google/model/google_logo_service.h
new file mode 100644
index 0000000..a02b79be
--- /dev/null
+++ b/ios/chrome/browser/google/model/google_logo_service.h
@@ -0,0 +1,10 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_GOOGLE_MODEL_GOOGLE_LOGO_SERVICE_H_
+#define IOS_CHROME_BROWSER_GOOGLE_MODEL_GOOGLE_LOGO_SERVICE_H_
+
+#import "ios/chrome/browser/google/google_logo_service.h"
+
+#endif  // IOS_CHROME_BROWSER_GOOGLE_MODEL_GOOGLE_LOGO_SERVICE_H_
diff --git a/ios/chrome/browser/google/model/google_logo_service_factory.h b/ios/chrome/browser/google/model/google_logo_service_factory.h
new file mode 100644
index 0000000..71ab572
--- /dev/null
+++ b/ios/chrome/browser/google/model/google_logo_service_factory.h
@@ -0,0 +1,10 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_GOOGLE_MODEL_GOOGLE_LOGO_SERVICE_FACTORY_H_
+#define IOS_CHROME_BROWSER_GOOGLE_MODEL_GOOGLE_LOGO_SERVICE_FACTORY_H_
+
+#import "ios/chrome/browser/google/google_logo_service_factory.h"
+
+#endif  // IOS_CHROME_BROWSER_GOOGLE_MODEL_GOOGLE_LOGO_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/intents/user_activity_browser_agent_unittest.mm b/ios/chrome/browser/intents/user_activity_browser_agent_unittest.mm
index 4976939..3fecce55 100644
--- a/ios/chrome/browser/intents/user_activity_browser_agent_unittest.mm
+++ b/ios/chrome/browser/intents/user_activity_browser_agent_unittest.mm
@@ -51,6 +51,7 @@
 #import "ios/chrome/common/intents/OpenInChromeIntent.h"
 #import "ios/chrome/common/intents/OpenLatestTabIntent.h"
 #import "ios/chrome/common/intents/OpenLensIntent.h"
+#import "ios/chrome/common/intents/OpenNewIncognitoTabIntent.h"
 #import "ios/chrome/common/intents/OpenNewTabIntent.h"
 #import "ios/chrome/common/intents/OpenReadingListIntent.h"
 #import "ios/chrome/common/intents/OpenRecentTabsIntent.h"
@@ -992,6 +993,29 @@
             [connection_information_ startupParameters].postOpeningAction);
 }
 
+// Tests that Chrome respond to open a new incognito tab.
+TEST_F(UserActivityBrowserAgentTest,
+       ContinueUserActivityIntentOpenNewIncognitoTab) {
+  NSUserActivity* user_activity =
+      [[NSUserActivity alloc] initWithActivityType:kSiriOpenNewIncognitoTab];
+
+  OpenNewIncognitoTabIntent* intent = [[OpenNewIncognitoTabIntent alloc] init];
+  INInteraction* interaction = [[INInteraction alloc] initWithIntent:intent
+                                                            response:nil];
+  id mock_user_activity = CreateMockNSUserActivity(user_activity, interaction);
+
+  user_activity_browser_agent_->ContinueUserActivity(mock_user_activity, YES);
+
+  EXPECT_EQ(ApplicationModeForTabOpening::INCOGNITO,
+            [connection_information_ startupParameters].applicationMode);
+  EXPECT_EQ(GURL(kChromeUINewTabURL),
+            [connection_information_ startupParameters].completeURL);
+  EXPECT_EQ(GURL(kChromeUINewTabURL),
+            [connection_information_ startupParameters].externalURL);
+  EXPECT_EQ(NO_ACTION,
+            [connection_information_ startupParameters].postOpeningAction);
+}
+
 // Tests that Chrome respond to manage payment methods intent.
 TEST_F(UserActivityBrowserAgentTest,
        ContinueUserActivityIntentManagePaymentMethods) {
diff --git a/ios/chrome/browser/main/model/BUILD.gn b/ios/chrome/browser/main/model/BUILD.gn
index 29fcbf6..aba592d 100644
--- a/ios/chrome/browser/main/model/BUILD.gn
+++ b/ios/chrome/browser/main/model/BUILD.gn
@@ -75,6 +75,7 @@
     "//ios/chrome/browser/shared/model/browser_state:test_support",
     "//ios/chrome/browser/shared/model/web_state_list",
     "//ios/chrome/browser/snapshots/model",
+    "//ios/chrome/browser/snapshots/model:snapshot_id",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
     "//testing/gtest",
diff --git a/ios/chrome/browser/passwords/model/password_controller.mm b/ios/chrome/browser/passwords/model/password_controller.mm
index f19a7698..98aa3b1 100644
--- a/ios/chrome/browser/passwords/model/password_controller.mm
+++ b/ios/chrome/browser/passwords/model/password_controller.mm
@@ -446,7 +446,7 @@
   syncer::SyncService* syncService =
       SyncServiceFactory::GetForBrowserState(self.browserState);
   const std::optional<std::string> accountToStorePassword =
-      password_manager::sync_util::GetAccountForSaving(prefs, syncService);
+      password_manager::sync_util::GetAccountForSaving(syncService);
   const password_manager::features_util::PasswordAccountStorageUserState
       accountStorageUserState = password_manager::features_util::
           ComputePasswordAccountStorageUserState(prefs, syncService);
diff --git a/ios/chrome/browser/providers/signin/chromium_choice.mm b/ios/chrome/browser/providers/signin/chromium_choice.mm
index 60bf9d71..54a272d 100644
--- a/ios/chrome/browser/providers/signin/chromium_choice.mm
+++ b/ios/chrome/browser/providers/signin/chromium_choice.mm
@@ -39,5 +39,10 @@
   return false;
 }
 
+bool IsSearchEngineChoiceScreenEnabledFre() {
+  // The feature is disabled on chromium
+  return false;
+}
+
 }  // namespace provider
 }  // namespace ios
diff --git a/ios/chrome/browser/snapshots/model/BUILD.gn b/ios/chrome/browser/snapshots/model/BUILD.gn
index 081081c1..a1e7098 100644
--- a/ios/chrome/browser/snapshots/model/BUILD.gn
+++ b/ios/chrome/browser/snapshots/model/BUILD.gn
@@ -6,7 +6,6 @@
   public = [
     "image_file_manager.h",
     "snapshot_browser_agent.h",
-    "snapshot_id.h",
     "snapshot_lru_cache.h",
     "snapshot_manager.h",
     "snapshot_manager_delegate.h",
@@ -27,6 +26,7 @@
   ]
   deps = [
     ":features",
+    ":snapshot_id",
     "//base",
     "//build:blink_buildflags",
     "//ios/chrome/browser/shared/model/browser",
@@ -46,6 +46,15 @@
   ]
 }
 
+source_set("snapshot_id") {
+  public = [
+    "snapshot_id.h",
+    "snapshot_id_wrapper.h",
+  ]
+  sources = [ "snapshot_id_wrapper.mm" ]
+  deps = [ "//base" ]
+}
+
 source_set("test_utils") {
   testonly = true
   sources = [
@@ -60,6 +69,7 @@
   sources = [
     "image_file_manager_unittest.mm",
     "snapshot_browser_agent_unittest.mm",
+    "snapshot_id_wrapper_unittest.mm",
     "snapshot_lru_cache_unittest.mm",
     "snapshot_storage_unittest.mm",
     "snapshot_tab_helper_unittest.mm",
@@ -67,6 +77,7 @@
   deps = [
     ":features",
     ":model",
+    ":snapshot_id",
     ":test_utils",
     "//base",
     "//base/test:test_support",
diff --git a/ios/chrome/browser/snapshots/model/snapshot_id_wrapper.h b/ios/chrome/browser/snapshots/model/snapshot_id_wrapper.h
new file mode 100644
index 0000000..a02cc3e7
--- /dev/null
+++ b/ios/chrome/browser/snapshots/model/snapshot_id_wrapper.h
@@ -0,0 +1,39 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_SNAPSHOTS_MODEL_SNAPSHOT_ID_WRAPPER_H_
+#define IOS_CHROME_BROWSER_SNAPSHOTS_MODEL_SNAPSHOT_ID_WRAPPER_H_
+
+#import <Foundation/Foundation.h>
+
+#ifdef __cplusplus
+#import "ios/chrome/browser/snapshots/model/snapshot_id.h"
+#endif
+
+// A Objective-C wrapper for SnapshotID to make it usable from Swift.
+@interface SnapshotIDWrapper : NSObject
+
+#ifdef __cplusplus
+- (instancetype)initWithSnapshotID:(SnapshotID)snapshot_id
+    NS_DESIGNATED_INITIALIZER;
+#endif
+- (instancetype)initWithIdentifier:(int32_t)identifier
+    NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
+
+#ifdef __cplusplus
+@property(nonatomic, readonly) SnapshotID snapshot_id;
+#endif
+
+@property(nonatomic, readonly) int32_t identifier;
+
+// Returns the hash value of `identifier`.
+- (NSUInteger)hash;
+
+// Returns true if this SnapshotIDWrapper is equal to `other`.
+- (BOOL)isEqual:(const SnapshotIDWrapper*)other;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_SNAPSHOTS_MODEL_SNAPSHOT_ID_WRAPPER_H_
diff --git a/ios/chrome/browser/snapshots/model/snapshot_id_wrapper.mm b/ios/chrome/browser/snapshots/model/snapshot_id_wrapper.mm
new file mode 100644
index 0000000..c954fd1d
--- /dev/null
+++ b/ios/chrome/browser/snapshots/model/snapshot_id_wrapper.mm
@@ -0,0 +1,48 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/snapshots/model/snapshot_id_wrapper.h"
+
+#import "base/apple/foundation_util.h"
+
+@implementation SnapshotIDWrapper {
+  SnapshotID snapshot_id_;
+}
+
+- (instancetype)initWithSnapshotID:(SnapshotID)snapshot_id {
+  if ((self = [super init])) {
+    snapshot_id_ = snapshot_id;
+  }
+  return self;
+}
+
+- (instancetype)initWithIdentifier:(int32_t)identifier {
+  if ((self = [super init])) {
+    snapshot_id_ = SnapshotID(identifier);
+  }
+  return self;
+}
+
+- (SnapshotID)snapshot_id {
+  return snapshot_id_;
+}
+
+- (int32_t)identifier {
+  return snapshot_id_.identifier();
+}
+
+- (NSUInteger)hash {
+  return std::hash<int32_t>{}(self.identifier);
+}
+
+- (BOOL)isEqual:(NSObject*)other {
+  if (![other isKindOfClass:[SnapshotIDWrapper class]]) {
+    return NO;
+  }
+
+  return self.snapshot_id ==
+         base::apple::ObjCCastStrict<SnapshotIDWrapper>(other).snapshot_id;
+}
+
+@end
diff --git a/ios/chrome/browser/snapshots/model/snapshot_id_wrapper_unittest.mm b/ios/chrome/browser/snapshots/model/snapshot_id_wrapper_unittest.mm
new file mode 100644
index 0000000..55539ee
--- /dev/null
+++ b/ios/chrome/browser/snapshots/model/snapshot_id_wrapper_unittest.mm
@@ -0,0 +1,52 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/snapshots/model/snapshot_id_wrapper.h"
+
+#import "testing/gtest_mac.h"
+#import "testing/platform_test.h"
+
+namespace {
+
+class SnapshotIDWrapperTest : public PlatformTest {};
+
+// Tests the comparison of 2 SnapshotIDWrappers with a same identifier.
+TEST_F(SnapshotIDWrapperTest, SameIdentifierWithDifferentInitializer) {
+  SnapshotIDWrapper* id1 =
+      [[SnapshotIDWrapper alloc] initWithSnapshotID:SnapshotID(42)];
+  SnapshotIDWrapper* id2 = [[SnapshotIDWrapper alloc] initWithIdentifier:42];
+
+  EXPECT_EQ([id1 identifier], [id2 identifier]);
+  EXPECT_NSEQ(id1, id2);
+  EXPECT_NE(id1, id2);
+}
+
+// Tests the comparison of 2 SnapshotIDWrappers with a different identifier.
+TEST_F(SnapshotIDWrapperTest, CompareSnapshotIDWrappers) {
+  SnapshotIDWrapper* id1 =
+      [[SnapshotIDWrapper alloc] initWithSnapshotID:SnapshotID(1)];
+  SnapshotIDWrapper* id2 = [[SnapshotIDWrapper alloc] initWithIdentifier:42];
+
+  EXPECT_NSNE(id1, id2);
+  EXPECT_NE(id1, id2);
+}
+
+// Tests that NSMutableSet works correctly with SnapshotIDWrapper.
+TEST_F(SnapshotIDWrapperTest, ReturnSameHashValueForSameIdentifier) {
+  SnapshotIDWrapper* id1 = [[SnapshotIDWrapper alloc] initWithIdentifier:42];
+  SnapshotIDWrapper* id2 = [[SnapshotIDWrapper alloc] initWithIdentifier:42];
+  SnapshotIDWrapper* id3 = [[SnapshotIDWrapper alloc] initWithIdentifier:43];
+
+  EXPECT_NSEQ(id1, id2);
+  EXPECT_NE(id1, id2);
+
+  // NSMutableSet uses `hash` method to identify a unique object.
+  NSMutableSet<SnapshotIDWrapper*>* set = [[NSMutableSet alloc] init];
+  [set addObject:id1];
+  [set addObject:id2];
+  [set addObject:id3];
+  EXPECT_EQ(set.count, 2ul);
+}
+
+}  // anonymous namespace
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
index f71ac26..ff854e6 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
@@ -482,7 +482,7 @@
       [self activateSigninWithAccountMode];
       return;
     case SigninPromoViewModeSignedInWithPrimaryAccount:
-      [self activateSyncWithPrimaryAccountMode];
+      [self activateSignedInWithPrimaryAccountMode];
       return;
   }
 }
@@ -769,8 +769,8 @@
   self.secondaryButton.hidden = NO;
 }
 
-// Updates promo for sync with account mode.
-- (void)activateSyncWithPrimaryAccountMode {
+// Updates promo for a signed-in account mode.
+- (void)activateSignedInWithPrimaryAccountMode {
   DCHECK_EQ(_mode, SigninPromoViewModeSignedInWithPrimaryAccount);
   self.secondaryButton.hidden = YES;
 }
@@ -799,7 +799,7 @@
       break;
     case SigninPromoViewModeSigninWithAccount:
     case SigninPromoViewModeSignedInWithPrimaryAccount:
-      [self.delegate signinPromoViewDidTapSigninWithDefaultAccount:self];
+      [self.delegate signinPromoViewDidTapPrimaryButtonWithDefaultAccount:self];
       break;
   }
 }
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm
index 2eace6f..65b0a275 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm
@@ -124,9 +124,10 @@
       break;
     }
     case SigninPromoViewModeSignedInWithPrimaryAccount: {
-      [signinPromoView
-          configurePrimaryButtonWithTitle:GetNSString(
-                                              IDS_IOS_SYNC_PROMO_TURN_ON_SYNC)];
+      [signinPromoView configurePrimaryButtonWithTitle:
+                           self.primaryButtonTitleOverride
+                               ? self.primaryButtonTitleOverride
+                               : GetNSString(IDS_IOS_SYNC_PROMO_TURN_ON_SYNC)];
       [self assignProfileImageToSigninPromoView:signinPromoView];
       break;
     }
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_delegate.h b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_delegate.h
index b43ca8a..fa16f0d 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_delegate.h
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_delegate.h
@@ -17,7 +17,8 @@
 
 // Called by SigninPromoView when the user taps the primary button with one
 // or more identities on the device.
-- (void)signinPromoViewDidTapSigninWithDefaultAccount:(SigninPromoView*)view;
+- (void)signinPromoViewDidTapPrimaryButtonWithDefaultAccount:
+    (SigninPromoView*)view;
 
 // Called by SigninPromoView when the user taps the secondary button with one
 // or more identities on the device.
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h
index 24490eb..ad40085 100644
--- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h
+++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h
@@ -59,6 +59,8 @@
   kInstantSignin,
   // Performs AuthenticationOperationSigninOnly.
   kSigninSheet,
+  // Shows account settings.
+  kReviewAccountSettings,
 };
 
 // Class that monitors the available identities and creates
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
index 0a8acb9..ab5ec784 100644
--- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
+++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
@@ -716,14 +716,26 @@
     }
     DCHECK(self.displayedIdentity)
         << base::SysNSStringToUTF8([self description]);
-    return [[SigninPromoViewConfigurator alloc]
-        initWithSigninPromoViewMode:
-            SigninPromoViewModeSignedInWithPrimaryAccount
-                          userEmail:self.displayedIdentity.userEmail
-                      userGivenName:self.displayedIdentity.userGivenName
-                          userImage:self.displayedIdentityAvatar
-                     hasCloseButton:hasCloseButton
-                   hasSignInSpinner:self.showSpinner];
+    SigninPromoViewConfigurator* configurator =
+        [[SigninPromoViewConfigurator alloc]
+            initWithSigninPromoViewMode:
+                SigninPromoViewModeSignedInWithPrimaryAccount
+                              userEmail:self.displayedIdentity.userEmail
+                          userGivenName:self.displayedIdentity.userGivenName
+                              userImage:self.displayedIdentityAvatar
+                         hasCloseButton:hasCloseButton
+                       hasSignInSpinner:self.showSpinner];
+    switch (self.signinPromoAction) {
+      case SigninPromoAction::kSync:
+      case SigninPromoAction::kSigninSheet:
+      case SigninPromoAction::kInstantSignin:
+        break;
+      case SigninPromoAction::kReviewAccountSettings:
+        configurator.primaryButtonTitleOverride =
+            l10n_util::GetNSString(IDS_IOS_SIGNIN_PROMO_REVIEW_SETTINGS_BUTTON);
+        break;
+    }
+    return configurator;
   }
   if (self.displayedIdentity) {
     return [[SigninPromoViewConfigurator alloc]
@@ -744,6 +756,7 @@
                      hasSignInSpinner:self.showSpinner];
   switch (self.signinPromoAction) {
     case SigninPromoAction::kSync:
+    case SigninPromoAction::kReviewAccountSettings:
       break;
     case SigninPromoAction::kSigninSheet:
     case SigninPromoAction::kInstantSignin:
@@ -1081,36 +1094,45 @@
                          operation:AuthenticationOperation::kSigninOnly
                        promoAction:promoAction];
       return;
+    case SigninPromoAction::kReviewAccountSettings:
+      NOTREACHED() << "This action is only valid for a signed in account.";
+      return;
   }
 }
 
-- (void)signinPromoViewDidTapSigninWithDefaultAccount:
+- (void)signinPromoViewDidTapPrimaryButtonWithDefaultAccount:
     (SigninPromoView*)signinPromoView {
   DCHECK(self.displayedIdentity) << base::SysNSStringToUTF8([self description]);
   DCHECK(self.signinPromoViewVisible)
       << base::SysNSStringToUTF8([self description]);
   DCHECK(!self.invalidClosedOrNeverVisible)
       << base::SysNSStringToUTF8([self description]);
-  [self sendImpressionsTillSigninButtonsHistogram];
   switch (self.signinPromoAction) {
     case SigninPromoAction::kInstantSignin:
+      [self sendImpressionsTillSigninButtonsHistogram];
       [self showSigninWithIdentity:self.displayedIdentity
                          operation:AuthenticationOperation::kInstantSignin
                        promoAction:signin_metrics::PromoAction::
                                        PROMO_ACTION_WITH_DEFAULT];
       return;
     case SigninPromoAction::kSync:
+      [self sendImpressionsTillSigninButtonsHistogram];
       [self showSigninWithIdentity:self.displayedIdentity
                          operation:AuthenticationOperation::kSigninAndSync
                        promoAction:signin_metrics::PromoAction::
                                        PROMO_ACTION_WITH_DEFAULT];
       return;
     case SigninPromoAction::kSigninSheet:
+      [self sendImpressionsTillSigninButtonsHistogram];
       [self showSigninWithIdentity:nil
                          operation:AuthenticationOperation::kSigninOnly
                        promoAction:signin_metrics::PromoAction::
                                        PROMO_ACTION_WITH_DEFAULT];
       return;
+    case SigninPromoAction::kReviewAccountSettings:
+      // TODO(crbug.com/1459255): Record metrics for this promo action.
+      [self showAccountSettings];
+      return;
   }
 }
 
@@ -1143,6 +1165,9 @@
                        promoAction:signin_metrics::PromoAction::
                                        PROMO_ACTION_NOT_DEFAULT];
       return;
+    case SigninPromoAction::kReviewAccountSettings:
+      NOTREACHED() << "This action is only valid for a signed in account.";
+      return;
   }
 }
 
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm
index feaa5b0..67c8f41 100644
--- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm
@@ -102,10 +102,7 @@
     consumer_ = OCMStrictProtocolMock(@protocol(SigninPromoViewConsumer));
     signin_presenter_ = OCMStrictProtocolMock(@protocol(SigninPresenter));
     account_settings_presenter_ =
-        access_point ==
-                signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_MANAGER
-            ? OCMStrictProtocolMock(@protocol(AccountSettingsPresenter))
-            : nil;
+        OCMStrictProtocolMock(@protocol(AccountSettingsPresenter));
     mediator_ = [[SigninPromoViewMediator alloc]
         initWithAccountManagerService:ChromeAccountManagerServiceFactory::
                                           GetForBrowserState(
@@ -315,6 +312,21 @@
     image_view_profile_image_ = nil;
   }
 
+  // Expects the review account settings promo view to be configured.
+  void ExpectReviewAccountSettingsPromoConfiguration() {
+    OCMExpect([signin_promo_view_
+        setMode:SigninPromoViewModeSignedInWithPrimaryAccount]);
+    OCMExpect([signin_promo_view_
+        setProfileImage:[OCMArg checkWithBlock:^BOOL(id value) {
+          image_view_profile_image_ = value;
+          return YES;
+        }]]);
+    OCMExpect([signin_promo_view_
+        configurePrimaryButtonWithTitle:
+            GetNSString(IDS_IOS_SIGNIN_PROMO_REVIEW_SETTINGS_BUTTON)]);
+    image_view_profile_image_ = nil;
+  }
+
   // Checks a configurator with accounts on the device.
   void CheckSyncPromoWithAccountConfigurator(
       SigninPromoViewConfigurator* configurator,
@@ -328,6 +340,20 @@
     EXPECT_NE(nil, image_view_profile_image_);
   }
 
+  // Checks a configurator with a signed-in account and review account settings
+  // action.
+  void CheckPromoWithReviewAccountSettingsAction(
+      SigninPromoViewConfigurator* configurator,
+      SigninPromoViewStyle style) {
+    EXPECT_NE(nil, configurator);
+    ExpectReviewAccountSettingsPromoConfiguration();
+    OCMExpect([close_button_ setHidden:close_button_hidden_]);
+    OCMExpect([signin_promo_view_ setPromoViewStyle:style]);
+    OCMExpect([signin_promo_view_ stopSignInSpinner]);
+    [configurator configureSigninPromoView:signin_promo_view_ withStyle:style];
+    EXPECT_NE(nil, image_view_profile_image_);
+  }
+
   // Checks to receive a notification for the image upate of the current
   // identity.
   void CheckForImageNotification(SigninPromoViewStyle style) {
@@ -537,7 +563,8 @@
   OCMExpect([consumer_ promoProgressStateDidChange]);
   ExpectConfiguratorNotification(NO /* identity changed */);
   // Starts sign-in with an identity.
-  [mediator_ signinPromoViewDidTapSigninWithDefaultAccount:signin_promo_view_];
+  [mediator_
+      signinPromoViewDidTapPrimaryButtonWithDefaultAccount:signin_promo_view_];
   EXPECT_TRUE([mediator_
       conformsToProtocol:@protocol(ChromeAccountManagerServiceObserver)]);
   id<ChromeAccountManagerServiceObserver> accountManagerServiceObserver =
@@ -610,8 +637,8 @@
     OCMExpect([consumer_ promoProgressStateDidChange]);
     ExpectConfiguratorNotification(NO /* identity changed */);
     // Start sign-in with an identity.
-    [mediator_
-        signinPromoViewDidTapSigninWithDefaultAccount:signin_promo_view_];
+    [mediator_ signinPromoViewDidTapPrimaryButtonWithDefaultAccount:
+                   signin_promo_view_];
     // Remove the sign-in promo.
     [mediator_ disconnect];
     EXPECT_EQ(SigninPromoViewState::kInvalid, mediator_.signinPromoViewState);
@@ -647,7 +674,8 @@
   OCMExpect([consumer_ promoProgressStateDidChange]);
   ExpectConfiguratorNotification(NO /* identity changed */);
   // Start sign-in with an identity.
-  [mediator_ signinPromoViewDidTapSigninWithDefaultAccount:signin_promo_view_];
+  [mediator_
+      signinPromoViewDidTapPrimaryButtonWithDefaultAccount:signin_promo_view_];
   // Remove the sign-in promo.
   [mediator_ disconnect];
   EXPECT_EQ(SigninPromoViewState::kInvalid, mediator_.signinPromoViewState);
@@ -659,4 +687,33 @@
   mediator_ = nil;
 }
 
+// Tests that promo setup with review account settings promo action.
+TEST_F(SigninPromoViewMediatorTest,
+       SigninPromoWithReviewAccountSettingsAction) {
+  AddDefaultIdentity();
+  identity_ = [FakeSystemIdentity fakeIdentity2];
+  fake_system_identity_manager()->AddIdentity(identity_);
+  GetAuthenticationService()->SignIn(
+      identity_, signin_metrics::AccessPoint::ACCESS_POINT_SIGNIN_PROMO);
+
+  CreateMediator(signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_MANAGER);
+  ExpectConfiguratorNotification(NO /* identity changed */);
+  [mediator_ signinPromoViewIsVisible];
+  ExpectConfiguratorNotification(NO /* identity changed */);
+  [mediator_ setSigninPromoAction:SigninPromoAction::kReviewAccountSettings];
+  EXPECT_EQ(identity_, mediator_.displayedIdentity);
+  fake_system_identity_manager()->WaitForServiceCallbacksToComplete();
+  // The close button should exist on the promo when shown on the bookmarks
+  // manager UI.
+  close_button_hidden_ = NO;
+  CheckPromoWithReviewAccountSettingsAction(configurator_,
+                                            SigninPromoViewStyleStandard);
+
+  OCMExpect([account_settings_presenter_ showAccountSettings]);
+  [mediator_
+      signinPromoViewDidTapPrimaryButtonWithDefaultAccount:signin_promo_view_];
+  EXPECT_EQ(SigninPromoViewState::kUsedAtLeastOnce,
+            mediator_.signinPromoViewState);
+}
+
 }  // namespace
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index 8e6dae3..0590325 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -175,6 +175,8 @@
     "//ios/chrome/browser/ui/authentication/enterprise:enterprise_utils",
     "//ios/chrome/browser/ui/authentication/signin:signin_headers",
     "//ios/chrome/browser/ui/autofill/cells",
+    "//ios/chrome/browser/ui/bubble:bubble",
+    "//ios/chrome/browser/ui/bubble:constants",
     "//ios/chrome/browser/ui/content_suggestions/cells",
     "//ios/chrome/browser/ui/first_run:field_trial",
     "//ios/chrome/browser/ui/keyboard",
diff --git a/ios/chrome/browser/ui/settings/DEPS b/ios/chrome/browser/ui/settings/DEPS
index 68bed9b..7cd60f3 100644
--- a/ios/chrome/browser/ui/settings/DEPS
+++ b/ios/chrome/browser/ui/settings/DEPS
@@ -7,6 +7,7 @@
   "+ios/chrome/browser/ui/scoped_ui_blocker",
   "+ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h",
   "+ios/chrome/browser/ui/default_promo/default_browser_instructions_view.h",
+  "+ios/chrome/browser/ui/bubble",
 ]
 
 specific_include_rules = {
diff --git a/ios/chrome/browser/ui/settings/google_services/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
index e7ff31d..29294d54 100644
--- a/ios/chrome/browser/ui/settings/google_services/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
@@ -180,6 +180,7 @@
     "//base",
     "//base/test:test_support",
     "//components/bookmarks/common",
+    "//components/feature_engagement/public",
     "//components/password_manager/core/common",
     "//components/policy:generated",
     "//components/policy/core/common:common_constants",
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h
index 7b03c28..b413f8f 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h
@@ -34,9 +34,18 @@
 // relies on GoogleServicesSettingsCoordinator to commit the sync changes.
 @interface ManageSyncSettingsCoordinator : ChromeCoordinator
 
-- (instancetype)initWithBaseViewController:(UIViewController*)viewController
-                                   browser:(Browser*)browser NS_UNAVAILABLE;
+// Delegate.
+@property(nonatomic, weak) id<ManageSyncSettingsCoordinatorDelegate> delegate;
 
+// Initializes ManageSyncSettingsCoordinator to present its controller modally.
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+                                   browser:(Browser*)browser
+                              accountState:
+                                  (SyncSettingsAccountState)accountState
+    NS_DESIGNATED_INITIALIZER;
+
+// Initializes ManageSyncSettingsCoordinator to view its controller by pushing
+// it on top of the navigation stack.
 - (instancetype)initWithBaseNavigationController:
                     (UINavigationController*)navigationController
                                          browser:(Browser*)browser
@@ -44,8 +53,8 @@
                                         (SyncSettingsAccountState)accountState
     NS_DESIGNATED_INITIALIZER;
 
-// Delegate.
-@property(nonatomic, weak) id<ManageSyncSettingsCoordinatorDelegate> delegate;
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+                                   browser:(Browser*)browser NS_UNAVAILABLE;
 
 @end
 
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
index c2f687a..733289f 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
@@ -48,6 +48,7 @@
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h"
+#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
 #import "ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.h"
 #import "ios/chrome/grit/ios_strings.h"
@@ -62,6 +63,7 @@
     BulkUploadCoordinatorDelegate,
     ManageSyncSettingsCommandHandler,
     ManageSyncSettingsTableViewControllerPresentationDelegate,
+    SettingsNavigationControllerDelegate,
     SignoutActionSheetCoordinatorDelegate,
     SyncErrorSettingsCommandHandler,
     SyncObserverModelBridge> {
@@ -78,6 +80,10 @@
     ManageSyncSettingsTableViewController* viewController;
 // Mediator.
 @property(nonatomic, strong) ManageSyncSettingsMediator* mediator;
+// The navigation controller used to present child controllers of
+// ManageSyncSettings.
+@property(nonatomic, readonly)
+    UINavigationController* _navigationControllerForChildPages;
 // Sync service.
 @property(nonatomic, assign, readonly) syncer::SyncService* syncService;
 // Authentication service.
@@ -96,10 +102,24 @@
   DismissViewCallback _dismissAccountDetailsController;
   // The account sync state.
   SyncSettingsAccountState _accountState;
+  // The navigation controller to use only when presenting the
+  // ManageSyncSettings modally.
+  SettingsNavigationController* _navigationControllerInModalView;
 }
 
 @synthesize baseNavigationController = _baseNavigationController;
 
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+                                   browser:(Browser*)browser
+                              accountState:
+                                  (SyncSettingsAccountState)accountState {
+  if (self = [super initWithBaseViewController:viewController
+                                       browser:browser]) {
+    _accountState = accountState;
+  }
+  return self;
+}
+
 - (instancetype)initWithBaseNavigationController:
                     (UINavigationController*)navigationController
                                          browser:(Browser*)browser
@@ -114,7 +134,6 @@
 }
 
 - (void)start {
-  DCHECK(self.baseNavigationController);
   ChromeBrowserState* browserState = self.browser->GetBrowserState();
   SyncSetupService* syncSetupService =
       SyncSetupServiceFactory::GetForBrowserState(browserState);
@@ -181,8 +200,13 @@
       HandlerForProtocol(dispatcher, SnackbarCommands);
 
   self.mediator.consumer = viewController;
-  [self.baseNavigationController pushViewController:viewController
-                                           animated:YES];
+
+  if (_baseNavigationController) {
+    [self.baseNavigationController pushViewController:viewController
+                                             animated:YES];
+  } else {
+    [self presentViewController:viewController];
+  }
   _syncObserver = std::make_unique<SyncObserverBridge>(self, self.syncService);
 }
 
@@ -207,6 +231,14 @@
 
 #pragma mark - Properties
 
+- (UINavigationController*)navigationControllerForChildPages {
+  if (_baseNavigationController) {
+    return _baseNavigationController;
+  }
+  CHECK(_navigationControllerInModalView);
+  return _navigationControllerInModalView;
+}
+
 - (syncer::SyncService*)syncService {
   return SyncServiceFactory::GetForBrowserState(
       self.browser->GetBrowserState());
@@ -219,6 +251,18 @@
 
 #pragma mark - Private
 
+- (void)presentViewController:(UIViewController*)controller {
+  SettingsNavigationController* navigationController =
+      [[SettingsNavigationController alloc]
+          initWithRootViewController:controller
+                             browser:self.browser
+                            delegate:self];
+  _navigationControllerInModalView = navigationController;
+  [self.baseViewController presentViewController:navigationController
+                                        animated:YES
+                                      completion:nil];
+}
+
 - (void)stopBulkUpload {
   [_bulkUploadCoordinator stop];
   _bulkUploadCoordinator.delegate = nil;
@@ -240,7 +284,8 @@
     }
 
     NSEnumerator<UIViewController*>* inversedViewControllers =
-        [self.baseNavigationController.viewControllers reverseObjectEnumerator];
+        [self.navigationControllerForChildPages
+                .viewControllers reverseObjectEnumerator];
     for (UIViewController* controller in inversedViewControllers) {
       if (controller == self.viewController) {
         break;
@@ -250,9 +295,16 @@
       }
     }
 
-    [self.baseNavigationController popToViewController:self.viewController
-                                              animated:NO];
-    [self.baseNavigationController popViewControllerAnimated:YES];
+    if (_baseNavigationController) {
+      [self.baseNavigationController popToViewController:self.viewController
+                                                animated:NO];
+      [self.baseNavigationController popViewControllerAnimated:YES];
+    } else {
+      [self.navigationControllerForChildPages.presentingViewController
+          dismissViewControllerAnimated:YES
+                             completion:nil];
+      [self.delegate manageSyncSettingsCoordinatorWasRemoved:self];
+    }
   }
   _settingsAreDismissed = YES;
 }
@@ -271,7 +323,7 @@
   [self stopBulkUpload];
   base::RecordAction(base::UserMetricsAction("BulkUploadSettingsOpen"));
   _bulkUploadCoordinator = [[BulkUploadCoordinator alloc]
-      initWithBaseNavigationController:self.baseNavigationController
+      initWithBaseNavigationController:self.navigationControllerForChildPages
                                browser:self.browser];
   _bulkUploadCoordinator.delegate = self;
   [_bulkUploadCoordinator start];
@@ -363,8 +415,11 @@
   accountsTableViewController.applicationCommandsHandler = HandlerForProtocol(
       self.browser->GetCommandDispatcher(), ApplicationCommands);
   accountsTableViewController.signoutDismissalByParentCoordinator = YES;
-  [self.baseNavigationController pushViewController:accountsTableViewController
-                                           animated:YES];
+  accountsTableViewController.navigationItem.rightBarButtonItem =
+      self.viewController.navigationItem.rightBarButtonItem;
+  [self.navigationControllerForChildPages
+      pushViewController:accountsTableViewController
+                animated:YES];
 }
 
 - (void)showManageYourGoogleAccount {
@@ -408,8 +463,8 @@
   }
 
   [self.viewController configureHandlersForRootViewController:controllerToPush];
-  [self.baseNavigationController pushViewController:controllerToPush
-                                           animated:YES];
+  [self.navigationControllerForChildPages pushViewController:controllerToPush
+                                                    animated:YES];
 }
 
 - (void)openTrustedVaultReauthForFetchKeys {
@@ -469,4 +524,17 @@
   }
 }
 
+#pragma mark - SettingsNavigationControllerDelegate
+
+- (void)closeSettings {
+  [self.navigationControllerForChildPages.presentingViewController
+      dismissViewControllerAnimated:YES
+                         completion:nil];
+  [self.delegate manageSyncSettingsCoordinatorWasRemoved:self];
+}
+
+- (void)settingsWasDismissed {
+  [self.delegate manageSyncSettingsCoordinatorWasRemoved:self];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.mm
index 84f0294..19f372a 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.mm
@@ -103,8 +103,7 @@
     return;
   _consumer = consumer;
   std::optional<std::string> account =
-      password_manager::sync_util::GetAccountForSaving(_prefService,
-                                                       _syncService);
+      password_manager::sync_util::GetAccountForSaving(_syncService);
   if (account) {
     CHECK(!account->empty());
     [_consumer setAccountSavingPasswords:base::SysUTF8ToNSString(*account)];
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
index bd15ae18..83c84cd 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
@@ -502,7 +502,7 @@
     password.shouldOfferToMoveToAccount =
         self.context == DetailsContext::kPasswordSettings &&
         password_manager::features_util::IsOptedInForAccountStorage(
-            _prefService, _syncService) &&
+            _syncService) &&
         ShouldShowLocalOnlyIcon(credential, _syncService);
     [passwords addObject:password];
   }
@@ -555,8 +555,7 @@
 // * Password sending feature is enabled.
 // * Password sharing pref is enabled.
 - (BOOL)isUserEligibleForSendingPasswords {
-  return password_manager::sync_util::GetAccountForSaving(_prefService,
-                                                          _syncService) &&
+  return password_manager::sync_util::GetAccountForSaving(_syncService) &&
          _prefService->GetBoolean(
              password_manager::prefs::kPasswordSharingEnabled) &&
          base::FeatureList::IsEnabled(
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm
index 746e3e4..9d757d91 100644
--- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm
@@ -138,8 +138,7 @@
                        faviconLoader:IOSChromeFaviconLoaderFactory::
                                          GetForBrowserState(browserState)
                          syncService:SyncServiceFactory::GetForBrowserState(
-                                         browserState)
-                         prefService:browserState->GetPrefs()];
+                                         browserState)];
     mediator_.encryptionState = OnDeviceEncryptionStateNotShown;
 
     // Inject some fake passwords to pass the loading state.
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
index 927eb27..15746ea9 100644
--- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
@@ -433,10 +433,10 @@
     return;
   }
 
-  [self.consumer setLocalPasswordsCount:[self computeLocalPasswordsCount]
-                    withUserEligibility:password_manager::features_util::
-                                            IsOptedInForAccountStorage(
-                                                _prefService, _syncService)];
+  [self.consumer
+      setLocalPasswordsCount:[self computeLocalPasswordsCount]
+         withUserEligibility:password_manager::features_util::
+                                 IsOptedInForAccountStorage(_syncService)];
 }
 
 // Returns the amount of local passwords.
diff --git a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
index 335af20..9c4c7f70 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
@@ -152,8 +152,7 @@
                                        GetForBrowserState(browserState)
                      faviconLoader:faviconLoader
                        syncService:SyncServiceFactory::GetForBrowserState(
-                                       browserState)
-                       prefService:browserState->GetPrefs()];
+                                       browserState)];
   self.mediator.tracker =
       feature_engagement::TrackerFactory::GetForBrowserState(browserState);
 
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.h b/ios/chrome/browser/ui/settings/password/passwords_mediator.h
index e9c6bf2..7ca7770 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_mediator.h
+++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.h
@@ -15,7 +15,6 @@
 class FaviconLoader;
 class IOSChromePasswordCheckManager;
 @protocol PasswordsConsumer;
-class PrefService;
 
 namespace syncer {
 class SyncService;
@@ -35,7 +34,6 @@
                         passwordCheckManager
                                faviconLoader:(FaviconLoader*)faviconLoader
                                  syncService:(syncer::SyncService*)syncService
-                                 prefService:(PrefService*)prefService
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
index b17b5788..d4063b9 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
@@ -76,21 +76,16 @@
 
   // Service to know whether passwords are synced.
   raw_ptr<syncer::SyncService> _syncService;
-
-  // The user pref service.
-  raw_ptr<PrefService> _prefService;
 }
 
 - (instancetype)initWithPasswordCheckManager:
                     (scoped_refptr<IOSChromePasswordCheckManager>)
                         passwordCheckManager
                                faviconLoader:(FaviconLoader*)faviconLoader
-                                 syncService:(syncer::SyncService*)syncService
-                                 prefService:(PrefService*)prefService {
+                                 syncService:(syncer::SyncService*)syncService {
   self = [super init];
   if (self) {
     _syncService = syncService;
-    _prefService = prefService;
     _faviconLoader = faviconLoader;
 
     _syncObserver = std::make_unique<SyncObserverBridge>(self, syncService);
@@ -136,7 +131,6 @@
   _passwordCheckManager.reset();
   _savedPasswordsPresenter = nullptr;
   _faviconLoader = nullptr;
-  _prefService = nullptr;
   _syncService = nullptr;
 }
 
@@ -342,8 +336,7 @@
 
 // Compute whether user is capable to run password check in Google Account.
 - (BOOL)canUseAccountPasswordCheckup {
-  return password_manager::sync_util::GetAccountForSaving(_prefService,
-                                                          _syncService) &&
+  return password_manager::sync_util::GetAccountForSaving(_syncService) &&
          !_syncService->GetUserSettings()->IsEncryptEverythingEnabled();
 }
 
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
index fcd3115..8724491 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
@@ -158,8 +158,7 @@
                                          GetForBrowserState(
                                              browser_state_.get())
                          syncService:SyncServiceFactory::GetForBrowserState(
-                                         browser_state_.get())
-                         prefService:browser_state_->GetPrefs()];
+                                         browser_state_.get())];
 
     mock_tracker_ = static_cast<feature_engagement::test::MockTracker*>(
         feature_engagement::TrackerFactory::GetForBrowserState(browserState()));
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
index c1d3bf6..557d053 100644
--- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
@@ -671,8 +671,7 @@
 
 // Computes whether user is capable to run password check in Google Account.
 - (BOOL)canUseAccountPasswordCheckup {
-  return password_manager::sync_util::GetAccountForSaving(self.userPrefService,
-                                                          self.syncService) &&
+  return password_manager::sync_util::GetAccountForSaving(self.syncService) &&
          !self.syncService->GetUserSettings()->IsEncryptEverythingEnabled();
 }
 
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index eb56990..defea15 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -13,6 +13,7 @@
 #import "base/metrics/user_metrics.h"
 #import "base/metrics/user_metrics_action.h"
 #import "base/strings/sys_string_conversions.h"
+#import "base/task/sequenced_task_runner.h"
 #import "build/branding_buildflags.h"
 #import "components/autofill/core/common/autofill_prefs.h"
 #import "components/feature_engagement/public/event_constants.h"
@@ -94,6 +95,8 @@
 #import "ios/chrome/browser/ui/authentication/cells/table_view_account_item.h"
 #import "ios/chrome/browser/ui/authentication/signin/signin_utils.h"
 #import "ios/chrome/browser/ui/authentication/signin_presenter.h"
+#import "ios/chrome/browser/ui/bubble/bubble_constants.h"
+#import "ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h"
 #import "ios/chrome/browser/ui/settings/about_chrome_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/address_bar_preference/address_bar_preference_coordinator.h"
@@ -235,6 +238,11 @@
   // Passwords coordinator.
   PasswordsCoordinator* _passwordsCoordinator;
 
+  // Feature engagement tracker for the signin IPH.
+  feature_engagement::Tracker* _featureEngagementTracker;
+  // Presenter for the signin IPH.
+  BubbleViewControllerPresenter* _bubblePresenter;
+
   // Identity object and observer used for Account Item refresh.
   id<SystemIdentity> _identity;
   std::unique_ptr<ChromeAccountManagerServiceObserverBridge>
@@ -342,6 +350,8 @@
     _accountManagerServiceObserver.reset(
         new ChromeAccountManagerServiceObserverBridge(self,
                                                       _accountManagerService));
+    _featureEngagementTracker =
+        feature_engagement::TrackerFactory::GetForBrowserState(_browserState);
 
     PrefService* prefService = _browserState->GetPrefs();
 
@@ -439,6 +449,11 @@
   }
 }
 
+- (void)viewDidAppear:(BOOL)animated {
+  [super viewDidAppear:animated];
+  [self maybeShowSigninIPH];
+}
+
 #pragma mark SettingsRootTableViewController
 
 - (void)loadModel {
@@ -1762,6 +1777,72 @@
   }
 }
 
+- (void)maybeShowSigninIPH {
+  if (_settingsAreDismissed) {
+    return;
+  }
+  AuthenticationService* authService =
+      AuthenticationServiceFactory::GetForBrowserState(
+          _browser->GetBrowserState());
+  BOOL shouldShowSigninIPH =
+      authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin) &&
+      [self shouldReplaceSyncSettingsWithAccountSettings];
+  if (!shouldShowSigninIPH) {
+    return;
+  }
+
+  UITableViewCell* accountCell = nil;
+  for (UITableViewCell* cell in [self.tableView visibleCells]) {
+    if ([cell isKindOfClass:[TableViewAccountCell class]]) {
+      accountCell = cell;
+      break;
+    }
+  }
+  if (!accountCell) {
+    return;
+  }
+
+  __weak __typeof(self) weakSelf = self;
+  CallbackWithIPHDismissalReasonType dismissalCallback =
+      ^(IPHDismissalReasonType dismissReason,
+        feature_engagement::Tracker::SnoozeAction snoozeAction) {
+        [weakSelf signinIPHDismissed];
+      };
+  _bubblePresenter = [[BubbleViewControllerPresenter alloc]
+           initWithText:l10n_util::GetNSString(IDS_IOS_SETTING_IPH_SIGNIN)
+                  title:nil
+                  image:nil
+         arrowDirection:BubbleArrowDirectionUp
+              alignment:BubbleAlignmentCenter
+             bubbleType:BubbleViewTypeDefault
+      dismissalCallback:dismissalCallback];
+  CGPoint anchorPointInCell = CGPointMake(CGRectGetMidX(accountCell.bounds),
+                                          CGRectGetMaxY(accountCell.bounds));
+  CGPoint anchorPointInWindow = [self.view.window convertPoint:anchorPointInCell
+                                                      fromView:accountCell];
+
+  // The IPH must be presented if
+  // `_featureEngagementTracker->ShouldTriggerHelpUI()` returns true.
+  BOOL canShowSigninIPH =
+      [_bubblePresenter canPresentInView:self.view
+                             anchorPoint:anchorPointInWindow] &&
+      _featureEngagementTracker->ShouldTriggerHelpUI(
+          feature_engagement::kIPHiOSReplaceSyncPromosWithSignInPromos);
+  if (canShowSigninIPH) {
+    [_bubblePresenter presentInViewController:self
+                                         view:self.view
+                                  anchorPoint:anchorPointInWindow];
+  } else {
+    _bubblePresenter = nil;
+  }
+}
+
+- (void)signinIPHDismissed {
+  _featureEngagementTracker->Dismissed(
+      feature_engagement::kIPHiOSReplaceSyncPromosWithSignInPromos);
+  _bubblePresenter = nil;
+}
+
 // Updates the Sync item to display the right icon and status message in the
 // cell.
 - (void)updateSyncItem:(TableViewDetailIconItem*)googleSyncItem {
@@ -1997,14 +2078,23 @@
 }
 
 - (void)didFinishSignin:(BOOL)signedIn {
-  if (_settingsAreDismissed)
+  if (_settingsAreDismissed) {
     return;
+  }
 
   // The sign-in is done. The sign-in promo cell or account cell can be
   // reloaded.
   DCHECK(self.isSigninInProgress);
   self.isSigninInProgress = NO;
   [self reloadData];
+
+  // Post the task to show signin IPH so that the UI has had time to refresh
+  // after `reloadData`.
+  __weak __typeof(self) weakSelf = self;
+  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(^{
+        [weakSelf maybeShowSigninIPH];
+      }));
 }
 
 #pragma mark SettingsControllerProtocol
diff --git a/ios/chrome/test/app/signin_test_util.mm b/ios/chrome/test/app/signin_test_util.mm
index b56ecbb..b38fd98d 100644
--- a/ios/chrome/test/app/signin_test_util.mm
+++ b/ios/chrome/test/app/signin_test_util.mm
@@ -12,6 +12,8 @@
 #import "components/signin/public/base/signin_metrics.h"
 #import "components/signin/public/base/signin_pref_names.h"
 #import "components/sync/base/features.h"
+#import "components/sync/base/user_selectable_type.h"
+#import "components/sync/service/sync_prefs.h"
 #import "components/sync/service/sync_service.h"
 #import "components/sync/service/sync_user_settings.h"
 #import "google_apis/gaia/gaia_constants.h"
@@ -186,21 +188,21 @@
 }
 
 void ResetSyncSelectedDataTypes() {
-  ChromeBrowserState* browserState =
+  ChromeBrowserState* browser_state =
       chrome_test_util::GetOriginalBrowserState();
-  syncer::SyncService* syncService =
-      SyncServiceFactory::GetForBrowserState(browserState);
-  syncer::SyncUserSettings* settings = syncService->GetUserSettings();
-  if (base::FeatureList::IsEnabled(
-          syncer::kReplaceSyncPromosWithSignInPromos)) {
-    // Clear the new per-account settings.
-    settings->KeepAccountSettingsPrefsOnlyForUsers({});
-  } else {
-    // Explicitly enable all selectable types, this ensures that
-    // BookmarksAndReadingListAccountStorageOptIn works as expected.
-    settings->SetSelectedTypes(
-        /*sync_everything=*/true, settings->GetRegisteredSelectableTypes());
-  }
+  // Clear the new per-account selected types.
+  SyncServiceFactory::GetForBrowserState(browser_state)
+      ->GetUserSettings()
+      ->KeepAccountSettingsPrefsOnlyForUsers({});
+  // And the old global selected types for syncing users. SyncUserSettings::
+  // SetSelectedTypes() CHECKs the user is signed-in, so go through SyncPrefs
+  // directly.
+  // TODO(crbug.com/1462552): Remove once sync-the-feature is gone on iOS.
+  syncer::SyncPrefs(browser_state->GetPrefs())
+      .SetSelectedTypes(
+          /*sync_everything=*/true,
+          /*registered_types=*/syncer::UserSelectableTypeSet::All(),
+          /*selected_types=*/syncer::UserSelectableTypeSet::All());
 }
 
 }  // namespace chrome_test_util
diff --git a/ios/chrome/test/providers/signin/test_choice.mm b/ios/chrome/test/providers/signin/test_choice.mm
index 35db75d3..2c782c4 100644
--- a/ios/chrome/test/providers/signin/test_choice.mm
+++ b/ios/chrome/test/providers/signin/test_choice.mm
@@ -37,5 +37,9 @@
   return false;
 }
 
+bool IsSearchEngineChoiceScreenEnabledFre() {
+  return false;
+}
+
 }  // namespace provider
 }  // namespace ios
diff --git a/ios/public/provider/chrome/browser/signin/choice_api.h b/ios/public/provider/chrome/browser/signin/choice_api.h
index f46362a..aefa5247ec 100644
--- a/ios/public/provider/chrome/browser/signin/choice_api.h
+++ b/ios/public/provider/chrome/browser/signin/choice_api.h
@@ -14,8 +14,6 @@
 #import "ios/chrome/browser/ui/first_run/first_run_screen_delegate.h"
 #import "ios/chrome/browser/ui/promos_manager/standard_promo_display_handler.h"
 
-class ChromeBrowserState;
-
 namespace ios {
 namespace provider {
 
@@ -39,9 +37,14 @@
 id<SceneAgent> CreateChoiceSceneAgent(PromosManager* promosManager,
                                       ChromeBrowserState* browserState);
 
-// Whether the feature is enabled
+// Whether the feature flag is enabled on runs that are not the first run.
+// TODO(b/306576460): Update this method's name to make it clearer what is
+// enabled or not.
 bool IsChoiceEnabled();
 
+// Whether the feature flag is enabled for the first run.
+bool IsSearchEngineChoiceScreenEnabledFre();
+
 }  // namespace provider
 }  // namespace ios
 
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.h b/ios/web_view/internal/passwords/web_view_password_feature_manager.h
index c906913..6356899 100644
--- a/ios/web_view/internal/passwords/web_view_password_feature_manager.h
+++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.h
@@ -11,15 +11,13 @@
 class SyncService;
 }  // namespace syncer
 
-class PrefService;
-
 namespace ios_web_view {
 // An //ios/web_view implementation of password_manager::PasswordFeatureManager.
 class WebViewPasswordFeatureManager
     : public password_manager::PasswordFeatureManager {
  public:
-  WebViewPasswordFeatureManager(PrefService* pref_service,
-                                const syncer::SyncService* sync_service);
+  explicit WebViewPasswordFeatureManager(
+      const syncer::SyncService* sync_service);
 
   WebViewPasswordFeatureManager(const WebViewPasswordFeatureManager&) = delete;
   WebViewPasswordFeatureManager& operator=(
@@ -45,7 +43,6 @@
   bool IsBiometricAuthenticationBeforeFillingEnabled() const override;
 
  private:
-  PrefService* const pref_service_;
   const syncer::SyncService* const sync_service_;
 };
 }  // namespace ios_web_view
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
index e8ec797a..ebb1d009 100644
--- a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
+++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
@@ -6,14 +6,12 @@
 
 #import "base/notreached.h"
 #import "components/password_manager/core/browser/features/password_manager_features_util.h"
-#import "components/prefs/pref_service.h"
 #import "components/sync/service/sync_service.h"
 
 namespace ios_web_view {
 WebViewPasswordFeatureManager::WebViewPasswordFeatureManager(
-    PrefService* pref_service,
     const syncer::SyncService* sync_service)
-    : pref_service_(pref_service), sync_service_(sync_service) {}
+    : sync_service_(sync_service) {}
 
 bool WebViewPasswordFeatureManager::IsGenerationEnabled() const {
   return true;
@@ -24,7 +22,7 @@
   // still be controlled on a per user basis to ensure that the logged out user
   // remains opted out.
   return password_manager::features_util::IsOptedInForAccountStorage(
-      pref_service_, sync_service_);
+      sync_service_);
 }
 
 bool WebViewPasswordFeatureManager::ShouldShowAccountStorageOptIn() const {
diff --git a/ios/web_view/internal/passwords/web_view_password_manager_client.mm b/ios/web_view/internal/passwords/web_view_password_manager_client.mm
index fdc27bf..8325ce8e 100644
--- a/ios/web_view/internal/passwords/web_view_password_manager_client.mm
+++ b/ios/web_view/internal/passwords/web_view_password_manager_client.mm
@@ -83,7 +83,7 @@
       profile_store_(profile_store),
       account_store_(account_store),
       reuse_manager_(reuse_manager),
-      password_feature_manager_(pref_service, sync_service),
+      password_feature_manager_(sync_service),
       credentials_filter_(
           this,
           base::BindRepeating(&WebViewPasswordManagerClient::GetSyncService,
diff --git a/ios/web_view/internal/sync/cwv_sync_controller.mm b/ios/web_view/internal/sync/cwv_sync_controller.mm
index adced548..038dda9 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller.mm
@@ -155,7 +155,7 @@
   autofill::prefs::SetUserOptedInWalletSyncTransport(_prefService, accountId,
                                                      /*opted_in=*/true);
   CHECK(password_manager::features_util::IsOptedInForAccountStorage(
-      _prefService, _syncService));
+      _syncService));
 }
 
 - (void)stopSyncAndClearIdentity {
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 38115f2..e91c30b 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
@@ -97,7 +97,7 @@
                 &pref_service_, &sync_service_),
             password_manager::PasswordForm::Store::kAccountStore);
   EXPECT_TRUE(password_manager::features_util::IsOptedInForAccountStorage(
-      &pref_service_, &sync_service_));
+      &sync_service_));
 }
 
 TEST_F(CWVSyncControllerTest, StopSyncAndClearIdentity) {
diff --git a/ios_internal b/ios_internal
index df56fdc..816c744 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit df56fdc8c9370dae4b8e7fc0f07d8c8b5a74d6b5
+Subproject commit 816c744389d305f55fb19490d84f6ecfbb0660cb
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 9fe6634e..90366f1 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -463,8 +463,8 @@
     "disk_cache/memory/mem_entry_impl.h",
     "disk_cache/net_log_parameters.cc",
     "disk_cache/net_log_parameters.h",
-    "disk_cache/simple/post_doom_waiter.cc",
-    "disk_cache/simple/post_doom_waiter.h",
+    "disk_cache/simple/post_operation_waiter.cc",
+    "disk_cache/simple/post_operation_waiter.h",
     "disk_cache/simple/simple_backend_impl.cc",
     "disk_cache/simple/simple_backend_impl.h",
     "disk_cache/simple/simple_backend_version.h",
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc
index f4c7155..577ca84 100644
--- a/net/disk_cache/backend_unittest.cc
+++ b/net/disk_cache/backend_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/containers/queue.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
@@ -5516,3 +5517,104 @@
   cache_->DoomAllEntries(base::DoNothing());
   run_loop.Run();
 }
+
+// See https://crbug.com/1486958
+TEST_F(DiskCacheBackendTest, SimpleOpenIter) {
+  constexpr int kEntries = 50;
+
+  SetSimpleCacheMode();
+  // Note: this test relies on InitCache() making sure the index is ready.
+  InitCache();
+
+  // We create a whole bunch of entries so that deleting them will hopefully
+  // finish after the iteration, in order to reproduce timing for the bug.
+  for (int i = 0; i < kEntries; ++i) {
+    disk_cache::Entry* entry = nullptr;
+    ASSERT_THAT(CreateEntry(base::NumberToString(i), &entry), IsOk());
+    entry->Close();
+  }
+  RunUntilIdle();  // Make sure close completes.
+  EXPECT_EQ(kEntries, cache_->GetEntryCount());
+
+  // Iterate once to get the order.
+  base::queue<std::string> keys;
+  auto iterator = cache_->CreateIterator();
+  base::RunLoop run_loop;
+  base::RepeatingCallback<void(EntryResult)> collect_entry_key =
+      base::BindLambdaForTesting([&](disk_cache::EntryResult result) {
+        if (result.net_error() == net::ERR_FAILED) {
+          run_loop.Quit();
+          return;  // iteration complete.
+        }
+        ASSERT_EQ(result.net_error(), net::OK);
+        disk_cache::Entry* entry = result.ReleaseEntry();
+        keys.push(entry->GetKey());
+        entry->Close();
+        result = iterator->OpenNextEntry(collect_entry_key);
+        EXPECT_EQ(result.net_error(), net::ERR_IO_PENDING);
+      });
+
+  disk_cache::EntryResult result = iterator->OpenNextEntry(collect_entry_key);
+  ASSERT_EQ(result.net_error(), net::ERR_IO_PENDING);
+  run_loop.Run();
+
+  // Open all entries with iterator...
+  int opened = 0;
+  int iter_opened = 0;
+  bool iter_done = false;
+  auto all_done = [&]() { return opened == kEntries && iter_done; };
+
+  iterator = cache_->CreateIterator();
+  base::RunLoop run_loop2;
+  base::RepeatingCallback<void(EntryResult)> handle_entry =
+      base::BindLambdaForTesting([&](disk_cache::EntryResult result) {
+        ++iter_opened;
+        if (result.net_error() == net::ERR_FAILED) {
+          EXPECT_EQ(iter_opened - 1, kEntries);
+          iter_done = true;
+          if (all_done()) {
+            run_loop2.Quit();
+          }
+          return;  // iteration complete.
+        }
+        EXPECT_EQ(result.net_error(), net::OK);
+        result = iterator->OpenNextEntry(handle_entry);
+        EXPECT_EQ(result.net_error(), net::ERR_IO_PENDING);
+      });
+
+  result = iterator->OpenNextEntry(handle_entry);
+  ASSERT_EQ(result.net_error(), net::ERR_IO_PENDING);
+
+  // ... while simultaneously opening them via name.
+  auto handle_open_result =
+      base::BindLambdaForTesting([&](disk_cache::EntryResult result) {
+        if (result.net_error() == net::OK) {
+          ++opened;
+        }
+        if (all_done()) {
+          run_loop2.Quit();
+        }
+      });
+
+  base::RepeatingClosure open_one_entry = base::BindLambdaForTesting([&]() {
+    std::string key = keys.front();
+    keys.pop();
+    disk_cache::EntryResult result =
+        cache_->OpenEntry(key, net::DEFAULT_PRIORITY, handle_open_result);
+    if (result.net_error() != net::ERR_IO_PENDING) {
+      handle_open_result.Run(std::move(result));
+    }
+
+    if (!keys.empty()) {
+      base::SequencedTaskRunner::GetCurrentDefault()->PostTask(FROM_HERE,
+                                                               open_one_entry);
+    }
+  });
+  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(FROM_HERE,
+                                                           open_one_entry);
+
+  run_loop2.Run();
+
+  // Should not have eaten any entries.
+  EXPECT_EQ(kEntries, cache_->GetEntryCount());
+}
diff --git a/net/disk_cache/simple/post_doom_waiter.cc b/net/disk_cache/simple/post_doom_waiter.cc
deleted file mode 100644
index a407216..0000000
--- a/net/disk_cache/simple/post_doom_waiter.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/disk_cache/simple/post_doom_waiter.h"
-
-#include "base/check_op.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback.h"
-#include "net/disk_cache/simple/simple_histogram_macros.h"
-
-namespace disk_cache {
-
-SimplePostDoomWaiter::SimplePostDoomWaiter() = default;
-
-SimplePostDoomWaiter::SimplePostDoomWaiter(base::OnceClosure to_run_post_doom)
-    : run_post_doom(std::move(to_run_post_doom)) {}
-
-SimplePostDoomWaiter::SimplePostDoomWaiter(SimplePostDoomWaiter&& other) =
-    default;
-SimplePostDoomWaiter& SimplePostDoomWaiter::operator=(
-    SimplePostDoomWaiter&& other) = default;
-SimplePostDoomWaiter::~SimplePostDoomWaiter() = default;
-
-SimplePostDoomWaiterTable::SimplePostDoomWaiterTable(net::CacheType cache_type)
-    : cache_type_(cache_type) {}
-SimplePostDoomWaiterTable::~SimplePostDoomWaiterTable() = default;
-
-void SimplePostDoomWaiterTable::OnDoomStart(uint64_t entry_hash) {
-  auto [it, inserted] = entries_pending_doom_.insert(
-      std::make_pair(entry_hash, std::vector<SimplePostDoomWaiter>()));
-  CHECK(inserted);
-}
-
-void SimplePostDoomWaiterTable::OnDoomComplete(uint64_t entry_hash) {
-  auto it = entries_pending_doom_.find(entry_hash);
-  CHECK(it != entries_pending_doom_.end());
-  std::vector<SimplePostDoomWaiter> to_handle_waiters;
-  to_handle_waiters.swap(it->second);
-  entries_pending_doom_.erase(it);
-
-  for (SimplePostDoomWaiter& post_doom : to_handle_waiters) {
-    std::move(post_doom.run_post_doom).Run();
-  }
-}
-
-std::vector<SimplePostDoomWaiter>* SimplePostDoomWaiterTable::Find(
-    uint64_t entry_hash) {
-  auto doom_it = entries_pending_doom_.find(entry_hash);
-  if (doom_it != entries_pending_doom_.end())
-    return &doom_it->second;
-  else
-    return nullptr;
-}
-
-}  // namespace disk_cache
diff --git a/net/disk_cache/simple/post_doom_waiter.h b/net/disk_cache/simple/post_doom_waiter.h
deleted file mode 100644
index c15a147..0000000
--- a/net/disk_cache/simple/post_doom_waiter.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NET_DISK_CACHE_SIMPLE_POST_DOOM_WAITER_H_
-#define NET_DISK_CACHE_SIMPLE_POST_DOOM_WAITER_H_
-
-#include <stdint.h>
-
-#include <unordered_map>
-#include <vector>
-
-#include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
-#include "net/base/cache_type.h"
-
-namespace disk_cache {
-
-struct SimplePostDoomWaiter {
-  SimplePostDoomWaiter();
-  explicit SimplePostDoomWaiter(base::OnceClosure to_run_post_doom);
-  SimplePostDoomWaiter(SimplePostDoomWaiter&& other);
-  ~SimplePostDoomWaiter();
-  SimplePostDoomWaiter& operator=(SimplePostDoomWaiter&& other);
-
-  base::OnceClosure run_post_doom;
-};
-
-// See |SimpleBackendImpl::post_doom_waiting_| for the description. This is
-// refcounted since sometimes this needs to survive backend destruction to
-// complete some per-entry operations.
-class SimplePostDoomWaiterTable
-    : public base::RefCounted<SimplePostDoomWaiterTable> {
-  friend class base::RefCounted<SimplePostDoomWaiterTable>;
-
- public:
-  explicit SimplePostDoomWaiterTable(net::CacheType cache_type);
-
-  SimplePostDoomWaiterTable(const SimplePostDoomWaiterTable&) = delete;
-  SimplePostDoomWaiterTable& operator=(const SimplePostDoomWaiterTable&) =
-      delete;
-
-  // The entry for |entry_hash| is being doomed; the backend will not attempt
-  // to run new operations for this |entry_hash| until the Doom is completed.
-  void OnDoomStart(uint64_t entry_hash);
-
-  // The entry for |entry_hash| has been successfully doomed, we can now allow
-  // operations on this entry, and we can run any operations enqueued while the
-  // doom completed.
-  void OnDoomComplete(uint64_t entry_hash);
-
-  // Returns nullptr if not found.
-  std::vector<SimplePostDoomWaiter>* Find(uint64_t entry_hash);
-
-  bool Has(uint64_t entry_hash) {
-    return entries_pending_doom_.find(entry_hash) !=
-           entries_pending_doom_.end();
-  }
-
- private:
-  ~SimplePostDoomWaiterTable();
-
-  net::CacheType cache_type_;
-  std::unordered_map<uint64_t, std::vector<SimplePostDoomWaiter>>
-      entries_pending_doom_;
-};
-
-}  // namespace disk_cache
-
-#endif  // NET_DISK_CACHE_SIMPLE_POST_DOOM_WAITER_H_
diff --git a/net/disk_cache/simple/post_operation_waiter.cc b/net/disk_cache/simple/post_operation_waiter.cc
new file mode 100644
index 0000000..e1b1150
--- /dev/null
+++ b/net/disk_cache/simple/post_operation_waiter.cc
@@ -0,0 +1,45 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/disk_cache/simple/post_operation_waiter.h"
+
+#include "base/check_op.h"
+#include "base/functional/bind.h"
+#include "base/functional/callback.h"
+#include "net/disk_cache/simple/simple_histogram_macros.h"
+
+namespace disk_cache {
+
+SimplePostOperationWaiterTable::SimplePostOperationWaiterTable() = default;
+SimplePostOperationWaiterTable::~SimplePostOperationWaiterTable() = default;
+
+void SimplePostOperationWaiterTable::OnOperationStart(uint64_t entry_hash) {
+  auto [_, inserted] = entries_pending_operation_.insert(
+      std::make_pair(entry_hash, std::vector<base::OnceClosure>()));
+  CHECK(inserted);
+}
+
+void SimplePostOperationWaiterTable::OnOperationComplete(uint64_t entry_hash) {
+  auto it = entries_pending_operation_.find(entry_hash);
+  CHECK(it != entries_pending_operation_.end());
+  std::vector<base::OnceClosure> to_handle_waiters;
+  to_handle_waiters.swap(it->second);
+  entries_pending_operation_.erase(it);
+
+  for (base::OnceClosure& post_operation : to_handle_waiters) {
+    std::move(post_operation).Run();
+  }
+}
+
+std::vector<base::OnceClosure>* SimplePostOperationWaiterTable::Find(
+    uint64_t entry_hash) {
+  auto doom_it = entries_pending_operation_.find(entry_hash);
+  if (doom_it != entries_pending_operation_.end()) {
+    return &doom_it->second;
+  } else {
+    return nullptr;
+  }
+}
+
+}  // namespace disk_cache
diff --git a/net/disk_cache/simple/post_operation_waiter.h b/net/disk_cache/simple/post_operation_waiter.h
new file mode 100644
index 0000000..e0da3dfe
--- /dev/null
+++ b/net/disk_cache/simple/post_operation_waiter.h
@@ -0,0 +1,61 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_DISK_CACHE_SIMPLE_POST_OPERATION_WAITER_H_
+#define NET_DISK_CACHE_SIMPLE_POST_OPERATION_WAITER_H_
+
+#include <stdint.h>
+
+#include <unordered_map>
+#include <vector>
+
+#include "base/functional/callback.h"
+#include "base/memory/ref_counted.h"
+#include "net/base/cache_type.h"
+
+namespace disk_cache {
+
+// See |SimpleBackendImpl::post_doom_waiting_| for the description. This is
+// refcounted since sometimes this needs to survive backend destruction to
+// complete some per-entry operations.
+class SimplePostOperationWaiterTable
+    : public base::RefCounted<SimplePostOperationWaiterTable> {
+  friend class base::RefCounted<SimplePostOperationWaiterTable>;
+
+ public:
+  SimplePostOperationWaiterTable();
+
+  SimplePostOperationWaiterTable(const SimplePostOperationWaiterTable&) =
+      delete;
+  SimplePostOperationWaiterTable& operator=(
+      const SimplePostOperationWaiterTable&) = delete;
+
+  // The entry for |entry_hash| is performing an operation like doom or opening
+  // by hash; the backend will not attempt to run new operations for this
+  // |entry_hash| until it is is completed.
+  void OnOperationStart(uint64_t entry_hash);
+
+  // The entry for |entry_hash| has been successfully doomed or had its key
+  // figured out, we can now allow operations on this entry, and we can run any
+  // operations enqueued while the operation was taking place. This will happen
+  // synchronously.
+  void OnOperationComplete(uint64_t entry_hash);
+
+  // Returns nullptr if not found.
+  std::vector<base::OnceClosure>* Find(uint64_t entry_hash);
+
+  bool Has(uint64_t entry_hash) {
+    return entries_pending_operation_.contains(entry_hash);
+  }
+
+ private:
+  ~SimplePostOperationWaiterTable();
+
+  std::unordered_map<uint64_t, std::vector<base::OnceClosure>>
+      entries_pending_operation_;
+};
+
+}  // namespace disk_cache
+
+#endif  // NET_DISK_CACHE_SIMPLE_POST_OPERATION_WAITER_H_
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc
index 41dddb9..c31d5038 100644
--- a/net/disk_cache/simple/simple_backend_impl.cc
+++ b/net/disk_cache/simple/simple_backend_impl.cc
@@ -223,7 +223,9 @@
       orig_max_size_(max_bytes),
       entry_operations_mode_(CacheTypeToOperationsMode(cache_type)),
       post_doom_waiting_(
-          base::MakeRefCounted<SimplePostDoomWaiterTable>(cache_type)),
+          base::MakeRefCounted<SimplePostOperationWaiterTable>()),
+      post_open_by_hash_waiting_(
+          base::MakeRefCounted<SimplePostOperationWaiterTable>()),
       net_log_(net_log) {
   // Treat negative passed-in sizes same as SetMaxSize would here and in other
   // backends, as default (if first call).
@@ -290,9 +292,9 @@
       kMinFileSizeLimit);
 }
 
-scoped_refptr<SimplePostDoomWaiterTable> SimpleBackendImpl::OnDoomStart(
+scoped_refptr<SimplePostOperationWaiterTable> SimpleBackendImpl::OnDoomStart(
     uint64_t entry_hash) {
-  post_doom_waiting_->OnDoomStart(entry_hash);
+  post_doom_waiting_->OnOperationStart(entry_hash);
   return post_doom_waiting_;
 }
 
@@ -371,11 +373,13 @@
                                          EntryResultCallback callback) {
   const uint64_t entry_hash = simple_util::GetEntryHashKey(key);
 
-  std::vector<SimplePostDoomWaiter>* post_doom = nullptr;
+  std::vector<base::OnceClosure>* post_operation = nullptr;
+  PostOperationQueue post_operation_queue = PostOperationQueue::kNone;
   scoped_refptr<SimpleEntryImpl> simple_entry = CreateOrFindActiveOrDoomedEntry(
-      entry_hash, key, request_priority, &post_doom);
+      entry_hash, key, request_priority, post_operation, post_operation_queue);
   if (!simple_entry) {
-    if (post_doom->empty() &&
+    if (post_operation_queue == PostOperationQueue::kPostDoom &&
+        post_operation->empty() &&
         entry_operations_mode_ == SimpleEntryImpl::OPTIMISTIC_OPERATIONS) {
       // The entry is doomed, and no other backend operations are queued for the
       // entry, thus the open must fail and it's safe to return synchronously.
@@ -391,9 +395,9 @@
     base::OnceCallback<EntryResult(EntryResultCallback)> operation =
         base::BindOnce(&SimpleBackendImpl::OpenEntry, base::Unretained(this),
                        key, request_priority);
-    post_doom->emplace_back(base::BindOnce(&RunEntryResultOperationAndCallback,
-                                           AsWeakPtr(), std::move(operation),
-                                           std::move(callback)));
+    post_operation->emplace_back(
+        base::BindOnce(&RunEntryResultOperationAndCallback, AsWeakPtr(),
+                       std::move(operation), std::move(callback)));
     return EntryResult::MakeError(net::ERR_IO_PENDING);
   }
   return simple_entry->OpenEntry(std::move(callback));
@@ -406,25 +410,26 @@
   DCHECK_LT(0u, key.size());
   const uint64_t entry_hash = simple_util::GetEntryHashKey(key);
 
-  std::vector<SimplePostDoomWaiter>* post_doom = nullptr;
+  std::vector<base::OnceClosure>* post_operation = nullptr;
+  PostOperationQueue post_operation_queue = PostOperationQueue::kNone;
   scoped_refptr<SimpleEntryImpl> simple_entry = CreateOrFindActiveOrDoomedEntry(
-      entry_hash, key, request_priority, &post_doom);
+      entry_hash, key, request_priority, post_operation, post_operation_queue);
 
   // If couldn't grab an entry object due to pending doom, see if circumstances
   // are right for an optimistic create.
-  if (!simple_entry) {
+  if (!simple_entry && post_operation_queue == PostOperationQueue::kPostDoom) {
     simple_entry = MaybeOptimisticCreateForPostDoom(
-        entry_hash, key, request_priority, post_doom);
+        entry_hash, key, request_priority, post_operation);
   }
 
-  // If that doesn't work either, retry this once doom is done.
+  // If that doesn't work either, retry this once doom / open by hash is done.
   if (!simple_entry) {
     base::OnceCallback<EntryResult(EntryResultCallback)> operation =
         base::BindOnce(&SimpleBackendImpl::CreateEntry, base::Unretained(this),
                        key, request_priority);
-    post_doom->emplace_back(base::BindOnce(&RunEntryResultOperationAndCallback,
-                                           AsWeakPtr(), std::move(operation),
-                                           std::move(callback)));
+    post_operation->emplace_back(
+        base::BindOnce(&RunEntryResultOperationAndCallback, AsWeakPtr(),
+                       std::move(operation), std::move(callback)));
     return EntryResult::MakeError(net::ERR_IO_PENDING);
   }
 
@@ -438,23 +443,27 @@
   DCHECK_LT(0u, key.size());
   const uint64_t entry_hash = simple_util::GetEntryHashKey(key);
 
-  std::vector<SimplePostDoomWaiter>* post_doom = nullptr;
+  std::vector<base::OnceClosure>* post_operation = nullptr;
+  PostOperationQueue post_operation_queue = PostOperationQueue::kNone;
   scoped_refptr<SimpleEntryImpl> simple_entry = CreateOrFindActiveOrDoomedEntry(
-      entry_hash, key, request_priority, &post_doom);
+      entry_hash, key, request_priority, post_operation, post_operation_queue);
 
   // If couldn't grab an entry object due to pending doom, see if circumstances
   // are right for an optimistic create.
   if (!simple_entry) {
-    simple_entry = MaybeOptimisticCreateForPostDoom(
-        entry_hash, key, request_priority, post_doom);
+    if (post_operation_queue == PostOperationQueue::kPostDoom) {
+      simple_entry = MaybeOptimisticCreateForPostDoom(
+          entry_hash, key, request_priority, post_operation);
+    }
     if (simple_entry) {
       return simple_entry->CreateEntry(std::move(callback));
     } else {
-      // If that doesn't work either, retry this once doom is done.
+      // If that doesn't work either, retry this once doom / open by hash is
+      // done.
       base::OnceCallback<EntryResult(EntryResultCallback)> operation =
           base::BindOnce(&SimpleBackendImpl::OpenOrCreateEntry,
                          base::Unretained(this), key, request_priority);
-      post_doom->emplace_back(
+      post_operation->emplace_back(
           base::BindOnce(&RunEntryResultOperationAndCallback, AsWeakPtr(),
                          std::move(operation), std::move(callback)));
       return EntryResult::MakeError(net::ERR_IO_PENDING);
@@ -469,7 +478,7 @@
     uint64_t entry_hash,
     const std::string& key,
     net::RequestPriority request_priority,
-    std::vector<SimplePostDoomWaiter>* post_doom) {
+    std::vector<base::OnceClosure>* post_doom) {
   scoped_refptr<SimpleEntryImpl> simple_entry;
   // We would like to optimistically have create go ahead, for benefit of
   // HTTP cache use. This can only be sanely done if we are the only op
@@ -499,20 +508,22 @@
                                         CompletionOnceCallback callback) {
   const uint64_t entry_hash = simple_util::GetEntryHashKey(key);
 
-  std::vector<SimplePostDoomWaiter>* post_doom = nullptr;
-  scoped_refptr<SimpleEntryImpl> simple_entry =
-      CreateOrFindActiveOrDoomedEntry(entry_hash, key, priority, &post_doom);
+  std::vector<base::OnceClosure>* post_operation = nullptr;
+  PostOperationQueue post_operation_queue = PostOperationQueue::kNone;
+  scoped_refptr<SimpleEntryImpl> simple_entry = CreateOrFindActiveOrDoomedEntry(
+      entry_hash, key, priority, post_operation, post_operation_queue);
   if (!simple_entry) {
-    // At first glance, it appears exceedingly silly to queue up a doom
-    // when we get here because the files corresponding to our key are being
-    // deleted... but it's possible that one of the things in post_doom is a
-    // create for our key, in which case we still have work to do.
+    // At first glance, it appears exceedingly silly to queue up a doom when we
+    // get here with `post_operation_queue == PostOperationQueue::kPostDoom`,
+    // e.g. a doom already pending; but it's possible that the sequence of
+    // operations is Doom/Create/Doom, in which case the second Doom is not
+    // at all redundant.
     base::OnceCallback<net::Error(CompletionOnceCallback)> operation =
         base::BindOnce(&SimpleBackendImpl::DoomEntry, base::Unretained(this),
                        key, priority);
-    post_doom->emplace_back(base::BindOnce(&RunOperationAndCallback,
-                                           AsWeakPtr(), std::move(operation),
-                                           std::move(callback)));
+    post_operation->emplace_back(
+        base::BindOnce(&RunOperationAndCallback, AsWeakPtr(),
+                       std::move(operation), std::move(callback)));
     return net::ERR_IO_PENDING;
   }
 
@@ -769,13 +780,18 @@
     const uint64_t entry_hash,
     const std::string& key,
     net::RequestPriority request_priority,
-    std::vector<SimplePostDoomWaiter>** post_doom) {
+    std::vector<base::OnceClosure>*& post_operation,
+    PostOperationQueue& post_operation_queue) {
   DCHECK_EQ(entry_hash, simple_util::GetEntryHashKey(key));
 
   // If there is a doom pending, we would want to serialize after it.
-  *post_doom = post_doom_waiting_->Find(entry_hash);
-  if (*post_doom)
+  std::vector<base::OnceClosure>* post_doom =
+      post_doom_waiting_->Find(entry_hash);
+  if (post_doom) {
+    post_operation = post_doom;
+    post_operation_queue = PostOperationQueue::kPostDoom;
     return nullptr;
+  }
 
   std::pair<EntryMap::iterator, bool> insert_result =
       active_entries_.insert(EntryMap::value_type(entry_hash, nullptr));
@@ -793,21 +809,33 @@
   // update its priority.
   DCHECK(it->second);
   // It's possible, but unlikely, that we have an entry hash collision with a
-  // currently active entry.
+  // currently active entry, or we may not know the key of active entry yet,
+  // since it's being opened by hash.
   if (key != it->second->key()) {
-    it->second->Doom();
-    DCHECK_EQ(0U, active_entries_.count(entry_hash));
-    DCHECK(post_doom_waiting_->Has(entry_hash));
-    // Re-run ourselves to handle the now-pending doom.
-    return CreateOrFindActiveOrDoomedEntry(entry_hash, key, request_priority,
-                                           post_doom);
+    DCHECK(!did_insert);
+    if (it->second->key().has_value()) {
+      // Collision case.
+      it->second->Doom();
+      DCHECK_EQ(0U, active_entries_.count(entry_hash));
+      DCHECK(post_doom_waiting_->Has(entry_hash));
+      // Re-run ourselves to handle the now-pending doom.
+      return CreateOrFindActiveOrDoomedEntry(entry_hash, key, request_priority,
+                                             post_operation,
+                                             post_operation_queue);
+    } else {
+      // Open by hash case.
+      post_operation = post_open_by_hash_waiting_->Find(entry_hash);
+      CHECK(post_operation);
+      post_operation_queue = PostOperationQueue::kPostOpenByHash;
+      return nullptr;
+    }
   }
   return base::WrapRefCounted(it->second);
 }
 
 EntryResult SimpleBackendImpl::OpenEntryFromHash(uint64_t entry_hash,
                                                  EntryResultCallback callback) {
-  std::vector<SimplePostDoomWaiter>* post_doom =
+  std::vector<base::OnceClosure>* post_doom =
       post_doom_waiting_->Find(entry_hash);
   if (post_doom) {
     base::OnceCallback<EntryResult(EntryResultCallback)> operation =
@@ -835,14 +863,22 @@
     it->second = simple_entry.get();
     simple_entry->SetActiveEntryProxy(
         ActiveEntryProxy::Create(entry_hash, this));
+    post_open_by_hash_waiting_->OnOperationStart(entry_hash);
+    callback =
+        base::BindOnce(&SimpleBackendImpl::OnEntryOpenedFromHash, AsWeakPtr(),
+                       entry_hash, simple_entry, std::move(callback));
   }
+
+  // Note: the !did_insert case includes when another OpenEntryFromHash is
+  // pending; we don't care since that one will take care of the queue and we
+  // don't need to check for key collisions.
   return it->second->OpenEntry(std::move(callback));
 }
 
 net::Error SimpleBackendImpl::DoomEntryFromHash(
     uint64_t entry_hash,
     CompletionOnceCallback callback) {
-  std::vector<SimplePostDoomWaiter>* post_doom =
+  std::vector<base::OnceClosure>* post_doom =
       post_doom_waiting_->Find(entry_hash);
   if (post_doom) {
     base::OnceCallback<net::Error(CompletionOnceCallback)> operation =
@@ -866,12 +902,21 @@
   return net::ERR_IO_PENDING;
 }
 
+void SimpleBackendImpl::OnEntryOpenedFromHash(
+    uint64_t hash,
+    const scoped_refptr<SimpleEntryImpl>& simple_entry,
+    EntryResultCallback callback,
+    EntryResult result) {
+  post_open_by_hash_waiting_->OnOperationComplete(hash);
+  std::move(callback).Run(std::move(result));
+}
+
 void SimpleBackendImpl::DoomEntriesComplete(
     std::unique_ptr<std::vector<uint64_t>> entry_hashes,
     CompletionOnceCallback callback,
     int result) {
   for (const uint64_t& entry_hash : *entry_hashes)
-    post_doom_waiting_->OnDoomComplete(entry_hash);
+    post_doom_waiting_->OnOperationComplete(entry_hash);
   std::move(callback).Run(result);
 }
 
diff --git a/net/disk_cache/simple/simple_backend_impl.h b/net/disk_cache/simple/simple_backend_impl.h
index cde0eee..41e0a36 100644
--- a/net/disk_cache/simple/simple_backend_impl.h
+++ b/net/disk_cache/simple/simple_backend_impl.h
@@ -27,7 +27,7 @@
 #include "net/base/cache_type.h"
 #include "net/base/net_export.h"
 #include "net/disk_cache/disk_cache.h"
-#include "net/disk_cache/simple/post_doom_waiter.h"
+#include "net/disk_cache/simple/post_operation_waiter.h"
 #include "net/disk_cache/simple/simple_entry_impl.h"
 #include "net/disk_cache/simple/simple_index_delegate.h"
 
@@ -92,8 +92,9 @@
   // The entry for |entry_hash| is being doomed; the backend will not attempt
   // run new operations for this |entry_hash| until the Doom is completed.
   //
-  // The return value should be used to call OnDoomComplete.
-  scoped_refptr<SimplePostDoomWaiterTable> OnDoomStart(uint64_t entry_hash);
+  // The return value should be used to call OnOperationComplete.
+  scoped_refptr<SimplePostOperationWaiterTable> OnDoomStart(
+      uint64_t entry_hash);
 
   // SimpleIndexDelegate:
   void DoomEntries(std::vector<uint64_t>* entry_hashes,
@@ -167,6 +168,8 @@
     int net_error;
   };
 
+  enum class PostOperationQueue { kNone, kPostDoom, kPostOpenByHash };
+
   void InitializeIndex(CompletionOnceCallback callback,
                        const DiskStatResult& result);
 
@@ -196,17 +199,20 @@
       uint64_t suggested_max_size,
       net::CacheType cache_type);
 
-  // Looks at current state of |entries_pending_doom_| and |active_entries_|
-  // relevant to |entry_hash|, and, as appropriate, either returns a valid entry
-  // matching |entry_hash| and |key|, or returns nullptr and sets |*post_doom|
-  // to point to a vector of closures which will be invoked when it's an
-  // appropriate time to try again.  The caller is expected to append its retry
-  // closure to that vector.
+  // Looks at current state of `post_doom_waiting_`,
+  // `post_open_by_hash_waiting_` and `active_entries_` relevant to
+  // `entry_hash`, and, as appropriate, either returns a valid entry matching
+  // `entry_hash` and `key`, or returns nullptr and sets `post_operation` to
+  // point to a vector of closures which will be invoked when it's an
+  // appropriate time to try again. The caller is expected to append its retry
+  // closure to that vector. `post_operation_queue` will be set exactly when
+  // `post_operation` is.
   scoped_refptr<SimpleEntryImpl> CreateOrFindActiveOrDoomedEntry(
       uint64_t entry_hash,
       const std::string& key,
       net::RequestPriority request_priority,
-      std::vector<SimplePostDoomWaiter>** post_doom);
+      std::vector<base::OnceClosure>*& post_operation,
+      PostOperationQueue& post_operation_queue);
 
   // If post-doom and settings indicates that optimistically succeeding a create
   // due to being immediately after a doom is possible, sets up an entry for
@@ -218,7 +224,7 @@
       uint64_t entry_hash,
       const std::string& key,
       net::RequestPriority request_priority,
-      std::vector<SimplePostDoomWaiter>* post_doom);
+      std::vector<base::OnceClosure>* post_doom);
 
   // Given a hash, will try to open the corresponding Entry. If we have an Entry
   // corresponding to |hash| in the map of active entries, opens it. Otherwise,
@@ -233,13 +239,14 @@
   net::Error DoomEntryFromHash(uint64_t entry_hash,
                                CompletionOnceCallback callback);
 
-  // Called when we tried to open an entry from key. When the entry has been
-  // opened, a check for key mismatch is performed.
-  void OnEntryOpenedFromKey(const std::string key,
-                            Entry** entry,
-                            const scoped_refptr<SimpleEntryImpl>& simple_entry,
-                            CompletionOnceCallback callback,
-                            int error_code);
+  // Called when we tried to open an entry with hash alone. When a blank entry
+  // has been created and filled in with information from the disk - based on a
+  // hash alone - this resumes operations that were waiting on the key
+  // information to have been loaded.
+  void OnEntryOpenedFromHash(uint64_t hash,
+                             const scoped_refptr<SimpleEntryImpl>& simple_entry,
+                             EntryResultCallback callback,
+                             EntryResult result);
 
   // A callback thunk used by DoomEntries to clear the |entries_pending_doom_|
   // after a mass doom.
@@ -270,10 +277,15 @@
 
   // The set of all entries which are currently being doomed. To avoid races,
   // these entries cannot have Doom/Create/Open operations run until the doom
-  // is complete. The base::OnceClosure |SimplePostDoomWaiter::run_post_doom|
-  // field is used to store deferred operations to be run at the completion of
-  // the Doom.
-  scoped_refptr<SimplePostDoomWaiterTable> post_doom_waiting_;
+  // is complete. They store a vector of base::OnceClosure's of deferred
+  // operations to be run at the completion of the Doom.
+  scoped_refptr<SimplePostOperationWaiterTable> post_doom_waiting_;
+
+  // Set of entries which are being opened by hash. We don't have their key,
+  // so can't check for collisions on Doom/Open/Create ops until that is
+  // complete.  This stores a vector of base::OnceClosure's of deferred
+  // operations to be run at the completion of the Doom.
+  scoped_refptr<SimplePostOperationWaiterTable> post_open_by_hash_waiting_;
 
   const raw_ptr<net::NetLog> net_log_;
 
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc
index b6e9905..13e312d 100644
--- a/net/disk_cache/simple/simple_entry_impl.cc
+++ b/net/disk_cache/simple/simple_entry_impl.cc
@@ -1611,7 +1611,7 @@
   PostClientCallback(std::move(callback), result);
   RunNextOperationIfNeeded();
   if (post_doom_waiting_) {
-    post_doom_waiting_->OnDoomComplete(entry_hash_);
+    post_doom_waiting_->OnOperationComplete(entry_hash_);
     post_doom_waiting_ = nullptr;
   }
 }
diff --git a/net/disk_cache/simple/simple_entry_impl.h b/net/disk_cache/simple/simple_entry_impl.h
index 35e85b2..5703935 100644
--- a/net/disk_cache/simple/simple_entry_impl.h
+++ b/net/disk_cache/simple/simple_entry_impl.h
@@ -20,7 +20,7 @@
 #include "net/base/net_export.h"
 #include "net/base/request_priority.h"
 #include "net/disk_cache/disk_cache.h"
-#include "net/disk_cache/simple/post_doom_waiter.h"
+#include "net/disk_cache/simple/post_operation_waiter.h"
 #include "net/disk_cache/simple/simple_entry_format.h"
 #include "net/disk_cache/simple/simple_entry_operation.h"
 #include "net/disk_cache/simple/simple_synchronous_entry.h"
@@ -451,7 +451,7 @@
   scoped_refptr<net::GrowableIOBuffer> stream_1_prefetch_data_;
 
   // This is used only while a doom is pending.
-  scoped_refptr<SimplePostDoomWaiterTable> post_doom_waiting_;
+  scoped_refptr<SimplePostOperationWaiterTable> post_doom_waiting_;
 
   // Choosing uint32_t over uint64_t for space savings. Pages have in the
   // hundres to possibly thousands of resources. Wrapping every 4 billion
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index f2671165..456013e 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2023-11-26 12:54 UTC
+# Last updated: 2023-11-27 12:54 UTC
 PinsListTimestamp
-1701003279
+1701089665
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index f4d9ad8..1db54e3 100644
--- a/net/http/transport_security_state_static_pins.json
+++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@
 // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets'
 // refer to, and the timestamp at which the pins list was last updated.
 //
-// Last updated: 2023-11-26 12:54 UTC
+// Last updated: 2023-11-27 12:54 UTC
 //
 {
   "pinsets": [
diff --git a/ppapi/shared_impl/var_tracker.cc b/ppapi/shared_impl/var_tracker.cc
index 3100e1d..9deb8156b 100644
--- a/ppapi/shared_impl/var_tracker.cc
+++ b/ppapi/shared_impl/var_tracker.cc
@@ -4,8 +4,7 @@
 
 #include "ppapi/shared_impl/var_tracker.h"
 
-#include <string.h>
-
+#include <algorithm>
 #include <limits>
 #include <memory>
 
@@ -214,8 +213,9 @@
 
   ArrayBufferVar* array_buffer(CreateArrayBuffer(size_in_bytes));
   if (!array_buffer)
-    return NULL;
-  memcpy(array_buffer->Map(), data, size_in_bytes);
+    return nullptr;
+  std::copy_n(static_cast<const uint8_t*>(data), size_in_bytes,
+              static_cast<uint8_t*>(array_buffer->Map()));
   return array_buffer;
 }
 
diff --git a/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.cc b/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.cc
index 943cc1f..6f3cdf4 100644
--- a/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.cc
+++ b/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.cc
@@ -656,7 +656,7 @@
 }
 
 bool HprofParser::SeekToFieldPosition(ClassInstance* instance,
-                                      base::StringPiece field_name) {
+                                      std::string_view field_name) {
   ClassObject* class_obj = FindClassObject(instance->class_id);
   if (class_obj == nullptr)
     return false;
diff --git a/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.h b/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.h
index 597b05d..a76b93b7 100644
--- a/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.h
+++ b/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.h
@@ -6,11 +6,11 @@
 #define SERVICES_TRACING_PUBLIC_CPP_PERFETTO_JAVA_HEAP_PROFILER_HPROF_PARSER_ANDROID_H_
 
 #include <string>
+#include <string_view>
 #include <unordered_map>
 
 #include "base/component_export.h"
 #include "base/gtest_prod_util.h"
-#include "base/strings/string_piece.h"
 #include "services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_buffer_android.h"
 #include "services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_instances_android.h"
 #include "third_party/perfetto/protos/perfetto/trace/profiling/heap_graph.pbzero.h"
@@ -183,7 +183,7 @@
   // Returns true after setting the position of |hprof_buffer_| to point to the
   // |field_name| in class.
   [[nodiscard]] bool SeekToFieldPosition(ClassInstance* instance,
-                                         base::StringPiece field_name);
+                                         std::string_view field_name);
 
   std::unordered_map<ObjectId, std::unique_ptr<StringReference>> strings_;
 
diff --git a/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android_unittest.cc b/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android_unittest.cc
index d45d474..d5ccddd 100644
--- a/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android_unittest.cc
+++ b/services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "services/tracing/public/cpp/perfetto/java_heap_profiler/hprof_parser_android.h"
 
+#include <string_view>
+
 #include "base/android/java_heap_dump_generator.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -277,7 +279,7 @@
 }
 
 std::unique_ptr<ClassObject> GetClassObjectWith2Fields(int id,
-                                                       base::StringPiece name) {
+                                                       std::string_view name) {
   auto obj = std::make_unique<ClassObject>(id, std::string{name});
   obj->instance_fields = {Field(base::StrCat({name, "_f1"}), DataType::INT, 0),
                           Field(base::StrCat({name, "_f2"}), DataType::INT, 0)};
diff --git a/services/tracing/public/cpp/perfetto/traced_value_proto_writer.cc b/services/tracing/public/cpp/perfetto/traced_value_proto_writer.cc
index 601ad7e5..f41682f 100644
--- a/services/tracing/public/cpp/perfetto/traced_value_proto_writer.cc
+++ b/services/tracing/public/cpp/perfetto/traced_value_proto_writer.cc
@@ -5,10 +5,10 @@
 
 #include <memory>
 #include <stack>
+#include <string_view>
 
 #include "base/hash/hash.h"
 #include "base/json/string_escape.h"
-#include "base/strings/string_piece.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
 #include "third_party/perfetto/include/perfetto/protozero/message_handle.h"
@@ -77,7 +77,7 @@
     AddDictEntry(name)->set_int_value(value);
   }
 
-  void SetIntegerWithCopiedName(base::StringPiece name, int value) override {
+  void SetIntegerWithCopiedName(std::string_view name, int value) override {
     AddDictEntry(name)->set_int_value(value);
   }
 
@@ -85,7 +85,7 @@
     AddDictEntry(name)->set_double_value(value);
   }
 
-  void SetDoubleWithCopiedName(base::StringPiece name, double value) override {
+  void SetDoubleWithCopiedName(std::string_view name, double value) override {
     AddDictEntry(name)->set_double_value(value);
   }
 
@@ -93,16 +93,16 @@
     AddDictEntry(name)->set_bool_value(value);
   }
 
-  void SetBooleanWithCopiedName(base::StringPiece name, bool value) override {
+  void SetBooleanWithCopiedName(std::string_view name, bool value) override {
     AddDictEntry(name)->set_bool_value(value);
   }
 
-  void SetString(const char* name, base::StringPiece value) override {
+  void SetString(const char* name, std::string_view value) override {
     AddDictEntry(name)->set_string_value(value.data(), value.size());
   }
 
-  void SetStringWithCopiedName(base::StringPiece name,
-                               base::StringPiece value) override {
+  void SetStringWithCopiedName(std::string_view name,
+                               std::string_view value) override {
     AddDictEntry(name)->set_string_value(value.data(), value.size());
   }
 
@@ -125,7 +125,7 @@
     DCHECK_EQ(full_child_size, appended_size);
   }
 
-  void SetValueWithCopiedName(base::StringPiece name, Writer* value) override {
+  void SetValueWithCopiedName(std::string_view name, Writer* value) override {
     SetValue(std::string(name).c_str(), value);
   }
 
@@ -144,8 +144,8 @@
     node_stack_.top()->set_nested_type(ProtoValue::DICT);
   }
 
-  void BeginDictionaryWithCopiedName(base::StringPiece name) override {
-    node_stack_.emplace(ProtoValueHandle(AddDictEntry(name)));
+  void BeginDictionaryWithCopiedName(std::string_view name) override {
+    node_stack_.emplace(AddDictEntry(name));
     node_stack_.top()->set_nested_type(ProtoValue::DICT);
   }
 
@@ -154,8 +154,8 @@
     node_stack_.top()->set_nested_type(ProtoValue::ARRAY);
   }
 
-  void BeginArrayWithCopiedName(base::StringPiece name) override {
-    node_stack_.emplace(ProtoValueHandle(AddDictEntry(name)));
+  void BeginArrayWithCopiedName(std::string_view name) override {
+    node_stack_.emplace(AddDictEntry(name));
     node_stack_.top()->set_nested_type(ProtoValue::ARRAY);
   }
 
@@ -181,7 +181,7 @@
     AddArrayEntry()->set_bool_value(value);
   }
 
-  void AppendString(base::StringPiece value) override {
+  void AppendString(std::string_view value) override {
     AddArrayEntry()->set_string_value(value.data(), value.size());
   }
 
@@ -235,7 +235,7 @@
     return node_stack_.top()->add_dict_values();
   }
 
-  ProtoValue* AddDictEntry(base::StringPiece name) {
+  ProtoValue* AddDictEntry(std::string_view name) {
     DCHECK(!node_stack_.empty() && !node_stack_.top()->is_finalized());
     node_stack_.top()->add_dict_keys(name.data(), name.length());
     return node_stack_.top()->add_dict_values();
diff --git a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
index 94905a0..128b804 100644
--- a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
+++ b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 #include <atomic>
+#include <string_view>
 
 #include "base/auto_reset.h"
 #include "base/containers/contains.h"
@@ -719,7 +720,7 @@
         base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
   }
   if (maybe_new_name && *maybe_new_name &&
-      base::StringPiece(thread_name_) != maybe_new_name) {
+      std::string_view(thread_name_) != maybe_new_name) {
     thread_name_ = maybe_new_name;
     thread_type_ = GetThreadType(maybe_new_name);
   }
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
index 7e033f28..a65d3333 100644
--- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
+++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
@@ -6,6 +6,7 @@
 
 #include <limits>
 #include <set>
+#include <string_view>
 
 #include "base/android/library_loader/anchor_functions.h"
 #include "base/debug/leak_annotations.h"
@@ -319,7 +320,7 @@
   // Sets Chrome's module info for the frame.
   void SetChromeModuleInfo() {
     module_base_address = executable_start_addr();
-    static const absl::optional<base::StringPiece> library_name =
+    static const absl::optional<std::string_view> library_name =
         base::debug::ReadElfLibraryName(
             reinterpret_cast<void*>(executable_start_addr()));
     static const base::NoDestructor<std::string> chrome_debug_id([] {
diff --git a/services/tracing/public/cpp/trace_event_args_allowlist.cc b/services/tracing/public/cpp/trace_event_args_allowlist.cc
index 3250e12..e0cb2c31 100644
--- a/services/tracing/public/cpp/trace_event_args_allowlist.cc
+++ b/services/tracing/public/cpp/trace_event_args_allowlist.cc
@@ -4,6 +4,8 @@
 
 #include "services/tracing/public/cpp/trace_event_args_allowlist.h"
 
+#include <string_view>
+
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "base/strings/pattern.h"
@@ -140,8 +142,7 @@
       category_group_name, category_group_name + strlen(category_group_name),
       ",");
   while (category_group_tokens.GetNext()) {
-    base::StringPiece category_group_token =
-        category_group_tokens.token_piece();
+    std::string_view category_group_token = category_group_tokens.token_piece();
     for (int i = 0; kEventArgsAllowlist[i].category_name != nullptr; ++i) {
       const AllowlistEntry& allowlist_entry = kEventArgsAllowlist[i];
       DCHECK(allowlist_entry.event_name);
diff --git a/skia/public/mojom/BUILD.gn b/skia/public/mojom/BUILD.gn
index cd3d332..11bf3a0c 100644
--- a/skia/public/mojom/BUILD.gn
+++ b/skia/public/mojom/BUILD.gn
@@ -36,6 +36,7 @@
     "image_info.mojom",
     "skcolor.mojom",
     "skcolor4f.mojom",
+    "skcolorspace.mojom",
     "skcolorspace_primaries.mojom",
     "surface_origin.mojom",
     "tile_mode.mojom",
@@ -91,6 +92,26 @@
     {
       types = [
         {
+          mojom = "skia.mojom.SkcmsMatrix3x3"
+          cpp = "::skcms_Matrix3x3"
+        },
+      ]
+      traits_headers = [ "skcolorspace_mojom_traits.h" ]
+      traits_public_deps = [ "//skia" ]
+    },
+    {
+      types = [
+        {
+          mojom = "skia.mojom.SkcmsTransferFunction"
+          cpp = "::skcms_TransferFunction"
+        },
+      ]
+      traits_headers = [ "skcolorspace_mojom_traits.h" ]
+      traits_public_deps = [ "//skia" ]
+    },
+    {
+      types = [
+        {
           mojom = "skia.mojom.SkColor"
           cpp = "::SkColor"
           copyable_pass_by_value = true
@@ -122,6 +143,16 @@
     {
       types = [
         {
+          mojom = "skia.mojom.SkColorSpace"
+          cpp = "::sk_sp<SkColorSpace>"
+        },
+      ]
+      traits_headers = [ "skcolorspace_mojom_traits.h" ]
+      traits_public_deps = [ "//skia" ]
+    },
+    {
+      types = [
+        {
           mojom = "skia.mojom.AlphaType"
           cpp = "::SkAlphaType"
         },
diff --git a/skia/public/mojom/skcolorspace.mojom b/skia/public/mojom/skcolorspace.mojom
new file mode 100644
index 0000000..19a7715
--- /dev/null
+++ b/skia/public/mojom/skcolorspace.mojom
@@ -0,0 +1,41 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module skia.mojom;
+
+// A 3x3 matrix to convert between primaries in linear space.
+struct SkcmsMatrix3x3 {
+  array<float,9> vals;
+};
+
+// A transfer function mapping encoded values to linear values. This can be the
+// standard 7-parameter piecewise function:
+//
+//   F(x) = { c*x + f                           : 0 <= |x| < d
+//          { sign(x) * ((a*abs(x) + b)^g + e)  : d <= |x|
+//
+// A negative value for g can indicate some special transfer functions (HLG, and
+// PQ), or can indicate that the function is invalid (and will always evaluate
+// to zero).
+struct SkcmsTransferFunction {
+  float g;
+  float a;
+  float b;
+  float c;
+  float d;
+  float e;
+  float f;
+};
+
+// A color space specified by the transformation to linear space and then to
+// XYZD50 primaries. Either none or both of `to_linear` and `to_xyzd50` are
+// nullopt.
+struct SkColorSpace {
+  // The transformation from encoded space to linear space.
+  SkcmsTransferFunction? to_linear;
+
+  // The transformation from linear space to XYZD50 primaries.
+  SkcmsMatrix3x3? to_xyzd50;
+};
+
diff --git a/skia/public/mojom/skcolorspace_mojom_traits.h b/skia/public/mojom/skcolorspace_mojom_traits.h
new file mode 100644
index 0000000..ad2a63dd
--- /dev/null
+++ b/skia/public/mojom/skcolorspace_mojom_traits.h
@@ -0,0 +1,117 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SKIA_PUBLIC_MOJOM_SKCOLORSPACE_MOJOM_TRAITS_H_
+#define SKIA_PUBLIC_MOJOM_SKCOLORSPACE_MOJOM_TRAITS_H_
+
+#include "skia/public/mojom/skcolorspace.mojom-shared.h"
+#include "third_party/skia/include/core/SkColorSpace.h"
+#include "third_party/skia/modules/skcms/skcms.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<skia::mojom::SkcmsMatrix3x3DataView, ::skcms_Matrix3x3> {
+  static std::array<float, 9> vals(const skcms_Matrix3x3& in) {
+    std::array<float, 9> out;
+    for (size_t i = 0; i < 3; ++i) {
+      for (size_t j = 0; j < 3; ++j) {
+        out[3 * i + j] = in.vals[i][j];
+      }
+    }
+    return out;
+  }
+
+  static bool Read(skia::mojom::SkcmsMatrix3x3DataView data,
+                   skcms_Matrix3x3* out) {
+    mojo::ArrayDataView<float> data_matrix;
+    data.GetValsDataView(&data_matrix);
+    if (data_matrix.is_null() || data_matrix.size() != 9) {
+      return false;
+    }
+    for (size_t i = 0; i < 3; ++i) {
+      for (size_t j = 0; j < 3; ++j) {
+        out->vals[i][j] = data_matrix[3 * i + j];
+      }
+    }
+    return true;
+  }
+};
+
+template <>
+struct StructTraits<skia::mojom::SkcmsTransferFunctionDataView,
+                    ::skcms_TransferFunction> {
+  static float g(const ::skcms_TransferFunction& trfn) { return trfn.g; }
+  static float a(const ::skcms_TransferFunction& trfn) { return trfn.a; }
+  static float b(const ::skcms_TransferFunction& trfn) { return trfn.b; }
+  static float c(const ::skcms_TransferFunction& trfn) { return trfn.c; }
+  static float d(const ::skcms_TransferFunction& trfn) { return trfn.d; }
+  static float e(const ::skcms_TransferFunction& trfn) { return trfn.e; }
+  static float f(const ::skcms_TransferFunction& trfn) { return trfn.f; }
+
+  static bool Read(skia::mojom::SkcmsTransferFunctionDataView data,
+                   ::skcms_TransferFunction* trfn) {
+    trfn->g = data.g();
+    trfn->a = data.a();
+    trfn->b = data.b();
+    trfn->c = data.c();
+    trfn->d = data.d();
+    trfn->e = data.e();
+    trfn->f = data.f();
+    return true;
+  }
+};
+
+template <>
+struct StructTraits<skia::mojom::SkColorSpaceDataView, ::sk_sp<SkColorSpace>> {
+  static absl::optional<skcms_TransferFunction> to_linear(
+      const ::sk_sp<SkColorSpace>& in) {
+    if (!in) {
+      return absl::nullopt;
+    }
+    skcms_TransferFunction trfn = {
+        1.f, 1.f, 0.f, 0.f, 0.f, 0.f, 0.f,
+    };
+    in->transferFn(&trfn);
+    return trfn;
+  }
+  static absl::optional<skcms_Matrix3x3> to_xyzd50(
+      const ::sk_sp<SkColorSpace>& in) {
+    if (!in) {
+      return absl::nullopt;
+    }
+    skcms_Matrix3x3 m = {{{1.f, 0.f, 0.f}, {0.f, 1.f, 0.f}, {0.f, 0.f, 1.f}}};
+    // The function toXYZD50 returns a boolean for historical reasons. It will
+    // always return true.
+    bool result = in->toXYZD50(&m);
+    CHECK(result);
+    return m;
+  }
+
+  static bool Read(skia::mojom::SkColorSpaceDataView data,
+                   ::sk_sp<SkColorSpace>* out) {
+    absl::optional<skcms_TransferFunction> to_linear;
+    if (!data.ReadToLinear(&to_linear)) {
+      return false;
+    }
+    absl::optional<skcms_Matrix3x3> to_xyzd50;
+    if (!data.ReadToXyzd50(&to_xyzd50)) {
+      return false;
+    }
+    if (to_linear.has_value() != to_xyzd50.has_value()) {
+      // Either none or both of `to_linear` and `to_xyzd50` must have a value.
+      return false;
+    }
+    if (!to_linear.has_value() || !to_xyzd50.has_value()) {
+      *out = nullptr;
+    } else {
+      *out = SkColorSpace::MakeRGB(to_linear.value(), to_xyzd50.value());
+    }
+    return true;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // SKIA_PUBLIC_MOJOM_SKCOLOR4F_MOJOM_TRAITS_H_
diff --git a/skia/public/mojom/test/mojom_traits_unittest.cc b/skia/public/mojom/test/mojom_traits_unittest.cc
index d79d2a5..498fbc6 100644
--- a/skia/public/mojom/test/mojom_traits_unittest.cc
+++ b/skia/public/mojom/test/mojom_traits_unittest.cc
@@ -4,10 +4,15 @@
 
 #include <limits>
 #include "mojo/public/cpp/test_support/test_utils.h"
+#include "skia/ext/skcolorspace_primaries.h"
 #include "skia/public/mojom/bitmap.mojom.h"
 #include "skia/public/mojom/bitmap_skbitmap_mojom_traits.h"
 #include "skia/public/mojom/image_info.mojom-shared.h"
 #include "skia/public/mojom/image_info.mojom.h"
+#include "skia/public/mojom/skcolorspace.mojom.h"
+#include "skia/public/mojom/skcolorspace_mojom_traits.h"
+#include "skia/public/mojom/skcolorspace_primaries.mojom.h"
+#include "skia/public/mojom/skcolorspace_primaries_mojom_traits.h"
 #include "skia/public/mojom/tile_mode.mojom.h"
 #include "skia/public/mojom/tile_mode_mojom_traits.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -145,6 +150,41 @@
   EXPECT_EQ(input, output);
 }
 
+TEST(StructTraitsTest, SkColorSpace) {
+  skcms_TransferFunction in_trfn{0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f};
+  skcms_TransferFunction out_trfn;
+  ASSERT_TRUE(
+      mojo::test::SerializeAndDeserialize<skia::mojom::SkcmsTransferFunction>(
+          in_trfn, out_trfn));
+  EXPECT_EQ(memcmp(&in_trfn, &out_trfn, sizeof(in_trfn)), 0);
+
+  skcms_Matrix3x3 in_to_xyzd50{
+      .vals = {{0.1f, 0.2f, 0.3f}, {0.4f, 0.5f, 0.6f}, {0.7f, 0.8f, 0.9f}}};
+  skcms_Matrix3x3 out_to_xyzd50;
+  ASSERT_TRUE(mojo::test::SerializeAndDeserialize<skia::mojom::SkcmsMatrix3x3>(
+      in_to_xyzd50, out_to_xyzd50));
+  EXPECT_EQ(memcmp(&in_to_xyzd50, &out_to_xyzd50, sizeof(in_to_xyzd50)), 0);
+
+  sk_sp<SkColorSpace> in_cs = SkColorSpace::MakeRGB(in_trfn, in_to_xyzd50);
+  sk_sp<SkColorSpace> out_cs;
+  ASSERT_TRUE(mojo::test::SerializeAndDeserialize<skia::mojom::SkColorSpace>(
+      in_cs, out_cs));
+  EXPECT_TRUE(SkColorSpace::Equals(in_cs.get(), out_cs.get()));
+
+  sk_sp<SkColorSpace> in_null_cs;
+  sk_sp<SkColorSpace> out_null_cs;
+  ASSERT_TRUE(mojo::test::SerializeAndDeserialize<skia::mojom::SkColorSpace>(
+      in_null_cs, out_null_cs));
+  EXPECT_EQ(out_null_cs.get(), nullptr);
+
+  SkColorSpacePrimaries in_p = SkNamedPrimariesExt::kGenericFilm;
+  SkColorSpacePrimaries out_p;
+  ASSERT_TRUE(
+      mojo::test::SerializeAndDeserialize<skia::mojom::SkColorSpacePrimaries>(
+          in_p, out_p));
+  EXPECT_TRUE(in_p == out_p);
+}
+
 TEST(StructTraitsTest, TileMode) {
   SkTileMode input(SkTileMode::kClamp);
   SkTileMode output;
diff --git a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
index 0cbaffa..75ed0aa 100644
--- a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
+++ b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
@@ -21,6 +21,7 @@
 SwitchAccess*
 VpnExtensionObserverBrowserTest*
 WebAppsCrosapiBrowserTest*
+*WebAppsPreventCloseCrosapiBrowserTest*
 WebAppPreloadInstallerLacrosBrowserTest*
 WebAppProviderBridgeBrowserTest*
 WebKioskAcceleratorLacrosTest*
diff --git a/testing/buildbot/filters/pixel_tests.filter b/testing/buildbot/filters/pixel_tests.filter
index ae2f4bc..ba7abc3 100644
--- a/testing/buildbot/filters/pixel_tests.filter
+++ b/testing/buildbot/filters/pixel_tests.filter
@@ -27,8 +27,8 @@
 *DiceWebSigninInterceptionBubbleV2PixelTest.InvokeUi_*
 DeleteAddressProfileDialogControllerImplTest.InvokeUi_*
 EditAddressProfileDialogControllerImplTest.InvokeUi_*
-EnterpriseWelcomeUIDialogPixelTest.*
-EnterpriseWelcomeUIWindowPixelTest.*
+ManagedUserNoticeUIDialogPixelTest.*
+ManagedUserNoticeUIWindowPixelTest.*
 ExtensionInstallDialogViewInteractiveBrowserTest.*
 ExtensionUninstallDialogViewInteractiveBrowserTest.*
 *EyeDropperBrowserTest.*
diff --git a/testing/libfuzzer/research/BUILD.gn b/testing/libfuzzer/research/BUILD.gn
new file mode 100644
index 0000000..4accde20
--- /dev/null
+++ b/testing/libfuzzer/research/BUILD.gn
@@ -0,0 +1 @@
+visibility = [ "//testing/libfuzzer/research:*" ]
diff --git a/testing/libfuzzer/research/README.md b/testing/libfuzzer/research/README.md
new file mode 100644
index 0000000..271b7be
--- /dev/null
+++ b/testing/libfuzzer/research/README.md
@@ -0,0 +1,13 @@
+# Experimental Fuzzers and Utilities
+
+This directory contains experimental features pertaining to fuzzers and their
+associated tooling as applied to Chromium. Please don't take dependencies on any
+code here or assume that it will remain in its current form.
+
+You are welcome and encouraged to propose changes that would make fuzzing
+Chromium easier.
+
+We'd like this to be an incubator for new Chromium fuzzing techniques and tools.
+The contents are meant to be more malleable and transient than other parts of
+Chromium tree. Code may be removed, promoted to elsewhere in the tree, or parked
+to invite future contributions.
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 4ce1d82..3d0b804 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2920,6 +2920,21 @@
             ]
         }
     ],
+    "CameraMonitoringInVideoCaptureService": [
+        {
+            "platforms": [
+                "mac"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "CameraMonitoringInVideoCaptureService"
+                    ]
+                }
+            ]
+        }
+    ],
     "Canvas2DAutoFlushParams": [
         {
             "platforms": [
@@ -13198,36 +13213,6 @@
             ]
         }
     ],
-    "Prerender2BookmarkBarTrigger": [
-        {
-            "platforms": [
-                "linux",
-                "mac",
-                "windows",
-                "chromeos",
-                "chromeos_lacros"
-            ],
-            "experiments": [
-                {
-                    "name": "BothMouseDownAndMouseHover_20231017",
-                    "params": {
-                        "prerender_bookmarkbar_on_mouse_hover_trigger": "true",
-                        "prerender_bookmarkbar_on_mouse_pressed_trigger": "true",
-                        "prerender_start_delay_on_mouse_hover_ms": "300"
-                    },
-                    "enable_features": [
-                        "BookmarkTriggerForPrerender2"
-                    ]
-                },
-                {
-                    "name": "Control",
-                    "disable_features": [
-                        "BookmarkTriggerForPrerender2"
-                    ]
-                }
-            ]
-        }
-    ],
     "Prerender2DesktopOmniboxTriggers": [
         {
             "platforms": [
@@ -18153,6 +18138,21 @@
             ]
         }
     ],
+    "SynchronousCompositorBackgroundSignal": [
+        {
+            "platforms": [
+                "android_webview"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "SynchronousCompositorBackgroundSignal"
+                    ]
+                }
+            ]
+        }
+    ],
     "SynthesizePageLoadOnlyOnInitialMainDocumentAccess": [
         {
             "platforms": [
@@ -19180,6 +19180,24 @@
             ]
         }
     ],
+    "UnoPhase2FollowUp": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "EnableUnoPhase2FollowUp",
+                    "params": {
+                        "event_trigger": "name:do_not_trigger_signin_iph_for_tests;comparator:>=360;window:360;storage:360"
+                    },
+                    "disable_features": [
+                        "IPH_iOSReplaceSyncPromosWithSignInPromos"
+                    ]
+                }
+            ]
+        }
+    ],
     "UploadOfficeToCloud": [
         {
             "platforms": [
@@ -20295,6 +20313,7 @@
             "platforms": [
                 "android",
                 "android_weblayer",
+                "android_webview",
                 "chromeos",
                 "chromeos_lacros",
                 "fuchsia",
diff --git a/third_party/angle b/third_party/angle
index 9a70fc9..ea82389 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 9a70fc9046644c2a3b4bb1ea9f0e56fe19473941
+Subproject commit ea8238935e4db0ec0d67460d402b1866d3f9ef26
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 619ccba..f11dc96 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -1155,9 +1155,6 @@
 );
 
 BASE_FEATURE(kLinkPreview, "LinkPreview", base::FEATURE_DISABLED_BY_DEFAULT);
-BASE_FEATURE(kLinkPreviewNavigation,
-             "LinkPreviewNavigation",
-             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // A feature to control whether the loading phase should be extended beyond
 // First Meaningful Paint by a configurable buffer.
@@ -1189,30 +1186,30 @@
 
 BASE_FEATURE(kLowPriorityAsyncScriptExecution,
              "LowPriorityAsyncScriptExecution",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 const base::FeatureParam<base::TimeDelta>
     kTimeoutForLowPriorityAsyncScriptExecution{
         &kLowPriorityAsyncScriptExecution, "low_pri_async_exec_timeout",
-        base::Seconds(1)};
+        base::Milliseconds(0)};
 
 // kLowPriorityAsyncScriptExecution will be disabled after document elapsed more
 // than |low_pri_async_exec_feature_limit|. Zero value means no limit.
 const base::FeatureParam<base::TimeDelta>
     kLowPriorityAsyncScriptExecutionFeatureLimitParam{
         &kLowPriorityAsyncScriptExecution, "low_pri_async_exec_feature_limit",
-        base::Seconds(3)};
+        base::Seconds(0)};
 
 // kLowPriorityAsyncScriptExecution will be applied only for cross site scripts.
 const base::FeatureParam<bool>
     kLowPriorityAsyncScriptExecutionCrossSiteOnlyParam{
         &kLowPriorityAsyncScriptExecution, "low_pri_async_exec_cross_site_only",
-        true};
+        false};
 
 const base::FeatureParam<bool>
     kLowPriorityAsyncScriptExecutionMainFrameOnlyParam{
         &kLowPriorityAsyncScriptExecution, "low_pri_async_exec_main_frame_only",
-        true};
+        false};
 
 // kLowPriorityAsyncScriptExecution will exclude scripts that influence LCP
 // element.
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index ad716ed..2e4720c 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -683,8 +683,6 @@
 // Enables the Link Preview.
 // Tracking bug: go/launch/4269184
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kLinkPreview);
-// Enables the Link Preview specific new navigation code path.
-BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kLinkPreviewNavigation);
 
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kLoadingTasksUnfreezable);
 
diff --git a/third_party/blink/public/mojom/printing/web_printing.mojom b/third_party/blink/public/mojom/printing/web_printing.mojom
index 33b0294..17b2db5d 100644
--- a/third_party/blink/public/mojom/printing/web_printing.mojom
+++ b/third_party/blink/public/mojom/printing/web_printing.mojom
@@ -4,10 +4,15 @@
 
 module blink.mojom;
 
-// Interface for interactions with a particular printer from the render process.
-// The implementation is responsible for checking access permissions.
-interface WebPrinter {
-  // TODO(b/302505962): Add necessary methods.
+enum WebPrintingMultipleDocumentHandling {
+  kSeparateDocumentsCollatedCopies,
+  kSeparateDocumentsUncollatedCopies
+};
+
+enum WebPrintingSides {
+  kOneSided,
+  kTwoSidedLongEdge,
+  kTwoSidedShortEdge
 };
 
 // Basic description of a single printer.
@@ -16,6 +21,32 @@
   pending_remote<WebPrinter> printer_remote;
 };
 
+struct WebPrintingRange {
+  uint32 from;
+  uint32 to;
+};
+
+// Detailed description of a single printer.
+struct WebPrinterAttributes {
+  uint32 copies_default;
+  WebPrintingRange copies_supported;
+
+  WebPrintingMultipleDocumentHandling multiple_document_handling_default;
+  array<WebPrintingMultipleDocumentHandling> multiple_document_handling_supported;
+
+  WebPrintingSides? sides_default;
+  array<WebPrintingSides> sides_supported;
+};
+
+// Interface for interactions with a particular printer from the render process.
+// The implementation is responsible for checking access permissions.
+interface WebPrinter {
+  // Fetches full attributes of this printer.
+  FetchAttributes() => (WebPrinterAttributes? attributes);
+
+  // TODO(b/302505962): Add remaining methods.
+};
+
 // Interface for accessing printers from the render process.
 // The implementation is responsible for checking access permissions.
 interface WebPrintingService {
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index fb94c804..54bffc9b 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4084,6 +4084,8 @@
   kSubtleCryptoDeriveBitsZeroLength = 4745,
   kSubtleCryptoDeriveBitsTruncation = 4746,
   kTextDirectiveInShadowDOM = 4747,
+  kPseudoFirstLetterOnRt = 4748,
+  kPseudoFirstLineOnRt = 4749,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/BUILD.gn b/third_party/blink/renderer/BUILD.gn
index 36ee2b65..e90040b 100644
--- a/third_party/blink/renderer/BUILD.gn
+++ b/third_party/blink/renderer/BUILD.gn
@@ -123,6 +123,22 @@
       "blink-gc-plugin",
     ]
 
+    # Enable GC plugin forbidding mojo::Associated{Remote,Receiver}:
+    cflags += [
+      "-Xclang",
+      "-plugin-arg-blink-gc-plugin",
+      "-Xclang",
+      "forbid-associated-remote-receiver",
+    ]
+
+    # Enable GC plugin forbidding off-heap collections of GCed:
+    cflags += [
+      "-Xclang",
+      "-plugin-arg-blink-gc-plugin",
+      "-Xclang",
+      "enable-off-heap-collections-of-gced-check",
+    ]
+
     # Add arguments for enabled GC plugin options:
     if (blink_gc_plugin_option_do_dump_graph) {
       cflags += [
@@ -132,14 +148,6 @@
         "dump-graph",
       ]
     }
-
-    # Enable GC plugin forbidding mojo::Associated{Remote,Receiver}:
-    cflags += [
-      "-Xclang",
-      "-plugin-arg-blink-gc-plugin",
-      "-Xclang",
-      "forbid-associated-remote-receiver",
-    ]
   }
 }
 
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index 39b919f..8988593 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -3092,6 +3092,8 @@
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_printer_attributes.h",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_document_description.cc",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_document_description.h",
+    "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_attributes.cc",
+    "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_attributes.h",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_template_attributes.cc",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_template_attributes.h",
   ]
@@ -3106,6 +3108,8 @@
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_printing_resolution_units.h",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_printing_sides.cc",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_printing_sides.h",
+    "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_state.cc",
+    "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_state.h",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_quality.cc",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_web_print_quality.h",
   ]
diff --git a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc
index 816971f..6f354f5 100644
--- a/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc
+++ b/third_party/blink/renderer/core/dom/first_letter_pseudo_element.cc
@@ -29,6 +29,7 @@
 #include "third_party/blink/renderer/core/css/style_request.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
+#include "third_party/blink/renderer/core/frame/web_feature.h"
 #include "third_party/blink/renderer/core/layout/generated_children.h"
 #include "third_party/blink/renderer/core/layout/layout_object.h"
 #include "third_party/blink/renderer/core/layout/layout_object_inlines.h"
@@ -264,6 +265,12 @@
       IsInvalidFirstLetterLayoutObject(first_letter_text_layout_object))
     return nullptr;
 
+  // TODO(crbug.com/1501719): See LayoutObject::BehavesLikeBlockContainer().
+  if (parent_layout_object->IsRubyText() &&
+      IsA<HTMLRTElement>(parent_layout_object->GetNode())) {
+    UseCounter::Count(element.GetDocument(),
+                      WebFeature::kPseudoFirstLetterOnRt);
+  }
   return To<LayoutText>(first_letter_text_layout_object);
 }
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
index 676fb79..61cc83c 100644
--- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -1081,7 +1081,7 @@
     LayoutUnit progression;
 
     for (const auto& child : fragment.Children()) {
-      const NGPhysicalFragment* child_fragment = child.get();
+      const PhysicalFragment* child_fragment = child.get();
       if (!child_fragment || child_fragment->IsOutOfFlowPositioned())
         continue;
 
diff --git a/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm_test.cc
index 28b94a63..c006539 100644
--- a/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm_test.cc
@@ -138,10 +138,10 @@
   }
 
   String DumpFragmentTree(const blink::NGPhysicalBoxFragment* fragment) {
-    NGPhysicalFragment::DumpFlags flags =
-        NGPhysicalFragment::DumpHeaderText | NGPhysicalFragment::DumpSubtree |
-        NGPhysicalFragment::DumpIndentation | NGPhysicalFragment::DumpOffset |
-        NGPhysicalFragment::DumpSize;
+    PhysicalFragment::DumpFlags flags =
+        PhysicalFragment::DumpHeaderText | PhysicalFragment::DumpSubtree |
+        PhysicalFragment::DumpIndentation | PhysicalFragment::DumpOffset |
+        PhysicalFragment::DumpSize;
 
     return fragment->DumpFragmentTree(flags);
   }
diff --git a/third_party/blink/renderer/core/layout/inline/README.md b/third_party/blink/renderer/core/layout/inline/README.md
index 1cae322..ca281ad0 100644
--- a/third_party/blink/renderer/core/layout/inline/README.md
+++ b/third_party/blink/renderer/core/layout/inline/README.md
@@ -74,7 +74,7 @@
 | Pre-layout | LayoutObject | [InlineItem] |
 | Line Breaking | [InlineItem] | [InlineItemResult] |
 | Line box construction | [InlineItemResult] | [LogicalLineItem] |
-| Generate fragments | [LogicalLineItem] | [NGPhysicalFragment] / [FragmentItem] |
+| Generate fragments | [LogicalLineItem] | [PhysicalFragment] / [FragmentItem] |
 
 Note: There is [an idea](https://docs.google.com/document/d/1dxzIHl1dwBtgeKgWd2cKcog8AyydN5rduQvXthMOMD0/edit?usp=sharing)
 to merge [InlineItemResult] and [LogicalLineItem], but this hasn't been happened yet.
@@ -254,7 +254,7 @@
 they are converted to fragments.
 
 Without [FragmentItem] enabled,
-each [LogicalLineItem] produces a [NGPhysicalFragment],
+each [LogicalLineItem] produces a [PhysicalFragment],
 added to the [PhysicalLineBoxFragment].
 
 With [FragmentItem] enabled,
@@ -273,7 +273,8 @@
    that calls appropriate layout algorithm.
 3. Each layout algorithm computes baseline according to the requests.
 4. Users retrieve the result by [NGPhysicalBoxFragment]`::Baseline()`,
-   or by higher level functions such as [NGBoxFragment]`::BaselineMetrics()`.
+   or by higher level functions such as
+   [LogicalBoxFragment]`::BaselineMetrics()`.
 
 Algorithms are responsible
 for checking [ConstraintSpace]`::BaselineRequests()`,
@@ -385,14 +386,14 @@
 [InlineNode]: ng_inline_node.h
 [LayoutInputNode]: ../ng/ng_layout_input_node.h
 [LineBreaker]: ng_line_breaker.h
+[LogicalBoxFragment]: ../ng/ng_box_fragment.h
 [LogicalLineItem]: ng_logical_line_item.h
 [LogicalLineItems]: ng_logical_line_items.h
 [NGBaselineRequest]: ng_baseline.h
-[NGBoxFragment]: ../ng/ng_box_fragment.h
 [NGPhysicalBoxFragment]: ../ng/ng_physical_box_fragment.h
-[NGPhysicalFragment]: ../ng/ng_physical_fragment.h
 [NGPhysicalTextFragment]: ng_physical_text_fragment.h
 [OffsetMapping]: ng_offset_mapping.h
+[PhysicalFragment]: ../ng/ng_physical_fragment.h
 [PhysicalLineBoxFragment]: ng_physical_line_box_fragment.h
 [ShapeResult]: ../../../platform/fonts/shaping/shape_result.h
 [ShapingLineBreaker]: ../../../platform/fonts/shaping/shaping_line_breaker.h
diff --git a/third_party/blink/renderer/core/layout/inline/fragment_items_builder.cc b/third_party/blink/renderer/core/layout/inline/fragment_items_builder.cc
index f026760..8e887ec 100644
--- a/third_party/blink/renderer/core/layout/inline/fragment_items_builder.cc
+++ b/third_party/blink/renderer/core/layout/inline/fragment_items_builder.cc
@@ -106,7 +106,7 @@
 
 void FragmentItemsBuilder::AssociateLogicalLineItems(
     LogicalLineItems* line_items,
-    const NGPhysicalFragment& line_fragment) {
+    const PhysicalFragment& line_fragment) {
   DCHECK(!current_line_items_ || current_line_items_ == line_items);
   current_line_items_ = line_items;
   DCHECK(!current_line_fragment_);
diff --git a/third_party/blink/renderer/core/layout/inline/fragment_items_builder.h b/third_party/blink/renderer/core/layout/inline/fragment_items_builder.h
index e8feee6..25094a8 100644
--- a/third_party/blink/renderer/core/layout/inline/fragment_items_builder.h
+++ b/third_party/blink/renderer/core/layout/inline/fragment_items_builder.h
@@ -52,7 +52,7 @@
   // positions the line box.
   //
   // 1. |AcquireLogicalLineItems| to get an instance of |LogicalLineItems|.
-  // 2. Add items to |LogicalLineItems| and create |NGPhysicalFragment|,
+  // 2. Add items to |LogicalLineItems| and create |PhysicalFragment|,
   //    then associate them by |AssociateLogicalLineItems|.
   // 3. |AddLine| adds the |PhysicalLineBoxFragment|.
   //
@@ -70,7 +70,7 @@
   const LogicalLineItems& GetLogicalLineItems(
       const PhysicalLineBoxFragment&) const;
   void AssociateLogicalLineItems(LogicalLineItems* line_items,
-                                 const NGPhysicalFragment& line_fragment);
+                                 const PhysicalFragment& line_fragment);
   void AddLine(const PhysicalLineBoxFragment& line,
                const LogicalOffset& offset);
 
@@ -155,9 +155,9 @@
 
   // Keeps children of a line until the offset is determined. See |AddLine|.
   LogicalLineItems* current_line_items_ = nullptr;
-  const NGPhysicalFragment* current_line_fragment_ = nullptr;
+  const PhysicalFragment* current_line_fragment_ = nullptr;
 
-  HeapHashMap<Member<const NGPhysicalFragment>, Member<LogicalLineItems>>
+  HeapHashMap<Member<const PhysicalFragment>, Member<LogicalLineItems>>
       line_items_map_;
   LogicalLineItems* const line_items_pool_ =
       MakeGarbageCollected<LogicalLineItems>();
diff --git a/third_party/blink/renderer/core/layout/inline/inline_box_state.cc b/third_party/blink/renderer/core/layout/inline/inline_box_state.cc
index e5532bc..a870dee 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_box_state.cc
+++ b/third_party/blink/renderer/core/layout/inline/inline_box_state.cc
@@ -835,7 +835,7 @@
   BoxFragmentBuilder box(item->GetLayoutObject(), &style, space,
                          {style.GetWritingMode(), TextDirection::kLtr});
   box.SetInitialFragmentGeometry(fragment_geometry);
-  box.SetBoxType(NGPhysicalFragment::kInlineBox);
+  box.SetBoxType(PhysicalFragment::kInlineBox);
   box.SetStyleVariant(item->GetStyleVariant());
 
   if (UNLIKELY(is_opaque)) {
diff --git a/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm_test.cc
index 65c8226c..ca26069c 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/inline/inline_layout_algorithm_test.cc
@@ -292,7 +292,7 @@
   // though there's no borders on the 1st line.
   const NGPhysicalBoxFragment* box_fragment = cursor.Current().BoxFragment();
   ASSERT_TRUE(box_fragment);
-  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, box_fragment->Type());
+  EXPECT_EQ(PhysicalFragment::kFragmentBox, box_fragment->Type());
 
   line_box.MoveToNextLine();
   ASSERT_FALSE(line_box) << "block_flow has two lines.";
diff --git a/third_party/blink/renderer/core/layout/inline/logical_line_item.h b/third_party/blink/renderer/core/layout/inline/logical_line_item.h
index 72f369e..f96a1351 100644
--- a/third_party/blink/renderer/core/layout/inline/logical_line_item.h
+++ b/third_party/blink/renderer/core/layout/inline/logical_line_item.h
@@ -198,7 +198,7 @@
   const LogicalSize& Size() const { return rect.size; }
   LogicalSize MarginSize() const { return {inline_size, Size().block_size}; }
 
-  const NGPhysicalFragment* GetPhysicalFragment() const {
+  const PhysicalFragment* GetPhysicalFragment() const {
     if (layout_result)
       return &layout_result->GetPhysicalFragment();
     return nullptr;
diff --git a/third_party/blink/renderer/core/layout/inline/physical_line_box_fragment.cc b/third_party/blink/renderer/core/layout/inline/physical_line_box_fragment.cc
index 3f17dde2..e10f3b4 100644
--- a/third_party/blink/renderer/core/layout/inline/physical_line_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/inline/physical_line_box_fragment.cc
@@ -18,7 +18,7 @@
 
 namespace {
 
-struct SameSizeAsPhysicalLineBoxFragment : NGPhysicalFragment {
+struct SameSizeAsPhysicalLineBoxFragment : PhysicalFragment {
   FontHeight metrics;
 };
 
@@ -40,10 +40,10 @@
 PhysicalLineBoxFragment::PhysicalLineBoxFragment(
     PassKey key,
     LineBoxFragmentBuilder* builder)
-    : NGPhysicalFragment(builder,
-                         builder->GetWritingMode(),
-                         kFragmentLineBox,
-                         builder->line_box_type_),
+    : PhysicalFragment(builder,
+                       builder->GetWritingMode(),
+                       kFragmentLineBox,
+                       builder->line_box_type_),
       metrics_(builder->metrics_) {
   // A line box must have a metrics unless it's an empty line box.
   DCHECK(!metrics_.IsEmpty() || IsEmptyLineBox());
@@ -57,7 +57,7 @@
 PhysicalLineBoxFragment::PhysicalLineBoxFragment(
     PassKey key,
     const PhysicalLineBoxFragment& other)
-    : NGPhysicalFragment(other), metrics_(other.metrics_) {
+    : PhysicalFragment(other), metrics_(other.metrics_) {
   base_direction_ = other.base_direction_;
   has_hanging_ = other.has_hanging_;
   has_propagated_descendants_ = other.has_propagated_descendants_;
@@ -137,7 +137,7 @@
 }
 
 void PhysicalLineBoxFragment::TraceAfterDispatch(Visitor* visitor) const {
-  NGPhysicalFragment::TraceAfterDispatch(visitor);
+  PhysicalFragment::TraceAfterDispatch(visitor);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/inline/physical_line_box_fragment.h b/third_party/blink/renderer/core/layout/inline/physical_line_box_fragment.h
index 3b80d98..e284dfba 100644
--- a/third_party/blink/renderer/core/layout/inline/physical_line_box_fragment.h
+++ b/third_party/blink/renderer/core/layout/inline/physical_line_box_fragment.h
@@ -15,7 +15,7 @@
 class FragmentItem;
 class LineBoxFragmentBuilder;
 
-class CORE_EXPORT PhysicalLineBoxFragment final : public NGPhysicalFragment {
+class CORE_EXPORT PhysicalLineBoxFragment final : public PhysicalFragment {
  public:
   enum LineBoxType {
     kNormalLineBox,
@@ -84,7 +84,7 @@
   }
 
  protected:
-  friend class NGPhysicalFragment;
+  friend class PhysicalFragment;
   void Dispose();
 
  private:
@@ -93,8 +93,8 @@
 
 template <>
 struct DowncastTraits<PhysicalLineBoxFragment> {
-  static bool AllowFrom(const NGPhysicalFragment& fragment) {
-    return fragment.Type() == NGPhysicalFragment::kFragmentLineBox;
+  static bool AllowFrom(const PhysicalFragment& fragment) {
+    return fragment.Type() == PhysicalFragment::kFragmentLineBox;
   }
 };
 
diff --git a/third_party/blink/renderer/core/layout/inline/ruby_utils.cc b/third_party/blink/renderer/core/layout/inline/ruby_utils.cc
index 62391b51..a72f7333 100644
--- a/third_party/blink/renderer/core/layout/inline/ruby_utils.cc
+++ b/third_party/blink/renderer/core/layout/inline/ruby_utils.cc
@@ -105,7 +105,7 @@
 
   const ComputedStyle* ruby_text_style = nullptr;
   for (const auto& child_link : column_fragment.PostLayoutChildren()) {
-    const NGPhysicalFragment& child_fragment = *child_link.get();
+    const PhysicalFragment& child_fragment = *child_link.get();
     const LayoutObject* layout_object = child_fragment.GetLayoutObject();
     if (!layout_object)
       continue;
@@ -124,7 +124,7 @@
   LayoutUnit end_overhang = half_width_of_ruby_font;
   bool found_line = false;
   for (const auto& child_link : column_fragment.PostLayoutChildren()) {
-    const NGPhysicalFragment& child_fragment = *child_link.get();
+    const PhysicalFragment& child_fragment = *child_link.get();
     const LayoutObject* layout_object = child_fragment.GetLayoutObject();
     if (!layout_object->IsRubyBase())
       continue;
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index bd1c4b7..d252143 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -423,7 +423,7 @@
 }
 
 void RecalcFragmentScrollableOverflow(RecalcScrollableOverflowResult& result,
-                                      const NGPhysicalFragment& fragment) {
+                                      const PhysicalFragment& fragment) {
   for (const auto& child : fragment.PostLayoutChildren()) {
     if (child->GetLayoutObject()) {
       if (const auto* box = DynamicTo<NGPhysicalBoxFragment>(child.get())) {
@@ -2545,11 +2545,11 @@
     ClearFirstInlineFragmentItemIndex();
 }
 
-bool LayoutBox::NGPhysicalFragmentList::MayHaveFragmentItems() const {
+bool LayoutBox::PhysicalFragmentList::MayHaveFragmentItems() const {
   return !IsEmpty() && front().IsInlineFormattingContext();
 }
 
-bool LayoutBox::NGPhysicalFragmentList::SlowHasFragmentItems() const {
+bool LayoutBox::PhysicalFragmentList::SlowHasFragmentItems() const {
   for (const NGPhysicalBoxFragment& fragment : *this) {
     if (fragment.HasItems())
       return true;
@@ -2557,7 +2557,7 @@
   return false;
 }
 
-wtf_size_t LayoutBox::NGPhysicalFragmentList::IndexOf(
+wtf_size_t LayoutBox::PhysicalFragmentList::IndexOf(
     const NGPhysicalBoxFragment& fragment) const {
   wtf_size_t index = 0;
   for (const auto& result : layout_results_) {
@@ -2569,7 +2569,7 @@
   return kNotFound;
 }
 
-bool LayoutBox::NGPhysicalFragmentList::Contains(
+bool LayoutBox::PhysicalFragmentList::Contains(
     const NGPhysicalBoxFragment& fragment) const {
   return IndexOf(fragment) != kNotFound;
 }
@@ -2855,16 +2855,16 @@
 }
 
 const NGPhysicalBoxFragment&
-LayoutBox::NGPhysicalFragmentList::Iterator::operator*() const {
+LayoutBox::PhysicalFragmentList::Iterator::operator*() const {
   return To<NGPhysicalBoxFragment>((*iterator_)->GetPhysicalFragment());
 }
 
-const NGPhysicalBoxFragment& LayoutBox::NGPhysicalFragmentList::front() const {
+const NGPhysicalBoxFragment& LayoutBox::PhysicalFragmentList::front() const {
   return To<NGPhysicalBoxFragment>(
       layout_results_.front()->GetPhysicalFragment());
 }
 
-const NGPhysicalBoxFragment& LayoutBox::NGPhysicalFragmentList::back() const {
+const NGPhysicalBoxFragment& LayoutBox::PhysicalFragmentList::back() const {
   return To<NGPhysicalBoxFragment>(
       layout_results_.back()->GetPhysicalFragment());
 }
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h
index 64af571..90257cc 100644
--- a/third_party/blink/renderer/core/layout/layout_box.h
+++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -697,11 +697,11 @@
       LayoutCacheStatus* out_cache_status);
 
   using LayoutResultList = HeapVector<Member<const LayoutResult>, 1>;
-  class NGPhysicalFragmentList {
+  class PhysicalFragmentList {
     STACK_ALLOCATED();
 
    public:
-    explicit NGPhysicalFragmentList(const LayoutResultList& layout_results)
+    explicit PhysicalFragmentList(const LayoutResultList& layout_results)
         : layout_results_(layout_results) {}
 
     wtf_size_t Size() const { return layout_results_.size(); }
@@ -760,9 +760,9 @@
     const LayoutResultList& layout_results_;
   };
 
-  NGPhysicalFragmentList PhysicalFragments() const {
+  PhysicalFragmentList PhysicalFragments() const {
     NOT_DESTROYED();
-    return NGPhysicalFragmentList(layout_results_);
+    return PhysicalFragmentList(layout_results_);
   }
   const LayoutResult* GetLayoutResult(wtf_size_t i) const;
   const LayoutResultList& GetLayoutResults() const {
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index d62897f..7e85d37c 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -4194,6 +4194,11 @@
         if (const ComputedStyle* cached =
                 first_line_block->GetCachedPseudoElementStyle(
                     kPseudoIdFirstLine)) {
+          // TODO(crbug.com/1501719): See
+          // LayoutObject::BehavesLikeBlockContainer().
+          if (IsRubyText() && IsA<HTMLRTElement>(GetNode())) {
+            UseCounter::Count(GetDocument(), WebFeature::kPseudoFirstLineOnRt);
+          }
           return cached;
         }
         continue;
diff --git a/third_party/blink/renderer/core/layout/layout_text_combine.h b/third_party/blink/renderer/core/layout/layout_text_combine.h
index 08c0c29..97c6cf3 100644
--- a/third_party/blink/renderer/core/layout/layout_text_combine.h
+++ b/third_party/blink/renderer/core/layout/layout_text_combine.h
@@ -59,8 +59,8 @@
   //    |LayoutObject::DebugRect()|, intersection observer, and scroll anchor.
   //  * |FragmentItem::RecalcInkOverflow()| for line box
   //  * |ScrollableOverflowCalculator::AddItemsInternal()| for line box.
-  //  * |NGPhysicalFragment::AddOutlineRectsForCursor()|
-  //  * |NGPhysicalFragment::AddScrollableOverflowForInlineChild()|
+  //  * |PhysicalFragment::AddOutlineRectsForCursor()|
+  //  * |PhysicalFragment::AddScrollableOverflowForInlineChild()|
   PhysicalRect AdjustRectForBoundingBox(const PhysicalRect& rect) const;
 
   PhysicalRect ComputeTextBoundsRectForHitTest(
diff --git a/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.cc b/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.cc
index c1d41733..aafb264 100644
--- a/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.cc
+++ b/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.cc
@@ -55,7 +55,7 @@
 absl::optional<LayoutUnit> UnpositionedListMarker::ContentAlignmentBaseline(
     const ConstraintSpace& space,
     FontBaseline baseline_type,
-    const NGPhysicalFragment& content) const {
+    const PhysicalFragment& content) const {
   // Compute the baseline of the child content.
   if (content.IsLineBox()) {
     const auto& line_box = To<PhysicalLineBoxFragment>(content);
@@ -81,7 +81,7 @@
 void UnpositionedListMarker::AddToBox(
     const ConstraintSpace& space,
     FontBaseline baseline_type,
-    const NGPhysicalFragment& content,
+    const PhysicalFragment& content,
     const BoxStrut& border_scrollbar_padding,
     const LayoutResult& marker_layout_result,
     LayoutUnit content_baseline,
diff --git a/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.h b/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.h
index 82711a5..319fe19f 100644
--- a/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.h
+++ b/third_party/blink/renderer/core/layout/list/unpositioned_list_marker.h
@@ -24,7 +24,7 @@
 class LayoutOutsideListMarker;
 class LayoutResult;
 class LayoutUnit;
-class NGPhysicalFragment;
+class PhysicalFragment;
 
 // Represents an unpositioned list marker.
 //
@@ -66,11 +66,11 @@
   absl::optional<LayoutUnit> ContentAlignmentBaseline(
       const ConstraintSpace&,
       FontBaseline,
-      const NGPhysicalFragment& content) const;
+      const PhysicalFragment& content) const;
   // Add a fragment for an outside list marker.
   void AddToBox(const ConstraintSpace&,
                 FontBaseline,
-                const NGPhysicalFragment& content,
+                const PhysicalFragment& content,
                 const BoxStrut&,
                 const LayoutResult& marker_layout_result,
                 LayoutUnit content_baseline,
diff --git a/third_party/blink/renderer/core/layout/ng/README.md b/third_party/blink/renderer/core/layout/ng/README.md
index aeea2a0..b88539b 100644
--- a/third_party/blink/renderer/core/layout/ng/README.md
+++ b/third_party/blink/renderer/core/layout/ng/README.md
@@ -28,13 +28,13 @@
 
  - The [ConstraintSpace](ng_constraint_space.h) which represents the "space"
    in which the current layout should produce a
-   [NGPhysicalFragment](ng_physical_fragment.h).
+   [PhysicalFragment](ng_physical_fragment.h).
 
  - TODO(layout-dev): BreakTokens should go here once implemented.
 
 The current layout should not access any information outside this set, this
 will break invariants in the system. (As a concrete example we intend to cache
-[NGPhysicalFragment](ng_physical_fragment.h)s based on this set, accessing
+[PhysicalFragment](ng_physical_fragment.h)s based on this set, accessing
 additional information outside this set will break caching behaviour).
 
 ### Box Tree ###
@@ -49,7 +49,7 @@
 
 TODO(layout-dev): Document with lots of pretty pictures.
 
-All coordinates and sizes associated with an NGPhysicalFragment are physical,
+All coordinates and sizes associated with an PhysicalFragment are physical,
 i.e. pure left/top offsets from the parent fragment, and sizes are expressed
 with widths and heights (not inline-size / block-size). No logical offsets or
 sizes. Writing mode and direction are resolved during layout.
@@ -135,10 +135,10 @@
 Call LayoutInputNode::ShowNodeTree() to dump the tree to stderr.
 
 #### For physical fragment subtree ####
-Call NGPhysicalFragment::ShowFragmentTree() to dump the tree to
+Call PhysicalFragment::ShowFragmentTree() to dump the tree to
 stderr. Fragments in the subtree are not required to be marked as placed
 (i.e. know their offset).
 
 A fragment tree may also be dumped to a String, by calling
-NGPhysicalFragment::DumpFragmentTree(). It takes a flag parameter, so that the
+PhysicalFragment::DumpFragmentTree(). It takes a flag parameter, so that the
 output can be customized to only contain what's relevant for a given purpose.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query_map.cc b/third_party/blink/renderer/core/layout/ng/ng_anchor_query_map.cc
index 08d8ff6c..74fd24e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query_map.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query_map.cc
@@ -97,7 +97,7 @@
     kOverwriteIfAfter,
   };
 
-  void AddAnchorQuery(const NGPhysicalFragment& fragment,
+  void AddAnchorQuery(const PhysicalFragment& fragment,
                       const PhysicalOffset& offset_from_fragmentainer,
                       const FragmentainerContext& fragmentainer) {
     const PhysicalAnchorQuery* anchor_query = fragment.AnchorQuery();
@@ -212,7 +212,7 @@
     }
   }
 
-  void AddChild(const NGPhysicalFragment& fragment,
+  void AddChild(const PhysicalFragment& fragment,
                 const PhysicalOffset& offset_from_fragmentainer,
                 const FragmentainerContext& fragmentainer) {
     if (const auto* box = DynamicTo<NGPhysicalBoxFragment>(&fragment))
diff --git a/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
index 23ad4d6..417a0ee9 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
@@ -87,7 +87,7 @@
   if (index_ >= parent_->Children().size())
     return nullptr;
   while (parent_->Children()[index_]->Type() !=
-         NGPhysicalFragment::kFragmentBox) {
+         PhysicalFragment::kFragmentBox) {
     ++index_;
     if (index_ >= parent_->Children().size())
       return nullptr;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
index 32f1106..60c3c51 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -279,7 +279,7 @@
 // header.
 BlockLayoutAlgorithm::~BlockLayoutAlgorithm() = default;
 
-void BlockLayoutAlgorithm::SetBoxType(NGPhysicalFragment::NGBoxType type) {
+void BlockLayoutAlgorithm::SetBoxType(PhysicalFragment::BoxType type) {
   container_builder_.SetBoxType(type);
 }
 
@@ -1430,7 +1430,7 @@
   // TODO(mstensho): There should be a class A breakpoint between a float and
   // another float, and also between a float and an in-flow block.
 
-  const NGPhysicalFragment& physical_fragment =
+  const PhysicalFragment& physical_fragment =
       positioned_float.layout_result->GetPhysicalFragment();
   LayoutUnit float_inline_size =
       LogicalFragment(constraint_space.GetWritingDirection(), physical_fragment)
@@ -3012,7 +3012,7 @@
 }
 
 void BlockLayoutAlgorithm::PropagateBaselineFromLineBox(
-    const NGPhysicalFragment& child,
+    const PhysicalFragment& child,
     LayoutUnit block_offset) {
   const auto& line_box = To<PhysicalLineBoxFragment>(child);
 
@@ -3049,7 +3049,7 @@
 }
 
 void BlockLayoutAlgorithm::PropagateBaselineFromBlockChild(
-    const NGPhysicalFragment& child,
+    const PhysicalFragment& child,
     const BoxStrut& margins,
     LayoutUnit block_offset) {
   DCHECK(child.IsBox());
@@ -3385,7 +3385,7 @@
   if (container_builder_.Children().size() > 0 && apply_fixed_size) {
     // The placeholder should have the width same as "editing-view-port"
     // element, which is the first grandchild of the text control.
-    const NGPhysicalFragment& child =
+    const PhysicalFragment& child =
         *container_builder_.Children()[kTextBlockIndex].fragment;
     if (child.IsTextControlContainer()) {
       const auto& grand_children = child.PostLayoutChildren();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
index d7477d5..2b30132b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
@@ -67,7 +67,7 @@
 
   ~BlockLayoutAlgorithm() override;
 
-  void SetBoxType(NGPhysicalFragment::NGBoxType type);
+  void SetBoxType(PhysicalFragment::BoxType type);
 
   MinMaxSizesResult ComputeMinMaxSizes(const MinMaxSizesFloatInput&) override;
   const LayoutResult* Layout() override;
@@ -253,9 +253,9 @@
   void UpdateEarlyBreakBetweenLines();
 
   // Propagates the baseline from the given |child| if needed.
-  void PropagateBaselineFromLineBox(const NGPhysicalFragment& child,
+  void PropagateBaselineFromLineBox(const PhysicalFragment& child,
                                     LayoutUnit block_offset);
-  void PropagateBaselineFromBlockChild(const NGPhysicalFragment& child,
+  void PropagateBaselineFromBlockChild(const PhysicalFragment& child,
                                        const BoxStrut& margins,
                                        LayoutUnit block_offset);
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
index 2253039a..8a4f4d7 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
@@ -65,10 +65,10 @@
   }
 
   String DumpFragmentTree(const NGPhysicalBoxFragment* fragment) {
-    NGPhysicalFragment::DumpFlags flags =
-        NGPhysicalFragment::DumpHeaderText | NGPhysicalFragment::DumpSubtree |
-        NGPhysicalFragment::DumpIndentation | NGPhysicalFragment::DumpOffset |
-        NGPhysicalFragment::DumpSize;
+    PhysicalFragment::DumpFlags flags =
+        PhysicalFragment::DumpHeaderText | PhysicalFragment::DumpSubtree |
+        PhysicalFragment::DumpIndentation | PhysicalFragment::DumpOffset |
+        PhysicalFragment::DumpSize;
 
     return fragment->DumpFragmentTree(flags);
   }
@@ -344,7 +344,7 @@
   EXPECT_EQ(LayoutUnit(kWidth), fragment->Size().width);
   EXPECT_EQ(LayoutUnit(kHeight1 + kHeight2 + kMarginTop),
             fragment->Size().height);
-  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, fragment->Type());
+  EXPECT_EQ(PhysicalFragment::kFragmentBox, fragment->Type());
   ASSERT_EQ(fragment->Children().size(), 2UL);
 
   const PhysicalFragmentLink& first_child = fragment->Children()[0];
@@ -788,7 +788,7 @@
 
   ASSERT_EQ(fragment->Children().size(), 2UL);
 
-  const NGPhysicalFragment* child1 = fragment->Children()[0].get();
+  const PhysicalFragment* child1 = fragment->Children()[0].get();
   PhysicalOffset child1_offset = fragment->Children()[0].Offset();
   EXPECT_EQ(0, child1_offset.top);
   EXPECT_EQ(kHeight, child1->Size().height);
@@ -1087,7 +1087,7 @@
   ASSERT_EQ(fragment->Children().size(), 1UL);
 
   // div1
-  const NGPhysicalFragment* child = fragment->Children()[0].get();
+  const PhysicalFragment* child = fragment->Children()[0].get();
   EXPECT_EQ(kBorderLeft + kPaddingLeft + kWidth + kPaddingRight + kBorderRight,
             child->Size().width);
   EXPECT_EQ(kBorderTop + kPaddingTop + kHeight + kPaddingBottom + kBorderBottom,
@@ -1121,10 +1121,10 @@
       RunBlockLayoutAlgorithm(container, space);
 
   EXPECT_EQ(LayoutUnit(kWidth + kPaddingLeft), fragment->Size().width);
-  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, fragment->Type());
+  EXPECT_EQ(PhysicalFragment::kFragmentBox, fragment->Type());
   ASSERT_EQ(fragment->Children().size(), 1UL);
 
-  const NGPhysicalFragment* child = fragment->Children()[0].get();
+  const PhysicalFragment* child = fragment->Children()[0].get();
   EXPECT_EQ(LayoutUnit(12), child->Size().width);
 }
 
@@ -1153,10 +1153,10 @@
       RunBlockLayoutAlgorithm(container, space);
 
   EXPECT_EQ(LayoutUnit(kWidth + kPaddingLeft), fragment->Size().width);
-  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, fragment->Type());
+  EXPECT_EQ(PhysicalFragment::kFragmentBox, fragment->Type());
   ASSERT_EQ(1UL, fragment->Children().size());
 
-  const NGPhysicalFragment* child = fragment->Children()[0].get();
+  const PhysicalFragment* child = fragment->Children()[0].get();
   PhysicalOffset child_offset = fragment->Children()[0].Offset();
   EXPECT_EQ(LayoutUnit(kChildWidth), child->Size().width);
   EXPECT_EQ(LayoutUnit(kPaddingLeft + 10), child_offset.left);
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 0658d7c..94c4dd7 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
@@ -572,7 +572,7 @@
 }
 
 const LayoutResult* BlockNode::SimplifiedLayout(
-    const NGPhysicalFragment& previous_fragment) const {
+    const PhysicalFragment& previous_fragment) const {
   const LayoutResult* previous_result = box_->GetSingleCachedLayoutResult();
   DCHECK(previous_result);
 
@@ -1586,7 +1586,7 @@
 
 void BlockNode::UpdateMarginPaddingInfoIfNeeded(
     const ConstraintSpace& space,
-    const NGPhysicalFragment& fragment) const {
+    const PhysicalFragment& fragment) const {
   // Table-cells don't have margins, and aren't grid-items.
   if (space.IsTableCell())
     return;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.h b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
index f128e68..95cbe6c5 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
@@ -23,7 +23,7 @@
 class LayoutBox;
 class LayoutResult;
 class NGPhysicalBoxFragment;
-class NGPhysicalFragment;
+class PhysicalFragment;
 enum class BaselineAlgorithmType;
 enum class MathScriptType;
 struct LayoutAlgorithmParams;
@@ -48,7 +48,7 @@
   // space used to generate the |LayoutResult|.
   // Otherwise it will simply return the previous layout result generated.
   const LayoutResult* SimplifiedLayout(
-      const NGPhysicalFragment& previous_fragment) const;
+      const PhysicalFragment& previous_fragment) const;
 
   // Lay out a repeatable node during block fragmentation (fixed positioned
   // element during printing, or table header / footer). To be called once for
@@ -284,9 +284,8 @@
       const NGPhysicalBoxFragment&,
       const BlockBreakToken* previous_container_break_token) const;
 
-  void UpdateMarginPaddingInfoIfNeeded(
-      const ConstraintSpace&,
-      const NGPhysicalFragment& fragment) const;
+  void UpdateMarginPaddingInfoIfNeeded(const ConstraintSpace&,
+                                       const PhysicalFragment& fragment) const;
 
   void UpdateShapeOutsideInfoIfNeeded(
       const LayoutResult&,
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc
index d55884f8..cfc1831 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.cc
@@ -161,7 +161,7 @@
 }
 
 void BoxFragmentBuilder::AddChild(
-    const NGPhysicalFragment& child,
+    const PhysicalFragment& child,
     const LogicalOffset& child_offset,
     const MarginStrut* margin_strut,
     bool is_self_collapsing,
@@ -175,7 +175,7 @@
 
   if (!relative_offset) {
     relative_offset = LogicalOffset();
-    if (box_type_ != NGPhysicalBoxFragment::NGBoxType::kInlineBox) {
+    if (box_type_ != PhysicalFragment::BoxType::kInlineBox) {
       if (child.IsLineBox()) {
         if (UNLIKELY(child.MayHaveDescendantAboveBlockStart()))
           may_have_descendant_above_block_start_ = true;
@@ -509,7 +509,7 @@
   if (ItemsBuilder()) {
     for (const LogicalFragmentLink& child : Children()) {
       DCHECK(child.fragment);
-      const NGPhysicalFragment& fragment = *child.fragment;
+      const PhysicalFragment& fragment = *child.fragment;
       DCHECK(fragment.IsLineBox() ||
              // TODO(kojii): How to place floats and OOF is TBD.
              fragment.IsFloatingOrOutOfFlowPositioned());
@@ -517,9 +517,10 @@
   }
 #endif
 
-  if (UNLIKELY(box_type_ == NGPhysicalFragment::kNormalBox && node_ &&
-               node_.IsBlockInInline()))
+  if (UNLIKELY(box_type_ == PhysicalFragment::kNormalBox && node_ &&
+               node_.IsBlockInInline())) {
     SetIsBlockInInline();
+  }
 
   if (UNLIKELY(has_block_fragmentation_ && node_)) {
     if (previous_break_token_ && previous_break_token_->IsAtBlockEnd()) {
@@ -541,7 +542,7 @@
     // Make some final adjustments to block-size for fragmentation, unless this
     // is a fragmentainer (so that we only include the block-size propagated
     // from children in that case).
-    if (!NGPhysicalFragment::IsFragmentainerBoxType(box_type_)) {
+    if (!PhysicalFragment::IsFragmentainerBoxType(box_type_)) {
       OverflowClipAxes block_axis = GetWritingDirection().IsHorizontal()
                                         ? kOverflowClipY
                                         : kOverflowClipX;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
index e777b9c..809a6f7 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
@@ -32,7 +32,7 @@
 
 namespace blink {
 
-class NGPhysicalFragment;
+class PhysicalFragment;
 
 class CORE_EXPORT BoxFragmentBuilder final : public FragmentBuilder {
   STACK_ALLOCATED();
@@ -146,7 +146,7 @@
   LayoutUnit IntrinsicBlockSize() const { return intrinsic_block_size_; }
   const BoxStrut& Borders() const {
     DCHECK(initial_fragment_geometry_);
-    DCHECK_NE(BoxType(), NGPhysicalFragment::kInlineBox);
+    DCHECK_NE(BoxType(), PhysicalFragment::kInlineBox);
     return initial_fragment_geometry_->border;
   }
   const BoxStrut& Scrollbar() const {
@@ -223,7 +223,7 @@
   // Other callers should call AddResult() instead of this when possible, since
   // there is information in the layout result that might need to be propagated.
   void AddChild(
-      const NGPhysicalFragment&,
+      const PhysicalFragment&,
       const LogicalOffset&,
       const MarginStrut* margin_strut = nullptr,
       bool is_self_collapsing = false,
@@ -414,7 +414,7 @@
 
   // See |NGPhysicalBoxFragment::InflowBounds|.
   void SetInflowBounds(const LogicalRect& inflow_bounds) {
-    DCHECK_NE(box_type_, NGPhysicalBoxFragment::NGBoxType::kInlineBox);
+    DCHECK_NE(box_type_, PhysicalFragment::BoxType::kInlineBox);
     DCHECK(Node().IsScrollContainer());
 #if DCHECK_IS_ON()
     is_inflow_bounds_explicitly_set_ = true;
@@ -433,14 +433,14 @@
 
   // Creates the fragment. Can only be called once.
   const LayoutResult* ToBoxFragment() {
-    DCHECK_NE(BoxType(), NGPhysicalFragment::kInlineBox);
+    DCHECK_NE(BoxType(), PhysicalFragment::kInlineBox);
     return ToBoxFragment(GetWritingMode());
   }
   const LayoutResult* ToInlineBoxFragment() {
     // The logical coordinate for inline box uses line-relative writing-mode,
     // not
     // flow-relative.
-    DCHECK_EQ(BoxType(), NGPhysicalFragment::kInlineBox);
+    DCHECK_EQ(BoxType(), PhysicalFragment::kInlineBox);
     return ToBoxFragment(ToLineWritingMode(GetWritingMode()));
   }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_break_token.h b/third_party/blink/renderer/core/layout/ng/ng_break_token.h
index a8de80c..d3783e4 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_break_token.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_break_token.h
@@ -25,8 +25,8 @@
 // accept a break token. For example:
 //
 // LayoutInputNode* node = ...;
-// NGPhysicalFragment* fragment = node->Layout(space);
-// NGPhysicalFragment* fragment2 =
+// PhysicalFragment* fragment = node->Layout(space);
+// PhysicalFragment* fragment2 =
 //     node->Layout(space, fragment->GetBreakToken());
 //
 // The break token should encapsulate enough information to "resume" the layout.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
index 7d81135..c4de684 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
@@ -133,7 +133,7 @@
     const FragmentBuilder::ChildrenVector& children) {
   if (children.empty())
     return;
-  const blink::NGPhysicalFragment* last_child =
+  const blink::PhysicalFragment* last_child =
       children[children.size() - 1].fragment;
   if (!last_child->IsColumnBox())
     return;
@@ -748,7 +748,7 @@
       params.column_spanner_path = spanner_path_;
 
       BlockLayoutAlgorithm child_algorithm(params);
-      child_algorithm.SetBoxType(NGPhysicalFragment::kColumnBox);
+      child_algorithm.SetBoxType(PhysicalFragment::kColumnBox);
       result = child_algorithm.Layout();
       const auto& column =
           To<NGPhysicalBoxFragment>(result->GetPhysicalFragment());
@@ -1309,7 +1309,7 @@
     LayoutAlgorithmParams params(Node(), fragment_geometry, space, break_token);
     params.column_spanner_path = spanner_path_;
     BlockLayoutAlgorithm balancing_algorithm(params);
-    balancing_algorithm.SetBoxType(NGPhysicalFragment::kColumnBox);
+    balancing_algorithm.SetBoxType(PhysicalFragment::kColumnBox);
     const LayoutResult* result = balancing_algorithm.Layout();
 
     // This algorithm should never abort.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
index a41f9a07..c8d616dd 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
@@ -25,10 +25,10 @@
   }
 
   String DumpFragmentTree(const NGPhysicalBoxFragment* fragment) {
-    NGPhysicalFragment::DumpFlags flags =
-        NGPhysicalFragment::DumpHeaderText | NGPhysicalFragment::DumpSubtree |
-        NGPhysicalFragment::DumpIndentation | NGPhysicalFragment::DumpOffset |
-        NGPhysicalFragment::DumpSize;
+    PhysicalFragment::DumpFlags flags =
+        PhysicalFragment::DumpHeaderText | PhysicalFragment::DumpSubtree |
+        PhysicalFragment::DumpIndentation | PhysicalFragment::DumpOffset |
+        PhysicalFragment::DumpSize;
 
     return fragment->DumpFragmentTree(flags);
   }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
index 632fff22..b176f75 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
@@ -42,10 +42,10 @@
   }
 
   String DumpFragmentTree(const NGPhysicalBoxFragment* fragment) {
-    NGPhysicalFragment::DumpFlags flags =
-        NGPhysicalFragment::DumpHeaderText | NGPhysicalFragment::DumpSubtree |
-        NGPhysicalFragment::DumpIndentation | NGPhysicalFragment::DumpOffset |
-        NGPhysicalFragment::DumpSize;
+    PhysicalFragment::DumpFlags flags =
+        PhysicalFragment::DumpHeaderText | PhysicalFragment::DumpSubtree |
+        PhysicalFragment::DumpIndentation | PhysicalFragment::DumpOffset |
+        PhysicalFragment::DumpSize;
 
     return fragment->DumpFragmentTree(flags);
   }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_fragment.h
index a998943..163522ae 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragment.h
@@ -19,7 +19,7 @@
 
  public:
   LogicalFragment(WritingDirectionMode writing_direction,
-                  const NGPhysicalFragment& physical_fragment)
+                  const PhysicalFragment& physical_fragment)
       : physical_fragment_(physical_fragment),
         writing_direction_(writing_direction) {}
 
@@ -41,7 +41,7 @@
   }
 
  protected:
-  const NGPhysicalFragment& physical_fragment_;
+  const PhysicalFragment& physical_fragment_;
   const WritingDirectionMode writing_direction_;
 };
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc
index a23921a..6cc5bac 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc
@@ -23,7 +23,7 @@
 }
 
 LogicalAnchorQuery::SetOptions AnchorQuerySetOptions(
-    const NGPhysicalFragment& fragment,
+    const PhysicalFragment& fragment,
     const LayoutInputNode& container,
     bool maybe_out_of_order_if_oof) {
   // If the |fragment| is not absolutely positioned, it's an in-flow anchor.
@@ -60,41 +60,41 @@
 
 }  // namespace
 
-NGPhysicalFragment::NGBoxType FragmentBuilder::BoxType() const {
-  if (box_type_ != NGPhysicalFragment::NGBoxType::kNormalBox) {
+PhysicalFragment::BoxType FragmentBuilder::BoxType() const {
+  if (box_type_ != PhysicalFragment::BoxType::kNormalBox) {
     return box_type_;
   }
 
   // When implicit, compute from LayoutObject.
   DCHECK(layout_object_);
   if (layout_object_->IsFloating()) {
-    return NGPhysicalFragment::NGBoxType::kFloating;
+    return PhysicalFragment::BoxType::kFloating;
   }
   if (layout_object_->IsOutOfFlowPositioned()) {
-    return NGPhysicalFragment::NGBoxType::kOutOfFlowPositioned;
+    return PhysicalFragment::BoxType::kOutOfFlowPositioned;
   }
   if (layout_object_->IsRenderedLegend()) {
-    return NGPhysicalFragment::NGBoxType::kRenderedLegend;
+    return PhysicalFragment::BoxType::kRenderedLegend;
   }
   if (layout_object_->IsInline()) {
     // Check |IsAtomicInlineLevel()| after |IsInline()| because |LayoutReplaced|
     // sets |IsAtomicInlineLevel()| even when it's block-level. crbug.com/567964
     if (layout_object_->IsAtomicInlineLevel()) {
-      return NGPhysicalFragment::NGBoxType::kAtomicInline;
+      return PhysicalFragment::BoxType::kAtomicInline;
     }
-    return NGPhysicalFragment::NGBoxType::kInlineBox;
+    return PhysicalFragment::BoxType::kInlineBox;
   }
   DCHECK(node_) << "Must call SetBoxType if there is no node";
   DCHECK_EQ(is_new_fc_, node_.CreatesNewFormattingContext())
       << "Forgot to call builder.SetIsNewFormattingContext";
   if (is_new_fc_) {
-    return NGPhysicalFragment::NGBoxType::kBlockFlowRoot;
+    return PhysicalFragment::BoxType::kBlockFlowRoot;
   }
-  return NGPhysicalFragment::NGBoxType::kNormalBox;
+  return PhysicalFragment::BoxType::kNormalBox;
 }
 
 void FragmentBuilder::ReplaceChild(wtf_size_t index,
-                                   const NGPhysicalFragment& new_child,
+                                   const PhysicalFragment& new_child,
                                    const LogicalOffset offset) {
   DCHECK_LT(index, children_.size());
   children_[index] = LogicalFragmentLink{std::move(&new_child), offset};
@@ -110,7 +110,7 @@
 }
 
 void FragmentBuilder::PropagateStickyDescendants(
-    const NGPhysicalFragment& child) {
+    const PhysicalFragment& child) {
   if (child.HasStickyConstrainedPosition()) {
     EnsureStickyDescendants().push_front(
         To<LayoutBoxModelObject>(child.GetMutableLayoutObject()));
@@ -129,7 +129,7 @@
   return *snap_areas_;
 }
 
-void FragmentBuilder::PropagateSnapAreas(const NGPhysicalFragment& child) {
+void FragmentBuilder::PropagateSnapAreas(const PhysicalFragment& child) {
   if (child.IsSnapArea()) {
     EnsureSnapAreas().insert(To<LayoutBox>(child.GetMutableLayoutObject()));
   }
@@ -152,7 +152,7 @@
   return *anchor_query_;
 }
 
-void FragmentBuilder::PropagateChildAnchors(const NGPhysicalFragment& child,
+void FragmentBuilder::PropagateChildAnchors(const PhysicalFragment& child,
                                             const LogicalOffset& child_offset) {
   absl::optional<LogicalAnchorQuery::SetOptions> options;
   if (child.IsBox() &&
@@ -212,7 +212,7 @@
 }
 
 void FragmentBuilder::PropagateScrollStartTarget(
-    const NGPhysicalFragment& child) {
+    const PhysicalFragment& child) {
   auto UpdateScrollStartTarget = [](Member<const LayoutBox>& old_target,
                                     const LayoutBox* new_target) {
     if (new_target &&
@@ -238,7 +238,7 @@
 // Propagate data in |child| to this fragment. The |child| will then be added as
 // a child fragment or a child fragment item.
 void FragmentBuilder::PropagateFromFragment(
-    const NGPhysicalFragment& child,
+    const PhysicalFragment& child,
     LogicalOffset child_offset,
     LogicalOffset relative_offset,
     const OofInlineContainer<LogicalOffset>* inline_container) {
@@ -316,11 +316,11 @@
       !break_token_ && !should_add_break_tokens_manually_) {
     const BreakToken* child_break_token = child.GetBreakToken();
     switch (child.Type()) {
-      case NGPhysicalFragment::kFragmentBox:
+      case PhysicalFragment::kFragmentBox:
         if (child_break_token)
           child_break_tokens_.push_back(child_break_token);
         break;
-      case NGPhysicalFragment::kFragmentLineBox:
+      case PhysicalFragment::kFragmentLineBox:
         if (child.IsLineForParallelFlow()) {
           // This is a line that only contains a resumed float / block after a
           // fragmentation break. It should not affect orphans / widows
@@ -345,7 +345,7 @@
   }
 }
 
-void FragmentBuilder::AddChildInternal(const NGPhysicalFragment* child,
+void FragmentBuilder::AddChildInternal(const PhysicalFragment* child,
                                        const LogicalOffset& child_offset) {
   // In order to know where list-markers are within the children list (for the
   // |SimplifiedLayoutAlgorithm|) we always place them as the first child.
@@ -503,7 +503,7 @@
 }
 
 void FragmentBuilder::PropagateOOFPositionedInfo(
-    const NGPhysicalFragment& fragment,
+    const PhysicalFragment& fragment,
     LogicalOffset offset,
     LogicalOffset relative_offset,
     LogicalOffset offset_adjustment,
@@ -617,7 +617,7 @@
       OofInlineContainer<LogicalOffset> new_fixedpos_inline_container(
           multicol_info->fixedpos_inline_container.container,
           fixedpos_inline_relative_offset);
-      const NGPhysicalFragment* fixedpos_containing_block_fragment =
+      const PhysicalFragment* fixedpos_containing_block_fragment =
           multicol_info->fixedpos_containing_block.Fragment();
 
       AdjustFixedposContainerInfo(box_fragment, relative_offset,
@@ -681,7 +681,7 @@
 }
 
 void FragmentBuilder::PropagateOOFFragmentainerDescendants(
-    const NGPhysicalFragment& fragment,
+    const PhysicalFragment& fragment,
     LogicalOffset offset,
     LogicalOffset relative_offset,
     LayoutUnit containing_block_adjustment,
@@ -704,7 +704,7 @@
        idx = next_idx) {
     next_idx = idx + 1;
     const auto& descendant = out_of_flow_fragmentainer_descendants[idx];
-    const NGPhysicalFragment* containing_block_fragment =
+    const PhysicalFragment* containing_block_fragment =
         descendant.containing_block.Fragment();
     bool container_inside_column_spanner =
         descendant.containing_block.IsInsideColumnSpanner();
@@ -808,7 +808,7 @@
     OofInlineContainer<LogicalOffset> new_fixedpos_inline_container(
         descendant.fixedpos_inline_container.container,
         fixedpos_inline_relative_offset);
-    const NGPhysicalFragment* fixedpos_containing_block_fragment =
+    const PhysicalFragment* fixedpos_containing_block_fragment =
         descendant.fixedpos_containing_block.Fragment();
 
     AdjustFixedposContainerInfo(
@@ -877,10 +877,10 @@
 }
 
 void FragmentBuilder::AdjustFixedposContainerInfo(
-    const NGPhysicalFragment* box_fragment,
+    const PhysicalFragment* box_fragment,
     LogicalOffset relative_offset,
     OofInlineContainer<LogicalOffset>* fixedpos_inline_container,
-    const NGPhysicalFragment** fixedpos_containing_block_fragment,
+    const PhysicalFragment** fixedpos_containing_block_fragment,
     const OofInlineContainer<LogicalOffset>* current_inline_container) const {
   DCHECK(fixedpos_inline_container);
   DCHECK(fixedpos_containing_block_fragment);
@@ -936,7 +936,7 @@
                        children_.size());
   for (auto& child : children_) {
     builder.Append(child.fragment->DumpFragmentTree(
-        NGPhysicalFragment::DumpAll & ~NGPhysicalFragment::DumpHeaderText));
+        PhysicalFragment::DumpAll & ~PhysicalFragment::DumpHeaderText));
   }
   return builder.ToString();
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
index 04d8a09..ab63370 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
@@ -78,14 +78,12 @@
   // Either this function or SetBoxType must be called before ToBoxFragment().
   void SetIsNewFormattingContext(bool is_new_fc) { is_new_fc_ = is_new_fc; }
 
-  NGPhysicalFragment::NGBoxType BoxType() const;
-  void SetBoxType(NGPhysicalFragment::NGBoxType box_type) {
-    box_type_ = box_type;
-  }
+  PhysicalFragment::BoxType BoxType() const;
+  void SetBoxType(PhysicalFragment::BoxType box_type) { box_type_ = box_type; }
   bool IsFragmentainerBoxType() const {
-    NGPhysicalFragment::NGBoxType box_type = BoxType();
-    return box_type == NGPhysicalFragment::kColumnBox ||
-           box_type == NGPhysicalFragment::kPageBox;
+    PhysicalFragment::BoxType box_type = BoxType();
+    return box_type == PhysicalFragment::kColumnBox ||
+           box_type == PhysicalFragment::kPageBox;
   }
 
   LayoutUnit InlineSize() const { return size_.inline_size; }
@@ -155,7 +153,7 @@
   }
 
   void ReplaceChild(wtf_size_t index,
-                    const NGPhysicalFragment& new_child,
+                    const PhysicalFragment& new_child,
                     const LogicalOffset offset);
 
   const ChildrenVector& Children() const { return children_; }
@@ -169,13 +167,13 @@
     items_builder_ = builder;
   }
 
-  void PropagateStickyDescendants(const NGPhysicalFragment& child);
-  void PropagateSnapAreas(const NGPhysicalFragment& child);
+  void PropagateStickyDescendants(const PhysicalFragment& child);
+  void PropagateSnapAreas(const PhysicalFragment& child);
 
   // Propagate |child|'s anchor for the CSS Anchor Positioning to |this|
   // builder. This includes the anchor of the |child| itself and anchors
   // propagated to the |child| from its descendants.
-  void PropagateChildAnchors(const NGPhysicalFragment& child,
+  void PropagateChildAnchors(const PhysicalFragment& child,
                              const LogicalOffset& child_offset);
 
   const LogicalAnchorQuery* AnchorQuery() const { return anchor_query_; }
@@ -327,7 +325,7 @@
   // list of descendants.
   // In addition, propagate any inner multicols with pending OOF descendants.
   void PropagateOOFPositionedInfo(
-      const NGPhysicalFragment& fragment,
+      const PhysicalFragment& fragment,
       LogicalOffset offset,
       LogicalOffset relative_offset,
       LogicalOffset offset_adjustment = LogicalOffset(),
@@ -344,7 +342,7 @@
   // fragmentainer descendants should be propagated there rather than to this
   // builder.
   void PropagateOOFFragmentainerDescendants(
-      const NGPhysicalFragment& fragment,
+      const PhysicalFragment& fragment,
       LogicalOffset offset,
       LogicalOffset relative_offset,
       LayoutUnit containing_block_adjustment,
@@ -530,23 +528,23 @@
       const OofInlineContainer<LogicalOffset>* = nullptr);
 
   void PropagateFromLayoutResult(const LayoutResult&);
-  void PropagateScrollStartTarget(const NGPhysicalFragment& child);
+  void PropagateScrollStartTarget(const PhysicalFragment& child);
 
   void PropagateFromFragment(
-      const NGPhysicalFragment& child,
+      const PhysicalFragment& child,
       LogicalOffset child_offset,
       LogicalOffset relative_offset,
       const OofInlineContainer<LogicalOffset>* inline_container = nullptr);
 
-  void AddChildInternal(const NGPhysicalFragment*, const LogicalOffset&);
+  void AddChildInternal(const PhysicalFragment*, const LogicalOffset&);
 
   // Set the fixedpos inline container and containing block based on the current
   // |box_fragment|, |relative_offset| and |current_inline_container|.
   void AdjustFixedposContainerInfo(
-      const NGPhysicalFragment* box_fragment,
+      const PhysicalFragment* box_fragment,
       LogicalOffset relative_offset,
       OofInlineContainer<LogicalOffset>* fixedpos_inline_container,
-      const NGPhysicalFragment** fixedpos_containing_block_fragment,
+      const PhysicalFragment** fixedpos_containing_block_fragment,
       const OofInlineContainer<LogicalOffset>* current_inline_container =
           nullptr) const;
 
@@ -555,8 +553,7 @@
   const ComputedStyle* style_;
   WritingDirectionMode writing_direction_;
   StyleVariant style_variant_;
-  NGPhysicalFragment::NGBoxType box_type_ =
-      NGPhysicalFragment::NGBoxType::kNormalBox;
+  PhysicalFragment::BoxType box_type_ = PhysicalFragment::BoxType::kNormalBox;
   LogicalSize size_;
   LayoutObject* layout_object_ = nullptr;
 
@@ -645,7 +642,7 @@
 
   friend class InlineLayoutStateStack;
   friend class LayoutResult;
-  friend class NGPhysicalFragment;
+  friend class PhysicalFragment;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
index 94b9a4c3..7f54ceae 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
@@ -791,7 +791,7 @@
 }
 
 bool HasBreakOpportunityBeforeNextChild(
-    const NGPhysicalFragment& child_fragment,
+    const PhysicalFragment& child_fragment,
     const BreakToken* incoming_child_break_token) {
   // Once we have added a child, there'll be a valid class A/B breakpoint [1]
   // before consecutive siblings, which implies that we have container
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
index 19af3dfec..2b3167cf 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
@@ -304,7 +304,7 @@
 // fragment that was just added to the builder, and the next sibling, if one is
 // added.
 bool HasBreakOpportunityBeforeNextChild(
-    const NGPhysicalFragment& child_fragment,
+    const PhysicalFragment& child_fragment,
     const BreakToken* incoming_child_break_token);
 
 // Insert a fragmentainer break before the child if necessary. In that case, the
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc b/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc
index b1a398b..c485c88 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc
@@ -53,7 +53,7 @@
 }
 
 LayoutResult::LayoutResult(BoxFragmentBuilderPassKey passkey,
-                           const NGPhysicalFragment* physical_fragment,
+                           const PhysicalFragment* physical_fragment,
                            BoxFragmentBuilder* builder)
     : LayoutResult(std::move(physical_fragment),
                    static_cast<FragmentBuilder*>(builder)) {
@@ -112,7 +112,7 @@
 }
 
 LayoutResult::LayoutResult(LineBoxFragmentBuilderPassKey passkey,
-                           const NGPhysicalFragment* physical_fragment,
+                           const PhysicalFragment* physical_fragment,
                            LineBoxFragmentBuilder* builder)
     : LayoutResult(std::move(physical_fragment),
                    static_cast<FragmentBuilder*>(builder)) {
@@ -181,7 +181,7 @@
 }
 
 LayoutResult::LayoutResult(const LayoutResult& other,
-                           const NGPhysicalFragment* physical_fragment)
+                           const PhysicalFragment* physical_fragment)
     : space_(other.space_),
       physical_fragment_(std::move(physical_fragment)),
       rare_data_(other.rare_data_
@@ -200,7 +200,7 @@
   DCHECK_EQ(physical_fragment_->Size(), other.physical_fragment_->Size());
 }
 
-LayoutResult::LayoutResult(const NGPhysicalFragment* physical_fragment,
+LayoutResult::LayoutResult(const PhysicalFragment* physical_fragment,
                            FragmentBuilder* builder)
     : space_(builder->space_),
       physical_fragment_(std::move(physical_fragment)),
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_result.h b/third_party/blink/renderer/core/layout/ng/ng_layout_result.h
index 2d2a5022..21f8c68c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_result.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_result.h
@@ -38,10 +38,10 @@
 class LineBoxFragmentBuilder;
 
 // The LayoutResult stores the resulting data from layout. This includes
-// geometry information in form of a NGPhysicalFragment, which is kept around
+// geometry information in form of a PhysicalFragment, which is kept around
 // for painting, hit testing, etc., as well as additional data which is only
 // necessary during layout and stored on this object.
-// Layout code should access the NGPhysicalFragment through the wrappers in
+// Layout code should access the PhysicalFragment through the wrappers in
 // LogicalFragment et al.
 class CORE_EXPORT LayoutResult final : public GarbageCollected<LayoutResult> {
  public:
@@ -83,10 +83,10 @@
 
   // Creates a copy of LayoutResult with a new (but "identical") fragment.
   LayoutResult(const LayoutResult& other,
-               const NGPhysicalFragment* physical_fragment);
+               const PhysicalFragment* physical_fragment);
 
   // Delegate constructor that sets up what it can, based on the builder.
-  LayoutResult(const NGPhysicalFragment* physical_fragment,
+  LayoutResult(const PhysicalFragment* physical_fragment,
                FragmentBuilder* builder);
 
   // We don't need the copy constructor, move constructor, copy
@@ -101,7 +101,7 @@
 
   ~LayoutResult() = default;
 
-  const NGPhysicalFragment& GetPhysicalFragment() const {
+  const PhysicalFragment& GetPhysicalFragment() const {
     DCHECK(physical_fragment_);
     DCHECK_EQ(kSuccess, Status());
     return *physical_fragment_;
@@ -587,13 +587,13 @@
   // This constructor requires a non-null fragment and sets a success status.
   using BoxFragmentBuilderPassKey = base::PassKey<BoxFragmentBuilder>;
   LayoutResult(BoxFragmentBuilderPassKey,
-               const NGPhysicalFragment* physical_fragment,
+               const PhysicalFragment* physical_fragment,
                BoxFragmentBuilder*);
 
   using LineBoxFragmentBuilderPassKey = base::PassKey<LineBoxFragmentBuilder>;
   // This constructor requires a non-null fragment and sets a success status.
   LayoutResult(LineBoxFragmentBuilderPassKey,
-               const NGPhysicalFragment* physical_fragment,
+               const PhysicalFragment* physical_fragment,
                LineBoxFragmentBuilder*);
 
   void Trace(Visitor*) const;
@@ -1012,7 +1012,7 @@
   // The constraint space which generated this layout result.
   const ConstraintSpace space_;
 
-  Member<const NGPhysicalFragment> physical_fragment_;
+  Member<const PhysicalFragment> physical_fragment_;
 
   // |rare_data_| cannot be stored in the union because it is difficult to have
   // a const bitfield for it and it cannot be traced.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_layout_utils.cc
index ba86765f..1a7daab4 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_utils.cc
@@ -340,7 +340,7 @@
     // At this point we know that either we have the same block-size for our
     // fragment, or our initial block-size was indefinite.
     //
-    // The |NGPhysicalFragment::DependsOnPercentageBlockSize| flag
+    // The |PhysicalFragment::DependsOnPercentageBlockSize| flag
     // will returns true if we are in quirks mode, and have a descendant that
     // depends on a percentage block-size, however it will also return true if
     // the node itself depends on the %-block-size.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_link.h b/third_party/blink/renderer/core/layout/ng/ng_link.h
index 59c69e48..dca3f24 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_link.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_link.h
@@ -10,29 +10,29 @@
 
 namespace blink {
 
-class NGPhysicalFragment;
+class PhysicalFragment;
 
 // Class representing the offset of a child fragment relative to the
 // parent fragment. Fragments themselves have no position information
 // allowing entire fragment subtrees to be reused and cached regardless
 // of placement.
 // This class is stored in a C-style regular array on
-// NGPhysicalFragment. It cannot have destructors. Fragment reference
+// PhysicalFragment. It cannot have destructors. Fragment reference
 // counting is done manually.
 struct CORE_EXPORT PhysicalFragmentLink {
   DISALLOW_NEW();
 
  public:
   PhysicalOffset Offset() const { return offset; }
-  const NGPhysicalFragment* get() const { return fragment.Get(); }
+  const PhysicalFragment* get() const { return fragment.Get(); }
 
   explicit operator bool() const { return fragment != nullptr; }
-  const NGPhysicalFragment& operator*() const { return *fragment; }
-  const NGPhysicalFragment* operator->() const { return fragment.Get(); }
+  const PhysicalFragment& operator*() const { return *fragment; }
+  const PhysicalFragment* operator->() const { return fragment.Get(); }
 
   void Trace(Visitor* visitor) const { visitor->Trace(fragment); }
 
-  Member<const NGPhysicalFragment> fragment;
+  Member<const PhysicalFragment> fragment;
   PhysicalOffset offset;
 };
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_logical_link.h b/third_party/blink/renderer/core/layout/ng/ng_logical_link.h
index 02d55c8..45a5ffb 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_logical_link.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_logical_link.h
@@ -11,7 +11,7 @@
 
 namespace blink {
 
-class NGPhysicalFragment;
+class PhysicalFragment;
 
 // Similar to |PhysicalFragmentLink| but with |LogicalOffset| instead of
 // |PhysicalOffset|.
@@ -20,15 +20,15 @@
 
  public:
   const LogicalOffset& Offset() const { return offset; }
-  const NGPhysicalFragment* get() const { return fragment.Get(); }
+  const PhysicalFragment* get() const { return fragment.Get(); }
 
   explicit operator bool() const { return fragment != nullptr; }
-  const NGPhysicalFragment& operator*() const { return *fragment; }
-  const NGPhysicalFragment* operator->() const { return fragment.Get(); }
+  const PhysicalFragment& operator*() const { return *fragment; }
+  const PhysicalFragment* operator->() const { return fragment.Get(); }
 
   void Trace(Visitor* visitor) const { visitor->Trace(fragment); }
 
-  Member<const NGPhysicalFragment> fragment;
+  Member<const PhysicalFragment> fragment;
   LogicalOffset offset;
 };
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
index b4b68c9..922f7ec 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -605,7 +605,7 @@
     if (fragmentainer_descendant.containing_block.Fragment()) {
       DCHECK(container_builder_->IsBlockFragmentationContextRoot());
 
-      const NGPhysicalFragment* containing_block_fragment =
+      const PhysicalFragment* containing_block_fragment =
           fragmentainer_descendant.containing_block.Fragment();
       const LayoutObject* containing_block =
           containing_block_fragment->GetLayoutObject();
@@ -1139,7 +1139,7 @@
         multicol_offset.block_offset -=
             previous_multicol_break_token->ConsumedBlockSize();
       }
-      const NGPhysicalFragment* containing_block_fragment =
+      const PhysicalFragment* containing_block_fragment =
           descendant.containing_block.Fragment();
       // If the containing block is not set, that means that the inner multicol
       // was its containing block, and the OOF will be laid out elsewhere.
@@ -1152,7 +1152,7 @@
           converter.ToLogical(descendant.containing_block.RelativeOffset(),
                               containing_block_fragment->Size());
 
-      const NGPhysicalFragment* fixedpos_containing_block_fragment =
+      const PhysicalFragment* fixedpos_containing_block_fragment =
           descendant.fixedpos_containing_block.Fragment();
       LogicalOffset fixedpos_containing_block_offset;
       LogicalOffset fixedpos_containing_block_rel_offset;
@@ -1487,7 +1487,7 @@
       // Layout the OOF descendants in order of fragmentainer index.
       for (wtf_size_t index = 0; index < descendants_to_layout.size();
            index++) {
-        const NGPhysicalFragment* fragment = nullptr;
+        const PhysicalFragment* fragment = nullptr;
         if (index < num_children)
           fragment = children[index].fragment;
         else if (column_balancing_info_)
@@ -1602,7 +1602,7 @@
 OutOfFlowLayoutPart::NodeInfo OutOfFlowLayoutPart::SetupNodeInfo(
     const LogicalOofPositionedNode& oof_node) {
   BlockNode node = oof_node.Node();
-  const NGPhysicalFragment* containing_block_fragment =
+  const PhysicalFragment* containing_block_fragment =
       oof_node.is_for_fragmentation
           ? To<LogicalOofNodeForFragmentation>(oof_node)
                 .containing_block.Fragment()
@@ -1623,8 +1623,7 @@
   } else {
     // If there's no layout object associated, the containing fragment should be
     // a page, and the containing block of the node should be the LayoutView.
-    DCHECK_EQ(containing_block_fragment->BoxType(),
-              NGPhysicalFragment::kPageBox);
+    DCHECK(containing_block_fragment->IsPageBox());
     DCHECK_EQ(node.GetLayoutBox()->ContainingBlock(),
               node.GetLayoutBox()->View());
   }
@@ -2532,7 +2531,7 @@
     container_builder_->AddChild(new_result->GetPhysicalFragment(), offset);
   } else {
     const LayoutResult* new_result = algorithm->Layout();
-    const NGPhysicalFragment* new_fragment = &new_result->GetPhysicalFragment();
+    const PhysicalFragment* new_fragment = &new_result->GetPhysicalFragment();
     container_builder_->ReplaceChild(index, *new_fragment, offset);
 
     if (multicol_children_ && index < multicol_children_->size()) {
@@ -2769,7 +2768,7 @@
   // Replace the old fragment with the new one, if |multicol_child| is a
   // fragmentainer and has the old fragment as a child.
   auto ReplaceFragmentainerChild =
-      [ReplaceChild](const NGPhysicalFragment& multicol_child) -> bool {
+      [ReplaceChild](const PhysicalFragment& multicol_child) -> bool {
     // We're going to replace a child of a fragmentainer. First check if it's a
     // fragmentainer at all.
     if (!multicol_child.IsFragmentainerBox())
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
index fde21b3a..8cdbfff 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
@@ -249,7 +249,7 @@
     // The physical fragment of the containing block used when laying out a
     // fragmentainer descendant. This is the containing block as defined by the
     // spec: https://www.w3.org/TR/css-position-3/#absolute-cb.
-    Member<const NGPhysicalFragment> containing_block_fragment;
+    Member<const PhysicalFragment> containing_block_fragment;
 
     void Trace(Visitor* visitor) const;
   };
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
index 5ece7a55..a127878c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
@@ -31,10 +31,10 @@
   }
 
   String DumpFragmentTree(const blink::NGPhysicalBoxFragment* fragment) {
-    NGPhysicalFragment::DumpFlags flags =
-        NGPhysicalFragment::DumpHeaderText | NGPhysicalFragment::DumpSubtree |
-        NGPhysicalFragment::DumpIndentation | NGPhysicalFragment::DumpOffset |
-        NGPhysicalFragment::DumpSize;
+    PhysicalFragment::DumpFlags flags =
+        PhysicalFragment::DumpHeaderText | PhysicalFragment::DumpSubtree |
+        PhysicalFragment::DumpIndentation | PhysicalFragment::DumpOffset |
+        PhysicalFragment::DumpSize;
 
     return fragment->DumpFragmentTree(flags);
   }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_node.h b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_node.h
index f28e321..625d69b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_node.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_node.h
@@ -31,7 +31,7 @@
 
   OofContainingBlock(OffsetType offset,
                      OffsetType relative_offset,
-                     const NGPhysicalFragment* fragment,
+                     const PhysicalFragment* fragment,
                      absl::optional<LayoutUnit> clipped_container_block_offset,
                      bool is_inside_column_spanner)
       : offset_(offset),
@@ -46,7 +46,7 @@
     offset_.block_offset += block_offset;
   }
   OffsetType RelativeOffset() const { return relative_offset_; }
-  const NGPhysicalFragment* Fragment() const { return fragment_.Get(); }
+  const PhysicalFragment* Fragment() const { return fragment_.Get(); }
   absl::optional<LayoutUnit> ClippedContainerBlockOffset() const {
     if (clipped_container_block_offset_ == LayoutUnit::Min()) {
       return absl::nullopt;
@@ -69,7 +69,7 @@
   // The relative offset is stored separately to ensure that it is applied after
   // fragmentation: https://www.w3.org/TR/css-break-3/#transforms.
   OffsetType relative_offset_;
-  Member<const NGPhysicalFragment> fragment_;
+  Member<const PhysicalFragment> fragment_;
   // The distance to the innermost container that clips block overflow, if any.
   LayoutUnit clipped_container_block_offset_ = LayoutUnit::Min();
   // True if there is a column spanner between the containing block and the
@@ -332,20 +332,20 @@
   }
 };
 
-// This is a sub class of |NGPhysicalFragment::OofData| that can store OOF
+// This is a sub class of |PhysicalFragment::OofData| that can store OOF
 // propagation data under the NG block fragmentation context.
 //
-// This class is defined here instead of |NGPhysicalFragment| because types
-// needed for this class requires full definition of |NGPhysicalFragment|, and
-// |NGPhysicalFragment| requires full definition of this class if this is put
-// into |NGPhysicalFragment|.
-struct FragmentedOofData final : NGPhysicalFragment::OofData {
+// This class is defined here instead of |PhysicalFragment| because types
+// needed for this class requires full definition of |PhysicalFragment|, and
+// |PhysicalFragment| requires full definition of this class if this is put
+// into |PhysicalFragment|.
+struct FragmentedOofData final : PhysicalFragment::OofData {
   using MulticolCollection =
       HeapHashMap<Member<LayoutBox>,
                   Member<MulticolWithPendingOofs<PhysicalOffset>>>;
 
   static bool HasOutOfFlowPositionedFragmentainerDescendants(
-      const NGPhysicalFragment& fragment) {
+      const PhysicalFragment& fragment) {
     const auto* oof_data = fragment.GetFragmentedOofData();
     return oof_data &&
            !oof_data->oof_positioned_fragmentainer_descendants.empty();
@@ -358,7 +358,7 @@
 
   static base::span<PhysicalOofNodeForFragmentation>
   OutOfFlowPositionedFragmentainerDescendants(
-      const NGPhysicalFragment& fragment) {
+      const PhysicalFragment& fragment) {
     const auto* oof_data = fragment.GetFragmentedOofData();
     if (!oof_data || oof_data->oof_positioned_fragmentainer_descendants.empty())
       return base::span<PhysicalOofNodeForFragmentation>();
@@ -371,7 +371,7 @@
   void Trace(Visitor* visitor) const override {
     visitor->Trace(oof_positioned_fragmentainer_descendants);
     visitor->Trace(multicols_with_pending_oofs);
-    NGPhysicalFragment::OofData::Trace(visitor);
+    PhysicalFragment::OofData::Trace(visitor);
   }
 
   HeapVector<PhysicalOofNodeForFragmentation>
diff --git a/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc
index 080cd3a..ebdb866 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc
@@ -98,7 +98,7 @@
       CalculateInitialFragmentGeometry(child_space, Node(), GetBreakToken());
   BlockLayoutAlgorithm child_algorithm(
       {Node(), fragment_geometry, child_space, break_token});
-  child_algorithm.SetBoxType(NGPhysicalFragment::kPageBox);
+  child_algorithm.SetBoxType(PhysicalFragment::kPageBox);
   const LayoutResult* result = child_algorithm.Layout();
   return &To<NGPhysicalBoxFragment>(result->GetPhysicalFragment());
 }
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 e941520..16a1dc9 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
@@ -40,7 +40,7 @@
 
 namespace {
 
-struct SameSizeAsNGPhysicalBoxFragment : NGPhysicalFragment {
+struct SameSizeAsNGPhysicalBoxFragment : PhysicalFragment {
   unsigned flags;
   LayoutUnit baseline;
   LayoutUnit last_baseline;
@@ -200,7 +200,7 @@
   // We store the children list inline in the fragment as a flexible
   // array. Therefore, we need to make sure to allocate enough space for
   // that array here, which requires a manual allocation + placement new.
-  // The initialization of the array is done by NGPhysicalFragment;
+  // The initialization of the array is done by PhysicalFragment;
   // we pass the buffer as a constructor argument.
   return MakeGarbageCollected<NGPhysicalBoxFragment>(
       AdditionalBytes(byte_size), PassKey(), builder, has_scrollable_overflow,
@@ -304,10 +304,10 @@
     const absl::optional<PhysicalRect>& inflow_bounds,
     bool has_fragment_items,
     WritingMode block_or_line_writing_mode)
-    : NGPhysicalFragment(builder,
-                         block_or_line_writing_mode,
-                         kFragmentBox,
-                         builder->BoxType()),
+    : PhysicalFragment(builder,
+                       block_or_line_writing_mode,
+                       kFragmentBox,
+                       builder->BoxType()),
       bit_field_(ConstHasFragmentItemsFlag::encode(has_fragment_items) |
                  HasDescendantsForTablePartFlag::encode(false) |
                  IsFragmentationContextRootFlag::encode(
@@ -407,7 +407,7 @@
     const NGPhysicalBoxFragment& other,
     bool has_scrollable_overflow,
     const PhysicalRect& scrollable_overflow)
-    : NGPhysicalFragment(other),
+    : PhysicalFragment(other),
       bit_field_(other.bit_field_),
       first_baseline_(other.first_baseline_),
       last_baseline_(other.last_baseline_),
@@ -426,7 +426,7 @@
 
 NGPhysicalBoxFragment::~NGPhysicalBoxFragment() {
   // Note: This function may not always be called because the dtor of
-  // NGPhysicalFragment is made non-virtual for memory efficiency.
+  // PhysicalFragment is made non-virtual for memory efficiency.
   SetInkOverflowType(ink_overflow_.Reset(InkOverflowType()));
 }
 
@@ -438,7 +438,7 @@
 }
 
 // TODO(kojii): Move to ng_physical_fragment.cc
-NGPhysicalFragment::OofData* NGPhysicalFragment::FragmentedOofDataFromBuilder(
+PhysicalFragment::OofData* PhysicalFragment::FragmentedOofDataFromBuilder(
     FragmentBuilder* builder) {
   DCHECK(has_fragmented_out_of_flow_data_);
   DCHECK_EQ(has_fragmented_out_of_flow_data_,
@@ -805,7 +805,7 @@
   } else if (layout_object->IsLayoutInline()) {
     // Inline overflow is a union of child overflows.
     PhysicalRect overflow;
-    if (BoxType() != kInlineBox) {
+    if (GetBoxType() != kInlineBox) {
       overflow = PhysicalRect({}, Size());
     }
     for (const auto& child_fragment : PostLayoutChildren()) {
@@ -863,7 +863,7 @@
     }
 
     void AddFloatingOrOutOfFlowPositionedChild(
-        const NGPhysicalFragment& child,
+        const PhysicalFragment& child,
         const PhysicalOffset& child_offset) {
       DCHECK(child.IsFloatingOrOutOfFlowPositioned());
       PhysicalRect child_scrollable_overflow =
@@ -1858,7 +1858,7 @@
   // in ctor so they do not cause TOCTOU.
   if (HasItems())
     visitor->Trace(*ComputeItemsAddress());
-  NGPhysicalFragment::TraceAfterDispatch(visitor);
+  PhysicalFragment::TraceAfterDispatch(visitor);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
index a089626c..bdd66544 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
@@ -30,7 +30,7 @@
 enum class OutlineType;
 struct FrameSetLayoutData;
 
-class CORE_EXPORT NGPhysicalBoxFragment final : public NGPhysicalFragment {
+class CORE_EXPORT NGPhysicalBoxFragment final : public PhysicalFragment {
  public:
   static const NGPhysicalBoxFragment* Create(
       BoxFragmentBuilder* builder,
@@ -98,7 +98,7 @@
 
   // Similar to |Children()| but all children are the latest generation of
   // post-layout, and therefore all descendants are safe.
-  NGPhysicalFragment::PostLayoutChildLinkList PostLayoutChildren() const {
+  PhysicalFragment::PostLayoutChildLinkList PostLayoutChildren() const {
     DCHECK(children_valid_);
     return PostLayoutChildLinkList(children_.size(), children_.data());
   }
@@ -393,7 +393,7 @@
   }
 
   const BlockBreakToken* GetBreakToken() const {
-    return To<BlockBreakToken>(NGPhysicalFragment::GetBreakToken());
+    return To<BlockBreakToken>(PhysicalFragment::GetBreakToken());
   }
 
   // Return true if this is the first fragment generated from a node.
@@ -532,7 +532,7 @@
 #endif
 
  protected:
-  friend class NGPhysicalFragment;
+  friend class PhysicalFragment;
   void Dispose();
 
  private:
@@ -639,8 +639,8 @@
 
 template <>
 struct DowncastTraits<NGPhysicalBoxFragment> {
-  static bool AllowFrom(const NGPhysicalFragment& fragment) {
-    return fragment.Type() == NGPhysicalFragment::kFragmentBox;
+  static bool AllowFrom(const PhysicalFragment& fragment) {
+    return fragment.Type() == PhysicalFragment::kFragmentBox;
   }
 };
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment_test.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment_test.cc
index 54e3c1f..50fbe398 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment_test.cc
@@ -117,12 +117,12 @@
     <img id="target" style="display: block">
   )HTML");
   const NGPhysicalBoxFragment& body = GetBodyFragment();
-  const NGPhysicalFragment& fragment = *body.Children().front();
-  EXPECT_EQ(fragment.Type(), NGPhysicalFragment::kFragmentBox);
+  const PhysicalFragment& fragment = *body.Children().front();
+  EXPECT_EQ(fragment.Type(), PhysicalFragment::kFragmentBox);
   // |LayoutReplaced| sets |IsAtomicInlineLevel()| even when it is block-level.
   // crbug.com/567964
   EXPECT_FALSE(fragment.IsAtomicInline());
-  EXPECT_EQ(fragment.BoxType(), NGPhysicalFragment::kBlockFlowRoot);
+  EXPECT_EQ(fragment.GetBoxType(), PhysicalFragment::kBlockFlowRoot);
 }
 
 TEST_F(NGPhysicalBoxFragmentTest, IsFragmentationContextRoot) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
index 853f87cb..14ee58d 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -28,43 +28,43 @@
 namespace blink {
 namespace {
 
-struct SameSizeAsNGPhysicalFragment
-    : public GarbageCollected<SameSizeAsNGPhysicalFragment> {
+struct SameSizeAsPhysicalFragment
+    : public GarbageCollected<SameSizeAsPhysicalFragment> {
   Member<void*> layout_object;
   PhysicalSize size;
   uint8_t flags[4];
   Member<void*> members[3];
 };
 
-ASSERT_SIZE(NGPhysicalFragment, SameSizeAsNGPhysicalFragment);
+ASSERT_SIZE(PhysicalFragment, SameSizeAsPhysicalFragment);
 
-String StringForBoxType(const NGPhysicalFragment& fragment) {
+String StringForBoxType(const PhysicalFragment& fragment) {
   StringBuilder result;
-  switch (fragment.BoxType()) {
-    case NGPhysicalFragment::NGBoxType::kNormalBox:
+  switch (fragment.GetBoxType()) {
+    case PhysicalFragment::BoxType::kNormalBox:
       break;
-    case NGPhysicalFragment::NGBoxType::kInlineBox:
+    case PhysicalFragment::BoxType::kInlineBox:
       result.Append("inline");
       break;
-    case NGPhysicalFragment::NGBoxType::kColumnBox:
+    case PhysicalFragment::BoxType::kColumnBox:
       result.Append("column");
       break;
-    case NGPhysicalFragment::NGBoxType::kPageBox:
+    case PhysicalFragment::BoxType::kPageBox:
       result.Append("page");
       break;
-    case NGPhysicalFragment::NGBoxType::kAtomicInline:
+    case PhysicalFragment::BoxType::kAtomicInline:
       result.Append("atomic-inline");
       break;
-    case NGPhysicalFragment::NGBoxType::kFloating:
+    case PhysicalFragment::BoxType::kFloating:
       result.Append("floating");
       break;
-    case NGPhysicalFragment::NGBoxType::kOutOfFlowPositioned:
+    case PhysicalFragment::BoxType::kOutOfFlowPositioned:
       result.Append("out-of-flow-positioned");
       break;
-    case NGPhysicalFragment::NGBoxType::kBlockFlowRoot:
+    case PhysicalFragment::BoxType::kBlockFlowRoot:
       result.Append("block-flow-root");
       break;
-    case NGPhysicalFragment::NGBoxType::kRenderedLegend:
+    case PhysicalFragment::BoxType::kRenderedLegend:
       result.Append("rendered-legend");
       break;
   }
@@ -93,11 +93,11 @@
 
  public:
   FragmentTreeDumper(StringBuilder* builder,
-                     NGPhysicalFragment::DumpFlags flags,
-                     const NGPhysicalFragment* target = nullptr)
+                     PhysicalFragment::DumpFlags flags,
+                     const PhysicalFragment* target = nullptr)
       : builder_(builder), target_fragment_(target), flags_(flags) {}
 
-  void Append(const NGPhysicalFragment* fragment,
+  void Append(const PhysicalFragment* fragment,
               absl::optional<PhysicalOffset> fragment_offset,
               unsigned indent = 2) {
     AppendIndentation(indent, fragment);
@@ -109,7 +109,7 @@
         return;
       }
       const LayoutObject* layout_object = box->GetLayoutObject();
-      if (flags_ & NGPhysicalFragment::DumpType) {
+      if (flags_ & PhysicalFragment::DumpType) {
         builder_->Append("Box");
         String box_type = StringForBoxType(*fragment);
         has_content = true;
@@ -118,7 +118,7 @@
           builder_->Append(box_type);
           builder_->Append(")");
         }
-        if (flags_ & NGPhysicalFragment::DumpSelfPainting &&
+        if (flags_ & PhysicalFragment::DumpSelfPainting &&
             box->HasSelfPaintingLayer()) {
           if (box_type.empty())
             builder_->Append(" ");
@@ -127,7 +127,7 @@
       }
       has_content = AppendOffsetAndSize(fragment, fragment_offset, has_content);
 
-      if (flags_ & NGPhysicalFragment::DumpNodeName && layout_object) {
+      if (flags_ & PhysicalFragment::DumpNodeName && layout_object) {
         if (has_content)
           builder_->Append(" ");
         builder_->Append(layout_object->DebugName());
@@ -135,17 +135,16 @@
       builder_->Append("\n");
 
       bool has_fragment_items = false;
-      if (flags_ & NGPhysicalFragment::DumpItems) {
+      if (flags_ & PhysicalFragment::DumpItems) {
         if (const FragmentItems* fragment_items = box->Items()) {
           InlineCursor cursor(*box, *fragment_items);
           Append(&cursor, indent + 2);
           has_fragment_items = true;
         }
       }
-      if (flags_ & NGPhysicalFragment::DumpSubtree) {
-        if (flags_ & NGPhysicalFragment::DumpLegacyDescendants &&
-            layout_object && !layout_object->IsLayoutNGObject() &&
-            box->Children().empty()) {
+      if (flags_ & PhysicalFragment::DumpSubtree) {
+        if (flags_ & PhysicalFragment::DumpLegacyDescendants && layout_object &&
+            !layout_object->IsLayoutNGObject() && box->Children().empty()) {
           AppendLegacySubtree(*layout_object, indent);
           return;
         }
@@ -159,14 +158,14 @@
     }
 
     if (const auto* line_box = DynamicTo<PhysicalLineBoxFragment>(fragment)) {
-      if (flags_ & NGPhysicalFragment::DumpType) {
+      if (flags_ & PhysicalFragment::DumpType) {
         builder_->Append("LineBox");
         has_content = true;
       }
       has_content = AppendOffsetAndSize(fragment, fragment_offset, has_content);
       builder_->Append("\n");
 
-      if (flags_ & NGPhysicalFragment::DumpSubtree) {
+      if (flags_ & PhysicalFragment::DumpSubtree) {
         for (auto& child : line_box->Children()) {
           Append(child.get(), child.Offset(), indent + 2);
         }
@@ -174,7 +173,7 @@
       }
     }
 
-    if (flags_ & NGPhysicalFragment::DumpType) {
+    if (flags_ & PhysicalFragment::DumpType) {
       builder_->Append("Unknown fragment type");
       has_content = true;
     }
@@ -199,7 +198,7 @@
   void AppendLegacySubtree(const LayoutObject& layout_object) {
     AppendLegacySubtree(layout_object, 0);
     if (target_fragment_ && !target_fragment_found_) {
-      if (flags_ & NGPhysicalFragment::DumpHeaderText) {
+      if (flags_ & PhysicalFragment::DumpHeaderText) {
         builder_->Append("(Fragment not found when searching the subtree)\n");
         builder_->Append("(Dumping detached fragment tree now:)\n");
       }
@@ -210,7 +209,7 @@
   void AppendNGRootInLegacySubtree(const LayoutObject& layout_object,
                                    unsigned indent) {
     DCHECK(IsNGRootWithFragments(layout_object));
-    if (flags_ & NGPhysicalFragment::DumpHeaderText) {
+    if (flags_ & PhysicalFragment::DumpHeaderText) {
       AppendIndentation(indent + 2);
       builder_->Append(
           "(NG fragment root inside fragment-less or legacy subtree:)\n");
@@ -224,7 +223,7 @@
   void Append(InlineCursor* cursor, unsigned indent) {
     for (; *cursor; cursor->MoveToNextSkippingChildren()) {
       const InlineCursorPosition& current = cursor->Current();
-      const NGPhysicalFragment* box = current.BoxFragment();
+      const PhysicalFragment* box = current.BoxFragment();
       if (box && !box->IsInlineBox()) {
         Append(box, current.OffsetInContainerFragment(), indent);
         continue;
@@ -243,28 +242,28 @@
       // make this more similar to |AppendFragmentToString| above.
       builder_->Append(current->ToString());
 
-      if (flags_ & NGPhysicalFragment::DumpOffset) {
+      if (flags_ & PhysicalFragment::DumpOffset) {
         builder_->Append(" offset:");
         builder_->Append(current.OffsetInContainerFragment().ToString());
       }
-      if (flags_ & NGPhysicalFragment::DumpSize) {
+      if (flags_ & PhysicalFragment::DumpSize) {
         builder_->Append(" size:");
         builder_->Append(current.Size().ToString());
       }
 
       builder_->Append("\n");
 
-      if (flags_ & NGPhysicalFragment::DumpSubtree && current.HasChildren()) {
+      if (flags_ & PhysicalFragment::DumpSubtree && current.HasChildren()) {
         InlineCursor descendants = cursor->CursorForDescendants();
         Append(&descendants, indent + 2);
       }
     }
   }
 
-  bool AppendOffsetAndSize(const NGPhysicalFragment* fragment,
+  bool AppendOffsetAndSize(const PhysicalFragment* fragment,
                            absl::optional<PhysicalOffset> fragment_offset,
                            bool has_content) {
-    if (flags_ & NGPhysicalFragment::DumpOffset) {
+    if (flags_ & PhysicalFragment::DumpOffset) {
       if (has_content)
         builder_->Append(" ");
       builder_->Append("offset:");
@@ -274,7 +273,7 @@
         builder_->Append("unplaced");
       has_content = true;
     }
-    if (flags_ & NGPhysicalFragment::DumpSize) {
+    if (flags_ & PhysicalFragment::DumpSize) {
       if (has_content)
         builder_->Append(" ");
       builder_->Append("size:");
@@ -285,8 +284,8 @@
   }
 
   void AppendIndentation(unsigned indent,
-                         const NGPhysicalFragment* fragment = nullptr) {
-    if (flags_ & NGPhysicalFragment::DumpIndentation) {
+                         const PhysicalFragment* fragment = nullptr) {
+    if (flags_ & PhysicalFragment::DumpIndentation) {
       unsigned start_idx = 0;
       if (fragment && fragment == target_fragment_) {
         builder_->Append("*");
@@ -314,17 +313,17 @@
   }
 
   StringBuilder* builder_;
-  const NGPhysicalFragment* target_fragment_ = nullptr;
-  NGPhysicalFragment::DumpFlags flags_;
+  const PhysicalFragment* target_fragment_ = nullptr;
+  PhysicalFragment::DumpFlags flags_;
   bool target_fragment_found_ = false;
 };
 
 }  // namespace
 
-NGPhysicalFragment::NGPhysicalFragment(FragmentBuilder* builder,
-                                       WritingMode block_or_line_writing_mode,
-                                       NGFragmentType type,
-                                       unsigned sub_type)
+PhysicalFragment::PhysicalFragment(FragmentBuilder* builder,
+                                   WritingMode block_or_line_writing_mode,
+                                   FragmentType type,
+                                   unsigned sub_type)
     : layout_object_(builder->layout_object_),
       size_(ToPhysicalSize(builder->size_, builder->GetWritingMode())),
       type_(type),
@@ -379,7 +378,7 @@
   children_valid_ = true;
 }
 
-NGPhysicalFragment::OofData* NGPhysicalFragment::OofDataFromBuilder(
+PhysicalFragment::OofData* PhysicalFragment::OofDataFromBuilder(
     FragmentBuilder* builder) {
   OofData* oof_data = nullptr;
   if (has_fragmented_out_of_flow_data_)
@@ -417,7 +416,7 @@
 
 // Even though the other constructors don't initialize many of these fields
 // (instead set by their super-classes), the copy constructor does.
-NGPhysicalFragment::NGPhysicalFragment(const NGPhysicalFragment& other)
+PhysicalFragment::PhysicalFragment(const PhysicalFragment& other)
     : layout_object_(other.layout_object_),
       size_(other.size_),
       type_(other.type_),
@@ -461,11 +460,11 @@
   DCHECK(children_valid_);
 }
 
-NGPhysicalFragment::~NGPhysicalFragment() {
+PhysicalFragment::~PhysicalFragment() {
   Dispose();
 }
 
-void NGPhysicalFragment::Dispose() {
+void PhysicalFragment::Dispose() {
   switch (Type()) {
     case kFragmentBox:
       static_cast<NGPhysicalBoxFragment*>(this)->Dispose();
@@ -476,28 +475,28 @@
   }
 }
 
-bool NGPhysicalFragment::IsBlockFlow() const {
+bool PhysicalFragment::IsBlockFlow() const {
   return !IsLineBox() && layout_object_->IsLayoutBlockFlow();
 }
 
-bool NGPhysicalFragment::IsTextControlContainer() const {
+bool PhysicalFragment::IsTextControlContainer() const {
   return IsCSSBox() && blink::IsTextControlContainer(layout_object_->GetNode());
 }
 
-bool NGPhysicalFragment::IsTextControlPlaceholder() const {
+bool PhysicalFragment::IsTextControlPlaceholder() const {
   return IsCSSBox() &&
          blink::IsTextControlPlaceholder(layout_object_->GetNode());
 }
 
 base::span<PhysicalOofPositionedNode>
-NGPhysicalFragment::OutOfFlowPositionedDescendants() const {
+PhysicalFragment::OutOfFlowPositionedDescendants() const {
   if (!HasOutOfFlowPositionedDescendants())
     return base::span<PhysicalOofPositionedNode>();
   return {oof_data_->oof_positioned_descendants.data(),
           oof_data_->oof_positioned_descendants.size()};
 }
 
-FragmentedOofData* NGPhysicalFragment::GetFragmentedOofData() const {
+FragmentedOofData* PhysicalFragment::GetFragmentedOofData() const {
   if (!has_fragmented_out_of_flow_data_)
     return nullptr;
   auto* oof_data = reinterpret_cast<FragmentedOofData*>(oof_data_.Get());
@@ -506,12 +505,12 @@
   return oof_data;
 }
 
-bool NGPhysicalFragment::HasNestedMulticolsWithOOFs() const {
+bool PhysicalFragment::HasNestedMulticolsWithOOFs() const {
   const auto* oof_data = GetFragmentedOofData();
   return oof_data && !oof_data->multicols_with_pending_oofs.empty();
 }
 
-bool NGPhysicalFragment::NeedsOOFPositionedInfoPropagation() const {
+bool PhysicalFragment::NeedsOOFPositionedInfoPropagation() const {
   // If we have |oof_data_|, it should mean at least one of OOF propagation data
   // exists.
   DCHECK_EQ(!!oof_data_,
@@ -521,7 +520,7 @@
   return !!oof_data_;
 }
 
-void NGPhysicalFragment::ClearOofData() {
+void PhysicalFragment::ClearOofData() {
   if (!oof_data_)
     return;
   if (HasAnchorQuery())
@@ -530,7 +529,7 @@
     oof_data_ = nullptr;
 }
 
-NGPhysicalFragment::OofData* NGPhysicalFragment::CloneOofData() const {
+PhysicalFragment::OofData* PhysicalFragment::CloneOofData() const {
   DCHECK(oof_data_);
   if (!has_fragmented_out_of_flow_data_)
     return MakeGarbageCollected<OofData>(*oof_data_);
@@ -538,7 +537,7 @@
   return MakeGarbageCollected<FragmentedOofData>(*GetFragmentedOofData());
 }
 
-bool NGPhysicalFragment::IsMonolithic() const {
+bool PhysicalFragment::IsMonolithic() const {
   // Line boxes are monolithic, except for line boxes that are just there to
   // contain a block inside an inline, in which case the anonymous block child
   // wrapper inside the line is breakable.
@@ -549,14 +548,14 @@
   return false;
 }
 
-bool NGPhysicalFragment::IsImplicitAnchor() const {
+bool PhysicalFragment::IsImplicitAnchor() const {
   if (Element* element = DynamicTo<Element>(GetNode())) {
     return element->HasImplicitlyAnchoredElement();
   }
   return false;
 }
 
-const FragmentData* NGPhysicalFragment::GetFragmentData() const {
+const FragmentData* PhysicalFragment::GetFragmentData() const {
   const LayoutBox* box = DynamicTo<LayoutBox>(GetLayoutObject());
   if (!box) {
     DCHECK(!GetLayoutObject());
@@ -566,14 +565,14 @@
       To<NGPhysicalBoxFragment>(*this));
 }
 
-const NGPhysicalFragment* NGPhysicalFragment::PostLayout() const {
+const PhysicalFragment* PhysicalFragment::PostLayout() const {
   if (const auto* box = DynamicTo<NGPhysicalBoxFragment>(this))
     return box->PostLayout();
   return this;
 }
 
 #if DCHECK_IS_ON()
-void NGPhysicalFragment::CheckType() const {
+void PhysicalFragment::CheckType() const {
   switch (Type()) {
     case kFragmentBox:
       if (IsInlineBox()) {
@@ -599,7 +598,7 @@
         // block box.
         DCHECK(!IsFloating());
         DCHECK(!IsOutOfFlowPositioned());
-        DCHECK(IsAtomicInline() || (IsBox() && BoxType() == kBlockFlowRoot));
+        DCHECK(IsAtomicInline() || (IsBox() && GetBoxType() == kBlockFlowRoot));
         break;
       }
       DCHECK_EQ(IsFloating(), layout_object_->IsFloating());
@@ -619,7 +618,7 @@
 }
 #endif
 
-PhysicalRect NGPhysicalFragment::ComputeRubyEmHeightBox(
+PhysicalRect PhysicalFragment::ComputeRubyEmHeightBox(
     const NGPhysicalBoxFragment& container) const {
   switch (Type()) {
     case kFragmentBox:
@@ -633,14 +632,14 @@
   return {{}, Size()};
 }
 
-PhysicalRect NGPhysicalFragment::ComputeRubyEmHeightBoxForPropagation(
+PhysicalRect PhysicalFragment::ComputeRubyEmHeightBoxForPropagation(
     const NGPhysicalBoxFragment& container) const {
   PhysicalRect overflow = ComputeRubyEmHeightBox(container);
   AdjustRubyEmHeightBoxForPropagation(container, &overflow);
   return overflow;
 }
 
-void NGPhysicalFragment::AdjustRubyEmHeightBoxForPropagation(
+void PhysicalFragment::AdjustRubyEmHeightBoxForPropagation(
     const NGPhysicalBoxFragment& container,
     PhysicalRect* overflow) const {
   DCHECK(!IsLineBox());
@@ -664,13 +663,13 @@
   }
 }
 
-LogicalRect NGPhysicalFragment::ConvertChildToLogical(
+LogicalRect PhysicalFragment::ConvertChildToLogical(
     const PhysicalRect& physical_rect) const {
   return WritingModeConverter(Style().GetWritingDirection(), Size())
       .ToLogical(physical_rect);
 }
 
-String NGPhysicalFragment::ToString() const {
+String PhysicalFragment::ToString() const {
   StringBuilder output;
   output.AppendFormat("Type: '%d' Size: '%s'", Type(),
                       Size().ToString().Ascii().c_str());
@@ -685,9 +684,9 @@
   return output.ToString();
 }
 
-String NGPhysicalFragment::DumpFragmentTree(
+String PhysicalFragment::DumpFragmentTree(
     DumpFlags flags,
-    const NGPhysicalFragment* target,
+    const PhysicalFragment* target,
     absl::optional<PhysicalOffset> fragment_offset,
     unsigned indent) const {
   StringBuilder string_builder;
@@ -698,9 +697,9 @@
   return string_builder.ToString();
 }
 
-String NGPhysicalFragment::DumpFragmentTree(const LayoutObject& root,
-                                            DumpFlags flags,
-                                            const NGPhysicalFragment* target) {
+String PhysicalFragment::DumpFragmentTree(const LayoutObject& root,
+                                          DumpFlags flags,
+                                          const PhysicalFragment* target) {
   if (root.IsLayoutNGObject()) {
     const LayoutBox& root_box = To<LayoutBox>(root);
     DCHECK_EQ(root_box.PhysicalFragmentCount(), 1u);
@@ -717,7 +716,7 @@
   return string_builder.ToString();
 }
 
-void NGPhysicalFragment::Trace(Visitor* visitor) const {
+void PhysicalFragment::Trace(Visitor* visitor) const {
   switch (Type()) {
     case kFragmentBox:
       static_cast<const NGPhysicalBoxFragment*>(this)->TraceAfterDispatch(
@@ -730,7 +729,7 @@
   }
 }
 
-void NGPhysicalFragment::TraceAfterDispatch(Visitor* visitor) const {
+void PhysicalFragment::TraceAfterDispatch(Visitor* visitor) const {
   visitor->Trace(layout_object_);
   visitor->Trace(propagated_data_);
   visitor->Trace(break_token_);
@@ -739,14 +738,14 @@
 
 // TODO(dlibby): remove `Children` and `PostLayoutChildren` and move the
 // casting and/or branching to the callers.
-base::span<const PhysicalFragmentLink> NGPhysicalFragment::Children() const {
+base::span<const PhysicalFragmentLink> PhysicalFragment::Children() const {
   if (Type() == kFragmentBox)
     return static_cast<const NGPhysicalBoxFragment*>(this)->Children();
   return base::make_span(static_cast<PhysicalFragmentLink*>(nullptr), 0u);
 }
 
-NGPhysicalFragment::PostLayoutChildLinkList
-NGPhysicalFragment::PostLayoutChildren() const {
+PhysicalFragment::PostLayoutChildLinkList PhysicalFragment::PostLayoutChildren()
+    const {
   if (Type() == kFragmentBox) {
     return static_cast<const NGPhysicalBoxFragment*>(this)
         ->PostLayoutChildren();
@@ -754,7 +753,7 @@
   return PostLayoutChildLinkList(0, nullptr);
 }
 
-void NGPhysicalFragment::SetChildrenInvalid() const {
+void PhysicalFragment::SetChildrenInvalid() const {
   if (!children_valid_)
     return;
 
@@ -765,7 +764,7 @@
 }
 
 // additional_offset must be offset from the containing_block.
-void NGPhysicalFragment::AddOutlineRectsForNormalChildren(
+void PhysicalFragment::AddOutlineRectsForNormalChildren(
     OutlineRectCollector& collector,
     const PhysicalOffset& additional_offset,
     OutlineType outline_type,
@@ -797,7 +796,7 @@
   }
 }
 
-void NGPhysicalFragment::AddOutlineRectsForCursor(
+void PhysicalFragment::AddOutlineRectsForCursor(
     OutlineRectCollector& collector,
     const PhysicalOffset& additional_offset,
     OutlineType outline_type,
@@ -860,7 +859,7 @@
   }
 }
 
-void NGPhysicalFragment::AddRubyEmHeightBoxForInlineChild(
+void PhysicalFragment::AddRubyEmHeightBoxForInlineChild(
     const NGPhysicalBoxFragment& container,
     const ComputedStyle& container_style,
     const FragmentItem& line,
@@ -898,7 +897,7 @@
     if (const NGPhysicalBoxFragment* child_box =
             item->PostLayoutBoxFragment()) {
       PhysicalRect child_scroll_overflow;
-      if (child_box->BoxType() != kInlineBox && !IsRubyBox()) {
+      if (child_box->GetBoxType() != kInlineBox && !IsRubyBox()) {
         child_scroll_overflow = item->RectInContainerFragment();
       }
       if (child_box->IsInlineBox()) {
@@ -932,7 +931,7 @@
 // Chop the hanging part from scrollable overflow. Children overflow in inline
 // direction should hang, which should not cause scroll.
 // TODO(kojii): Should move to text fragment to make this more accurate.
-void NGPhysicalFragment::AdjustRubyEmHeightBoxForHanging(
+void PhysicalFragment::AdjustRubyEmHeightBoxForHanging(
     const PhysicalRect& rect,
     const WritingMode container_writing_mode,
     PhysicalRect* overflow) {
@@ -951,7 +950,7 @@
 
 // additional_offset must be offset from the containing_block because
 // LocalToAncestorRect returns rects wrt containing_block.
-void NGPhysicalFragment::AddOutlineRectsForDescendant(
+void PhysicalFragment::AddOutlineRectsForDescendant(
     const PhysicalFragmentLink& descendant,
     OutlineRectCollector& collector,
     const PhysicalOffset& additional_offset,
@@ -1013,7 +1012,7 @@
   }
 }
 
-bool NGPhysicalFragment::DependsOnPercentageBlockSize(
+bool PhysicalFragment::DependsOnPercentageBlockSize(
     const FragmentBuilder& builder) {
   LayoutInputNode node = builder.node_;
 
@@ -1058,18 +1057,16 @@
   return false;
 }
 
-void NGPhysicalFragment::OofData::Trace(Visitor* visitor) const {
+void PhysicalFragment::OofData::Trace(Visitor* visitor) const {
   visitor->Trace(oof_positioned_descendants);
   visitor->Trace(anchor_query);
 }
 
-std::ostream& operator<<(std::ostream& out,
-                         const NGPhysicalFragment& fragment) {
+std::ostream& operator<<(std::ostream& out, const PhysicalFragment& fragment) {
   return out << fragment.ToString();
 }
 
-std::ostream& operator<<(std::ostream& out,
-                         const NGPhysicalFragment* fragment) {
+std::ostream& operator<<(std::ostream& out, const PhysicalFragment* fragment) {
   if (!fragment)
     return out << "<null>";
   return out << *fragment;
@@ -1079,23 +1076,23 @@
 
 #if DCHECK_IS_ON()
 
-void ShowFragmentTree(const blink::NGPhysicalFragment* fragment) {
+void ShowFragmentTree(const blink::PhysicalFragment* fragment) {
   if (!fragment) {
     LOG(INFO) << "Cannot show fragment tree. Fragment is null.";
     return;
   }
-  blink::NGPhysicalFragment::DumpFlags dump_flags =
-      blink::NGPhysicalFragment::DumpAll;
+  blink::PhysicalFragment::DumpFlags dump_flags =
+      blink::PhysicalFragment::DumpAll;
   LOG(INFO) << "\n" << fragment->DumpFragmentTree(dump_flags).Utf8();
 }
 
 void ShowFragmentTree(const blink::LayoutObject& root,
-                      const blink::NGPhysicalFragment* target) {
-  blink::NGPhysicalFragment::DumpFlags dump_flags =
-      blink::NGPhysicalFragment::DumpAll;
+                      const blink::PhysicalFragment* target) {
+  blink::PhysicalFragment::DumpFlags dump_flags =
+      blink::PhysicalFragment::DumpAll;
   LOG(INFO) << "\n"
-            << blink::NGPhysicalFragment::DumpFragmentTree(root, dump_flags,
-                                                           target)
+            << blink::PhysicalFragment::DumpFragmentTree(root, dump_flags,
+                                                         target)
                    .Utf8();
 }
 
@@ -1103,7 +1100,7 @@
   ShowFragmentTree(*target.View());
 }
 
-void ShowEntireFragmentTree(const blink::NGPhysicalFragment* target) {
+void ShowEntireFragmentTree(const blink::PhysicalFragment* target) {
   if (!target) {
     LOG(INFO) << "Cannot show fragment tree. Fragment is null.";
     return;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
index d5408de..e647d16 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -41,7 +41,7 @@
 struct LogicalRect;
 struct PhysicalOofPositionedNode;
 
-// The NGPhysicalFragment contains the output geometry from layout. The
+// The PhysicalFragment contains the output geometry from layout. The
 // fragment stores all of its information in the physical coordinate system for
 // use by paint, hit-testing etc.
 //
@@ -52,16 +52,15 @@
 // Layout code should only access geometry information through the
 // LogicalFragment wrapper classes which transforms information into the logical
 // coordinate system.
-class CORE_EXPORT NGPhysicalFragment
-    : public GarbageCollected<NGPhysicalFragment> {
+class CORE_EXPORT PhysicalFragment : public GarbageCollected<PhysicalFragment> {
  public:
-  enum NGFragmentType {
+  enum FragmentType {
     kFragmentBox = 0,
     kFragmentLineBox = 1,
     // When adding new values, make sure the bit size of |type_| is large
     // enough to store.
   };
-  enum NGBoxType {
+  enum BoxType {
     kNormalBox,
     kInlineBox,
     // A multi-column container creates column boxes as its children, which
@@ -102,44 +101,46 @@
     Member<const ScrollStartTargetCandidates> scroll_start_targets;
   };
 
-  NGPhysicalFragment(FragmentBuilder* builder,
-                     WritingMode block_or_line_writing_mode,
-                     NGFragmentType type,
-                     unsigned sub_type);
+  PhysicalFragment(FragmentBuilder* builder,
+                   WritingMode block_or_line_writing_mode,
+                   FragmentType type,
+                   unsigned sub_type);
 
-  NGPhysicalFragment(const NGPhysicalFragment& other);
+  PhysicalFragment(const PhysicalFragment& other);
 
-  ~NGPhysicalFragment();
+  ~PhysicalFragment();
 
   void Dispose();
 
-  NGFragmentType Type() const { return static_cast<NGFragmentType>(type_); }
+  FragmentType Type() const { return static_cast<FragmentType>(type_); }
   bool IsContainer() const {
-    return Type() == NGFragmentType::kFragmentBox ||
-           Type() == NGFragmentType::kFragmentLineBox;
+    return Type() == FragmentType::kFragmentBox ||
+           Type() == FragmentType::kFragmentLineBox;
   }
-  bool IsBox() const { return Type() == NGFragmentType::kFragmentBox; }
-  bool IsLineBox() const { return Type() == NGFragmentType::kFragmentLineBox; }
+  bool IsBox() const { return Type() == FragmentType::kFragmentBox; }
+  bool IsLineBox() const { return Type() == FragmentType::kFragmentLineBox; }
 
   // Returns the box type of this fragment.
-  NGBoxType BoxType() const {
+  BoxType GetBoxType() const {
     DCHECK(IsBox());
-    return static_cast<NGBoxType>(sub_type_);
+    return static_cast<BoxType>(sub_type_);
   }
   // True if this is an inline box; e.g., <span>. Atomic inlines such as
   // replaced elements or inline block are not included.
   bool IsInlineBox() const {
-    return IsBox() && BoxType() == NGBoxType::kInlineBox;
+    return IsBox() && GetBoxType() == BoxType::kInlineBox;
   }
   bool IsColumnBox() const {
-    return IsBox() && BoxType() == NGBoxType::kColumnBox;
+    return IsBox() && GetBoxType() == BoxType::kColumnBox;
   }
-  bool IsPageBox() const { return IsBox() && BoxType() == NGBoxType::kPageBox; }
-  static bool IsFragmentainerBoxType(NGBoxType type) {
-    return type == NGBoxType::kColumnBox || type == NGBoxType::kPageBox;
+  bool IsPageBox() const {
+    return IsBox() && GetBoxType() == BoxType::kPageBox;
+  }
+  static bool IsFragmentainerBoxType(BoxType type) {
+    return type == BoxType::kColumnBox || type == BoxType::kPageBox;
   }
   bool IsFragmentainerBox() const {
-    return IsBox() && IsFragmentainerBoxType(BoxType());
+    return IsBox() && IsFragmentainerBoxType(GetBoxType());
   }
   bool IsColumnSpanAll() const {
     if (const auto* box = DynamicTo<LayoutBox>(GetLayoutObject()))
@@ -149,7 +150,7 @@
   // An atomic inline is represented as a kFragmentBox, such as inline block and
   // replaced elements.
   bool IsAtomicInline() const {
-    return IsBox() && BoxType() == NGBoxType::kAtomicInline;
+    return IsBox() && GetBoxType() == BoxType::kAtomicInline;
   }
   // True if this box is a block-in-inline, or if this line contains a
   // block-in-inline.
@@ -160,10 +161,10 @@
   // True if this fragment is in-flow in an inline formatting context.
   bool IsInline() const { return IsInlineBox() || IsAtomicInline(); }
   bool IsFloating() const {
-    return IsBox() && BoxType() == NGBoxType::kFloating;
+    return IsBox() && GetBoxType() == BoxType::kFloating;
   }
   bool IsOutOfFlowPositioned() const {
-    return IsBox() && BoxType() == NGBoxType::kOutOfFlowPositioned;
+    return IsBox() && GetBoxType() == BoxType::kOutOfFlowPositioned;
   }
   bool IsFixedPositioned() const {
     return IsCSSBox() && layout_object_->IsFixedPositioned();
@@ -191,7 +192,7 @@
   // Return true if this is the legend child of a fieldset that gets special
   // treatment (i.e. placed over the block-start border).
   bool IsRenderedLegend() const {
-    return IsBox() && BoxType() == NGBoxType::kRenderedLegend;
+    return IsBox() && GetBoxType() == BoxType::kRenderedLegend;
   }
   bool IsMathML() const {
     return IsBox() && GetSelfOrContainerLayoutObject()->IsMathML();
@@ -275,7 +276,7 @@
   bool HasCollapsedBorders() const { return has_collapsed_borders_; }
 
   bool IsFormattingContextRoot() const {
-    return IsBox() && BoxType() >= NGBoxType::kMinimumFormattingContextRoot;
+    return IsBox() && GetBoxType() >= BoxType::kMinimumFormattingContextRoot;
   }
 
   // Returns true if we have a descendant within this formatting context, which
@@ -464,12 +465,12 @@
 
   const FragmentData* GetFragmentData() const;
 
-  // |NGPhysicalFragment| may live longer than the corresponding |LayoutObject|.
-  // Though |NGPhysicalFragment| is immutable, |layout_object_| is cleared to
+  // |PhysicalFragment| may live longer than the corresponding |LayoutObject|.
+  // Though |PhysicalFragment| is immutable, |layout_object_| is cleared to
   // |nullptr| when it was destroyed to avoid reading destroyed objects.
   bool IsLayoutObjectDestroyedOrMoved() const { return !layout_object_; }
   void LayoutObjectWillBeDestroyed() const {
-    const_cast<NGPhysicalFragment*>(this)->layout_object_ = nullptr;
+    const_cast<PhysicalFragment*>(this)->layout_object_ = nullptr;
   }
 
   // Returns the latest generation of the post-layout fragment. Returns
@@ -478,7 +479,7 @@
   // When subtree relayout occurs at the relayout boundary, its containing block
   // may keep the reference to old generations of this fragment. Callers can
   // check if there were newer generations.
-  const NGPhysicalFragment* PostLayout() const;
+  const PhysicalFragment* PostLayout() const;
 
   // Em height box. including contents, in the local coordinate.
   PhysicalRect ComputeRubyEmHeightBox(
@@ -519,7 +520,7 @@
   // Dump the fragment tree, optionally mark |target| if it's found. If not
   // found, the subtree established by |target| will be dumped as well.
   String DumpFragmentTree(DumpFlags,
-                          const NGPhysicalFragment* target = nullptr,
+                          const PhysicalFragment* target = nullptr,
                           absl::optional<PhysicalOffset> = absl::nullopt,
                           unsigned indent = 2) const;
 
@@ -531,14 +532,14 @@
   // behavior is undefined.
   static String DumpFragmentTree(const LayoutObject& root,
                                  DumpFlags,
-                                 const NGPhysicalFragment* target = nullptr);
+                                 const PhysicalFragment* target = nullptr);
 
   void Trace(Visitor*) const;
   void TraceAfterDispatch(Visitor*) const;
 
   // Same as |base::span<const PhysicalFragmentLink>|, except that:
   // * Each |PhysicalFragmentLink| has the latest generation of post-layout. See
-  //   |NGPhysicalFragment::PostLayout()| for more details.
+  //   |PhysicalFragment::PostLayout()| for more details.
   // * The iterator skips fragments for destroyed or moved |LayoutObject|.
   class PostLayoutChildLinkList {
     STACK_ALLOCATED();
@@ -586,10 +587,10 @@
      private:
       void SkipInvalidAndSetPostLayout() {
         for (; current_ != end_; ++current_) {
-          const NGPhysicalFragment* fragment = current_->fragment.Get();
+          const PhysicalFragment* fragment = current_->fragment.Get();
           if (UNLIKELY(fragment->IsLayoutObjectDestroyedOrMoved()))
             continue;
-          if (const NGPhysicalFragment* post_layout = fragment->PostLayout()) {
+          if (const PhysicalFragment* post_layout = fragment->PostLayout()) {
             post_layout_.fragment = post_layout;
             post_layout_.offset = current_->offset;
             return;
@@ -762,8 +763,8 @@
   Member<LayoutObject> layout_object_;
   PhysicalSize size_;
 
-  const uint8_t type_ : 1;           // NGFragmentType
-  const uint8_t sub_type_ : 4;       // NGBoxType, NGTextType, or NGLineBoxType
+  const uint8_t type_ : 1;           // FragmentType
+  const uint8_t sub_type_ : 4;       // BoxType, NGTextType, or LineBoxType
   const uint8_t style_variant_ : 2;  // StyleVariant
   const uint8_t is_hidden_for_paint_ : 1;
   uint8_t : 0;  // NOLINT, zero-length bitfield used to allow the compiler to
@@ -808,11 +809,11 @@
   Member<OofData> oof_data_;
 };
 
-CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGPhysicalFragment*);
-CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGPhysicalFragment&);
+CORE_EXPORT std::ostream& operator<<(std::ostream&, const PhysicalFragment*);
+CORE_EXPORT std::ostream& operator<<(std::ostream&, const PhysicalFragment&);
 
 #if !DCHECK_IS_ON()
-inline void NGPhysicalFragment::CheckType() const {}
+inline void PhysicalFragment::CheckType() const {}
 #endif
 
 }  // namespace blink
@@ -822,19 +823,18 @@
 
 // Output the fragment tree to the log.
 // See DumpFragmentTree().
-CORE_EXPORT void ShowFragmentTree(const blink::NGPhysicalFragment*);
+CORE_EXPORT void ShowFragmentTree(const blink::PhysicalFragment*);
 
 // Output the fragment tree(s) inside |root| to the log.
 // See DumpFragmentTree(const LayoutObject& ...).
 CORE_EXPORT void ShowFragmentTree(
     const blink::LayoutObject& root,
-    const blink::NGPhysicalFragment* target = nullptr);
+    const blink::PhysicalFragment* target = nullptr);
 
 // Output the fragment tree(s) from the entire document to the log.
 // See DumpFragmentTree(const LayoutObject& ...).
 CORE_EXPORT void ShowEntireFragmentTree(const blink::LayoutObject& target);
-CORE_EXPORT void ShowEntireFragmentTree(
-    const blink::NGPhysicalFragment* target);
+CORE_EXPORT void ShowEntireFragmentTree(const blink::PhysicalFragment* target);
 #endif  // DCHECK_IS_ON()
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_NG_PHYSICAL_FRAGMENT_H_
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment_test.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment_test.cc
index 1faac7b..8bc64ce 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment_test.cc
@@ -12,15 +12,15 @@
 
 namespace blink {
 
-class NGPhysicalFragmentTest : public RenderingTest {
+class PhysicalFragmentTest : public RenderingTest {
  public:
-  String DumpAll(const NGPhysicalFragment* target = nullptr) const {
-    return NGPhysicalFragment::DumpFragmentTree(
-        *GetDocument().GetLayoutView(), NGPhysicalFragment::DumpAll, target);
+  String DumpAll(const PhysicalFragment* target = nullptr) const {
+    return PhysicalFragment::DumpFragmentTree(
+        *GetDocument().GetLayoutView(), PhysicalFragment::DumpAll, target);
   }
 };
 
-TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeBasic) {
+TEST_F(PhysicalFragmentTest, DumpFragmentTreeBasic) {
   SetBodyInnerHTML(R"HTML(
     <div id="block"></div>
   )HTML");
@@ -35,7 +35,7 @@
 }
 
 // LayoutView is the containing block of an absolutely positioned descendant.
-TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithAbspos) {
+TEST_F(PhysicalFragmentTest, DumpFragmentTreeWithAbspos) {
   SetBodyInnerHTML(R"HTML(
     <div id="abs" style="position:absolute;"></div>
   )HTML");
@@ -51,7 +51,7 @@
 }
 
 // An NG object is the containing block of an absolutely positioned descendant.
-TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithAbsposInRelpos) {
+TEST_F(PhysicalFragmentTest, DumpFragmentTreeWithAbsposInRelpos) {
   SetBodyInnerHTML(R"HTML(
     <div id="rel" style="position:relative;">
       <div id="abs" style="position:absolute; left:10px; top:20px;"></div>
@@ -70,7 +70,7 @@
 }
 
 // A legacy grid with another legacy grid inside, and some NG objects, too.
-TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithGrid) {
+TEST_F(PhysicalFragmentTest, DumpFragmentTreeWithGrid) {
   SetBodyInnerHTML(R"HTML(
     <div id="outer-grid" style="display:grid;">
       <div id="grid-as-item" style="display:grid;">
@@ -99,7 +99,7 @@
   EXPECT_EQ(expectation, dump);
 }
 
-TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithTargetInsideColumn) {
+TEST_F(PhysicalFragmentTest, DumpFragmentTreeWithTargetInsideColumn) {
   SetBodyInnerHTML(R"HTML(
     <div id="multicol" style="columns:3;">
       <div id="child" style="height:150px;"></div>
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
index 9ee7daa..47bfabd 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
@@ -214,7 +214,7 @@
 }
 
 void SimplifiedLayoutAlgorithm::AppendNewChildFragment(
-    const NGPhysicalFragment& fragment,
+    const PhysicalFragment& fragment,
     LogicalOffset offset) {
   container_builder_.AddChild(fragment, offset);
 }
@@ -337,7 +337,7 @@
 
 void SimplifiedLayoutAlgorithm::AddChildFragment(
     const PhysicalFragmentLink& old_fragment,
-    const NGPhysicalFragment& new_fragment,
+    const PhysicalFragment& new_fragment,
     const MarginStrut* margin_strut,
     bool is_self_collapsing) {
   DCHECK_EQ(old_fragment->Size(), new_fragment.Size());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.h
index 3b73830..c379e8e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.h
@@ -15,7 +15,7 @@
 namespace blink {
 
 class BlockBreakToken;
-class NGPhysicalFragment;
+class PhysicalFragment;
 struct PhysicalFragmentLink;
 
 // The "simplified" layout algorithm will run in the following circumstances:
@@ -46,7 +46,7 @@
   // Perform a simple copy of all children of the old fragment.
   void CloneOldChildren();
 
-  void AppendNewChildFragment(const NGPhysicalFragment&, LogicalOffset);
+  void AppendNewChildFragment(const PhysicalFragment&, LogicalOffset);
 
   // Just create a new layout result based on the current builder state. To be
   // used after CloneOldChildren() / AppendNewChildFragment().
@@ -66,7 +66,7 @@
 
  private:
   void AddChildFragment(const PhysicalFragmentLink& old_fragment,
-                        const NGPhysicalFragment& new_fragment,
+                        const PhysicalFragment& new_fragment,
                         const MarginStrut* margin_strut = nullptr,
                         bool is_self_collapsing = false);
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.cc
index 86392fe..0ec2edc 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.cc
@@ -22,7 +22,7 @@
   DCHECK(previous_fragment.IsFragmentainerBox());
   DCHECK(params.space.HasKnownFragmentainerBlockSize());
 
-  container_builder_.SetBoxType(previous_fragment.BoxType());
+  container_builder_.SetBoxType(previous_fragment.GetBoxType());
   container_builder_.SetPageNameIfNeeded(previous_fragment.PageName());
   container_builder_.SetFragmentBlockSize(
       params.space.FragmentainerBlockSize());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.h
index f040b64..3c7f7046 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.h
@@ -19,7 +19,7 @@
 // This is more a copy-and-append algorithm than a layout algorithm.
 // This algorithm will only run when we are trying to add OOF-positioned
 // elements to an already laid out fragmentainer. It performs a copy of the
-// previous |NGPhysicalFragment| and appends the OOF-positioned elements to the
+// previous |PhysicalFragment| and appends the OOF-positioned elements to the
 // |container_builder_|.
 class CORE_EXPORT SimplifiedOofLayoutAlgorithm
     : public LayoutAlgorithm<BlockNode, BoxFragmentBuilder, BlockBreakToken> {
diff --git a/third_party/blink/renderer/core/paint/README.md b/third_party/blink/renderer/core/paint/README.md
index 0e06709..03ca58f 100644
--- a/third_party/blink/renderer/core/paint/README.md
+++ b/third_party/blink/renderer/core/paint/README.md
@@ -402,7 +402,7 @@
 
 ## Paint
 
-Within a PaintLayer, paint walks the NGPhysicalFragment tree in paint-order and
+Within a PaintLayer, paint walks the PhysicalFragment tree in paint-order and
 produces a list of display items. This is implemented using static painter
 classes (such as [`NGBoxFragmentPainter`](ng/ng_box_fragment_painter.cc)) and
 appends display items to a
diff --git a/third_party/blink/renderer/core/paint/box_decoration_data.h b/third_party/blink/renderer/core/paint/box_decoration_data.h
index eb76a55..530c3c0 100644
--- a/third_party/blink/renderer/core/paint/box_decoration_data.h
+++ b/third_party/blink/renderer/core/paint/box_decoration_data.h
@@ -30,7 +30,7 @@
                           layout_replaced.StyleRef().HasBorderDecoration()) {}
 
   BoxDecorationData(const PaintInfo& paint_info,
-                    const NGPhysicalFragment& fragment,
+                    const PhysicalFragment& fragment,
                     const ComputedStyle& style)
       : BoxDecorationData(
             paint_info,
@@ -39,7 +39,7 @@
             !fragment.HasCollapsedBorders() && style.HasBorderDecoration()) {}
 
   BoxDecorationData(const PaintInfo& paint_info,
-                    const NGPhysicalFragment& fragment)
+                    const PhysicalFragment& fragment)
       : BoxDecorationData(paint_info, fragment, fragment.Style()) {}
 
   BoxDecorationData BackgroundOnly() const {
diff --git a/third_party/blink/renderer/core/paint/box_model_object_painter.cc b/third_party/blink/renderer/core/paint/box_model_object_painter.cc
index 4e7dc68..fd55547 100644
--- a/third_party/blink/renderer/core/paint/box_model_object_painter.cc
+++ b/third_party/blink/renderer/core/paint/box_model_object_painter.cc
@@ -30,7 +30,7 @@
 }  // anonymous namespace
 
 BoxModelObjectPainter::BoxModelObjectPainter(const LayoutBoxModelObject& box)
-    : BoxPainterBase(&box.GetDocument(), box.StyleRef(), GetNode(box)),
+    : BoxPainterBase(box.GetDocument(), box.StyleRef(), GetNode(box)),
       box_model_(box) {}
 
 PhysicalRect BoxModelObjectPainter::AdjustRectForScrolledContent(
@@ -77,16 +77,11 @@
     const FillLayer& bg_layer,
     BackgroundBleedAvoidance bleed_avoidance,
     bool is_painting_background_in_contents_space) const {
-  const ComputedStyle& style = box_model_.StyleRef();
-  RespectImageOrientationEnum respect_orientation = style.ImageOrientation();
-  if (auto* style_image = bg_layer.GetImage()) {
-    respect_orientation =
-        style_image->ForceOrientationIfNecessary(respect_orientation);
-  }
   return BoxPainterBase::FillLayerInfo(
-      box_model_.GetDocument(), style, box_model_.IsScrollContainer(), color,
-      bg_layer, bleed_avoidance, respect_orientation, PhysicalBoxSides(),
-      box_model_.IsLayoutInline(), is_painting_background_in_contents_space);
+      box_model_.GetDocument(), box_model_.StyleRef(),
+      box_model_.IsScrollContainer(), color, bg_layer, bleed_avoidance,
+      PhysicalBoxSides(), box_model_.IsLayoutInline(),
+      is_painting_background_in_contents_space);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc
index 4683f078..8f4b8e4 100644
--- a/third_party/blink/renderer/core/paint/box_painter_base.cc
+++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
@@ -436,7 +436,7 @@
     // TODO(trchen): A fill layer cannot paint if the calculated tile size is
     // empty.  This occlusion check can be wrong.
     if (current_layer->ClipOccludesNextLayers() &&
-        current_layer->ImageOccludesNextLayers(*document_, style_)) {
+        current_layer->ImageOccludesNextLayers(document_, style_)) {
       if (current_layer->Clip() == EFillBox::kBorder)
         is_non_associative = false;
       break;
@@ -452,13 +452,12 @@
     Color bg_color,
     const FillLayer& layer,
     BackgroundBleedAvoidance bleed_avoidance,
-    RespectImageOrientationEnum respect_image_orientation,
     PhysicalBoxSides sides_to_include,
     bool is_inline,
     bool is_painting_background_in_contents_space)
     : image(layer.GetImage()),
       color(bg_color),
-      respect_image_orientation(respect_image_orientation),
+      respect_image_orientation(style.ImageOrientation()),
       sides_to_include(sides_to_include),
       is_bottom_layer(!layer.Next()),
       is_border_fill(layer.Clip() == EFillBox::kStrokeBox ||
@@ -506,6 +505,11 @@
   is_printing = doc.Printing();
 
   should_paint_image = image && image->CanRender();
+  if (should_paint_image) {
+    respect_image_orientation =
+        image->ForceOrientationIfNecessary(respect_image_orientation);
+  }
+
   bool composite_bgcolor_animation =
       RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled() &&
       style.HasCurrentBackgroundColorAnimation() &&
@@ -704,11 +708,11 @@
                          paint_timing_info, op, respect_orientation);
 }
 
-scoped_refptr<Image> GetBGColorPaintWorkletImage(const Document* document,
+scoped_refptr<Image> GetBGColorPaintWorkletImage(const Document& document,
                                                  Node* node,
                                                  const gfx::SizeF& image_size) {
   BackgroundColorPaintImageGenerator* generator =
-      GetBackgroundColorPaintImageGenerator(*document);
+      GetBackgroundColorPaintImageGenerator(document);
   // The generator can be null in testing environment.
   if (!generator)
     return nullptr;
@@ -723,7 +727,7 @@
 }
 
 // Returns true if the background color was painted by the paint worklet.
-bool PaintBGColorWithPaintWorklet(const Document* document,
+bool PaintBGColorWithPaintWorklet(const Document& document,
                                   const BoxPainterBase::FillLayerInfo& info,
                                   Node* node,
                                   const ComputedStyle& style,
@@ -837,7 +841,7 @@
   return true;
 }
 
-inline bool PaintFastBottomLayer(const Document* document,
+inline bool PaintFastBottomLayer(const Document& document,
                                  Node* node,
                                  const ComputedStyle& style,
                                  GraphicsContext& context,
@@ -926,7 +930,7 @@
       gfx::RectF(image->Rect()), gfx::RectF(image_border.Rect()));
 
   auto image_auto_dark_mode = ImageClassifierHelper::GetImageAutoDarkMode(
-      *document->GetFrame(), style, image_border.Rect(), src_rect);
+      *document.GetFrame(), style, image_border.Rect(), src_rect);
 
   Image::ImageClampingMode clamping_mode =
       Image::ImageClampingMode::kClampImageToSourceRect;
@@ -1036,7 +1040,7 @@
   return border;
 }
 
-void PaintFillLayerBackground(const Document* document,
+void PaintFillLayerBackground(const Document& document,
                               GraphicsContext& context,
                               const BoxPainterBase::FillLayerInfo& info,
                               Node* node,
@@ -1073,7 +1077,7 @@
         inspector_paint_image_event::Data, node, *info.image,
         gfx::RectF(image->Rect()), gfx::RectF(scrolled_paint_rect));
     DrawTiledBackground(
-        document->GetFrame(), context, style, *image, geometry, composite_op,
+        document.GetFrame(), context, style, *image, geometry, composite_op,
         info.respect_image_orientation,
         ComputeImagePaintTimingInfo(node, *image, *info.image, context,
                                     gfx::RectF(geometry.SnappedDestRect())));
@@ -1371,7 +1375,7 @@
 
   PaintFillLayers(paint_info, Color::kTransparent, style_.MaskLayers(),
                   paint_rect, geometry);
-  NinePieceImagePainter::Paint(paint_info.context, obj, *document_, node_,
+  NinePieceImagePainter::Paint(paint_info.context, obj, document_, node_,
                                paint_rect, style_, style_.MaskBoxImage(),
                                sides_to_include);
 }
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.h b/third_party/blink/renderer/core/paint/box_painter_base.h
index 2232189..a0e0ff49 100644
--- a/third_party/blink/renderer/core/paint/box_painter_base.h
+++ b/third_party/blink/renderer/core/paint/box_painter_base.h
@@ -40,7 +40,7 @@
   STACK_ALLOCATED();
 
  public:
-  BoxPainterBase(const Document* document,
+  BoxPainterBase(const Document& document,
                  const ComputedStyle& style,
                  Node* node)
       : document_(document), style_(style), node_(node) {}
@@ -118,7 +118,6 @@
                   Color bg_color,
                   const FillLayer&,
                   BackgroundBleedAvoidance,
-                  RespectImageOrientationEnum,
                   PhysicalBoxSides sides_to_include,
                   bool is_inline,
                   bool is_painting_background_in_contents_space);
@@ -178,7 +177,7 @@
  private:
   PhysicalBoxStrut ComputeSnappedBorders() const;
 
-  const Document* document_;
+  const Document& document_;
   const ComputedStyle& style_;
   Node* node_;
 };
diff --git a/third_party/blink/renderer/core/paint/ng/README.md b/third_party/blink/renderer/core/paint/ng/README.md
index c5fd83f..1b335d8 100644
--- a/third_party/blink/renderer/core/paint/ng/README.md
+++ b/third_party/blink/renderer/core/paint/ng/README.md
@@ -8,30 +8,30 @@
 
 ## NGPaintFragment ##
 
-LayoutNG produces a tree of [NGPhysicalFragment].
+LayoutNG produces a tree of [PhysicalFragment].
 
-One of its goals is to share a sub-tree of NGPhysicalFragment across frames,
+One of its goals is to share a sub-tree of PhysicalFragment across frames,
 or even within a frame where possible.
 This goal enforces a few characteristics:
 
 * It must be immutable.
 * It must be relative within the sub-tree, ideally only to its parent.
 
-A [NGPaintFragment] owns a NGPhysicalFragment by `scoped_refptr` in n:1 relation.
-For instance, NGPhysicalFragment can be shared across frames,
+A [NGPaintFragment] owns a PhysicalFragment by `scoped_refptr` in n:1 relation.
+For instance, PhysicalFragment can be shared across frames,
 but different NGPaintFragment instance can be created for each frame.
 
-It has following characteristics when compared to NGPhysicalFragment:
+It has following characteristics when compared to PhysicalFragment:
 
 * It can have mutable fields, such as `VisualRect()`.
 * It can use its own coordinate system.
-* Separate instances can be created when NGPhysicalFragment is shared.
-* It can have its own tree structure, differently from NGPhysicalFragment tree.
+* Separate instances can be created when PhysicalFragment is shared.
+* It can have its own tree structure, differently from PhysicalFragment tree.
 
 ### The tree structure ###
 
 In short, one can think that the NGPaintFragment tree structure is
-exactly the same as the NGPhysicalFragment tree structure.
+exactly the same as the PhysicalFragment tree structure.
 
 LayoutNG will be launched in phases. In the phase 1 implementation,
 only boxes with inline children are painted directly from fragments, and
@@ -59,7 +59,7 @@
 If the inline block has another inline block which LayoutNG can handle,
 another NGPaintFragment tree is created for the inner inline block.
 
-### NGPhysicalFragment traversal ###
+### PhysicalFragment traversal ###
 
 When possible (when sufficiently transitioned to LayoutNG), we'll paint and
 hit-test by traversing the physical fragment tree, rather than traversing the
@@ -79,5 +79,5 @@
 
 [LayoutNG]: ../../layout/ng/README.md
 [NGPaintFragment]: ng_paint_fragment.h
-[NGPhysicalFragment]: ../../layout/ng/ng_physical_fragment.h
+[PhysicalFragment]: ../../layout/ng/ng_physical_fragment.h
 [fragmentainer]: https://drafts.csswg.org/css-break/#fragmentation-container
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
index e40bd84..fa49ac40 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -69,7 +69,7 @@
   return layout_object->GetSelectionState() != SelectionState::kNone;
 }
 
-inline bool IsVisibleToPaint(const NGPhysicalFragment& fragment,
+inline bool IsVisibleToPaint(const PhysicalFragment& fragment,
                              const ComputedStyle& style) {
   if (fragment.IsHiddenForPaint())
     return false;
@@ -133,7 +133,7 @@
   return false;
 }
 
-inline bool IsVisibleToHitTest(const NGPhysicalFragment& fragment,
+inline bool IsVisibleToHitTest(const PhysicalFragment& fragment,
                                const HitTestRequest& request) {
   const ComputedStyle& style = fragment.Style();
   return IsVisibleToPaint(fragment, style) &&
@@ -815,7 +815,7 @@
   DCHECK(!box_fragment_.IsInlineFormattingContext());
   PaintInfo paint_info_for_descendants = paint_info.ForDescendants();
   for (const PhysicalFragmentLink& child : box_fragment_.Children()) {
-    const NGPhysicalFragment& child_fragment = *child;
+    const PhysicalFragment& child_fragment = *child;
     DCHECK(child_fragment.IsBox());
     if (child_fragment.HasSelfPaintingLayer() || child_fragment.IsFloating())
       continue;
@@ -829,7 +829,7 @@
     const PaintInfo& paint_info,
     const PaintInfo& paint_info_for_descendants,
     PhysicalOffset paint_offset) {
-  const NGPhysicalFragment& child_fragment = *child;
+  const PhysicalFragment& child_fragment = *child;
   DCHECK(child_fragment.IsBox());
   DCHECK(!child_fragment.HasSelfPaintingLayer());
   DCHECK(!child_fragment.IsFloating());
@@ -889,7 +889,7 @@
 }
 
 void NGBoxFragmentPainter::PaintFloatingChildren(
-    const NGPhysicalFragment& container,
+    const PhysicalFragment& container,
     const PaintInfo& paint_info) {
   DCHECK(container.HasFloatingDescendantsForPaint());
   const PaintInfo* local_paint_info = &paint_info;
@@ -904,7 +904,7 @@
   DCHECK(container.HasFloatingDescendantsForPaint());
 
   for (const PhysicalFragmentLink& child : container.Children()) {
-    const NGPhysicalFragment& child_fragment = *child;
+    const PhysicalFragment& child_fragment = *child;
     if (child_fragment.HasSelfPaintingLayer())
       continue;
 
@@ -1558,7 +1558,7 @@
 // It also paints the backgrounds of the `::first-line` line box. Other line
 // boxes don't have their own background.
 inline void NGBoxFragmentPainter::PaintLineBox(
-    const NGPhysicalFragment& line_box_fragment,
+    const PhysicalFragment& line_box_fragment,
     const DisplayItemClient& display_item_client,
     const FragmentItem& line_box_item,
     const PaintInfo& paint_info,
@@ -1882,16 +1882,10 @@
     BackgroundBleedAvoidance bleed_avoidance,
     bool is_painting_background_in_contents_space) const {
   const NGPhysicalBoxFragment& fragment = GetPhysicalFragment();
-  const ComputedStyle& style = fragment.Style();
-  RespectImageOrientationEnum respect_orientation = style.ImageOrientation();
-  if (auto* style_image = bg_layer.GetImage()) {
-    respect_orientation =
-        style_image->ForceOrientationIfNecessary(respect_orientation);
-  }
   return BoxPainterBase::FillLayerInfo(
-      fragment.GetLayoutObject()->GetDocument(), style,
+      fragment.GetLayoutObject()->GetDocument(), fragment.Style(),
       fragment.IsScrollContainer(), color, bg_layer, bleed_avoidance,
-      respect_orientation, box_fragment_.SidesToInclude(),
+      box_fragment_.SidesToInclude(),
       fragment.GetLayoutObject()->IsLayoutInline(),
       is_painting_background_in_contents_space);
 }
@@ -2086,7 +2080,7 @@
   if (!element)
     return false;
   const auto children = GetPhysicalFragment().Children();
-  auto it = base::ranges::find(children, element, &NGPhysicalFragment::GetNode);
+  auto it = base::ranges::find(children, element, &PhysicalFragment::GetNode);
   if (it == children.end())
     return false;
   return hit_test.AddNodeToResultWithContentOffset(
@@ -2495,7 +2489,7 @@
 
 bool NGBoxFragmentPainter::HitTestFloatingChildren(
     const HitTestContext& hit_test,
-    const NGPhysicalFragment& container,
+    const PhysicalFragment& container,
     const PhysicalOffset& accumulated_offset) {
   DCHECK_EQ(hit_test.phase, HitTestPhase::kFloat);
   DCHECK(container.HasFloatingDescendantsForPaint());
@@ -2514,7 +2508,7 @@
 
   auto children = container.Children();
   for (const PhysicalFragmentLink& child : base::Reversed(children)) {
-    const NGPhysicalFragment& child_fragment = *child.fragment;
+    const PhysicalFragment& child_fragment = *child.fragment;
     if (UNLIKELY(child_fragment.IsLayoutObjectDestroyedOrMoved()))
       continue;
     if (child_fragment.HasSelfPaintingLayer())
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
index 98a77683..00c425b6 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
@@ -28,7 +28,7 @@
 class InlineBackwardCursor;
 class InlineCursor;
 class NGInlineBoxFragmentPainter;
-class NGPhysicalFragment;
+class PhysicalFragment;
 class ScopedPaintState;
 struct PaintInfo;
 
@@ -151,7 +151,7 @@
   void PaintLineBoxChildItems(InlineCursor* children,
                               const PaintInfo&,
                               const PhysicalOffset& paint_offset);
-  void PaintLineBox(const NGPhysicalFragment& line_box_fragment,
+  void PaintLineBox(const PhysicalFragment& line_box_fragment,
                     const DisplayItemClient& display_item_client,
                     const FragmentItem& line_box_item,
                     const PaintInfo&,
@@ -174,7 +174,7 @@
                     const PhysicalOffset& paint_offset,
                     const PhysicalOffset& parent_offset);
   void PaintFloatingItems(const PaintInfo& paint_info, InlineCursor* cursor);
-  void PaintFloatingChildren(const NGPhysicalFragment&,
+  void PaintFloatingChildren(const PhysicalFragment&,
                              const PaintInfo& paint_info);
   void PaintFloats(const PaintInfo&);
   void PaintMask(const PaintInfo&, const PhysicalOffset& paint_offset);
@@ -253,7 +253,7 @@
                             const NGPhysicalBoxFragment& container,
                             const InlineCursor& children);
   bool HitTestFloatingChildren(const HitTestContext& hit_test,
-                               const NGPhysicalFragment& container,
+                               const PhysicalFragment& container,
                                const PhysicalOffset& accumulated_offset);
   bool HitTestFloatingChildItems(const HitTestContext& hit_test,
                                  const InlineCursor& children,
@@ -326,7 +326,7 @@
     const InlineCursor* inline_box_cursor,
     const FragmentItem* box_item,
     NGInlinePaintContext* inline_context)
-    : BoxPainterBase(&box.GetDocument(), box.Style(), box.GetNode()),
+    : BoxPainterBase(box.GetDocument(), box.Style(), box.GetNode()),
       box_fragment_(box),
       display_item_client_(display_item_client),
       items_(box.Items()),
diff --git a/third_party/blink/renderer/core/paint/ng/ng_frame_set_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_frame_set_painter.cc
index b7243fe..a4949624 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_frame_set_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_frame_set_painter.cc
@@ -48,7 +48,7 @@
     return;
 
   for (const PhysicalFragmentLink& link : box_fragment_.Children()) {
-    const NGPhysicalFragment& child_fragment = *link;
+    const PhysicalFragment& child_fragment = *link;
     if (child_fragment.HasSelfPaintingLayer())
       continue;
     if (To<NGPhysicalBoxFragment>(child_fragment).CanTraverse()) {
diff --git a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.cc
index 5fa4080..09858914 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.cc
@@ -199,7 +199,7 @@
     const PaintInfo& paint_info,
     const PhysicalOffset& paint_offset) {
   DCHECK_EQ(paint_info.phase, PaintPhase::kForeground);
-  DCHECK_EQ(inline_box_fragment_.Type(), NGPhysicalFragment::kFragmentLineBox);
+  DCHECK_EQ(inline_box_fragment_.Type(), PhysicalFragment::kFragmentLineBox);
   DCHECK(NeedsPaint(inline_box_fragment_));
   // |FragmentItem| uses the fragment id when painting the background of
   // line boxes. Please see |FragmentItem::kInitialLineFragmentId|.
@@ -549,10 +549,7 @@
   DCHECK(inline_box_cursor_);
   DCHECK_EQ(inline_box_cursor_->Current().Item(), &inline_box_item_);
 
-  DCHECK_EQ(inline_box_fragment_.Type(),
-            NGPhysicalFragment::NGFragmentType::kFragmentBox);
-  DCHECK_EQ(inline_box_fragment_.BoxType(),
-            NGPhysicalFragment::NGBoxType::kInlineBox);
+  DCHECK(inline_box_fragment_.IsInlineBox());
 }
 #endif
 
diff --git a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h
index 4786c21c..9a3d974 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h
+++ b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h
@@ -30,7 +30,7 @@
                                    LayoutUnit* total_width) const;
 
  protected:
-  NGInlineBoxFragmentPainterBase(const NGPhysicalFragment& inline_box_fragment,
+  NGInlineBoxFragmentPainterBase(const PhysicalFragment& inline_box_fragment,
                                  const InlineCursor* inline_box_cursor,
                                  const FragmentItem& inline_box_item,
                                  const LayoutObject& layout_object,
@@ -146,7 +146,7 @@
   // Style taking ::first-line into account.
   const ComputedStyle& line_style_;
 
-  const NGPhysicalFragment& inline_box_fragment_;
+  const PhysicalFragment& inline_box_fragment_;
   const FragmentItem& inline_box_item_;
   const InlineCursor* inline_box_cursor_ = nullptr;
   NGInlinePaintContext* inline_context_ = nullptr;
@@ -218,7 +218,7 @@
   STACK_ALLOCATED();
 
  public:
-  NGLineBoxFragmentPainter(const NGPhysicalFragment& line_box_fragment,
+  NGLineBoxFragmentPainter(const PhysicalFragment& line_box_fragment,
                            const FragmentItem& line_box_item,
                            const NGPhysicalBoxFragment& block_fragment)
       : NGLineBoxFragmentPainter(line_box_fragment,
@@ -226,9 +226,8 @@
                                  block_fragment,
                                  *block_fragment.GetLayoutObject()) {}
 
-  static bool NeedsPaint(const NGPhysicalFragment& line_fragment) {
-    DCHECK_EQ(line_fragment.Type(),
-              NGPhysicalFragment::NGFragmentType::kFragmentLineBox);
+  static bool NeedsPaint(const PhysicalFragment& line_fragment) {
+    DCHECK(line_fragment.IsLineBox());
     return line_fragment.UsesFirstLineStyle();
   }
 
@@ -238,7 +237,7 @@
                                    const PhysicalOffset& paint_offset);
 
  private:
-  NGLineBoxFragmentPainter(const NGPhysicalFragment& line_box_fragment,
+  NGLineBoxFragmentPainter(const PhysicalFragment& line_box_fragment,
                            const FragmentItem& line_box_item,
                            const NGPhysicalBoxFragment& block_fragment,
                            const LayoutObject& layout_block_flow)
@@ -255,8 +254,7 @@
             layout_block_flow.FirstLineStyleRef(),
             /* inline_context */ nullptr),
         block_fragment_(block_fragment) {
-    DCHECK_EQ(line_box_fragment.Type(),
-              NGPhysicalFragment::NGFragmentType::kFragmentLineBox);
+    DCHECK(line_box_fragment.IsLineBox());
     DCHECK(NeedsPaint(line_box_fragment));
     DCHECK(layout_block_flow.IsLayoutNGObject());
   }
diff --git a/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc b/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc
index 33d65a4..874d5c0 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc
@@ -468,7 +468,7 @@
 
 namespace {
 
-const NGPhysicalFragment* StartSection(const NGPhysicalBoxFragment& table) {
+const PhysicalFragment* StartSection(const NGPhysicalBoxFragment& table) {
   for (const auto& child : table.Children()) {
     if (!child->IsTableSection()) {
       continue;
@@ -478,7 +478,7 @@
   return nullptr;
 }
 
-const NGPhysicalFragment* EndSection(const NGPhysicalBoxFragment& table) {
+const PhysicalFragment* EndSection(const NGPhysicalBoxFragment& table) {
   const auto children = table.Children();
   for (auto it = children.rbegin(); it != children.rend(); ++it) {
     const auto& child = *it;
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h
index ae500035..8911d68b 100644
--- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h
+++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h
@@ -19,7 +19,7 @@
 class LayoutObject;
 class LocalFrameView;
 class NGPhysicalBoxFragment;
-class NGPhysicalFragment;
+class PhysicalFragment;
 struct PhysicalFragmentLink;
 
 // This class walks the whole layout tree, beginning from the root
@@ -240,7 +240,7 @@
 
   // List of fragments that may be missed during LayoutObject walking. See
   // CollectMissableChildren() and WalkMissedChildren().
-  HeapHashSet<Member<const NGPhysicalFragment>> pending_missables_;
+  HeapHashSet<Member<const PhysicalFragment>> pending_missables_;
 
   bool needs_invalidate_chrome_client_and_intersection_ = false;
 
diff --git a/third_party/blink/renderer/modules/handwriting/handwriting_type_converters.cc b/third_party/blink/renderer/modules/handwriting/handwriting_type_converters.cc
index 876a85b1..0b46337b 100644
--- a/third_party/blink/renderer/modules/handwriting/handwriting_type_converters.cc
+++ b/third_party/blink/renderer/modules/handwriting/handwriting_type_converters.cc
@@ -53,9 +53,8 @@
     return nullptr;
   }
   auto output = handwriting::mojom::blink::HandwritingStroke::New();
-  for (const auto& point : input->getPoints()) {
-    output->points.push_back(mojo::ConvertTo<HandwritingPointPtr>(point));
-  }
+  output->points =
+      mojo::ConvertTo<Vector<HandwritingPointPtr>>(input->getPoints());
   return output;
 }
 
diff --git a/third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.cc b/third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.cc
index 0ae67400..d23e431 100644
--- a/third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.cc
+++ b/third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.cc
@@ -17,21 +17,6 @@
 
 namespace mojo {
 
-template <>
-struct TypeConverter<Vector<Vector<uint8_t>>,
-                     blink::HeapVector<blink::Member<
-                         blink::V8UnionArrayBufferOrArrayBufferView>>> {
-  static Vector<Vector<uint8_t>> Convert(
-      const blink::HeapVector<
-          blink::Member<blink::V8UnionArrayBufferOrArrayBufferView>>& input) {
-    Vector<Vector<uint8_t>> result;
-    for (const auto& item : input) {
-      result.push_back(mojo::ConvertTo<Vector<uint8_t>>(item.Get()));
-    }
-    return result;
-  }
-};
-
 payments::mojom::blink::SecurePaymentConfirmationRequestPtr
 TypeConverter<payments::mojom::blink::SecurePaymentConfirmationRequestPtr,
               blink::SecurePaymentConfirmationRequest*>::
diff --git a/third_party/blink/renderer/modules/printing/BUILD.gn b/third_party/blink/renderer/modules/printing/BUILD.gn
index f42f6be..83ca2f3d6 100644
--- a/third_party/blink/renderer/modules/printing/BUILD.gn
+++ b/third_party/blink/renderer/modules/printing/BUILD.gn
@@ -12,6 +12,8 @@
     "web_printer.h",
     "web_printing_manager.cc",
     "web_printing_manager.h",
+    "web_printing_type_converters.cc",
+    "web_printing_type_converters.h",
   ]
   deps = [ "//printing/buildflags" ]
 }
diff --git a/third_party/blink/renderer/modules/printing/OWNERS b/third_party/blink/renderer/modules/printing/OWNERS
index 3dfbd9c..08aabc2 100644
--- a/third_party/blink/renderer/modules/printing/OWNERS
+++ b/third_party/blink/renderer/modules/printing/OWNERS
@@ -1 +1,4 @@
 file://chrome/browser/printing/web_api/OWNERS
+
+per-file *_type_converter*.*=set noparent
+per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/renderer/modules/printing/web_print_job.cc b/third_party/blink/renderer/modules/printing/web_print_job.cc
index fca2df99..18fe8e24 100644
--- a/third_party/blink/renderer/modules/printing/web_print_job.cc
+++ b/third_party/blink/renderer/modules/printing/web_print_job.cc
@@ -5,17 +5,19 @@
 #include "third_party/blink/renderer/modules/printing/web_print_job.h"
 
 #include "base/notreached.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_attributes.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 
 namespace blink {
 
 WebPrintJob::WebPrintJob(ExecutionContext* execution_context) {
-  NOTIMPLEMENTED();
+  NOTIMPLEMENTED_LOG_ONCE();
 }
 
 WebPrintJob::~WebPrintJob() = default;
 
 void WebPrintJob::Trace(Visitor* visitor) const {
+  visitor->Trace(attributes_);
   ScriptWrappable::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/modules/printing/web_print_job.h b/third_party/blink/renderer/modules/printing/web_print_job.h
index 73e4d724..1bec3a8 100644
--- a/third_party/blink/renderer/modules/printing/web_print_job.h
+++ b/third_party/blink/renderer/modules/printing/web_print_job.h
@@ -7,10 +7,12 @@
 
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/member.h"
 
 namespace blink {
 
 class ExecutionContext;
+class WebPrintJobAttributes;
 
 class MODULES_EXPORT WebPrintJob : public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
@@ -19,7 +21,12 @@
   explicit WebPrintJob(ExecutionContext* execution_context);
   ~WebPrintJob() override;
 
+  WebPrintJobAttributes* attributes() const { return attributes_; }
+
   void Trace(Visitor* visitor) const override;
+
+ private:
+  Member<WebPrintJobAttributes> attributes_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/printing/web_print_job.idl b/third_party/blink/renderer/modules/printing/web_print_job.idl
index 7a48464..982d505 100644
--- a/third_party/blink/renderer/modules/printing/web_print_job.idl
+++ b/third_party/blink/renderer/modules/printing/web_print_job.idl
@@ -2,6 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+enum WebPrintJobState {
+  "pending",
+  "processing",
+  "completed",
+  "canceled",
+  "aborted"
+};
+
+dictionary WebPrintJobAttributes {
+  DOMString jobName;
+  WebPrintJobState jobState;
+};
+
 [
   Exposed=Window,
   RuntimeEnabled=WebPrinting,
@@ -9,5 +22,7 @@
   IsolatedContext
 ]
 interface WebPrintJob {
+  WebPrintJobAttributes attributes();
+
   // TODO(b/302505962): Add remaining methods.
 };
diff --git a/third_party/blink/renderer/modules/printing/web_printer.cc b/third_party/blink/renderer/modules/printing/web_printer.cc
index 5cf7697..21aff418 100644
--- a/third_party/blink/renderer/modules/printing/web_printer.cc
+++ b/third_party/blink/renderer/modules/printing/web_printer.cc
@@ -5,10 +5,13 @@
 #include "third_party/blink/renderer/modules/printing/web_printer.h"
 
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_web_print_document_description.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_template_attributes.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_web_printer_attributes.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/modules/printing/web_printing_type_converters.h"
+#include "third_party/blink/renderer/platform/bindings/exception_code.h"
 
 namespace blink {
 
@@ -24,15 +27,52 @@
 WebPrinter::~WebPrinter() = default;
 
 void WebPrinter::Trace(Visitor* visitor) const {
-  visitor->Trace(printer_);
   visitor->Trace(attributes_);
+  visitor->Trace(fetch_attributes_resolver_);
+  visitor->Trace(printer_);
   ScriptWrappable::Trace(visitor);
 }
 
 ScriptPromise WebPrinter::fetchAttributes(ScriptState* script_state,
                                           ExceptionState& exception_state) {
-  // TODO(b/302505962): Implement this.
-  return ScriptPromise();
+  if (!script_state->ContextIsValid()) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError,
+                                      "Context has shut down.");
+    return ScriptPromise();
+  }
+
+  if (fetch_attributes_resolver_) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kInvalidStateError,
+        "A call to fetchAttributes() is already in progress.");
+    return ScriptPromise();
+  }
+
+  fetch_attributes_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(
+      script_state, exception_state.GetContext());
+  printer_->FetchAttributes(
+      fetch_attributes_resolver_->WrapCallbackInScriptScope(
+          WTF::BindOnce(&WebPrinter::OnFetchAttributes, WrapPersistent(this))));
+  return fetch_attributes_resolver_->Promise();
+}
+
+void WebPrinter::OnFetchAttributes(
+    ScriptPromiseResolver*,
+    mojom::blink::WebPrinterAttributesPtr printer_attributes) {
+  if (!printer_attributes) {
+    fetch_attributes_resolver_->RejectWithDOMException(
+        DOMExceptionCode::kNetworkError, "Unable to fetch printer attributes.");
+    fetch_attributes_resolver_ = nullptr;
+    return;
+  }
+
+  auto* new_attributes =
+      mojo::ConvertTo<WebPrinterAttributes*>(printer_attributes);
+  new_attributes->setPrinterName(attributes_->printerName());
+  attributes_ = new_attributes;
+
+  fetch_attributes_resolver_->Resolve(attributes_);
+  fetch_attributes_resolver_ = nullptr;
 }
 
 ScriptPromise WebPrinter::printJob(
diff --git a/third_party/blink/renderer/modules/printing/web_printer.h b/third_party/blink/renderer/modules/printing/web_printer.h
index 23550e0..9cf39cadc 100644
--- a/third_party/blink/renderer/modules/printing/web_printer.h
+++ b/third_party/blink/renderer/modules/printing/web_printer.h
@@ -16,6 +16,7 @@
 class ExceptionState;
 class ExecutionContext;
 class ScriptPromise;
+class ScriptPromiseResolver;
 class WebPrintDocumentDescription;
 class WebPrintJobTemplateAttributes;
 class WebPrinterAttributes;
@@ -40,7 +41,11 @@
   void Trace(Visitor* visitor) const override;
 
  private:
+  void OnFetchAttributes(ScriptPromiseResolver*,
+                         mojom::blink::WebPrinterAttributesPtr new_attributes);
+
   Member<WebPrinterAttributes> attributes_;
+  Member<ScriptPromiseResolver> fetch_attributes_resolver_;
   HeapMojoRemote<mojom::blink::WebPrinter> printer_;
 };
 
diff --git a/third_party/blink/renderer/modules/printing/web_printing_type_converters.cc b/third_party/blink/renderer/modules/printing/web_printing_type_converters.cc
new file mode 100644
index 0000000..012114f0
--- /dev/null
+++ b/third_party/blink/renderer/modules/printing/web_printing_type_converters.cc
@@ -0,0 +1,126 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/printing/web_printing_type_converters.h"
+
+#include "third_party/blink/public/mojom/printing/web_printing.mojom-blink.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_web_printer_attributes.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_mime_media_type.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_multiple_document_handling.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_range.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_sides.h"
+
+namespace {
+// sides:
+using V8Sides = blink::V8WebPrintingSides;
+using MojomSides = blink::mojom::blink::WebPrintingSides;
+
+// multiple-document-handling:
+using V8MultipleDocumentHandling = blink::V8WebPrintingMultipleDocumentHandling;
+using MojomMultipleDocumentHandling =
+    blink::mojom::blink::WebPrintingMultipleDocumentHandling;
+}  // namespace
+
+namespace mojo {
+
+template <>
+struct TypeConverter<V8Sides, MojomSides> {
+  static V8Sides Convert(const MojomSides& sides) {
+    switch (sides) {
+      case MojomSides::kOneSided:
+        return V8Sides(V8Sides::Enum::kOneSided);
+      case MojomSides::kTwoSidedShortEdge:
+        return V8Sides(V8Sides::Enum::kTwoSidedShortEdge);
+      case MojomSides::kTwoSidedLongEdge:
+        return V8Sides(V8Sides::Enum::kTwoSidedLongEdge);
+    }
+  }
+};
+
+template <>
+struct TypeConverter<V8MultipleDocumentHandling,
+                     MojomMultipleDocumentHandling> {
+  static V8MultipleDocumentHandling Convert(
+      const MojomMultipleDocumentHandling& mdh) {
+    switch (mdh) {
+      case MojomMultipleDocumentHandling::kSeparateDocumentsCollatedCopies:
+        return V8MultipleDocumentHandling(
+            V8MultipleDocumentHandling::Enum::kSeparateDocumentsCollatedCopies);
+      case MojomMultipleDocumentHandling::kSeparateDocumentsUncollatedCopies:
+        return V8MultipleDocumentHandling(
+            V8MultipleDocumentHandling::Enum::
+                kSeparateDocumentsUncollatedCopies);
+    }
+  }
+};
+
+}  // namespace mojo
+
+namespace blink {
+
+namespace {
+
+void ProcessCopies(const mojom::blink::WebPrinterAttributes& new_attributes,
+                   WebPrinterAttributes* current_attributes) {
+  current_attributes->setCopiesDefault(new_attributes.copies_default);
+  auto* copies_range = WebPrintingRange::Create();
+  copies_range->setFrom(new_attributes.copies_supported->from);
+  copies_range->setTo(new_attributes.copies_supported->to);
+  current_attributes->setCopiesSupported(copies_range);
+}
+
+void ProcessDocumentFormat(
+    const mojom::blink::WebPrinterAttributes& new_attributes,
+    WebPrinterAttributes* current_attributes) {
+  current_attributes->setDocumentFormatDefault(
+      V8WebPrintingMimeMediaType::Enum::kApplicationPdf);
+  current_attributes->setDocumentFormatSupported({V8WebPrintingMimeMediaType(
+      V8WebPrintingMimeMediaType::Enum::kApplicationPdf)});
+}
+
+void ProcessMultipleDocumentHandling(
+    const mojom::blink::WebPrinterAttributes& new_attributes,
+    WebPrinterAttributes* current_attributes) {
+  current_attributes->setMultipleDocumentHandlingDefault(
+      mojo::ConvertTo<V8MultipleDocumentHandling>(
+          new_attributes.multiple_document_handling_default));
+  current_attributes->setMultipleDocumentHandlingSupported(
+      mojo::ConvertTo<Vector<V8MultipleDocumentHandling>>(
+          new_attributes.multiple_document_handling_supported));
+}
+
+void ProcessSides(const mojom::blink::WebPrinterAttributes& new_attributes,
+                  WebPrinterAttributes* current_attributes) {
+  if (new_attributes.sides_default) {
+    current_attributes->setSidesDefault(
+        mojo::ConvertTo<V8Sides>(*new_attributes.sides_default));
+  }
+  if (!new_attributes.sides_supported.empty()) {
+    current_attributes->setSidesSupported(
+        mojo::ConvertTo<Vector<V8Sides>>(new_attributes.sides_supported));
+  }
+}
+
+}  // namespace
+
+}  // namespace blink
+
+namespace mojo {
+
+blink::WebPrinterAttributes*
+TypeConverter<blink::WebPrinterAttributes*,
+              blink::mojom::blink::WebPrinterAttributesPtr>::
+    Convert(const blink::mojom::blink::WebPrinterAttributesPtr&
+                printer_attributes) {
+  auto* attributes = blink::WebPrinterAttributes::Create();
+
+  blink::ProcessCopies(*printer_attributes, attributes);
+  blink::ProcessDocumentFormat(*printer_attributes, attributes);
+  blink::ProcessMultipleDocumentHandling(*printer_attributes, attributes);
+  blink::ProcessSides(*printer_attributes, attributes);
+
+  return attributes;
+}
+
+}  // namespace mojo
diff --git a/third_party/blink/renderer/modules/printing/web_printing_type_converters.h b/third_party/blink/renderer/modules/printing/web_printing_type_converters.h
new file mode 100644
index 0000000..6aac7365
--- /dev/null
+++ b/third_party/blink/renderer/modules/printing/web_printing_type_converters.h
@@ -0,0 +1,26 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PRINTING_WEB_PRINTING_TYPE_CONVERTERS_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_PRINTING_WEB_PRINTING_TYPE_CONVERTERS_H_
+
+#include "mojo/public/cpp/bindings/type_converter.h"
+#include "third_party/blink/public/mojom/printing/web_printing.mojom-blink-forward.h"
+
+namespace blink {
+class WebPrinterAttributes;
+}  // namespace blink
+
+namespace mojo {
+
+template <>
+struct TypeConverter<blink::WebPrinterAttributes*,
+                     blink::mojom::blink::WebPrinterAttributesPtr> {
+  static blink::WebPrinterAttributes* Convert(
+      const blink::mojom::blink::WebPrinterAttributesPtr&);
+};
+
+}  // namespace mojo
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_PRINTING_WEB_PRINTING_TYPE_CONVERTERS_H_
diff --git a/third_party/blink/renderer/modules/webcodecs/array_buffer_util.cc b/third_party/blink/renderer/modules/webcodecs/array_buffer_util.cc
index 3f15e39..0505a38 100644
--- a/third_party/blink/renderer/modules/webcodecs/array_buffer_util.cc
+++ b/third_party/blink/renderer/modules/webcodecs/array_buffer_util.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/renderer/modules/webcodecs/array_buffer_util.h"
 
-#include "third_party/blink/renderer/platform/wtf/hash_set.h"
+#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
 
 namespace blink {
 
@@ -45,7 +45,7 @@
     v8::Isolate* isolate) {
   // Before transferring anything, we check that all the arraybuffers in the
   // list are transferable and there are no duplicates.
-  WTF::HashSet<Member<DOMArrayBuffer>> seen_buffers;
+  HeapHashSet<Member<DOMArrayBuffer>> seen_buffers;
   for (const Member<DOMArrayBuffer>& array_buffer : transfer_list) {
     if (!array_buffer) {
       continue;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.cc b/third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.cc
index f1c5dc1..c14e784 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.cc
@@ -38,7 +38,8 @@
   dawn_desc.compute.constantCount = computeStage->constantCount;
   dawn_desc.compute.constants = computeStage->constants.get();
   dawn_desc.compute.module = programmable_stage_desc->module()->GetHandle();
-  dawn_desc.compute.entryPoint = computeStage->entry_point.c_str();
+  dawn_desc.compute.entryPoint =
+      computeStage->entry_point ? computeStage->entry_point->c_str() : nullptr;
 
   return dawn_desc;
 }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.cc b/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.cc
index 2c34b73b..554a9c6b 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.cc
@@ -15,9 +15,11 @@
   DCHECK(descriptor);
   DCHECK(dawn_programmable_stage);
 
-  dawn_programmable_stage->entry_point =
-      UTF8StringFromUSVStringWithNullReplacedByReplacementCodePoint(
-          descriptor->entryPoint());
+  if (descriptor->hasEntryPoint()) {
+    dawn_programmable_stage->entry_point =
+        UTF8StringFromUSVStringWithNullReplacedByReplacementCodePoint(
+            descriptor->entryPoint());
+  }
 
   if (!descriptor->hasConstants()) {
     return;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.h b/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.h
index 0ff8080..4182fab 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.h
@@ -7,6 +7,7 @@
 
 #include <dawn/webgpu.h>
 #include <memory>
+#include <optional>
 #include <string>
 
 namespace blink {
@@ -24,7 +25,7 @@
       delete;
   OwnedProgrammableStage& operator=(OwnedProgrammableStage&& desc) = delete;
 
-  std::string entry_point;
+  std::optional<std::string> entry_point;
   std::unique_ptr<std::string[]> constantKeys;
   std::unique_ptr<WGPUConstantEntry[]> constants;
   uint32_t constantCount = 0;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.idl b/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.idl
index 8fc2e966..b2f34fe 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.idl
@@ -6,7 +6,7 @@
 
 dictionary GPUProgrammableStage {
     required GPUShaderModule module;
-    required USVString entryPoint;
+    USVString entryPoint;
 
     // Should have a default of {}, but Blink doesn't seem to support that yet.
     record<USVString, GPUPipelineConstantValue> constants;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc b/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc
index 335f182..e22cade 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc
@@ -246,7 +246,8 @@
   dawn_vertex->dawn_desc->constantCount = dawn_vertex->constantCount;
   dawn_vertex->dawn_desc->constants = dawn_vertex->constants.get();
   dawn_vertex->dawn_desc->module = descriptor->module()->GetHandle();
-  dawn_vertex->dawn_desc->entryPoint = dawn_vertex->entry_point.c_str();
+  dawn_vertex->dawn_desc->entryPoint =
+      dawn_vertex->entry_point ? dawn_vertex->entry_point->c_str() : nullptr;
 
   if (descriptor->hasBuffers()) {
     AsDawnVertexBufferLayouts(device, descriptor, dawn_vertex);
@@ -279,7 +280,9 @@
   dawn_fragment->dawn_desc.constantCount = dawn_fragment->constantCount;
   dawn_fragment->dawn_desc.constants = dawn_fragment->constants.get();
   dawn_fragment->dawn_desc.module = descriptor->module()->GetHandle();
-  dawn_fragment->dawn_desc.entryPoint = dawn_fragment->entry_point.c_str();
+  dawn_fragment->dawn_desc.entryPoint =
+      dawn_fragment->entry_point ? dawn_fragment->entry_point->c_str()
+                                 : nullptr;
 
   dawn_fragment->dawn_desc.targets = nullptr;
   dawn_fragment->dawn_desc.targetCount = descriptor->targets().size();
diff --git a/third_party/blink/renderer/platform/bindings/dom_data_store.h b/third_party/blink/renderer/platform/bindings/dom_data_store.h
index 680e73ac..12c281e 100644
--- a/third_party/blink/renderer/platform/bindings/dom_data_store.h
+++ b/third_party/blink/renderer/platform/bindings/dom_data_store.h
@@ -164,7 +164,7 @@
       return object->SetReturnValue(return_value);
     auto it = wrapper_map_.find(object);
     if (it != wrapper_map_.end()) {
-      return_value.Set(it->value);
+      return_value.SetNonEmpty(it->value);
       return true;
     }
     return false;
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable.h b/third_party/blink/renderer/platform/bindings/script_wrappable.h
index 3e44c89..b5ff24b 100644
--- a/third_party/blink/renderer/platform/bindings/script_wrappable.h
+++ b/third_party/blink/renderer/platform/bindings/script_wrappable.h
@@ -201,16 +201,20 @@
   }
 
   bool SetReturnValue(v8::ReturnValue<v8::Value> return_value) {
-    return_value.Set(main_world_wrapper_);
-    return ContainsWrapper();
+    const bool contains_wrapper = ContainsWrapper();
+    if (contains_wrapper) {
+      return_value.SetNonEmpty(main_world_wrapper_);
+    }
+    return contains_wrapper;
   }
 
-  bool ContainsWrapper() const { return !main_world_wrapper_.IsEmpty(); }
 
  protected:
   ScriptWrappable() = default;
 
  private:
+  bool ContainsWrapper() const { return !main_world_wrapper_.IsEmpty(); }
+
   v8::Local<v8::Object> MainWorldWrapper(v8::Isolate* isolate) const {
     return main_world_wrapper_.Get(isolate);
   }
diff --git a/third_party/blink/renderer/platform/bindings/v8_set_return_value.h b/third_party/blink/renderer/platform/bindings/v8_set_return_value.h
index 8f21dbb6d..35c600e 100644
--- a/third_party/blink/renderer/platform/bindings/v8_set_return_value.h
+++ b/third_party/blink/renderer/platform/bindings/v8_set_return_value.h
@@ -70,7 +70,7 @@
              .ToLocal(&wrapper)) {
       return;
     }
-    info.GetReturnValue().Set(wrapper);
+    info.GetReturnValue().SetNonEmpty(wrapper);
   }
 };
 
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result_test.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result_test.cc
index 4d41a32..05b7ee0 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/shape_result_test.cc
+++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result_test.cc
@@ -402,7 +402,7 @@
     {u"012345678901234567890123456789",
      TextDirection::kLtr,
      {0, 1, 4, 5, 12, 18, 30, 32},
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
      {0, 6.738, 26.953, 33.691, 80.859, 121.289, 202.148, 0},
 #else
      {0, 7, 28, 35, 84, 126, 210, 0},
@@ -414,7 +414,7 @@
     {u"012345678901234567890123456789",  // 1
      TextDirection::kRtl,
      {0, 1, 4, 5, 12, 18, 30, 32},
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
      {202.148, 195.410, 175.195, 168.457, 121.289, 80.859, 0, 0},
 #else
      {210, 203, 182, 175, 126, 84, 0, 0},
@@ -426,7 +426,7 @@
     {u"0ff1ff23fff456ffff7890fffff12345ffffff6789",
      TextDirection::kLtr,
      {0, 1, 4, 5, 12, 18, 42, 43},
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
      {0, 6.738, 21.809, 25.975, 62.85, 92.994, 226.418, 0},
 #else
      {0, 7, 22, 26, 63, 93, 228, 0},
@@ -438,7 +438,7 @@
     {u"0ff1ff23fff456ffff7890fffff12345ffffff6789",
      TextDirection::kRtl,
      {0, 1, 4, 5, 12, 18, 42, 43},
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
      {226.418, 219.680, 204.609, 200.443, 163.564, 133.424, 0, 0},
 #else
      {228, 221, 206, 202, 165, 135, 0, 0},
@@ -450,7 +450,7 @@
     {u"مَ1مَمَ2مَمَمَ3مَمَمَمَ4مَمَمَمَمَ5مَمَمَمَمَمَ",
      TextDirection::kLtr,
      {0, 1, 2, 3, 4, 5, 10, 15, 20, 30, 47},
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
      {0, 0, 5.865, 12.727, 12.727, 19.061, 37.723, 55.008, 66.299, 99.832,
       148.746},
 #elif BUILDFLAG(IS_WIN)
@@ -465,7 +465,7 @@
     {u"مَ1مَمَ2مَمَمَ3مَمَمَمَ4مَمَمَمَمَ5مَمَمَمَمَمَ",
      TextDirection::kLtr,
      {0, 1, 2, 3, 4, 5, 10, 15, 20, 30, 47},
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
      {0, 5.865, 5.865, 12.727, 19.061, 19.061, 37.723, 55.008, 71.256, 99.832,
       148.746},
 #elif BUILDFLAG(IS_WIN)
@@ -480,7 +480,7 @@
     {u"مَ1مَمَ2مَمَمَ3مَمَمَمَ4مَمَمَمَمَ5مَمَمَمَمَمَ",
      TextDirection::kRtl,
      {0, 1, 2, 3, 4, 5, 10, 15, 20, 30, 47},
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
      {148.746, 148.746, 142.881, 136.02, 136.02, 130.553, 111.891, 93.738,
       83.315, 49.781, 0},
 #elif BUILDFLAG(IS_WIN)
@@ -495,7 +495,7 @@
     {u"مَ1مَمَ2مَمَمَ3مَمَمَمَ4مَمَمَمَمَ5مَمَمَمَمَمَ",
      TextDirection::kRtl,
      {0, 1, 2, 3, 4, 5, 10, 15, 20, 30, 47},
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
      {148.746, 142.881, 142.881, 136.02, 130.553, 130.553, 111.891, 93.738,
       78.357, 49.781, 0},
 #elif BUILDFLAG(IS_WIN)
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index b9490d4..9d2ea727 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1539,14 +1539,11 @@
 crbug.com/1488371 virtual/deprecate-unload/http/tests/history/history-replace-updates-current-item.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/navigation/image-load-in-subframe-unload-handler.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/navigation/image-load-in-unload-handler.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-cross-origin.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-same-origin.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/notifications/close-on-document-unload.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/notifications/notification-creation-detached-context.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/notifications/request-permission-detached-context.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/xmlhttprequest/frame-load-cancelled-abort.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/http/tests/xmlhttprequest/frame-unload-abort-crash.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/external/wpt/document-picture-in-picture/clears-session-on-close.https.html [ Failure Skip Timeout ]
+crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/browsers/browsing-the-web/back-forward-cache/events.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/browsers/browsing-the-web/unloading-documents/001.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/browsers/browsing-the-web/unloading-documents/002.html [ Failure Skip Timeout ]
@@ -1573,7 +1570,6 @@
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/navigation-api/navigation-methods/return-value/navigate-unload.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/navigation-api/navigation-methods/return-value/reload-rejection-order-unload-unserializablestate.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/navigation-api/navigation-methods/return-value/reload-unload.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/external/wpt/navigation-timing/nested-unload-timing.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/permissions-policy/experimental-features/unload-allowed-by-default.tentative.window.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.html [ Failure Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/screen-details/getScreenDetails.tentative.https.window.html [ Timeout ]
@@ -1589,9 +1585,14 @@
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/fetch/api/cors/cors-keepalive.any.html [ Skip Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/fetch/api/redirect/redirect-keepalive.any.html [ Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/fetch/metadata/unload.https.sub.html [ Timeout ]
+# Also tests timing, so cannot be moved to pagehide.
+crbug.com/1488371 virtual/deprecate-unload/external/wpt/navigation-timing/nested-unload-timing.html [ Failure ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/navigation/targeted-navigation-in-unload-handler.html [ Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Skip Timeout ]
 
+# Pagehide is not appropriate as the test checks if PiP window is functional until the very end of the page's lifecycle:
+crbug.com/1488371 virtual/deprecate-unload/external/wpt/document-picture-in-picture/clears-session-on-close.https.html [ Timeout ]
+
 ######## End Unload Deprecation
 
 ### sheriff 2019-07-16
@@ -2697,6 +2698,8 @@
 crbug.com/626703 [ Mac ] virtual/webcodecs-without-task-runner-with-custom-deleter/external/wpt/webcodecs/videoDecoder-codec-specific.https.any.worker.html?h265_hevc [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Win10.20h2 ] external/wpt/pointerevents/pointerevent_after_target_appended.html?mouse [ Timeout ]
+crbug.com/626703 [ Mac12 ] external/wpt/pointerevents/pointerevent_after_target_appended.html?mouse [ Timeout ]
 crbug.com/626703 external/wpt/css/css-nesting/has-nesting.html [ Failure ]
 crbug.com/626703 external/wpt/png/apng/acTL-plays-one.html [ Failure ]
 crbug.com/626703 external/wpt/png/apng/fcTL-blend-source-nearly-transparent.html [ Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 26229c07..45c48d6 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -2676,8 +2676,6 @@
       "http/tests/navigation/image-css-load-in-subframe-unload-handler.html",
       "http/tests/navigation/image-load-in-subframe-unload-handler.html",
       "http/tests/navigation/image-load-in-unload-handler.html",
-      "http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-cross-origin.html",
-      "http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-same-origin.html",
       "http/tests/navigation/redirect-on-back-updates-history-item.html",
       "http/tests/navigation/redirect-on-reload-updates-history-item.html",
       "http/tests/navigation/targeted-navigation-in-unload-handler.html",
@@ -2690,7 +2688,6 @@
       "http/tests/security/window-events-pass.html",
       "http/tests/sendbeacon/beacon-detached-no-crash.html",
       "http/tests/xmlhttprequest/frame-load-cancelled-abort.html",
-      "http/tests/xmlhttprequest/frame-unload-abort-crash.html",
       "external/wpt/battery-status/no-leak-on-detached-use.https.html",
       "external/wpt/document-picture-in-picture/clears-session-on-close.https.html",
       "external/wpt/fetch/api/basic/keepalive.any.js",
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index e65d264..ea491e2 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -5045,6 +5045,13 @@
        {}
       ]
      ],
+     "delete-from-after-empty-table-header-grouped-element.html": [
+      "e6ad4fa9e36c8d6b70d08294d772ba32e3d84d40",
+      [
+       null,
+       {}
+      ]
+     ],
      "delete-immediately-after-changing-input-type-from-time.html": [
       "e608b8c86612d73f731d3127127e768328c7644c",
       [
@@ -554026,7 +554033,7 @@
         ]
        ],
        "document-base-url-window-initiator-is-not-opener.https.window.js": [
-        "ca3028d9cc3214a8110808f18cc7b76471cc2449",
+        "a8519b5d1b6d3f39f7642e0e21a0955d69821ecd",
         [
          "html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.html",
          {}
@@ -649095,7 +649102,7 @@
      ]
     ],
     "full-cycle-test.https.any.js": [
-     "b7d5f7ea658fb6440ac253b9276110f97640131d",
+     "d8b23f9a88f48ef212acc4ff815a74dd0f11ed70",
      [
       "webcodecs/full-cycle-test.https.any.html?av1",
       {
@@ -696094,7 +696101,7 @@
       "log": {
        "entry_added": {
         "console.py": [
-         "533dfd795017fc5c6042399aaeff0f1fc2d443b1",
+         "061e85b7b6b31758b0abedb274778f083a2947cf",
          [
           null,
           {}
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-from-after-empty-table-header-grouped-element.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-from-after-empty-table-header-grouped-element.html
new file mode 100644
index 0000000..e6ad4fa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-from-after-empty-table-header-grouped-element.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<html>
+<head>
+<meta char="utf-8">
+<script>
+addEventListener("load", () => {
+  document.documentElement.contentEditable = true;
+  getSelection().collapse(document.querySelector("svg"), document.querySelector("svg").childNodes.length);
+  document.execCommand("delete");
+});
+</script>
+<body>
+<svg>
+  <a display="table-header-group">
+  </a>
+  </svg></body></html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js b/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js
index b7d5f7ea..d8b23f9 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js
@@ -82,6 +82,8 @@
   await checkEncoderSupport(t, encoder_config);
   let decoder = new VideoDecoder({
     output(frame) {
+      t.add_cleanup(() => { frame.close() });
+
       assert_equals(frame.visibleRect.width, w, "visibleRect.width");
       assert_equals(frame.visibleRect.height, h, "visibleRect.height");
       assert_equals(frame.timestamp, next_ts++, "decode timestamp");
@@ -105,7 +107,6 @@
       frames_decoded++;
       assert_true(validateBlackDots(frame, frame.timestamp),
         "frame doesn't match. ts: " + frame.timestamp);
-      frame.close();
     },
     error(e) {
       assert_unreached(e.message);
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/log/entry_added/console.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/log/entry_added/console.py
index 533dfd7..061e85b 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/log/entry_added/console.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/log/entry_added/console.py
@@ -101,6 +101,25 @@
 
 
 @pytest.mark.asyncio
+async def test_method_timeEnd(bidi_session, subscribe_events, top_context, wait_for_event, wait_for_future_safe):
+    await subscribe_events(events=["log.entryAdded"])
+
+    on_entry_added = wait_for_event("log.entryAdded")
+
+    script = "console.time('test'); console.timeEnd('test');"
+
+    await bidi_session.script.evaluate(
+        expression=script,
+        await_promise=True,
+        target=ContextTarget(top_context["context"]),
+    )
+
+    event_data = await wait_for_future_safe(on_entry_added)
+
+    assert_console_entry(event_data, method="timeEnd")
+
+
+@pytest.mark.asyncio
 async def test_new_context_with_new_window(bidi_session, subscribe_events, top_context, wait_for_event, wait_for_future_safe):
     await subscribe_events(events=["log.entryAdded"])
 
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/network-router-info-mainresource-network-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/network-router-info-mainresource-network-expected.txt
new file mode 100644
index 0000000..c380239
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/network-router-info-mainresource-network-expected.txt
@@ -0,0 +1,5 @@
+Verifies that the request head has static routing information on the main resource when the request fallbacks to the network.
+{
+    ruleIdMatched : 1
+}
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/network-router-info-mainresource-network.js b/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/network-router-info-mainresource-network.js
new file mode 100644
index 0000000..08b0592
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/network-router-info-mainresource-network.js
@@ -0,0 +1,23 @@
+(async function (testRunner) {
+  var { page, session, dp } = await testRunner.startURL(
+    'resources/simple.html',
+    'Verifies that the request head has static routing information on the main resource when the request fallbacks to the network.');
+  const swHelper =
+    (await testRunner.loadScript('../../resources/service-worker-helper.js'))(
+      dp, session);
+
+  await Promise.all([
+    dp.Network.enable(),
+    dp.Page.enable(),
+  ]);
+
+  await swHelper.installSWAndWaitForActivated(
+    'service-worker-router-to-network.js');
+
+  await dp.Page.reload();
+
+  const responseReceived = await dp.Network.onceResponseReceived();
+  testRunner.log(responseReceived.params.response.serviceWorkerRouterInfo);
+
+  testRunner.completeTest();
+});
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/resources/service-worker-router-to-network.js b/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/resources/service-worker-router-to-network.js
new file mode 100644
index 0000000..11b9dafb
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/resources/service-worker-router-to-network.js
@@ -0,0 +1,10 @@
+'use strict';
+
+self.addEventListener('install', async e => {
+  await e.registerRouter(
+    [{ condition: { urlPattern: '*' }, source: 'network' }]);
+  self.skipWaiting();
+});
+self.addEventListener('fetch', e => {
+  e.respondWith(new Response('fake handler'));
+});
diff --git a/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-cross-origin-expected.txt b/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-cross-origin-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-cross-origin-expected.txt
rename to third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-cross-origin-expected.txt
diff --git a/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-cross-origin.html b/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-cross-origin.html
similarity index 81%
rename from third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-cross-origin.html
rename to third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-cross-origin.html
index d9a6e472..45cc57bf 100644
--- a/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-cross-origin.html
+++ b/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-cross-origin.html
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <iframe></iframe>
 <a href='about:blank'></a>
 <script>
@@ -7,7 +8,7 @@
   }
   let iframe = document.querySelector('iframe');
   let link = document.querySelector('a');
-  iframe.contentWindow.addEventListener('unload', function() {
+  iframe.contentWindow.addEventListener('pagehide', function() {
     link.click();
   });
   location.href = 'http://localhost:8000/navigation/resources/pass-and-notify-done.html'
diff --git a/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-same-origin-expected.txt b/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-same-origin-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-same-origin-expected.txt
rename to third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-same-origin-expected.txt
diff --git a/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-same-origin.html b/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-same-origin.html
similarity index 80%
rename from third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-same-origin.html
rename to third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-same-origin.html
index ddbbe250..dc763c58 100644
--- a/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-unload-handler-same-origin.html
+++ b/third_party/blink/web_tests/http/tests/navigation/navigate-to-about-blank-from-subframe-pagehide-handler-same-origin.html
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <iframe></iframe>
 <a href='about:blank'></a>
 <script>
@@ -7,7 +8,7 @@
   }
   let iframe = document.querySelector('iframe');
   let link = document.querySelector('a');
-  iframe.contentWindow.addEventListener('unload', function() {
+  iframe.contentWindow.addEventListener('pagehide', function() {
     link.click();
   });
   location.href = './resources/pass-and-notify-done.html';
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/frame-unload-abort-crash-expected.txt b/third_party/blink/web_tests/http/tests/xmlhttprequest/frame-pagehide-abort-crash-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/http/tests/xmlhttprequest/frame-unload-abort-crash-expected.txt
rename to third_party/blink/web_tests/http/tests/xmlhttprequest/frame-pagehide-abort-crash-expected.txt
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/frame-unload-abort-crash.html b/third_party/blink/web_tests/http/tests/xmlhttprequest/frame-pagehide-abort-crash.html
similarity index 90%
rename from third_party/blink/web_tests/http/tests/xmlhttprequest/frame-unload-abort-crash.html
rename to third_party/blink/web_tests/http/tests/xmlhttprequest/frame-pagehide-abort-crash.html
index 74ad6af..42386789 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/frame-unload-abort-crash.html
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/frame-pagehide-abort-crash.html
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <html>
 <body>
 <p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=25394">bug 25394</a>: crash in DocumentLoader::addResponse due to bad |this| pointer</p>
@@ -36,7 +37,7 @@
     }
 </script>
 <div id="framediv">
-<iframe src="resources/xmlhttprequest-in-unload.html" width=50 height=10 border=0></iframe>
+<iframe src="resources/xmlhttprequest-in-pagehide.html" width=50 height=10 border=0></iframe>
 </div>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/resources/xmlhttprequest-in-unload.html b/third_party/blink/web_tests/http/tests/xmlhttprequest/resources/xmlhttprequest-in-pagehide.html
similarity index 88%
rename from third_party/blink/web_tests/http/tests/xmlhttprequest/resources/xmlhttprequest-in-unload.html
rename to third_party/blink/web_tests/http/tests/xmlhttprequest/resources/xmlhttprequest-in-pagehide.html
index 72cf47c..64581b62 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/resources/xmlhttprequest-in-unload.html
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/resources/xmlhttprequest-in-pagehide.html
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <html>
 <head>
 <script>
@@ -31,6 +32,6 @@
 }
 </script>
 </head>
-<body onload="window.parent.subframeLoaded()" onunload="loadXML()">
+<body onload="window.parent.subframeLoaded()" onpagehide="loadXML()">
 </body>
 </html>
diff --git a/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window-expected.txt b/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window-expected.txt
new file mode 100644
index 0000000..af5565e
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window-expected.txt
@@ -0,0 +1,22 @@
+This is a testharness.js-based test.
+Found 9 FAIL, 0 TIMEOUT, 0 NOTRUN.
+[FAIL] shadowed unload (document.body)
+  assert_equals: alternative body should reflect expected (function) function "() => 0" but got (object) null
+[FAIL] not shadowed copy (document.body)
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] not shadowed cut (document.body)
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] not shadowed paste (document.body)
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] shadowed unload (document.createElement("body"))
+  assert_equals: body should reflect expected (function) function "() => 0" but got (object) null
+[FAIL] not shadowed copy (document.createElement("body"))
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] not shadowed cut (document.createElement("body"))
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] not shadowed paste (document.createElement("body"))
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] shadowed unload (window)
+  assert_equals: body should reflect expected (function) function "() => 0" but got (object) null
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-frameset-window-expected.txt b/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-frameset-window-expected.txt
new file mode 100644
index 0000000..6cd6f8a
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-frameset-window-expected.txt
@@ -0,0 +1,22 @@
+This is a testharness.js-based test.
+Found 9 FAIL, 0 TIMEOUT, 0 NOTRUN.
+[FAIL] shadowed unload (document.body)
+  assert_equals: alternative body should reflect expected (function) function "() => 0" but got (object) null
+[FAIL] not shadowed copy (document.body)
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] not shadowed cut (document.body)
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] not shadowed paste (document.body)
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] shadowed unload (document.createElement("frameset"))
+  assert_equals: body should reflect expected (function) function "() => 0" but got (object) null
+[FAIL] not shadowed copy (document.createElement("frameset"))
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] not shadowed cut (document.createElement("frameset"))
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] not shadowed paste (document.createElement("frameset"))
+  assert_equals: window should reflect expected (object) null but got (undefined) undefined
+[FAIL] shadowed unload (window)
+  assert_equals: body should reflect expected (function) function "() => 0" but got (object) null
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body-expected.txt b/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body-expected.txt
new file mode 100644
index 0000000..4964dfc8
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+Found 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
+[FAIL] Ignore setting of unload window event handlers on windowless body
+  assert_equals: expected (function) function "function () { return "Handler attached to the window"; }" but got (object) null
+[FAIL] Ignore setting of unload window event handlers on windowless frameset
+  assert_equals: expected (function) function "function () { return "Handler attached to the window"; }" but got (object) null
+Harness: the test ran to completion.
+
diff --git a/third_party/dawn b/third_party/dawn
index 9ffc1d9..571cc44 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 9ffc1d92cb4b6a599dc8803a9d84f28821c5b27d
+Subproject commit 571cc4420ff93b2ff9ed49ef2c076191563c87df
diff --git a/third_party/depot_tools b/third_party/depot_tools
index 25b4354..9c44fe5 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit 25b4354fadce5fc7d318e18bef43e6dc8e68e10d
+Subproject commit 9c44fe5fca957f65f36b5a5f2b375c2ad95b83dc
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index beef3c6..e526a89 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit beef3c68361522775e89249acd82afb5e576b8c4
+Subproject commit e526a89d9a3184fa6219961a2dbd310b58a50986
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index d52a379..ced63bc 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit d52a3791eb93361fa24825670284e7bcfb520403
+Subproject commit ced63bcacbb1ba3576b352e147174f139f44e102
diff --git a/third_party/libc++abi/src b/third_party/libc++abi/src
index e6a7fd81..b90fa05 160000
--- a/third_party/libc++abi/src
+++ b/third_party/libc++abi/src
@@ -1 +1 @@
-Subproject commit e6a7fd81edcf7c3effe2a815a1d7937cbeaacc59
+Subproject commit b90fa05c8949d3634ee48ebe90b1a2bfd56498e5
diff --git a/third_party/skia b/third_party/skia
index 5c037ee..5f08327 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 5c037eed36a24d282a03bd1f03d2dff74ff69410
+Subproject commit 5f0832787d0fb817d5a94261123448fb52c41e6b
diff --git a/third_party/webrtc b/third_party/webrtc
index 2561dd3..9fdceb8 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 2561dd307eaedb9baa8c0cde1fec26d627b777cf
+Subproject commit 9fdceb80b5f7c36cdbcd5861c737b40a73b430f6
diff --git a/tools/android/checkstyle/chromium-style-5.0.xml b/tools/android/checkstyle/chromium-style-5.0.xml
index bbd1b90c..47e995f 100644
--- a/tools/android/checkstyle/chromium-style-5.0.xml
+++ b/tools/android/checkstyle/chromium-style-5.0.xml
@@ -112,7 +112,7 @@
       <property name="severity" value="info"/>
     </module>
     <module name="NeedBraces">
-      <property name="severity" value="error"/>
+      <property name="severity" value="warning"/>
       <property name="allowSingleLineStatement" value="true"/>
     </module>
     <module name="RegexpSinglelineJava">
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h b/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
index 3cb687a..e903416 100644
--- a/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
+++ b/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
@@ -42,11 +42,11 @@
 
   // Enables checking for `mojo::Associated{Remote,Receiver}` in the forbidden
   // fields checker.
-  bool forbid_associated_remote_receiver = false;
+  bool forbid_associated_remote_receiver = true;
 
   // Enables checks for GCed objects, Members, and pointers or references to
   // GCed objects and in stl and WTF collections.
-  bool enable_off_heap_collections_of_gced_check = false;
+  bool enable_off_heap_collections_of_gced_check = true;
   bool enable_off_heap_collections_of_gced_check_pdfium = false;
 
   std::set<std::string> ignored_classes;
diff --git a/tools/clang/blink_gc_plugin/tests/off-heap-collections-of-gced.flags b/tools/clang/blink_gc_plugin/tests/off-heap-collections-of-gced.flags
deleted file mode 100644
index 3fe509b5..0000000
--- a/tools/clang/blink_gc_plugin/tests/off-heap-collections-of-gced.flags
+++ /dev/null
@@ -1 +0,0 @@
--Xclang -plugin-arg-blink-gc-plugin -Xclang enable-off-heap-collections-of-gced-check
diff --git a/tools/clang/blink_gc_plugin/tests/off-heap-collections-of-members.flags b/tools/clang/blink_gc_plugin/tests/off-heap-collections-of-members.flags
deleted file mode 100644
index 3fe509b5..0000000
--- a/tools/clang/blink_gc_plugin/tests/off-heap-collections-of-members.flags
+++ /dev/null
@@ -1 +0,0 @@
--Xclang -plugin-arg-blink-gc-plugin -Xclang enable-off-heap-collections-of-gced-check
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 5459efb..d7ebaa1e 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -40223,6 +40223,8 @@
   <suffix name="iOSPromoWhatsNew" label="For iOSPromoWhatsNew feature"/>
   <suffix name="iOSPullToRefreshFeature"
       label="For iOSPullToRefreshFeature feature"/>
+  <suffix name="iOSReplaceSyncPromosWithSignInPromos"
+      label="For iOSReplaceSyncPromosWithSignInPromos feature"/>
   <suffix name="iOSShareToolbarItemFeature"
       label="For iOSShareToolbarItemFeature feature"/>
   <suffix name="iOSTabGridToolbarItemFeature"
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index dbe1575..a164f2a 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -25257,6 +25257,8 @@
   <int value="4745" label="SubtleCryptoDeriveBitsZeroLength"/>
   <int value="4746" label="SubtleCryptoDeriveBitsTruncation"/>
   <int value="4747" label="TextDirectiveInShadowDOM"/>
+  <int value="4748" label="PseudoFirstLetterOnRt"/>
+  <int value="4749" label="PseudoFirstLineOnRt"/>
 </enum>
 
 <enum name="FeaturePolicyFeature">
@@ -35169,6 +35171,7 @@
   <int value="-1157991559" label="CloudApAuthAttachAsHeader:enabled"/>
   <int value="-1156950420"
       label="CryptAuthV2DeviceActivityStatusUseConnectivity:enabled"/>
+  <int value="-1156639003" label="ArcResizeCompat:enabled"/>
   <int value="-1156179600" label="OmniboxRichEntitySuggestions:enabled"/>
   <int value="-1155543191" label="CopylessPaste:disabled"/>
   <int value="-1155411808" label="HoldingSpacePredictability:enabled"/>
@@ -41965,6 +41968,7 @@
   <int value="2088061188" label="LibinputHandleTouchpad:enabled"/>
   <int value="2088438916" label="CrosShortstand:disabled"/>
   <int value="2088446947" label="enable-ephemeral-guest-profiles-on-desktop"/>
+  <int value="2088963066" label="ArcResizeCompat:disabled"/>
   <int value="2089897928" label="enable-audio-focus"/>
   <int value="2089901626" label="QuickSettingsPWA:enabled"/>
   <int value="2089934964" label="QuickActionShowBubbleLauncher:enabled"/>
@@ -49305,15 +49309,6 @@
   <int value="1" label="Lacros">Web page info comes from lacros chrome.</int>
 </enum>
 
-<enum name="PowerwashDialogViewType">
-  <int value="0" label="Invoked on settings page"/>
-  <int value="1" label="Shortcut. Confirmation for powerwash only."/>
-  <int value="2" label="Shortcut. Confirmation for powerwash and rollback."/>
-  <int value="3" label="Shortcut. Offer. Rollback unavailable."/>
-  <int value="4" label="Shortcut. Offer. Rollback available."/>
-  <int value="5" label="Shortcut. Restart required."/>
-</enum>
-
 <enum name="PredictionGrantLikelihood">
   <int value="0" label="Unknown"/>
   <int value="1" label="Very unlikely"/>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index f0963279..c525f983 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -235,6 +235,8 @@
       summary="showing the Whats New Promo on iOS"/>
   <variant name="IPH_iOSPullToRefreshFeature"
       summary="the full screen IPH for pull to refresh"/>
+  <variant name="IPH_iOSReplaceSyncPromosWithSignInPromos"
+      summary="account row in settings page"/>
   <variant name="IPH_iOSShareToolbarItemFeature"
       summary="the share tool bar item (bottom on iPhone, top on iPad)"/>
   <variant name="IPH_iOSTabGridToolbarItemFeature"
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index b3ae5fc..f6ab55d5 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -6308,50 +6308,6 @@
   </token>
 </histogram>
 
-<histogram name="MediaGalleries.ScanCancelTime" units="ms" expires_after="M85">
-  <owner>vandebo@chromium.org</owner>
-  <summary>If a media scan was cancelled, the duration (in ms) it ran.</summary>
-</histogram>
-
-<histogram name="MediaGalleries.ScanDirectoriesFound" units="units"
-    expires_after="M85">
-  <owner>vandebo@chromium.org</owner>
-  <summary>
-    The number of directories with media files found during a scan.
-  </summary>
-</histogram>
-
-<histogram name="MediaGalleries.ScanFinishedTime" units="ms"
-    expires_after="M85">
-  <owner>vandebo@chromium.org</owner>
-  <summary>
-    Duration in milliseconds taken to do a media scan that ran to completion.
-  </summary>
-</histogram>
-
-<histogram name="MediaGalleries.ScanGalleriesGranted" units="%"
-    expires_after="M85">
-  <owner>vandebo@chromium.org</owner>
-  <summary>
-    The percentage of galleries accepted (not deselected) from the scan result
-    dialog.
-  </summary>
-</histogram>
-
-<histogram name="MediaGalleries.ScanGalleriesPopulated" units="units"
-    expires_after="M85">
-  <owner>vandebo@chromium.org</owner>
-  <summary>
-    The number of galleries added or updated in preferences after a scan.
-  </summary>
-</histogram>
-
-<histogram name="MediaGalleries.Usage" enum="MediaGalleriesUsageType"
-    expires_after="M77">
-  <owner>vandebo@chromium.org</owner>
-  <summary>Various usage counts for media galleries.</summary>
-</histogram>
-
 <histogram name="MediaLauncherActivity.LaunchResult" enum="BooleanSuccess"
     expires_after="2021-06-19">
   <owner>steimel@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 7ed9550..fec86a7c 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -8448,15 +8448,6 @@
   </summary>
 </histogram>
 
-<histogram name="Reset.ChromeOS.PowerwashDialogShown"
-    enum="PowerwashDialogViewType" expires_after="M77">
-  <owner>merkulova@chromium.org</owner>
-  <summary>
-    Records the number of times the factory reset dialog was shown. Grouped by
-    the viewtype.
-  </summary>
-</histogram>
-
 <histogram name="ResourceLoadingHints.ResourceLoadingBlocked"
     units="loading blocked" expires_after="M85">
   <owner>tbansal@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml
index e405cf2f..fb2029c0 100644
--- a/tools/metrics/histograms/metadata/permissions/histograms.xml
+++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -507,6 +507,17 @@
   <token key="PermissionType" variants="AllPermissionTypes"/>
 </histogram>
 
+<histogram name="Permissions.GetLastCommittedOriginAsURL.IsFileURL"
+    enum="Boolean" expires_after="2024-10-30">
+  <owner>elklm@chromium.org</owner>
+  <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
+  <summary>
+    Recorded whenever a RenderFrameHost is used to fetch an origin for
+    permission verification on Android. This histogram is needed to verify if
+    the file url override rule is still needed.
+  </summary>
+</histogram>
+
 <histogram name="Permissions.MissingOSLevelPermission.Action"
     enum="PermissionAction" expires_after="2024-05-19">
   <owner>andypaicu@chromium.org</owner>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
index 7c1da34..38b6835dc 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="az">
 <translation id="1000498691615767391">Açmaq üçün qovluq seçin</translation>
+<translation id="1014208178561091457"><ph name="FILE_NAME" /> şifrələndiyi üçün kopyalanmadı.</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> element silinir...</translation>
 <translation id="1049926623896334335">Word sənədi</translation>
 <translation id="1056775291175587022">Şəbəkə yoxdur</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Qovluğu Parallels Desktop ilə paylaşın</translation>
 <translation id="1439919885608649279">Əlində gül olan adam</translation>
 <translation id="1458457385801829801">Çıxarın: <ph name="TARGET_NAME" /></translation>
+<translation id="146691674290220697"><ph name="NUMBER_OF_FILES" /> fayl şifrələndiyi üçün kopyalanmadı.</translation>
 <translation id="1471718551822868769">Slovak</translation>
 <translation id="1482884275703521657">Fin</translation>
 <translation id="148466539719134488">İsveçrəyə aid</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Əlçatan deyil</translation>
 <translation id="3254434849914415189"><ph name="FILE_TYPE" /> fayllar üçün defolt tətbiq seçin:</translation>
 <translation id="3255159654094949700">Ərəb</translation>
+<translation id="326396468955264502"><ph name="NUMBER_OF_FILES" /> fayl şifrələndiyi üçün köçürülmədi.</translation>
 <translation id="3264582393905923483">Məzmun</translation>
 <translation id="3272909651715601089">"<ph name="PATH" />" açılmadı</translation>
 <translation id="3280431534455935878">Hazırlanır</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">1 qovluq <ph name="VM_NAME" /> ilə paylaşıldı</translation>
 <translation id="3524311639100184459">Xəbərdarlıq: Bu fayllar müvəqqətidir və diskdə yer boşaltmaq üçün avtomatik silinə bilər.  <ph name="BEGIN_LINK" />Ətraflı Məlumat<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Qovluq</translation>
+<translation id="3529424493985988200">Detallar üçün administrator ilə əlaqə saxlayın.</translation>
 <translation id="3548125359243647069">Yanlış PIN kod dəfələrlə daxil edilib.</translation>
 <translation id="3549797760399244642">drive.google.com saytına keçin...</translation>
 <translation id="3553048479571901246">Faylları <ph name="APP_NAME" /> ilə açmaq üçün əvvəlcə onları Windows fayllar qovluğuna kopyalayın.</translation>
@@ -701,6 +705,7 @@
 <translation id="637062427944097960">Bu fayl başqa masaüstündə açıldı. Ona baxmaq üçün <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) köçürün.</translation>
 <translation id="6394388407447716302">Yalnız oxunan</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> element</translation>
+<translation id="6407769893376380348"><ph name="FILE_NAME" /> şifrələndiyi üçün köçürülmədi.</translation>
 <translation id="642282551015776456">Bu ad qovluq adının faylı kimi istifadə edilə bilməz</translation>
 <translation id="6423031066725912715">TCVN klaviaturası ilə Vyetnam dili</translation>
 <translation id="6430271654280079150">1 cəhdiniz qalıb.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
index 7acca02..7acfc0d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bs">
 <translation id="1000498691615767391">Odaberite koji folder želite otvoriti</translation>
+<translation id="1014208178561091457">Kopiranje datoteke <ph name="FILE_NAME" /> nije uspjelo jer je šifrirana.</translation>
 <translation id="1047956942837015229">Brisanje stavki (<ph name="COUNT" />)…</translation>
 <translation id="1049926623896334335">Word dokument</translation>
 <translation id="1056775291175587022">Nema mreže</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Dijeljenje foldera pomoću aplikacije Parallels Desktop</translation>
 <translation id="1439919885608649279">Osoba s cvijećem</translation>
 <translation id="1458457385801829801">Izbaci <ph name="TARGET_NAME" /></translation>
+<translation id="146691674290220697">Kopiranje <ph name="NUMBER_OF_FILES" /> datoteke/datoteka nije uspjelo jer su šifrirane.</translation>
 <translation id="1471718551822868769">slovački</translation>
 <translation id="1482884275703521657">finski</translation>
 <translation id="148466539719134488">švicarska</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Nije dostupno</translation>
 <translation id="3254434849914415189">Odaberite zadanu aplikaciju za <ph name="FILE_TYPE" /> fajlove:</translation>
 <translation id="3255159654094949700">arapski</translation>
+<translation id="326396468955264502">Premještanje <ph name="NUMBER_OF_FILES" /> datoteke/datoteka nije uspjelo jer su šifrirane.</translation>
 <translation id="3264582393905923483">Kontekst</translation>
 <translation id="3272909651715601089">Otvaranje putanje "<ph name="PATH" />" nije uspjelo</translation>
 <translation id="3280431534455935878">Pripremanje</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">1 folder se dijeli s virtuelnom mašinom <ph name="VM_NAME" /></translation>
 <translation id="3524311639100184459">Oprez: Ovi fajlovi su privremeni i moguće je da će se automatski izbrisati radi oslobađanja prostora na disku.  <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Folder</translation>
+<translation id="3529424493985988200">Pojedinosti možete saznati od administratora.</translation>
 <translation id="3548125359243647069">Previše puta je unet pogrešan PIN.</translation>
 <translation id="3549797760399244642">Idite na drive.google.com...</translation>
 <translation id="3553048479571901246">Da otvorite fajlove pomoću aplikacije <ph name="APP_NAME" />, najprije ih kopirajte u folder Windows fajlova.</translation>
@@ -701,6 +705,7 @@
 <translation id="637062427944097960">Ovaj fajl se otvorio na drugoj radnoj površini. Prebacite na korisnika <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) da ga vidite.</translation>
 <translation id="6394388407447716302">Samo za čitanje</translation>
 <translation id="6395575651121294044">Broj stavki: <ph name="NUMBER_OF_FILES" /></translation>
+<translation id="6407769893376380348">Premještanje datoteke <ph name="FILE_NAME" /> nije uspjelo jer je šifrirana.</translation>
 <translation id="642282551015776456">Ovo ime se ne može koristiti za naziv fajla ili foldera.</translation>
 <translation id="6423031066725912715">vijetnamski s tastaturom TCVN</translation>
 <translation id="6430271654280079150">Imate još 1 pokušaj.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
index aca078c..932d593 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
 <translation id="1000498691615767391">Piliin ang isang folder para buksan</translation>
+<translation id="1014208178561091457">Hindi makopya ang <ph name="FILE_NAME" /> dahil naka-encrypt ito.</translation>
 <translation id="1047956942837015229">Nagtatanggal ng <ph name="COUNT" /> (na) item...</translation>
 <translation id="1049926623896334335">Dokumento ng Word</translation>
 <translation id="1056775291175587022">Walang network</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Ibahagi ang folder sa Parallels Desktop</translation>
 <translation id="1439919885608649279">Taong may mga bulaklak</translation>
 <translation id="1458457385801829801">I-eject ang <ph name="TARGET_NAME" /></translation>
+<translation id="146691674290220697">Hindi makopya ang <ph name="NUMBER_OF_FILES" /> (na) file dahil naka-encrypt ang mga ito.</translation>
 <translation id="1471718551822868769">Slovak</translation>
 <translation id="1482884275703521657">Finnish</translation>
 <translation id="148466539719134488">Swiss</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Hindi available</translation>
 <translation id="3254434849914415189">Piliin ang default na app para sa mga <ph name="FILE_TYPE" /> na file:</translation>
 <translation id="3255159654094949700">Arabic</translation>
+<translation id="326396468955264502">Hindi mailipat ang <ph name="NUMBER_OF_FILES" /> (na) file dahil naka-encrypt ang mga ito.</translation>
 <translation id="3264582393905923483">Konteksto</translation>
 <translation id="3272909651715601089">Hindi mabuksan ang "<ph name="PATH" />"</translation>
 <translation id="3280431534455935878">Ihinahanda</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">1 folder ang na-share sa <ph name="VM_NAME" /></translation>
 <translation id="3524311639100184459">Mag-ingat: Ang mga file na ito ay pansamantala lang at puwedeng awtomatikong ma-delete para magbakante ng espasyo sa disk.  <ph name="BEGIN_LINK" />Matuto Pa<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Folder</translation>
+<translation id="3529424493985988200">Makipag-ugnayan sa iyong administrator para sa mga detalye.</translation>
 <translation id="3548125359243647069">Napakaraming beses nang naglagay ng maling PIN.</translation>
 <translation id="3549797760399244642">Pumunta sa drive.google.com...</translation>
 <translation id="3553048479571901246">Para makapagbukas ng mga file gamit ang <ph name="APP_NAME" />, kopyahin muna ang mga ito sa folder ng mga Windows file.</translation>
@@ -701,6 +705,7 @@
 <translation id="637062427944097960">Ang file na ito na binuksan sa ibang desktop. Ilipat sa <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) upang tingnan ito.</translation>
 <translation id="6394388407447716302">Read-only</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> (na) item</translation>
+<translation id="6407769893376380348">Hindi mailipat ang <ph name="FILE_NAME" /> dahil naka-encrypt ito.</translation>
 <translation id="642282551015776456">Hindi maaaring gamitin ang pangalang ito bilang isang pangalan ng file o folder</translation>
 <translation id="6423031066725912715">Vietnamese na may TCVN keyboard</translation>
 <translation id="6430271654280079150">Mayroon ka na lang 1 natitirang pagsubok.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
index e31981f..ce7cb8b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="gu">
 <translation id="1000498691615767391">ખોલવા માટે એક ફોલ્ડર પસંદ કરો</translation>
+<translation id="1014208178561091457"><ph name="FILE_NAME" /> કૉપિ કરી શકાયું નથી કારણ કે તે એન્ક્રિપ્ટેડ છે.</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> આઇટમ્સ કાઢી નાખી રહ્યું છે...</translation>
 <translation id="1049926623896334335">Word દસ્તાવેજ</translation>
 <translation id="1056775291175587022">કોઈ નેટવર્ક નથી</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Parallels ડેસ્કટૉપ સાથે ફોલ્ડર શેર કરો</translation>
 <translation id="1439919885608649279">ફૂલો લઈને ઉભેલી વ્યક્તિ</translation>
 <translation id="1458457385801829801"><ph name="TARGET_NAME" />ને બહાર કાઢો</translation>
+<translation id="146691674290220697"><ph name="NUMBER_OF_FILES" /> ફાઇલને કૉપિ કરી શકાઈ નથી કારણ કે તે એન્ક્રિપ્ટેડ છે.</translation>
 <translation id="1471718551822868769">સ્લોવાક</translation>
 <translation id="1482884275703521657">ફિનિશ</translation>
 <translation id="148466539719134488">સ્વીસ</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">ઉપલબ્ધ નથી</translation>
 <translation id="3254434849914415189"><ph name="FILE_TYPE" /> ફાઇલો માટે ડિફૉલ્ટ ઍપ પસંદ કરો:</translation>
 <translation id="3255159654094949700">અરબી</translation>
+<translation id="326396468955264502"><ph name="NUMBER_OF_FILES" /> ફાઇલ ખસેડી શકાઈ નથી કારણ કે તે એનક્રિપ્ટેડ છે.</translation>
 <translation id="3264582393905923483">સંદર્ભ</translation>
 <translation id="3272909651715601089">"<ph name="PATH" />" ખોલી શક્યા નથી</translation>
 <translation id="3280431534455935878">તૈયારી કરી રહ્યાં છીએ</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490"><ph name="VM_NAME" /> સાથે 1 ફોલ્ડર શેર કરવામાં આવ્યું</translation>
 <translation id="3524311639100184459">ચેતવણી: આ ફાઇલો અસ્થાયી છે અને બની શકે કે ડિસ્ક પર સ્પેસ ખાલી કરવા માટે તેમને ઑટોમૅટિક રીતે ડિલીટ કરવામાં આવે  <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">ફોલ્ડર</translation>
+<translation id="3529424493985988200">વિગતો માટે તમારા ઍડમિનિસ્ટ્રેટરનો સંપર્ક કરો.</translation>
 <translation id="3548125359243647069">ઘણી બધી વખત કોઈ ખોટો પિન દાખલ કરવામાં આવ્યો છે.</translation>
 <translation id="3549797760399244642">drive.google.com પર જાઓ...</translation>
 <translation id="3553048479571901246"><ph name="APP_NAME" /> વડે ફાઇલો ખોલવા માટે, પહેલા તેમને Windowsના ફાઇલ ફોલ્ડરમાં કૉપિ કરો.</translation>
@@ -701,6 +705,7 @@
 <translation id="637062427944097960">આ ફાઇલને બીજા ડેસ્કટૉપ પર ખોલેલી. તેને જોવા માટે <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) પર જાઓ.</translation>
 <translation id="6394388407447716302">ફક્ત વાંચવા માટે</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> આઇટમ</translation>
+<translation id="6407769893376380348"><ph name="FILE_NAME" /> ખસેડી શકાયું નથી કારણ કે તે એન્ક્રિપ્ટેડ છે.</translation>
 <translation id="642282551015776456">આ નામનો ઉપયોગ ફોલ્ડર નામની કોઈ ફાઇલ તરીકે થઈ શકશે નહીં</translation>
 <translation id="6423031066725912715">વિયેતનામીઝ, TCVN કીબોર્ડ સાથે</translation>
 <translation id="6430271654280079150">તમારો 1 પ્રયાસ બાકી છે.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
index e2e8a82..1ddd6d16 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hr">
 <translation id="1000498691615767391">Odaberite mapu za otvaranje</translation>
+<translation id="1014208178561091457">Kopiranje datoteke <ph name="FILE_NAME" /> nije uspjelo jer je šifrirana.</translation>
 <translation id="1047956942837015229">Brisanje stavki (<ph name="COUNT" />)...</translation>
 <translation id="1049926623896334335">Wordov dokument</translation>
 <translation id="1056775291175587022">Nema mreža</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Dijeljenje mape s Parallels Desktopom</translation>
 <translation id="1439919885608649279">Osoba s cvijećem</translation>
 <translation id="1458457385801829801">Izbaci <ph name="TARGET_NAME" /></translation>
+<translation id="146691674290220697">Kopiranje <ph name="NUMBER_OF_FILES" /> datoteke/datoteka nije uspjelo jer su šifrirane.</translation>
 <translation id="1471718551822868769">slovački</translation>
 <translation id="1482884275703521657">finski</translation>
 <translation id="148466539719134488">švicarska</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Nije dostupno</translation>
 <translation id="3254434849914415189">Odaberite zadanu aplikaciju za <ph name="FILE_TYPE" /> datoteke:</translation>
 <translation id="3255159654094949700">arapski</translation>
+<translation id="326396468955264502">Premještanje <ph name="NUMBER_OF_FILES" /> datoteke/datoteka nije uspjelo jer su šifrirane.</translation>
 <translation id="3264582393905923483">Kontekst</translation>
 <translation id="3272909651715601089">Nije moguće otvoriti "<ph name="PATH" />"</translation>
 <translation id="3280431534455935878">Priprema</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">1 mapa podijeljena je s VM-om <ph name="VM_NAME" /></translation>
 <translation id="3524311639100184459">Oprez: ove su datoteke privremene i mogu se automatski izbrisati za oslobađanje prostora na disku.  <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Mapa</translation>
+<translation id="3529424493985988200">Pojedinosti možete saznati od administratora.</translation>
 <translation id="3548125359243647069">Unijeli ste netočan PIN previše puta.</translation>
 <translation id="3549797760399244642">Idite na drive.google.com...</translation>
 <translation id="3553048479571901246">Da biste otvarali datoteke pomoću aplikacije <ph name="APP_NAME" />, najprije ih kopirajte u mapu datoteka u Windowsima.</translation>
@@ -701,6 +705,7 @@
 <translation id="637062427944097960">Ova je datoteka otvorena na drugoj radnoj površini. Prebacite se na korisnika <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) da biste je vidjeli.</translation>
 <translation id="6394388407447716302">Samo za čitanje</translation>
 <translation id="6395575651121294044">Broj stavki: <ph name="NUMBER_OF_FILES" /></translation>
+<translation id="6407769893376380348">Premještanje datoteke <ph name="FILE_NAME" /> nije uspjelo jer je šifrirana.</translation>
 <translation id="642282551015776456">To ime ne može se upotrijebiti kao datoteka naziva mape</translation>
 <translation id="6423031066725912715">vijetnamski s tipkovnicom TCVN</translation>
 <translation id="6430271654280079150">Imate još jedan pokušaj.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
index 951287a..77d96d1a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hu">
 <translation id="1000498691615767391">Válasszon megnyitni kívánt mappát</translation>
+<translation id="1014208178561091457">A(z) <ph name="FILE_NAME" /> fájl másolása nem sikerült, mert titkosítva van.</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> elem törlése...</translation>
 <translation id="1049926623896334335">Word-dokumentum</translation>
 <translation id="1056775291175587022">Nincs hálózat</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Mappa megosztása a Parallels Desktoppal</translation>
 <translation id="1439919885608649279">Ember virágokkal</translation>
 <translation id="1458457385801829801"><ph name="TARGET_NAME" /> eltávolítása</translation>
+<translation id="146691674290220697"><ph name="NUMBER_OF_FILES" /> fájl másolása nem sikerült, mert titkosítva vannak.</translation>
 <translation id="1471718551822868769">szlovák</translation>
 <translation id="1482884275703521657">finn</translation>
 <translation id="148466539719134488">svájci</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Nem hozzáférhető</translation>
 <translation id="3254434849914415189">Válassza ki az alapértelmezett alkalmazást <ph name="FILE_TYPE" />-fájlokhoz:</translation>
 <translation id="3255159654094949700">arab</translation>
+<translation id="326396468955264502">Nem sikerült áthelyezni <ph name="NUMBER_OF_FILES" /> fájlt, mert titkosítva vannak.</translation>
 <translation id="3264582393905923483">Kontextus</translation>
 <translation id="3272909651715601089">A(z) „<ph name="PATH" />” fájl nem nyitható meg</translation>
 <translation id="3280431534455935878">Előkészítés</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">1 mappa megosztva a következővel: <ph name="VM_NAME" /></translation>
 <translation id="3524311639100184459">Figyelem: Ezek ideiglenes fájlok, és automatikusan törlésre kerülnek azért, hogy tárhely szabaduljon fel.  <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" />.</translation>
 <translation id="3527085408025491307">Mappa</translation>
+<translation id="3529424493985988200">A részletekért forduljon a rendszergazdához.</translation>
 <translation id="3548125359243647069">Túl sokszor lett megadva helytelen PIN-kód.</translation>
 <translation id="3549797760399244642">Ugrás ide: drive.google.com...</translation>
 <translation id="3553048479571901246">Fájlok <ph name="APP_NAME" /> alkalmazással való megnyitásához először másolja be őket a Windows-fájlok mappába.</translation>
@@ -701,6 +705,7 @@
 <translation id="637062427944097960">Ez a fájl meg van nyitva egy másik asztalon. A megtekintéséhez váltson át <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) profiljára.</translation>
 <translation id="6394388407447716302">Írásvédett</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> elem</translation>
+<translation id="6407769893376380348">Nem sikerült áthelyezni a(z) <ph name="FILE_NAME" /> fájlt, mert titkosítva van.</translation>
 <translation id="642282551015776456">Ezt a nevet nem lehet mappa fájlneveként használni</translation>
 <translation id="6423031066725912715">vietnámi, TCVN-billentyűzettel</translation>
 <translation id="6430271654280079150">1 próbálkozási lehetősége maradt.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
index f3a511dc..539d97e 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="iw">
 <translation id="1000498691615767391">בחירת תיקייה לפתיחה</translation>
+<translation id="1014208178561091457">לא ניתן להעתיק את <ph name="FILE_NAME" /> כי הוא מוצפן.</translation>
 <translation id="1047956942837015229">מתבצעת מחיקה של <ph name="COUNT" /> פריטים...</translation>
 <translation id="1049926623896334335">‏מסמך Word</translation>
 <translation id="1056775291175587022">אין רשתות</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">‏שיתוף תיקייה באמצעות Parallels Desktop</translation>
 <translation id="1439919885608649279">אדם עם פרחים</translation>
 <translation id="1458457385801829801">הוצאה של <ph name="TARGET_NAME" /></translation>
+<translation id="146691674290220697">לא ניתן להעתיק <ph name="NUMBER_OF_FILES" /> קבצים כי הם מוצפנים.</translation>
 <translation id="1471718551822868769">סלובקית</translation>
 <translation id="1482884275703521657">פינית</translation>
 <translation id="148466539719134488">שווייצרית</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">רשת לא זמינה</translation>
 <translation id="3254434849914415189">יש לבחור את יישום ברירת המחדל עבור קובצי <ph name="FILE_TYPE" />:</translation>
 <translation id="3255159654094949700">ערבית</translation>
+<translation id="326396468955264502">לא ניתן להעביר <ph name="NUMBER_OF_FILES" /> קבצים כי הם מוצפנים.</translation>
 <translation id="3264582393905923483">הקשר</translation>
 <translation id="3272909651715601089">לא ניתן היה לפתוח את "<ph name="PATH" />"</translation>
 <translation id="3280431534455935878">הקובץ בהכנה</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">תיקייה אחת שותפה עם <ph name="VM_NAME" /></translation>
 <translation id="3524311639100184459">זהירות: הקבצים האלה זמניים, וייתכן שהם יימחקו באופן אוטומטי כדי לפנות מקום בכונן.  <ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">תיקייה</translation>
+<translation id="3529424493985988200">לפרטים נוספים, יש לפנות לאדמין.</translation>
 <translation id="3548125359243647069">הוזן קוד אימות שגוי יותר מדי פעמים.</translation>
 <translation id="3549797760399244642">‏מעבר אל drive.google.com...</translation>
 <translation id="3553048479571901246">‏כדי שניתן יהיה לפתוח קבצים באמצעות <ph name="APP_NAME" />, צריך להעתיק אותם לתיקיית קובצי Windows.</translation>
@@ -702,6 +706,7 @@
 <translation id="637062427944097960">הקובץ הזה נפתח בשולחן עבודה שונה. עבור אל <ph name="USER_NAME" />‏ (<ph name="MAIL_ADDRESS" />) כדי לראות אותו.</translation>
 <translation id="6394388407447716302">לקריאה בלבד</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> פריטים</translation>
+<translation id="6407769893376380348">לא ניתן להעביר את הקובץ <ph name="FILE_NAME" /> כי הוא מוצפן.</translation>
 <translation id="642282551015776456">ייתכן שלא ניתן להשתמש בשם זה כשם קובץ או תיקייה</translation>
 <translation id="6423031066725912715">‏וייטנאמית עם מקלדת TCVN</translation>
 <translation id="6430271654280079150">נותר לך עוד ניסיון אחד.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
index c682aa59..16b413d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="mn">
 <translation id="1000498691615767391">Нээх хавтсыг сонгоно уу</translation>
+<translation id="1014208178561091457"><ph name="FILE_NAME" />-г шифрлэсэн тул үүнийг хуулж чадсангүй.</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> файлыг устгаж байна...</translation>
 <translation id="1049926623896334335">Word баримт</translation>
 <translation id="1056775291175587022">Сүлжээ алга</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Фолдерыг Parallels Desktop-тай хуваалцах</translation>
 <translation id="1439919885608649279">Цэцэгтэй хүн</translation>
 <translation id="1458457385801829801"><ph name="TARGET_NAME" />-г гаргах</translation>
+<translation id="146691674290220697"><ph name="NUMBER_OF_FILES" /> файлыг шифрлэсэн тул тэдгээрийг хуулж чадсангүй.</translation>
 <translation id="1471718551822868769">Словак</translation>
 <translation id="1482884275703521657">Финланд</translation>
 <translation id="148466539719134488">Швейцарь</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Боломжгүй байна</translation>
 <translation id="3254434849914415189"><ph name="FILE_TYPE" /> файлуудад анхдагч аппликейшнийг сонгох:</translation>
 <translation id="3255159654094949700">Араб</translation>
+<translation id="326396468955264502"><ph name="NUMBER_OF_FILES" /> файлыг шифрлэсэн тул тэдгээрийг зөөж чадсангүй.</translation>
 <translation id="3264582393905923483">Хам сэдэв</translation>
 <translation id="3272909651715601089">"<ph name="PATH" />"-г нээж чадсангүй</translation>
 <translation id="3280431534455935878">Бэлдэж байна</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490"><ph name="VM_NAME" />-тай 1 фолдер хуваалцсан</translation>
 <translation id="3524311639100184459">Анхааруулга: Эдгээр файл нь түр зуурын файлууд бөгөөд дискийн зайг чөлөөлөхийн тулд автоматаар устгаж болно.  <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Хавтас</translation>
+<translation id="3529424493985988200">Дэлгэрэнгүй мэдээлэл авах бол администратортайгаа холбогдоно уу.</translation>
 <translation id="3548125359243647069">ПИН-г хэт олон удаа буруу оруулсан байна.</translation>
 <translation id="3549797760399244642">drive.google.com руу очно уу...</translation>
 <translation id="3553048479571901246">Файлуудыг <ph name="APP_NAME" />-р нээхийн тулд эхлээд тэдгээрийг Windows-н файлын фолдерт хуулна уу.</translation>
@@ -699,6 +703,7 @@
 <translation id="637062427944097960">Энэ файл нь өөр десктоп дээр нээгдсэн байна. Үүнийг харахын тулд <ph name="USER_NAME" /> ( <ph name="MAIL_ADDRESS" /> ) руу шилжинэ үү.</translation>
 <translation id="6394388407447716302">Зєвхєн унших</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> зүйл</translation>
+<translation id="6407769893376380348"><ph name="FILE_NAME" />-г шифрлэсэн тул үүнийг зөөж чадсангүй.</translation>
 <translation id="642282551015776456">Энэ нэрийг хавтасны нэрийн файл болгон ашиглаж болохгүй.</translation>
 <translation id="6423031066725912715">TCVN гартай вьетнам</translation>
 <translation id="6430271654280079150">Танд 1 оролдлого үлдсэн байна.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
index d457e01f..4e4b8b0 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
 <translation id="1000498691615767391">Pilih folder untuk dibuka</translation>
+<translation id="1014208178561091457"><ph name="FILE_NAME" /> tidak dapat disalin kerana fail tersebut disulitkan.</translation>
 <translation id="1047956942837015229">Memadamkan <ph name="COUNT" /> item...</translation>
 <translation id="1049926623896334335">Dokumen Word</translation>
 <translation id="1056775291175587022">0 rangkaian</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Kongsi folder dengan Parallels Desktop</translation>
 <translation id="1439919885608649279">Orang dengan bunga</translation>
 <translation id="1458457385801829801">Usir <ph name="TARGET_NAME" /></translation>
+<translation id="146691674290220697"><ph name="NUMBER_OF_FILES" /> fail tidak dapat disalin kerana fail tersebut disulitkan.</translation>
 <translation id="1471718551822868769">Slovak</translation>
 <translation id="1482884275703521657">Finland</translation>
 <translation id="148466539719134488">Bahasa Switzerland</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Tidak tersedia</translation>
 <translation id="3254434849914415189">Pilih apl lalai untuk fail <ph name="FILE_TYPE" />:</translation>
 <translation id="3255159654094949700">Arab</translation>
+<translation id="326396468955264502"><ph name="NUMBER_OF_FILES" /> fail tidak dapat dipindahkan kerana fail tersebut disulitkan.</translation>
 <translation id="3264582393905923483">Konteks</translation>
 <translation id="3272909651715601089">Tidak dapat membuka "<ph name="PATH" />"</translation>
 <translation id="3280431534455935878">Menyediakan</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">1 folder dikongsi dengan <ph name="VM_NAME" /></translation>
 <translation id="3524311639100184459">Awas: Fail ini bersifat sementara dan mungkin dipadamkan secara automatik untuk mengosongkan ruang cakera.  <ph name="BEGIN_LINK" />Ketahui Lebih Lanjut<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Folder</translation>
+<translation id="3529424493985988200">Hubungi pentadbir anda untuk mendapatkan butiran.</translation>
 <translation id="3548125359243647069">PIN yang salah telah dimasukkan terlalu banyak kali.</translation>
 <translation id="3549797760399244642">Pergi ke drive.google.com...</translation>
 <translation id="3553048479571901246">Untuk membuka fail dengan <ph name="APP_NAME" />, salin fail itu ke folder fail Windows dahulu.</translation>
@@ -701,6 +705,7 @@
 <translation id="637062427944097960">Fail ini dibuka pada desktop yang berbeza. Alihkan ke <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) untuk melihat fail.</translation>
 <translation id="6394388407447716302">Baca sahaja</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> item</translation>
+<translation id="6407769893376380348"><ph name="FILE_NAME" /> tidak dapat dipindahkan kerana fail tersebut disulitkan.</translation>
 <translation id="642282551015776456">Nama ini tidak boleh digunakan sebagai nama fail atau folder</translation>
 <translation id="6423031066725912715">Vietnam dengan papan kekunci TCVN</translation>
 <translation id="6430271654280079150">Anda mempunyai 1 percubaan lagi.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
index 7092b61..a393c72 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="nl">
 <translation id="1000498691615767391">Selecteer een map om te openen</translation>
+<translation id="1014208178561091457"><ph name="FILE_NAME" /> kan niet worden gekopieerd omdat het is versleuteld.</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> items verwijderen...</translation>
 <translation id="1049926623896334335">Word-document</translation>
 <translation id="1056775291175587022">Geen netwerken</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Map delen met Parallels Desktop</translation>
 <translation id="1439919885608649279">Persoon met bloemen</translation>
 <translation id="1458457385801829801"><ph name="TARGET_NAME" /> verwijderen</translation>
+<translation id="146691674290220697"><ph name="NUMBER_OF_FILES" /> bestanden kunnen niet worden gekopieerd omdat ze zijn versleuteld.</translation>
 <translation id="1471718551822868769">Slowaaks</translation>
 <translation id="1482884275703521657">Fins</translation>
 <translation id="148466539719134488">Zwitsers</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Niet beschikbaar</translation>
 <translation id="3254434849914415189">Kies de standaardapp voor <ph name="FILE_TYPE" />-bestanden:</translation>
 <translation id="3255159654094949700">Arabisch</translation>
+<translation id="326396468955264502"><ph name="NUMBER_OF_FILES" /> bestanden kunnen niet worden verplaatst omdat ze zijn versleuteld.</translation>
 <translation id="3264582393905923483">Context</translation>
 <translation id="3272909651715601089">Kan '<ph name="PATH" />' niet openen</translation>
 <translation id="3280431534455935878">Voorbereiden</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">1 map gedeeld met <ph name="VM_NAME" /></translation>
 <translation id="3524311639100184459">Let op: Deze bestanden zijn tijdelijk en kunnen automatisch worden verwijderd om schijfruimte vrij te maken.  <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Map</translation>
+<translation id="3529424493985988200">Neem contact op met je beheerder voor meer informatie.</translation>
 <translation id="3548125359243647069">Je hebt te vaak een verkeerde pincode opgegeven.</translation>
 <translation id="3549797760399244642">Ga naar drive.google.com...</translation>
 <translation id="3553048479571901246">Als je bestanden wilt openen met <ph name="APP_NAME" />, kopieer je ze eerst naar de bestandsmap van Windows.</translation>
@@ -702,6 +706,7 @@
 <translation id="637062427944097960">Dit bestand is op een ander bureaublad geopend. Verplaats het naar <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) om het te bekijken.</translation>
 <translation id="6394388407447716302">Alleen lezen</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> items</translation>
+<translation id="6407769893376380348"><ph name="FILE_NAME" /> kan niet worden verplaatst omdat het is versleuteld.</translation>
 <translation id="642282551015776456">Deze naam mag niet worden gebruikt als de naam van een bestand of map.</translation>
 <translation id="6423031066725912715">Vietnamees met TCVN-toetsenbord</translation>
 <translation id="6430271654280079150">Je hebt nog 1 poging.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_or.xtb b/ui/chromeos/translations/ui_chromeos_strings_or.xtb
index addbf7d0..a0f9ab4 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_or.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_or.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="or">
 <translation id="1000498691615767391">ଖୋଲିବା ପାଇଁ ଏକ ଫୋଲ୍ଡର୍ ବାଛନ୍ତୁ</translation>
+<translation id="1014208178561091457"><ph name="FILE_NAME" />କୁ ଏନକ୍ରିପ୍ଟ କରାଯାଇଥିବା ଯୋଗୁଁ ଏହାକୁ କପି କରାଯାଇପାରିଲା ନାହିଁ।</translation>
 <translation id="1047956942837015229"><ph name="COUNT" />ଟି ଆଇଟମ୍‍କୁ ଡିଲିଟ୍ କରାଯାଉଛି...</translation>
 <translation id="1049926623896334335">Word ଡକ୍ୟୁମେଣ୍ଟ</translation>
 <translation id="1056775291175587022">ନେଟୱାର୍କ ନାହିଁ</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Parallels Desktop ସହ ଫୋଲ୍ଡର ସେୟାର୍ କରନ୍ତୁ</translation>
 <translation id="1439919885608649279">ଫୁଲଗୁଡ଼ିକ ସହ ଜଣେ ବ୍ୟକ୍ତି</translation>
 <translation id="1458457385801829801"><ph name="TARGET_NAME" />କୁ ବାହାର କରିଦିଅନ୍ତୁ</translation>
+<translation id="146691674290220697"><ph name="NUMBER_OF_FILES" /> ଫାଇଲକୁ ଏନକ୍ରିପ୍ଟ କରାଯାଇଥିବା ଯୋଗୁଁ ସେଗୁଡ଼ିକୁ କପି କରାଯାଇପାରିଲା ନାହିଁ।</translation>
 <translation id="1471718551822868769">ସ୍ଲୋଭାକ୍</translation>
 <translation id="1482884275703521657">ଫିନିଶ୍</translation>
 <translation id="148466539719134488">ସ୍ଵିସ୍</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">ଉପଲବ୍ଧ ନାହିଁ</translation>
 <translation id="3254434849914415189"><ph name="FILE_TYPE" /> ଫାଇଲ୍‍ଗୁଡ଼ିକ ପାଇଁ ଡିଫଲ୍ଟ ଆପ୍‍ ବାଛନ୍ତୁ:</translation>
 <translation id="3255159654094949700">ଆରବିକ୍</translation>
+<translation id="326396468955264502"><ph name="NUMBER_OF_FILES" /> ଫାଇଲକୁ ଏନକ୍ରିପ୍ଟ କରାଯାଇଥିବା ଯୋଗୁଁ ସେଗୁଡ଼ିକୁ ମୁଭ କରାଯାଇପାରିଲା ନାହିଁ।</translation>
 <translation id="3264582393905923483">ପ୍ରସଙ୍ଗ</translation>
 <translation id="3272909651715601089">"<ph name="PATH" />" ଖୋଲାଯାଇପାରିଲା ନାହିଁ</translation>
 <translation id="3280431534455935878">ପ୍ରସ୍ତୁତ ହେଉଛି</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490"><ph name="VM_NAME" /> ସହ 1 ଫୋଲ୍ଡର ସେୟାର କରାଯାଇଛି</translation>
 <translation id="3524311639100184459">ସାବଧାନ: ଏହି ଫାଇଲଗୁଡ଼ିକ ଅସ୍ଥାୟୀ ଅଟେ ଏବଂ ଡିସ୍କରେ ଜାଗା ଖାଲି କରିବା ପାଇଁ ଏଗୁଡ଼ିକ ସ୍ୱଚାଳିତ ଭାବେ ଡିଲିଟ୍ ହୋଇଯାଇପାରେ।  <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">ଫୋଲ୍ଡର୍</translation>
+<translation id="3529424493985988200">ବିବରଣୀ ପାଇଁ ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କୁ କଣ୍ଟାକ୍ଟ କରନ୍ତୁ।</translation>
 <translation id="3548125359243647069">ଏକ ଭୁଲ PIN ବହୁତ ଥର ଲେଖାଯାଇଛି।</translation>
 <translation id="3549797760399244642">drive.google.comକୁ ଯାଆନ୍ତୁ …</translation>
 <translation id="3553048479571901246"><ph name="APP_NAME" /> ମାଧ୍ୟମରେ ଫାଇଲଗୁଡ଼ିକ ଖୋଲିବାକୁ, ପ୍ରଥମେ ସେଗୁଡ଼ିକୁ Windows ଫାଇଲ୍ ଫୋଲ୍ଡରରେ କପି କରନ୍ତୁ।</translation>
@@ -696,6 +700,7 @@
 <translation id="637062427944097960">ଏହି ଫାଇଲ୍‌ଟି ଏକ ଭିନ୍ନ ଡେସ୍କଟପ୍‌ରେ ଖୋଲିଲା। (<ph name="MAIL_ADDRESS" />)କୁ ଦେଖିବା ପାଇଁ <ph name="USER_NAME" />କୁ ଘୁଞ୍ଚାନ୍ତୁ</translation>
 <translation id="6394388407447716302">କେବଳ-ପଢ଼ିବା ପାଇଁ</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" />ଟି ଆଇଟମ୍</translation>
+<translation id="6407769893376380348"><ph name="FILE_NAME" />କୁ ଏନକ୍ରିପ୍ଟ କରାଯାଇଥିବା ଯୋଗୁଁ ଏହାକୁ ମୁଭ କରାଯାଇପାରିଲା ନାହିଁ।</translation>
 <translation id="642282551015776456">ଏହି ନାମ କୌଣସି ଫାଇଲ୍‍ କିମ୍ବା ଫୋଲ୍ଡର୍‌ର ନାମ ଭାବେ ବ୍ୟବହାର କରାଯାଇନପାରେ</translation>
 <translation id="6423031066725912715">TCVN କୀବୋର୍ଡ ସହ ଭିଏତନାମିଜ୍</translation>
 <translation id="6430271654280079150">ଆପଣଙ୍କ ପାଖରେ 1ଟି ପ୍ରଚେଷ୍ଟା ବାକି ଅଛି।</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
index 0d9ee343..adbc68a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
 <translation id="1000498691615767391">Chagua folda ya kufungua</translation>
+<translation id="1014208178561091457"><ph name="FILE_NAME" /> imeshindwa kunakiliwa kwa sababu imesimbwa kwa njia fiche.</translation>
 <translation id="1047956942837015229">Inafuta vipengee <ph name="COUNT" />...</translation>
 <translation id="1049926623896334335">Hati ya Word</translation>
 <translation id="1056775291175587022">Hamna mitandao</translation>
@@ -55,6 +56,7 @@
 <translation id="1435838927755162558">Shiriki folda na Parallels Desktop</translation>
 <translation id="1439919885608649279">Mtu aliye na maua</translation>
 <translation id="1458457385801829801">Ondoa <ph name="TARGET_NAME" /></translation>
+<translation id="146691674290220697">Faili <ph name="NUMBER_OF_FILES" /> zimeshindwa kunakiliwa kwa sababu zimesimbwa kwa njia fiche.</translation>
 <translation id="1471718551822868769">Kislovakia</translation>
 <translation id="1482884275703521657">Kifini</translation>
 <translation id="148466539719134488">Kiswisi</translation>
@@ -276,6 +278,7 @@
 <translation id="3253225298092156258">Haipatikani</translation>
 <translation id="3254434849914415189">Chagua programu chaguomsingi ya faili <ph name="FILE_TYPE" />:</translation>
 <translation id="3255159654094949700">Kiarabu</translation>
+<translation id="326396468955264502">Faili <ph name="NUMBER_OF_FILES" /> zimeshindwa kuhamishwa kwa sababu zimesimbwa kwa njia fiche.</translation>
 <translation id="3264582393905923483">Muktadha</translation>
 <translation id="3272909651715601089">Imeshindwa kufungua "<ph name="PATH" />"</translation>
 <translation id="3280431534455935878">Inaandaa</translation>
@@ -313,6 +316,7 @@
 <translation id="3523225005467146490">Folda 1 imeshirikiwa na <ph name="VM_NAME" /></translation>
 <translation id="3524311639100184459">Tahadhari: Faili hizi ni za muda na huenda zikafutwa kiotomatiki ili upate nafasi zaidi ya hifadhi kwenye diski.  <ph name="BEGIN_LINK" />Pata Maelezo Zaidi<ph name="END_LINK" /></translation>
 <translation id="3527085408025491307">Folda</translation>
+<translation id="3529424493985988200">Wasiliana na msimamizi wako ili upate maelezo.</translation>
 <translation id="3548125359243647069">Umeweka PIN isiyo sahihi mara nyingi mno.</translation>
 <translation id="3549797760399244642">Nenda kwenye drive.google.com...</translation>
 <translation id="3553048479571901246">Ili ufungue faili ukitumia <ph name="APP_NAME" />, zinakili kwanza kwenye folda ya faili za Windows.</translation>
@@ -701,6 +705,7 @@
 <translation id="637062427944097960">Faili hii ilifunguka kwenye eneo-kazi tofauti. Sogea kwenye <ph name="USER_NAME" /> ( <ph name="MAIL_ADDRESS" /> ) ili uione.</translation>
 <translation id="6394388407447716302">Kusoma tu</translation>
 <translation id="6395575651121294044">Faili <ph name="NUMBER_OF_FILES" /></translation>
+<translation id="6407769893376380348"><ph name="FILE_NAME" /> imeshindwa kuhamishwa kwa sababu imesimbwa kwa njia fiche.</translation>
 <translation id="642282551015776456">Jina hili halifai kutumiwe kama faili ya jina la folda</translation>
 <translation id="6423031066725912715">Kivietinamu kwenye kibodi ya TCVN</translation>
 <translation id="6430271654280079150">Umebakisha jaribio 1.</translation>
diff --git a/ui/file_manager/file_manager/foreground/js/actions_model_unittest.ts b/ui/file_manager/file_manager/foreground/js/actions_model_unittest.ts
index d514cbd..773ef89 100644
--- a/ui/file_manager/file_manager/foreground/js/actions_model_unittest.ts
+++ b/ui/file_manager/file_manager/foreground/js/actions_model_unittest.ts
@@ -243,7 +243,7 @@
     });
     saveForOfflineAction.execute();
   });
-  assertTrue(mockMetadataModel.properties['pinned']);
+  assertTrue(mockMetadataModel.properties['pinned']!);
   assertEquals(1, invalidated);
 
   assertEquals(1, countMetricCalls('FileBrowser.DrivePinSuccess'));
@@ -285,7 +285,7 @@
     });
     offlineNotNecessaryAction.execute();
   });
-  assertFalse(mockMetadataModel.properties['pinned']);
+  assertFalse(mockMetadataModel.properties['pinned']!);
   assertEquals(2, invalidated);
 }
 
@@ -307,7 +307,7 @@
   };
   chrome.fileManagerPrivate.pinDriveFile =
       (entry: Entry, pin: boolean, callback: VoidCallback) => {
-        const metadata = mockMetadataModel.getCache([entry])[0];
+        const metadata = mockMetadataModel.getCache([entry])[0]!;
         metadata['pinned'] = pin;
         mockMetadataModel.set(entry, metadata);
         callback();
@@ -349,8 +349,8 @@
     saveForOfflineAction.execute();
   });
 
-  assertTrue(!!mockMetadataModel.getCache([testDocument])[0]['pinned']);
-  assertTrue(!!mockMetadataModel.getCache([testFile])[0]['pinned']);
+  assertTrue(!!mockMetadataModel.getCache([testDocument])[0]!['pinned']);
+  assertTrue(!!mockMetadataModel.getCache([testFile])[0]!['pinned']);
 
   assertEquals(2, countMetricCalls('FileBrowser.DrivePinSuccess'));
   assertEquals(1, countMetricCalls('FileBrowser.DriveHostedFilePinSuccess'));
@@ -380,8 +380,8 @@
     offlineNotNecessaryAction.execute();
   });
 
-  assertFalse(!!mockMetadataModel.getCache([testDocument])[0]['pinned']);
-  assertFalse(!!mockMetadataModel.getCache([testFile])[0]['pinned']);
+  assertFalse(!!mockMetadataModel.getCache([testDocument])[0]!['pinned']);
+  assertFalse(!!mockMetadataModel.getCache([testFile])[0]!['pinned']);
 }
 
 /**
@@ -403,7 +403,7 @@
   };
   chrome.fileManagerPrivate.pinDriveFile =
       (entry: Entry, pin: boolean, callback: VoidCallback) => {
-        const metadata = mockMetadataModel.getCache([entry])[0];
+        const metadata = mockMetadataModel.getCache([entry])[0]!;
         metadata['pinned'] = pin;
         mockMetadataModel.set(entry, metadata);
         callback();
@@ -447,8 +447,8 @@
     saveForOfflineAction.execute();
   });
 
-  assertFalse(!!mockMetadataModel.getCache([testDocument])[0]['pinned']);
-  assertTrue(!!mockMetadataModel.getCache([testFile])[0]['pinned']);
+  assertFalse(!!mockMetadataModel.getCache([testDocument])[0]!['pinned']);
+  assertTrue(!!mockMetadataModel.getCache([testFile])[0]!['pinned']);
 
   assertEquals(1, countMetricCalls('FileBrowser.DrivePinSuccess'));
   assertEquals(0, countMetricCalls('FileBrowser.DriveHostedFilePinSuccess'));
@@ -480,8 +480,8 @@
     offlineNotNecessaryAction.execute();
   });
 
-  assertFalse(!!mockMetadataModel.getCache([testDocument])[0]['pinned']);
-  assertFalse(!!mockMetadataModel.getCache([testFile])[0]['pinned']);
+  assertFalse(!!mockMetadataModel.getCache([testDocument])[0]!['pinned']);
+  assertFalse(!!mockMetadataModel.getCache([testFile])[0]!['pinned']);
 }
 
 /**
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/mock_metadata.js b/ui/file_manager/file_manager/foreground/js/metadata/mock_metadata.js
deleted file mode 100644
index b28ee8f..0000000
--- a/ui/file_manager/file_manager/foreground/js/metadata/mock_metadata.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// @ts-ignore: error TS6133: 'MetadataModel' is declared but its value is never
-// read.
-import {MetadataModel} from './metadata_model.js';
-
-/**
- * Returns a mock of metadata model.
- *
- * @extends {MetadataModel}
- * @final
- */
-export class MockMetadataModel {
-  /** @param {Record<string, any>} initial_properties */
-  constructor(initial_properties) {
-    /**
-     * Dummy properties, which can be overwritten by a test.
-     * @public @const @type {Record<string, any>}
-     */
-    this.properties = initial_properties;
-
-    /**
-     * Per entry properties, which can be set by a test.
-     * @private @const @type {Map<string, Object>}
-     */
-    this.propertiesMap_ = new Map();
-  }
-
-  /** @override */
-  // @ts-ignore: error TS7006: Parameter 'entries' implicitly has an 'any' type.
-  get(entries) {
-    return Promise.resolve(this.getCache(entries));
-  }
-
-  /** @override */
-  // @ts-ignore: error TS7006: Parameter 'entries' implicitly has an 'any' type.
-  getCache(entries) {
-    return entries.map(
-        // @ts-ignore: error TS7006: Parameter 'entry' implicitly has an 'any'
-        // type.
-        entry => this.propertiesMap_.has(entry.toURL()) ?
-            this.propertiesMap_.get(entry.toURL()) :
-            this.properties);
-  }
-
-  /**
-   * @param {Entry} entry
-   * @param {Object} properties
-   */
-  set(entry, properties) {
-    this.propertiesMap_.set(entry.toURL(), properties);
-  }
-
-  /** @override */
-  // @ts-ignore: error TS4121: This member cannot have a JSDoc comment with an
-  // '@override' tag because its containing class 'MockMetadataModel' does not
-  // extend another class.
-  notifyEntriesChanged() {}
-}
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/mock_metadata.ts b/ui/file_manager/file_manager/foreground/js/metadata/mock_metadata.ts
new file mode 100644
index 0000000..4548049
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/metadata/mock_metadata.ts
@@ -0,0 +1,55 @@
+// Copyright 2018 The Chromium Authors
+// 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.js';
+
+import {FilesAppEntry} from '../../../externs/files_app_entry_interfaces.js';
+
+import {MetadataItem} from './metadata_item.js';
+import {MetadataModel} from './metadata_model.js';
+import {MetadataProvider} from './metadata_provider.js';
+import {MetadataRequest} from './metadata_request.js';
+
+/**
+ * Mock metadata provider that doesn't actually do anything just so
+ * MockMetadataModel has an object it can pass to MetadataModel's constructor.
+ */
+class MockMetadataProvider extends MetadataProvider {
+  override get(_requests: MetadataRequest[]): Promise<MetadataItem[]> {
+    assertNotReached('Method not implemented.');
+  }
+}
+
+/**
+ * Returns a mock of metadata model.
+ */
+export class MockMetadataModel extends MetadataModel {
+  /**
+   * Per entry properties, which can be set by a test.
+   */
+  private propertiesMap_: Map<string, MetadataItem> = new Map();
+
+  /**
+   * @param properties Default properties, which can be overwritten by a test.
+   */
+  constructor(public properties: MetadataItem) {
+    super(new MockMetadataProvider([]));
+  }
+
+  override get(entries: Array<Entry|FilesAppEntry>) {
+    return Promise.resolve(this.getCache(entries, []));
+  }
+
+  override getCache(
+      entries: Array<Entry|FilesAppEntry>, _names: string[] = []) {
+    return entries.map(
+        entry => this.propertiesMap_.get(entry.toURL()) || this.properties);
+  }
+
+  set(entry: Entry, properties: MetadataItem) {
+    this.propertiesMap_.set(entry.toURL(), properties);
+  }
+
+  override notifyEntriesChanged() {}
+}
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni
index 5daa93c2..edd872d 100644
--- a/ui/file_manager/file_names.gni
+++ b/ui/file_manager/file_names.gni
@@ -97,7 +97,6 @@
   "file_manager/foreground/js/metadata/metadata_cache_item.js",
   "file_manager/foreground/js/metadata/metadata_cache_set.js",
   "file_manager/foreground/js/metadata/metadata_dispatcher.js",
-  "file_manager/foreground/js/metadata/mock_metadata.js",
   "file_manager/foreground/js/metadata/mpeg_parser.js",
   "file_manager/foreground/js/metadata/multi_metadata_provider.js",
 
@@ -548,6 +547,7 @@
   "file_manager/foreground/js/metadata/exif_parser_unittest.ts",
   "file_manager/foreground/js/metadata/file_system_metadata_provider_unittest.ts",
   "file_manager/foreground/js/metadata/metadata_model_unittest.ts",
+  "file_manager/foreground/js/metadata/mock_metadata.ts",
   "file_manager/foreground/js/metadata/thumbnail_model_unittest.ts",
 ]
 
diff --git a/v8 b/v8
index 802e4ae..f5a2f13 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 802e4aead6e7cf7f12b406e2cdb389334f7d3e3d
+Subproject commit f5a2f13d0f1ece6975deeec43fd83a937bad0cb1