diff --git a/DEPS b/DEPS
index 5484766..aa1ed9c9 100644
--- a/DEPS
+++ b/DEPS
@@ -303,15 +303,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': '79f23e8d8b5d3c602bc2a1081ddb39d3f8085c9e',
+  'skia_revision': '1537198c54612e958cd5262f590adcbb9224bd82',
   # 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': '279e0319cb5e66dbed2cdd32ed1699a3b64a9695',
+  'v8_revision': '0d37babc6f0101301fece0d680cb63f77b27c012',
   # 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': '8f966559277014210094158770d801896d718cab',
+  'angle_revision': 'a1789bef235225f8f5603de9e568923c1f852d8b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -394,7 +394,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': '6f24b5c111c5631de0e094a81be6926d55509167',
+  'devtools_frontend_revision': '0d9654f13ba7bbeabb1136d09401309975720cf8',
   # 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.
@@ -418,11 +418,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '615eeaaaba9ba8b21de204f31d37e8ff075c78f5',
+  'dawn_revision': '498189e2dd635668efd4b5e261f3222cd82141a2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': '1d9a9a0c6189282949fc56613fae3804f6b642c9',
+  'quiche_revision': 'f51e747d3714b8b7bebedb12bef5edfb912ff288',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -450,7 +450,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': '5fee66b487b8845d20efccfe5602bf11329cb7d4',
+  'nearby_revision': '85091845a8471a776df9461d476f733304b13c8e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -462,7 +462,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.
-  'cros_components_revision': 'efb676910c7e96c78bb050ee100e47f4addf23d1',
+  'cros_components_revision': '075d293d1a98cce55cdb88185239126eb64f6d55',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -494,7 +494,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       'dbea8476722304fba54a843659313f2ecf2252c3',
+  'libcxx_revision':       '99f5e4d09e3014e1b178dfd7ebf451e652461ad6',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:85944ebc24a90ec1e489e85a46fdc68542c3146f',
@@ -823,7 +823,7 @@
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + 'c0140ef954e627a2b8b563a465c1518d7fb8e283',
+    'url': Var('chromium_git') + '/website.git' + '@' + 'b62ff6eb4a7f802e6bf27bb9e89248c94f095579',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -847,7 +847,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'fa93c43d0ebc382860647e74fbbd87acddcb5142',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '50dba9a91b59cdc77d7216807576ded5b8f4c65a',
       'condition': 'checkout_ios',
   },
 
@@ -1196,7 +1196,7 @@
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '9a50858ef92b662c0f264a32b6a94c189da5e945',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '2d62a1f2a592e504f9420b3ecd917f0a880295bd',
     'condition': 'checkout_src_internal',
   },
 
@@ -1428,7 +1428,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/kotlin_stdlib',
-              'version': 'QEHg036Jc2HWG4-ao7usl1QUexRidGFFSgqqWUpmK-YC',
+              'version': 'KIU1zubKhCbwM8mZNhGe3NriMr5QZRo3mHdOu4rAYowC',
           },
       ],
       'condition': 'checkout_android',
@@ -1439,7 +1439,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/kotlinc',
-              'version': 'WKNG-_aQcnsBG-F7SS-yUGLlN9roxcWYt1K_8uw27zQC',
+              'version': 'TW-qEGSqERSeeEdITH9I24qeAFvaEkvFIzRTD0n5RIUC',
           },
       ],
       'condition': 'checkout_android',
@@ -1661,7 +1661,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd6dd1afcbdccd18eff2a5992ad7eedaef4a6b4c6',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '84bb6bced2420d2e7bd880cbf30b348448fa95d4',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1843,10 +1843,10 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'f4bf599a8b575df685c31d9c4729a70a04e377ed',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'cd9505da1d631c46cc38b7218c54a4598a4fd802',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'dac947fdd70cf6ec088e1c621f58eaf99430175f',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '3ba809d6a6bc20931adde485bb04586a6556db11',
+    Var('webrtc_git') + '/src.git' + '@' + 'c30fb63f95862e401fb72562ddb6301da3dcbd9d',
 
   # 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.
@@ -2013,7 +2013,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'wYmP2k8JbZSJCVqmxnMfsAIwY-E1vQwaMQinj-NiMHEC',
+        'version': '9_15eZoQyE5HZYDRGjNsUHUKg_jfhYBZRTyePsONtvkC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3949,7 +3949,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        '173f05847ba29e71a934e10d0b8dcc97584e1b1b',
+        'faa64fd015b00924d8c041a05e3c2bd2817bf325',
       'condition': 'checkout_src_internal',
   },
 
@@ -4003,7 +4003,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '3803d9c28df7c8d5121cbc7d09c60a5a5c0c558c',
+        'b65722f17a0133fb4d41b7610dfeb7f04e48f3c1',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
index 63d1d32e..6d36a675 100644
--- a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
+++ b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
@@ -494,5 +494,6 @@
         android:process=":sandboxed_process9"
         android:visibleToInstantApps="true">
     </service>  # DIFF-ANCHOR: e2f3bbbd
+    <uses-library android:name="android.ext.adservices" android:required="false"/>
   </application>
 </manifest>
diff --git a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
index 3c23690..d14d137 100644
--- a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
+++ b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
@@ -494,6 +494,7 @@
         android:process=":sandboxed_process9"
         android:visibleToInstantApps="true">
     </service>  # DIFF-ANCHOR: e2f3bbbd
+    <uses-library android:name="android.ext.adservices" android:required="false"/>
     <uses-static-library android:name="org.chromium.trichromelibrary" android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:version="OFFSET=31"/>
   </application>
 </manifest>
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 2fdeb14..7252b878 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -934,6 +934,8 @@
     "picker/model/picker_category.h",
     "picker/model/picker_model.cc",
     "picker/model/picker_model.h",
+    "picker/model/picker_search_results.cc",
+    "picker/model/picker_search_results.h",
     "picker/picker_controller.cc",
     "picker/picker_controller.h",
     "picker/picker_session_metrics.cc",
diff --git a/ash/ash_element_identifiers.cc b/ash/ash_element_identifiers.cc
index 365b5b1c..d3fa0d1 100644
--- a/ash/ash_element_identifiers.cc
+++ b/ash/ash_element_identifiers.cc
@@ -17,6 +17,8 @@
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kHoldingSpaceTrayElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kHomeButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kLoginUserViewElementId);
+DEFINE_ELEMENT_IDENTIFIER_VALUE(kOverviewDeskBarElementId);
+DEFINE_ELEMENT_IDENTIFIER_VALUE(kOverviewDeskBarNewDeskButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kQuickSettingsSettingsButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kQuickSettingsViewElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSearchBoxViewElementId);
diff --git a/ash/ash_element_identifiers.h b/ash/ash_element_identifiers.h
index 94b74d47..e1af9fb 100644
--- a/ash/ash_element_identifiers.h
+++ b/ash/ash_element_identifiers.h
@@ -40,6 +40,13 @@
 // Uniquely identifies the `LoginUserView`.
 DECLARE_EXPORTED_ELEMENT_IDENTIFIER_VALUE(ASH_EXPORT, kLoginUserViewElementId);
 
+DECLARE_EXPORTED_ELEMENT_IDENTIFIER_VALUE(ASH_EXPORT,
+                                          kOverviewDeskBarElementId);
+
+DECLARE_EXPORTED_ELEMENT_IDENTIFIER_VALUE(
+    ASH_EXPORT,
+    kOverviewDeskBarNewDeskButtonElementId);
+
 DECLARE_EXPORTED_ELEMENT_IDENTIFIER_VALUE(
     ASH_EXPORT,
     kQuickSettingsSettingsButtonElementId);
diff --git a/ash/components/arc/arc_features.cc b/ash/components/arc/arc_features.cc
index 6523644..ba88646 100644
--- a/ash/components/arc/arc_features.cc
+++ b/ash/components/arc/arc_features.cc
@@ -57,6 +57,9 @@
              "ArcNearbyShareFuseBox",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Controls whether to enable support for s2idle in ARCVM.
+BASE_FEATURE(kEnableArcS2Idle, "ArcS2Idle", base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Controls whether to enable ARCVM /data migration. It does not take effect
 // when kEnableVirtioBlkForData is set, in which case virtio-blk is used for
 // /data without going through the migration.
diff --git a/ash/components/arc/arc_features.h b/ash/components/arc/arc_features.h
index f5f8f8da..0fc84c0e 100644
--- a/ash/components/arc/arc_features.h
+++ b/ash/components/arc/arc_features.h
@@ -22,6 +22,7 @@
 extern const base::FeatureParam<bool> kEnableArcIdleManagerIgnoreBatteryForPLT;
 extern const base::FeatureParam<int> kEnableArcIdleManagerDelayMs;
 BASE_DECLARE_FEATURE(kEnableArcNearbyShareFuseBox);
+BASE_DECLARE_FEATURE(kEnableArcS2Idle);
 BASE_DECLARE_FEATURE(kEnableArcVmDataMigration);
 BASE_DECLARE_FEATURE(kEnableLazyWebViewInit);
 BASE_DECLARE_FEATURE(kEnablePerVmCoreScheduling);
diff --git a/ash/components/arc/metrics/arc_wm_metrics.cc b/ash/components/arc/metrics/arc_wm_metrics.cc
index 2714474..4d887ac 100644
--- a/ash/components/arc/metrics/arc_wm_metrics.cc
+++ b/ash/components/arc/metrics/arc_wm_metrics.cc
@@ -6,6 +6,8 @@
 
 #include "ash/constants/app_types.h"
 #include "ash/public/cpp/app_types_util.h"
+#include "ash/root_window_controller.h"
+#include "ash/screen_util.h"
 #include "ash/shell.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/window_state_observer.h"
@@ -43,6 +45,10 @@
 // Histogram of the delay for window state transition when exiting tablet mode.
 constexpr char kWindowExitTabletModeTimeHistogramPrefix[] =
     "Arc.WM.WindowExitTabletModeDelayTimeV2.";
+// Histogram of the delay for window bounds change when display rotates in
+// tablet mode.
+constexpr char kWindowRotateTimeHistogramPrefix[] =
+    "Arc.WM.WindowRotateDelayTime.";
 
 constexpr char kArcHistogramName[] = "ArcApp";
 constexpr char kBrowserHistogramName[] = "Browser";
@@ -193,10 +199,60 @@
   base::OnceClosure window_close_completed_callback_;
 };
 
+// A window observer that records the latency of window bounds change when
+// display rotates in tablet mode.
+class ArcWmMetrics::WindowRotationObserver : public aura::WindowObserver {
+ public:
+  WindowRotationObserver(aura::Window* window, base::OnceClosure callback)
+      : window_(window),
+        window_bounds_changed_completed_callback_(std::move(callback)) {
+    window_observation_.Observe(window);
+  }
+
+  WindowRotationObserver(const WindowRotationObserver&) = delete;
+  WindowRotationObserver& operator=(const WindowRotationObserver) = delete;
+  ~WindowRotationObserver() override = default;
+
+  void OnWindowBoundsChanged(aura::Window* window,
+                             const gfx::Rect& old_bounds,
+                             const gfx::Rect& new_bounds,
+                             ui::PropertyChangeReason reason) override {
+    if (new_bounds ==
+        ash::screen_util::GetMaximizedWindowBoundsInParent(window)) {
+      RecordWindowRotateDelay();
+      std::move(window_bounds_changed_completed_callback_).Run();
+    }
+  }
+
+ private:
+  void RecordWindowRotateDelay() {
+    const ash::AppType app_type =
+        static_cast<ash::AppType>(window_->GetProperty(aura::client::kAppType));
+    base::UmaHistogramCustomTimes(
+        ArcWmMetrics::GetWindowRotateTimeHistogramName(app_type),
+        window_bounds_change_elapsed_timer_.Elapsed(),
+        /*minimum=*/base::Milliseconds(1),
+        /*maximum=*/base::Seconds(2), 100);
+  }
+
+  const raw_ptr<aura::Window, ExperimentalAsh> window_;
+
+  // Tracks the elapsed time from the display rotation happens until the window
+  // bounds is changed.
+  base::ElapsedTimer window_bounds_change_elapsed_timer_;
+  base::ScopedObservation<aura::Window, aura::WindowObserver>
+      window_observation_{this};
+  base::OnceClosure window_bounds_changed_completed_callback_;
+};
+
 ArcWmMetrics::ArcWmMetrics() {
   if (aura::Env::HasInstance()) {
     env_observation_.Observe(aura::Env::GetInstance());
   }
+
+  if (ash::Shell::HasInstance()) {
+    shell_observation_.Observe(ash::Shell::Get());
+  }
 }
 
 ArcWmMetrics::~ArcWmMetrics() = default;
@@ -236,6 +292,13 @@
   return base::StrCat({kWindowExitTabletModeTimeHistogramPrefix, app_type_str});
 }
 
+// static
+std::string ArcWmMetrics::GetWindowRotateTimeHistogramName(
+    ash::AppType app_type) {
+  const std::string app_type_str = GetAppTypeName(app_type);
+  return base::StrCat({kWindowRotateTimeHistogramPrefix, app_type_str});
+}
+
 void ArcWmMetrics::OnWindowInitialized(aura::Window* new_window) {
   ash::AppType app_type = static_cast<ash::AppType>(
       new_window->GetProperty(aura::client::kAppType));
@@ -321,17 +384,31 @@
 void ArcWmMetrics::OnWindowDestroying(aura::Window* window) {
   state_change_observing_windows_.erase(window);
   exiting_tablet_mode_observing_windows_.erase(window);
+  rotation_observing_windows_.erase(window);
   if (window_observations_.IsObservingSource(window)) {
     window_observations_.RemoveObservation(window);
   }
 }
 
 void ArcWmMetrics::OnDisplayTabletStateChanged(display::TabletState state) {
-  if (state == display::TabletState::kInTabletMode ||
-      state == display::TabletState::kInClamshellMode) {
+  if (state == display::TabletState::kInClamshellMode) {
     return;
   }
 
+  // After entering tablet mode, we start observing screen rotation.
+  if (state == display::TabletState::kInTabletMode) {
+    ash::ScreenRotationAnimator* animator =
+        ash::RootWindowController::ForWindow(ash::Shell::GetPrimaryRootWindow())
+            ->GetScreenRotationAnimator();
+    if (animator &&
+        !screen_rotation_observations_.IsObservingSource(animator)) {
+      screen_rotation_observations_.AddObservation(animator);
+    }
+    return;
+  }
+
+  // When entering or exiting tablet mode, we get the top non floated window and
+  // measure the window state change latency for it.
   aura::Window* top_window = ash::window_util::GetTopNonFloatedWindow();
   if (!top_window) {
     return;
@@ -359,11 +436,56 @@
   }
 }
 
+void ArcWmMetrics::OnScreenCopiedBeforeRotation() {
+  if (!display::Screen::GetScreen()->InTabletMode()) {
+    return;
+  }
+
+  aura::Window* top_window = ash::window_util::GetTopNonFloatedWindow();
+  if (!top_window) {
+    return;
+  }
+
+  chromeos::WindowStateType window_state_type =
+      ash::WindowState::Get(top_window)->GetStateType();
+  // We only collect data for the rotation of maximized window.
+  if (window_state_type == chromeos::WindowStateType::kMaximized) {
+    rotation_observing_windows_.emplace(
+        top_window,
+        std::make_unique<WindowRotationObserver>(
+            top_window, base::BindOnce(&ArcWmMetrics::OnWindowRotationCompleted,
+                                       base::Unretained(this), top_window)));
+  }
+}
+
+void ArcWmMetrics::OnScreenRotationAnimationFinished(
+    ash::ScreenRotationAnimator* animator,
+    bool canceled) {
+  rotation_observing_windows_.clear();
+}
+
+void ArcWmMetrics::OnRootWindowWillShutdown(aura::Window* root_window) {
+  if (auto* const animator = ash::RootWindowController::ForWindow(root_window)
+                                 ->GetScreenRotationAnimator();
+      animator && screen_rotation_observations_.IsObservingSource(animator)) {
+    screen_rotation_observations_.RemoveObservation(animator);
+  }
+}
+
+void ArcWmMetrics::OnShellDestroying() {
+  shell_observation_.Reset();
+  screen_rotation_observations_.RemoveAllObservations();
+}
+
 void ArcWmMetrics::OnOperationCompleted(aura::Window* window) {
   state_change_observing_windows_.erase(window);
   exiting_tablet_mode_observing_windows_.erase(window);
 }
 
+void ArcWmMetrics::OnWindowRotationCompleted(aura::Window* window) {
+  rotation_observing_windows_.erase(window);
+}
+
 void ArcWmMetrics::OnWindowCloseRequested(aura::Window* window) {
   close_observing_windows_.emplace(
       window, std::make_unique<WindowCloseObserver>(
diff --git a/ash/components/arc/metrics/arc_wm_metrics.h b/ash/components/arc/metrics/arc_wm_metrics.h
index e92916282..59ae582 100644
--- a/ash/components/arc/metrics/arc_wm_metrics.h
+++ b/ash/components/arc/metrics/arc_wm_metrics.h
@@ -9,6 +9,10 @@
 #include <string>
 
 #include "ash/constants/app_types.h"
+#include "ash/rotator/screen_rotation_animator.h"
+#include "ash/rotator/screen_rotation_animator_observer.h"
+#include "ash/shell.h"
+#include "ash/shell_observer.h"
 #include "base/scoped_multi_source_observation.h"
 #include "base/scoped_observation.h"
 #include "ui/aura/env.h"
@@ -25,6 +29,8 @@
 
 class ArcWmMetrics : public aura::EnvObserver,
                      public aura::WindowObserver,
+                     public ash::ScreenRotationAnimatorObserver,
+                     public ash::ShellObserver,
                      public display::DisplayObserver {
  public:
   ArcWmMetrics();
@@ -44,6 +50,8 @@
   static std::string GetWindowExitTabletModeTimeHistogramName(
       ash::AppType app_type);
 
+  static std::string GetWindowRotateTimeHistogramName(ash::AppType app_type);
+
   // aura::EnvObserver
   void OnWindowInitialized(aura::Window* new_window) override;
 
@@ -56,6 +64,15 @@
   // display::DisplayObserver:
   void OnDisplayTabletStateChanged(display::TabletState state) override;
 
+  // ash::ScreenRotationAnimatorObserver:
+  void OnScreenCopiedBeforeRotation() override;
+  void OnScreenRotationAnimationFinished(ash::ScreenRotationAnimator* animator,
+                                         bool canceled) override;
+
+  // ash::ShellObserver:
+  void OnRootWindowWillShutdown(aura::Window* root_window) override;
+  void OnShellDestroying() override;
+
  private:
   friend class ArcWmMetricsTest;
 
@@ -63,7 +80,10 @@
 
   class WindowCloseObserver;
 
+  class WindowRotationObserver;
+
   void OnOperationCompleted(aura::Window* window);
+  void OnWindowRotationCompleted(aura::Window* window);
 
   void OnWindowCloseRequested(aura::Window* window);
   void OnWindowCloseCompleted(aura::Window* window);
@@ -83,6 +103,11 @@
   base::flat_map<aura::Window*, std::unique_ptr<WindowStateChangeObserver>>
       exiting_tablet_mode_observing_windows_;
 
+  // The map of windows that being observed by WindowRotationObserver and
+  // their corresponding observers.
+  base::flat_map<aura::Window*, std::unique_ptr<WindowRotationObserver>>
+      rotation_observing_windows_;
+
   base::ScopedObservation<aura::Env, aura::EnvObserver> env_observation_{this};
 
   base::ScopedMultiSourceObservation<aura::Window, aura::WindowObserver>
@@ -90,6 +115,13 @@
 
   display::ScopedDisplayObserver display_observer_{this};
 
+  base::ScopedMultiSourceObservation<ash::ScreenRotationAnimator,
+                                     ash::ScreenRotationAnimatorObserver>
+      screen_rotation_observations_{this};
+
+  base::ScopedObservation<ash::Shell, ash::ShellObserver> shell_observation_{
+      this};
+
   base::WeakPtrFactory<ArcWmMetrics> weak_ptr_factory_{this};
 };
 
diff --git a/ash/components/arc/metrics/arc_wm_metrics_unittest.cc b/ash/components/arc/metrics/arc_wm_metrics_unittest.cc
index 16569d6..10ce3bc 100644
--- a/ash/components/arc/metrics/arc_wm_metrics_unittest.cc
+++ b/ash/components/arc/metrics/arc_wm_metrics_unittest.cc
@@ -29,10 +29,24 @@
     arc_wm_metrics_ = std::make_unique<ArcWmMetrics>();
   }
 
+  void TearDown() override {
+    arc_wm_metrics_.reset();
+    ash::AshTestBase::TearDown();
+  }
+
   void OnWindowCloseRequested(aura::Window* window) {
     arc_wm_metrics_->OnWindowCloseRequested(window);
   }
 
+  void OnDisplayRotated() {
+    arc_wm_metrics_->OnScreenCopiedBeforeRotation();
+    display::Display display =
+        display::Screen::GetScreen()->GetPrimaryDisplay();
+    ash::Shell::Get()->display_manager()->SetDisplayRotation(
+        display.id(), display::Display::ROTATE_90,
+        display::Display::RotationSource::USER);
+  }
+
  private:
   std::unique_ptr<ArcWmMetrics> arc_wm_metrics_;
 };
@@ -175,4 +189,20 @@
   histogram_tester.ExpectTotalCount(histogram_name, 1);
 }
 
+TEST_F(ArcWmMetricsTest, TestWindowRotateDelayOnDisplayRotationMetrics) {
+  ash::AppType app_type = ash::AppType::ARC_APP;
+  auto window = CreateAppWindow(gfx::Rect(0, 0, 100, 100), app_type);
+  window->Show();
+
+  base::HistogramTester histogram_tester;
+  const auto histogram_name =
+      ArcWmMetrics::GetWindowRotateTimeHistogramName(app_type);
+  histogram_tester.ExpectTotalCount(histogram_name, 0);
+
+  // UMA only records data when display rotates in tablet mode.
+  ash::TabletModeControllerTestApi().EnterTabletMode();
+  OnDisplayRotated();
+  histogram_tester.ExpectTotalCount(histogram_name, 1);
+}
+
 }  // namespace arc
diff --git a/ash/components/arc/session/arc_vm_client_adapter.cc b/ash/components/arc/session/arc_vm_client_adapter.cc
index fdf84cf8..4b528b1 100644
--- a/ash/components/arc/session/arc_vm_client_adapter.cc
+++ b/ash/components/arc/session/arc_vm_client_adapter.cc
@@ -58,6 +58,7 @@
 #include "base/threading/scoped_blocking_call.h"
 #include "base/time/time.h"
 #include "base/timer/elapsed_timer.h"
+#include "build/build_config.h"
 #include "chromeos/ash/components/cryptohome/cryptohome_parameters.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
 #include "chromeos/ash/components/dbus/debug_daemon/debug_daemon_client.h"
@@ -459,6 +460,12 @@
       base::FeatureList::IsEnabled(kVmmSwapPolicy) ||
       base::FeatureList::IsEnabled(kVmmSwapKeyboardShortcut));
 
+#if defined(ARCH_CPU_X86_64)
+  if (base::FeatureList::IsEnabled(kEnableArcS2Idle)) {
+    request.set_enable_s2idle(true);
+  }
+#endif  // defined(ARCH_CPU_X86_64)
+
   auto orientation = display::PanelOrientation::kNormal;
   if (auto* screen = display::Screen::GetScreen()) {
     const auto display_id = screen->GetPrimaryDisplay().id();
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 6374e06..62222d13 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1332,11 +1332,6 @@
              "GrowthCampaignsInDemoMode",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enables editing with handwriting gestures within the virtual keyboard.
-BASE_FEATURE(kHandwritingGestureEditing,
-             "HandwritingGestureEditing",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Enables new on-device recognition for legacy handwriting input.
 BASE_FEATURE(kHandwritingLegacyRecognition,
              "HandwritingLegacyRecognition",
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 4f8852e..4cf1731 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -433,8 +433,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kGrowthCampaignsInDemoMode);
 COMPONENT_EXPORT(ASH_CONSTANTS)
-BASE_DECLARE_FEATURE(kHandwritingGestureEditing);
-COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kHandwritingLegacyRecognition);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kHomeButtonWithText);
 COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/frame/non_client_frame_view_ash.cc b/ash/frame/non_client_frame_view_ash.cc
index 8936735..569ff27c 100644
--- a/ash/frame/non_client_frame_view_ash.cc
+++ b/ash/frame/non_client_frame_view_ash.cc
@@ -27,6 +27,8 @@
 #include "ui/base/hit_test.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/chromeos/styles/cros_tokens_color_mappings.h"
+#include "ui/display/display_observer.h"
+#include "ui/display/tablet_state.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/geometry/size.h"
@@ -57,7 +59,7 @@
 // instantiated for windows that have no WindowStateDelegate provided.
 class NonClientFrameViewAshImmersiveHelper : public WindowStateObserver,
                                              public aura::WindowObserver,
-                                             public TabletModeObserver {
+                                             public display::DisplayObserver {
  public:
   NonClientFrameViewAshImmersiveHelper(views::Widget* widget,
                                        NonClientFrameViewAsh* custom_frame_view)
@@ -66,8 +68,6 @@
     window_state_->window()->AddObserver(this);
     window_state_->AddObserver(this);
 
-    Shell::Get()->tablet_mode_controller()->AddObserver(this);
-
     immersive_fullscreen_controller_ =
         std::make_unique<ImmersiveFullscreenController>();
     custom_frame_view->InitImmersiveFullscreenControllerForView(
@@ -79,31 +79,33 @@
       const NonClientFrameViewAshImmersiveHelper&) = delete;
 
   ~NonClientFrameViewAshImmersiveHelper() override {
-    if (Shell::Get()->tablet_mode_controller())
-      Shell::Get()->tablet_mode_controller()->RemoveObserver(this);
-
     if (window_state_) {
       window_state_->RemoveObserver(this);
       window_state_->window()->RemoveObserver(this);
     }
   }
 
-  // TabletModeObserver:
-  void OnTabletModeStarted() override {
-    if (window_state_->IsFullscreen())
+  // display::DisplayObserver:
+  void OnDisplayTabletStateChanged(display::TabletState state) override {
+    if (window_state_->IsFullscreen()) {
       return;
-    if (Shell::Get()->tablet_mode_controller()->ShouldAutoHideTitlebars(
-            widget_) &&
-        !window_state_->IsFloated()) {
-      ImmersiveFullscreenController::EnableForWidget(widget_, true);
     }
-  }
 
-  void OnTabletModeEnded() override {
-    if (window_state_->IsFullscreen())
-      return;
-
-    ImmersiveFullscreenController::EnableForWidget(widget_, false);
+    switch (state) {
+      case display::TabletState::kEnteringTabletMode:
+      case display::TabletState::kExitingTabletMode:
+        break;
+      case display::TabletState::kInTabletMode:
+        if (Shell::Get()->tablet_mode_controller()->ShouldAutoHideTitlebars(
+                widget_) &&
+            !window_state_->IsFloated()) {
+          ImmersiveFullscreenController::EnableForWidget(widget_, true);
+        }
+        break;
+      case display::TabletState::kInClamshellMode:
+        ImmersiveFullscreenController::EnableForWidget(widget_, false);
+        break;
+    }
   }
 
  private:
@@ -143,6 +145,7 @@
   raw_ptr<WindowState, ExperimentalAsh> window_state_;
   std::unique_ptr<ImmersiveFullscreenController>
       immersive_fullscreen_controller_;
+  display::ScopedDisplayObserver display_observer_{this};
 };
 
 NonClientFrameViewAsh::NonClientFrameViewAsh(views::Widget* frame)
diff --git a/ash/multi_user/multi_user_window_manager_impl.cc b/ash/multi_user/multi_user_window_manager_impl.cc
index 854fc755..de466c45 100644
--- a/ash/multi_user/multi_user_window_manager_impl.cc
+++ b/ash/multi_user/multi_user_window_manager_impl.cc
@@ -21,6 +21,7 @@
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/base/ui_base_types.h"
+#include "ui/display/tablet_state.h"
 #include "ui/events/event.h"
 #include "ui/wm/core/transient_window_manager.h"
 #include "ui/wm/core/window_animations.h"
@@ -104,7 +105,6 @@
     : delegate_(delegate), current_account_id_(account_id) {
   DCHECK(delegate_);
   g_instance = this;
-  Shell::Get()->tablet_mode_controller()->AddObserver(this);
   Shell::Get()->session_controller()->AddObserver(this);
 }
 
@@ -125,7 +125,6 @@
   }
 
   Shell::Get()->session_controller()->RemoveObserver(this);
-  Shell::Get()->tablet_mode_controller()->RemoveObserver(this);
   g_instance = nullptr;
 }
 
@@ -356,7 +355,12 @@
   }
 }
 
-void MultiUserWindowManagerImpl::OnTabletModeStarted() {
+void MultiUserWindowManagerImpl::OnDisplayTabletStateChanged(
+    display::TabletState state) {
+  if (state != display::TabletState::kInTabletMode) {
+    return;
+  }
+
   for (auto& entry : window_to_entry_)
     Shell::Get()->tablet_mode_controller()->AddWindow(entry.first);
 }
diff --git a/ash/multi_user/multi_user_window_manager_impl.h b/ash/multi_user/multi_user_window_manager_impl.h
index c10a85b6..f029155 100644
--- a/ash/multi_user/multi_user_window_manager_impl.h
+++ b/ash/multi_user/multi_user_window_manager_impl.h
@@ -11,15 +11,19 @@
 #include "ash/ash_export.h"
 #include "ash/public/cpp/multi_user_window_manager.h"
 #include "ash/public/cpp/session/session_observer.h"
-#include "ash/public/cpp/tablet_mode_observer.h"
 #include "base/containers/flat_map.h"
 #include "base/memory/raw_ptr.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
 #include "components/account_id/account_id.h"
 #include "ui/aura/window_observer.h"
+#include "ui/display/display_observer.h"
 #include "ui/wm/core/transient_window_observer.h"
 
+namespace display {
+enum class TabletState;
+}  // namespace display
+
 namespace ash {
 
 class MultiUserWindowManagerDelegate;
@@ -49,7 +53,7 @@
       public SessionObserver,
       public aura::WindowObserver,
       public ::wm::TransientWindowObserver,
-      public TabletModeObserver {
+      public display::DisplayObserver {
  public:
   // The speed which should be used to perform animations.
   enum AnimationSpeed {
@@ -95,8 +99,8 @@
   void OnTransientChildRemoved(aura::Window* window,
                                aura::Window* transient) override;
 
-  // TabletModeObserver:
-  void OnTabletModeStarted() override;
+  // display::DisplayObserver:
+  void OnDisplayTabletStateChanged(display::TabletState state) override;
 
   // Disable any animations for unit tests.
   void SetAnimationSpeedForTest(AnimationSpeed speed);
@@ -229,6 +233,8 @@
 
   // The animation between users.
   std::unique_ptr<UserSwitchAnimator> animation_;
+
+  display::ScopedDisplayObserver display_observer_{this};
 };
 
 }  // namespace ash
diff --git a/ash/picker/model/picker_search_results.cc b/ash/picker/model/picker_search_results.cc
new file mode 100644
index 0000000..ce75af09
--- /dev/null
+++ b/ash/picker/model/picker_search_results.cc
@@ -0,0 +1,36 @@
+// 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 "ash/picker/model/picker_search_results.h"
+
+namespace ash {
+
+PickerSearchResults::Section::Section(const std::u16string& heading,
+                                      base::span<const std::u16string> results)
+    : heading_(heading), results_(results.begin(), results.end()) {}
+
+PickerSearchResults::Section::Section(const Section& other) = default;
+
+PickerSearchResults::Section& PickerSearchResults::Section::operator=(
+    const Section& other) = default;
+
+PickerSearchResults::Section::~Section() = default;
+
+PickerSearchResults::PickerSearchResults(base::span<const Section> sections)
+    : sections_(sections.begin(), sections.end()) {}
+
+PickerSearchResults::PickerSearchResults(const PickerSearchResults& other) =
+    default;
+
+PickerSearchResults& PickerSearchResults::operator=(
+    const PickerSearchResults& other) = default;
+
+PickerSearchResults::~PickerSearchResults() = default;
+
+base::span<const PickerSearchResults::Section> PickerSearchResults::sections()
+    const {
+  return sections_;
+}
+
+}  // namespace ash
diff --git a/ash/picker/model/picker_search_results.h b/ash/picker/model/picker_search_results.h
new file mode 100644
index 0000000..771744e
--- /dev/null
+++ b/ash/picker/model/picker_search_results.h
@@ -0,0 +1,49 @@
+// 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 ASH_PICKER_MODEL_PICKER_SEARCH_RESULTS_H_
+#define ASH_PICKER_MODEL_PICKER_SEARCH_RESULTS_H_
+
+#include <string>
+#include <vector>
+
+#include "ash/ash_export.h"
+#include "base/containers/span.h"
+
+namespace ash {
+
+// The search results for a particular Picker query.
+class ASH_EXPORT PickerSearchResults {
+ public:
+  // Search results are divided into different sections.
+  class Section {
+   public:
+    explicit Section(const std::u16string& heading,
+                     base::span<const std::u16string> results);
+    Section(const Section& other);
+    Section& operator=(const Section& other);
+    ~Section();
+
+   private:
+    std::u16string heading_;
+
+    // TODO(b/310088338): Support result types beyond just literal text.
+    std::vector<std::u16string> results_;
+  };
+
+  explicit PickerSearchResults(base::span<const Section> sections);
+  PickerSearchResults(const PickerSearchResults& other);
+  PickerSearchResults& operator=(const PickerSearchResults& other);
+  ~PickerSearchResults();
+
+  base::span<const Section> sections() const;
+
+ private:
+  // Sections ordered by relevance.
+  std::vector<Section> sections_;
+};
+
+}  // namespace ash
+
+#endif  // ASH_PICKER_MODEL_PICKER_SEARCH_RESULTS_H_
diff --git a/ash/picker/picker_controller.cc b/ash/picker/picker_controller.cc
index df9033e..dbddf431 100644
--- a/ash/picker/picker_controller.cc
+++ b/ash/picker/picker_controller.cc
@@ -7,6 +7,7 @@
 #include <string_view>
 
 #include "ash/constants/ash_switches.h"
+#include "ash/picker/model/picker_search_results.h"
 #include "ash/picker/views/picker_view.h"
 #include "ash/public/cpp/ash_web_view_factory.h"
 #include "ash/public/cpp/picker/picker_client.h"
@@ -30,6 +31,14 @@
     return client_->CreateWebView(params);
   }
 
+  void StartSearch(const std::u16string& query,
+                   SearchResultsCallback callback) override {
+    // TODO(b/310088338): Do a real search.
+    callback.Run(PickerSearchResults({{
+        PickerSearchResults::Section(u"Matching expressions", {{u"👍", u"😊"}}),
+    }}));
+  }
+
  private:
   raw_ptr<PickerClient> client_ = nullptr;
 };
diff --git a/ash/picker/views/picker_search_field_view.cc b/ash/picker/views/picker_search_field_view.cc
index bb303da..b9aa1d9 100644
--- a/ash/picker/views/picker_search_field_view.cc
+++ b/ash/picker/views/picker_search_field_view.cc
@@ -29,8 +29,6 @@
       TypographyToken::kCrosBody2));
   // TODO(b/309706053): Replace this once the strings are finalized.
   textfield_->SetAccessibleName(u"placeholder");
-
-  search_callback_.Run(u"");
 }
 
 PickerSearchFieldView::~PickerSearchFieldView() = default;
diff --git a/ash/picker/views/picker_search_field_view_unittest.cc b/ash/picker/views/picker_search_field_view_unittest.cc
index 17c503f..0cc7e48 100644
--- a/ash/picker/views/picker_search_field_view_unittest.cc
+++ b/ash/picker/views/picker_search_field_view_unittest.cc
@@ -19,12 +19,12 @@
 
 using PickerSearchFieldViewTest = AshTestBase;
 
-TEST_F(PickerSearchFieldViewTest, TriggersSearchOnConstruction) {
+TEST_F(PickerSearchFieldViewTest, DoesNotTriggerSearchOnConstruction) {
   base::test::TestFuture<const std::u16string&> future;
   PickerSessionMetrics metrics;
   PickerSearchFieldView view(future.GetRepeatingCallback(), &metrics);
 
-  EXPECT_EQ(future.Get(), u"");
+  EXPECT_FALSE(future.IsReady());
 }
 
 TEST_F(PickerSearchFieldViewTest, TriggersSearchOnContentsChange) {
@@ -33,7 +33,6 @@
   PickerSessionMetrics metrics;
   auto* view = widget->SetContentsView(std::make_unique<PickerSearchFieldView>(
       future.GetRepeatingCallback(), &metrics));
-  future.Clear();
 
   view->RequestFocus();
   PressAndReleaseKey(ui::KeyboardCode::VKEY_A, ui::EF_NONE);
diff --git a/ash/picker/views/picker_view.cc b/ash/picker/views/picker_view.cc
index f3c6b9b..a151b3b 100644
--- a/ash/picker/views/picker_view.cc
+++ b/ash/picker/views/picker_view.cc
@@ -6,11 +6,11 @@
 
 #include <memory>
 
+#include "ash/picker/model/picker_search_results.h"
 #include "ash/picker/views/picker_contents_view.h"
 #include "ash/picker/views/picker_search_field_view.h"
 #include "ash/picker/views/picker_user_education_view.h"
 #include "ash/picker/views/picker_zero_state_view.h"
-#include "ash/public/cpp/ash_web_view.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/chromeos/styles/cros_tokens_color_mappings.h"
@@ -41,38 +41,28 @@
   return border;
 }
 
-std::unique_ptr<AshWebView> CreateWebView(PickerView::Delegate& delegate) {
-  std::unique_ptr<AshWebView> view =
-      delegate.CreateWebView(AshWebView::InitParams{
-          .rounded_corners = gfx::RoundedCornersF(
-              /*upper_left=*/0, /*upper_right*/ 0,
-              /*lower_right=*/kBorderRadius, /*lower_left=*/kBorderRadius)});
-  view->Navigate(GURL("chrome://picker"));
-  view->SetLayoutManager(std::make_unique<views::FillLayout>());
-  // Fill up all remaining space with the view.
-  return view;
-}
-
 }  // namespace
 
 PickerView::PickerView(std::unique_ptr<Delegate> delegate,
                        const base::TimeTicks trigger_event_timestamp)
-    : session_metrics_(trigger_event_timestamp) {
+    : session_metrics_(trigger_event_timestamp),
+      delegate_(std::move(delegate)) {
   SetShowCloseButton(false);
   SetBackground(views::CreateThemedSolidBackground(kBackgroundColor));
   SetPreferredSize(kPickerSize);
 
   SetLayoutManager(std::make_unique<views::FlexLayout>())
       ->SetOrientation(views::LayoutOrientation::kVertical);
-  // TODO(b/310088250): Perform a search when the search callback is called.
+  // `base::Unretained` is safe here because this class owns
+  // `search_field_view_`.
   search_field_view_ = AddChildView(std::make_unique<PickerSearchFieldView>(
-      base::DoNothing(), &session_metrics_));
+      base::BindRepeating(&PickerView::StartSearch, base::Unretained(this)),
+      &session_metrics_));
   search_field_view_->SetProperty(views::kMarginsKey, kSearchFieldMargins);
 
   // Automatically focus on the search field.
   SetInitiallyFocusedView(search_field_view_);
 
-  zero_state_view_ = AddChildView(std::make_unique<PickerZeroStateView>());
   contents_view_ = AddChildView(std::make_unique<PickerContentsView>());
   contents_view_->SetProperty(
       views::kFlexBehaviorKey,
@@ -80,7 +70,11 @@
                                views::MaximumFlexSizeRule::kUnbounded)
           .WithWeight(1));
 
-  web_view_ = contents_view_->AddPage(CreateWebView(*delegate));
+  zero_state_view_ =
+      contents_view_->AddPage(std::make_unique<PickerZeroStateView>());
+  search_results_view_ =
+      contents_view_->AddPage(std::make_unique<views::View>());
+  contents_view_->SetActivePage(zero_state_view_);
 
   user_education_view_ =
       AddChildView(std::make_unique<PickerUserEducationView>());
@@ -116,6 +110,22 @@
   return frame;
 }
 
+void PickerView::StartSearch(const std::u16string& query) {
+  if (query == u"") {
+    contents_view_->SetActivePage(zero_state_view_);
+  } else {
+    contents_view_->SetActivePage(search_results_view_);
+    // `base::Unretained` is safe here because this class owns `delegate_`.
+    delegate_->StartSearch(
+        query, base::BindRepeating(&PickerView::PublishSearchResults,
+                                   base::Unretained(this)));
+  }
+}
+
+void PickerView::PublishSearchResults(const PickerSearchResults& results) {
+  // TODO(b/310088338): Show results.
+}
+
 BEGIN_METADATA(PickerView, views::View)
 END_METADATA
 
diff --git a/ash/picker/views/picker_view.h b/ash/picker/views/picker_view.h
index 748f7e5..8a4eb87 100644
--- a/ash/picker/views/picker_view.h
+++ b/ash/picker/views/picker_view.h
@@ -24,6 +24,7 @@
 class PickerUserEducationView;
 class PickerZeroStateView;
 class PickerContentsView;
+class PickerSearchResults;
 
 // View for the Picker widget.
 class ASH_EXPORT PickerView : public views::WidgetDelegateView {
@@ -32,9 +33,17 @@
 
   class Delegate {
    public:
+    using SearchResultsCallback =
+        base::RepeatingCallback<void(const PickerSearchResults& results)>;
+
     virtual ~Delegate() {}
     virtual std::unique_ptr<AshWebView> CreateWebView(
         const AshWebView::InitParams& params) = 0;
+
+    // Starts a search for `query`. Results will be returned via `callback`,
+    // which may be called multiples times to update the results.
+    virtual void StartSearch(const std::u16string& query,
+                             SearchResultsCallback callback) = 0;
   };
 
   explicit PickerView(std::unique_ptr<Delegate> delegate,
@@ -55,14 +64,30 @@
   std::unique_ptr<views::NonClientFrameView> CreateNonClientFrameView(
       views::Widget* widget) override;
 
-  const AshWebView& web_view_for_testing() const { return *web_view_; }
+  PickerSearchFieldView& search_field_view_for_testing() {
+    return *search_field_view_;
+  }
+  PickerZeroStateView& zero_state_view_for_testing() {
+    return *zero_state_view_;
+  }
+  views::View& search_results_view_for_testing() {
+    return *search_results_view_;
+  }
 
  private:
+  // Starts a search with `query`, with search results being returned to
+  // `PublishSearchResults`.
+  void StartSearch(const std::u16string& query);
+
+  // Displays `results` in the view.
+  void PublishSearchResults(const PickerSearchResults& results);
+
   PickerSessionMetrics session_metrics_;
+  std::unique_ptr<Delegate> delegate_;
   raw_ptr<PickerSearchFieldView> search_field_view_ = nullptr;
   raw_ptr<PickerContentsView> contents_view_ = nullptr;
-  raw_ptr<AshWebView> web_view_ = nullptr;
   raw_ptr<PickerZeroStateView> zero_state_view_ = nullptr;
+  raw_ptr<views::View> search_results_view_ = nullptr;
   raw_ptr<PickerUserEducationView> user_education_view_ = nullptr;
 };
 
diff --git a/ash/picker/views/picker_view_unittest.cc b/ash/picker/views/picker_view_unittest.cc
index a55b6f8b9..8c89de7e 100644
--- a/ash/picker/views/picker_view_unittest.cc
+++ b/ash/picker/views/picker_view_unittest.cc
@@ -4,6 +4,10 @@
 
 #include "ash/picker/views/picker_view.h"
 
+#include "ash/picker/model/picker_search_results.h"
+#include "ash/picker/views/picker_search_field_view.h"
+#include "ash/picker/views/picker_user_education_view.h"
+#include "ash/picker/views/picker_zero_state_view.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/test_ash_web_view.h"
 #include "ash/test/test_ash_web_view_factory.h"
@@ -17,6 +21,7 @@
 namespace {
 
 using ::testing::ElementsAre;
+using ::testing::Property;
 using ::testing::Truly;
 
 using PickerViewTest = AshTestBase;
@@ -28,6 +33,9 @@
     return ash_web_view_factory_.Create(params);
   }
 
+  void StartSearch(const std::u16string& query,
+                   SearchResultsCallback callback) override {}
+
  private:
   TestAshWebViewFactory ash_web_view_factory_;
 };
@@ -79,14 +87,46 @@
   EXPECT_EQ(view->size(), gfx::Size(420, 480));
 }
 
-TEST_F(PickerViewTest, CreatesWebViewToWebUI) {
+TEST_F(PickerViewTest, ShowsZeroStateView) {
   auto widget =
       PickerView::CreateWidget(std::make_unique<FakePickerViewDelegate>());
   PickerView* view = GetPickerViewFromWidget(*widget);
 
-  const auto& web_view =
-      static_cast<const TestAshWebView&>(view->web_view_for_testing());
-  EXPECT_EQ(web_view.current_url(), GURL("chrome://picker"));
+  EXPECT_THAT(view->search_field_view_for_testing(),
+              Property(&views::View::GetVisible, true));
+  EXPECT_THAT(view->zero_state_view_for_testing(),
+              Property(&views::View::GetVisible, true));
+  EXPECT_THAT(view->search_results_view_for_testing(),
+              Property(&views::View::GetVisible, false));
+}
+
+TEST_F(PickerViewTest, NonEmptySearchFieldContentsSwitchesToSearchResultsView) {
+  auto widget =
+      PickerView::CreateWidget(std::make_unique<FakePickerViewDelegate>());
+  widget->Show();
+  PickerView* view = GetPickerViewFromWidget(*widget);
+
+  PressAndReleaseKey(ui::KeyboardCode::VKEY_A, ui::EF_NONE);
+
+  EXPECT_THAT(view->zero_state_view_for_testing(),
+              Property(&views::View::GetVisible, false));
+  EXPECT_THAT(view->search_results_view_for_testing(),
+              Property(&views::View::GetVisible, true));
+}
+
+TEST_F(PickerViewTest, EmptySearchFieldContentsSwitchesToZeroStateView) {
+  auto widget =
+      PickerView::CreateWidget(std::make_unique<FakePickerViewDelegate>());
+  widget->Show();
+  PickerView* view = GetPickerViewFromWidget(*widget);
+  PressAndReleaseKey(ui::KeyboardCode::VKEY_A, ui::EF_NONE);
+
+  PressAndReleaseKey(ui::KeyboardCode::VKEY_BACK, ui::EF_NONE);
+
+  EXPECT_THAT(view->zero_state_view_for_testing(),
+              Property(&views::View::GetVisible, true));
+  EXPECT_THAT(view->search_results_view_for_testing(),
+              Property(&views::View::GetVisible, false));
 }
 
 }  // namespace
diff --git a/ash/public/cpp/tablet_mode_observer.h b/ash/public/cpp/tablet_mode_observer.h
index e2dae67..44c2e88 100644
--- a/ash/public/cpp/tablet_mode_observer.h
+++ b/ash/public/cpp/tablet_mode_observer.h
@@ -10,27 +10,10 @@
 namespace ash {
 
 // Used to observe tablet mode changes inside ash. Exported for tests.
+// Note: If you want to observe the tablet mode change on display, use
+// display::DisplayObserver::OnDisplayTabletStateChanged().
 class ASH_PUBLIC_EXPORT TabletModeObserver {
  public:
-  // OnTabletModeStarting/Started/Ending/Ended is deprecated. Use
-  // display::DisplayObserver::OnDisplayTabletStateChanged to catch the tablet
-  // mode enterting and exiting.
-  // TODO(crbug.com/1502114): Remove OnTabletModeStarting/Started/Ending/Ended.
-
-  // Called when the tablet mode is about to start.
-  virtual void OnTabletModeStarting() {}
-
-  // Called when the tablet mode has started. Windows might still be animating
-  // though.
-  virtual void OnTabletModeStarted() {}
-
-  // Called when the tablet mode is about to end.
-  virtual void OnTabletModeEnding() {}
-
-  // Called when the tablet mode has ended. Windows may still be animating but
-  // have been restored.
-  virtual void OnTabletModeEnded() {}
-
   // Called when tablet mode blocks or unblocks events. This usually matches,
   // exiting or entering tablet mode, except when an external mouse is
   // connected.
@@ -42,9 +25,9 @@
 
   // Called when the tablet physical state of the device changes (e.g. due to
   // lid angle changes, device attached/detached from base, ... etc.). It's
-  // called before any notifications of UI changes (such as OnTabletModeStarted,
-  // OnTabletModeEnded, ... etc.) that are results of this physical state
-  // change.
+  // called before any notifications of UI changes (such as
+  // display::DisplayObserver::OnDisplayTabletStateChanged etc.) that are
+  // results of this physical state change.
   virtual void OnTabletPhysicalStateChanged() {}
 
  protected:
diff --git a/ash/style/close_button.h b/ash/style/close_button.h
index 9c7ed07..d414cd2 100644
--- a/ash/style/close_button.h
+++ b/ash/style/close_button.h
@@ -5,6 +5,7 @@
 #ifndef ASH_STYLE_CLOSE_BUTTON_H_
 #define ASH_STYLE_CLOSE_BUTTON_H_
 
+#include "ash/ash_export.h"
 #include "ash/style/ash_color_id.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/color/color_id.h"
@@ -20,8 +21,8 @@
 // A circular ImageButton with kCloseButtonIcon inside. It has small, medium and
 // large different sizes. The touch area of the small close button will be
 // expanded.
-class CloseButton : public views::ImageButton,
-                    public views::ViewTargeterDelegate {
+class ASH_EXPORT CloseButton : public views::ImageButton,
+                               public views::ViewTargeterDelegate {
  public:
   METADATA_HEADER(CloseButton);
 
diff --git a/ash/user_education/welcome_tour/welcome_tour_controller.cc b/ash/user_education/welcome_tour/welcome_tour_controller.cc
index 9dea599c..d0386fe 100644
--- a/ash/user_education/welcome_tour/welcome_tour_controller.cc
+++ b/ash/user_education/welcome_tour/welcome_tour_controller.cc
@@ -44,6 +44,7 @@
 #include "ui/base/ui_base_types.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
+#include "ui/display/tablet_state.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/interaction/element_tracker_views.h"
@@ -322,11 +323,12 @@
   MaybeAbortWelcomeTour(welcome_tour_metrics::AbortedReason::kShutdown);
 }
 
-void WelcomeTourController::OnTabletControllerDestroyed() {
-  MaybeAbortWelcomeTour(welcome_tour_metrics::AbortedReason::kShutdown);
-}
+void WelcomeTourController::OnDisplayTabletStateChanged(
+    display::TabletState state) {
+  if (state != display::TabletState::kEnteringTabletMode) {
+    return;
+  }
 
-void WelcomeTourController::OnTabletModeStarting() {
   MaybeAbortWelcomeTour(
       welcome_tour_metrics::AbortedReason::kTabletModeEnabled);
 }
@@ -470,7 +472,7 @@
   nudge_pause_ = SystemNudgePauseManager::Get()->CreateScopedPause();
   scrim_ = std::make_unique<WelcomeTourScrim>();
   shell_observation_.Observe(Shell::Get());
-  tablet_mode_observation_.Observe(TabletMode::Get());
+  display_observation_.Observe(display::Screen::GetScreen());
   toast_pause_ = ToastManager::Get()->CreateScopedPause();
   window_minimizer_ = std::make_unique<WelcomeTourWindowMinimizer>();
 
@@ -506,7 +508,7 @@
   nudge_pause_.reset();
   scrim_.reset();
   shell_observation_.Reset();
-  tablet_mode_observation_.Reset();
+  display_observation_.Reset();
   toast_pause_.reset();
   window_minimizer_.reset();
 
diff --git a/ash/user_education/welcome_tour/welcome_tour_controller.h b/ash/user_education/welcome_tour/welcome_tour_controller.h
index a9b95620..701faee 100644
--- a/ash/user_education/welcome_tour/welcome_tour_controller.h
+++ b/ash/user_education/welcome_tour/welcome_tour_controller.h
@@ -10,8 +10,6 @@
 #include "ash/accessibility/accessibility_observer.h"
 #include "ash/ash_export.h"
 #include "ash/public/cpp/session/session_observer.h"
-#include "ash/public/cpp/tablet_mode.h"
-#include "ash/public/cpp/tablet_mode_observer.h"
 #include "ash/shell_observer.h"
 #include "ash/user_education/user_education_feature_controller.h"
 #include "ash/user_education/welcome_tour/welcome_tour_metrics.h"
@@ -20,6 +18,12 @@
 #include "base/scoped_observation.h"
 #include "base/timer/elapsed_timer.h"
 #include "ui/base/interaction/element_identifier.h"
+#include "ui/display/display_observer.h"
+
+namespace display {
+class Screen;
+enum class TabletState;
+}  // namespace display
 
 namespace user_education {
 struct TutorialDescription;
@@ -45,7 +49,7 @@
                                          public AccessibilityObserver,
                                          public SessionObserver,
                                          public ShellObserver,
-                                         public TabletModeObserver {
+                                         public display::DisplayObserver {
  public:
   WelcomeTourController();
   WelcomeTourController(const WelcomeTourController&) = delete;
@@ -79,9 +83,8 @@
   // ShellObserver:
   void OnShellDestroying() override;
 
-  // TabletModeObserver:
-  void OnTabletControllerDestroyed() override;
-  void OnTabletModeStarting() override;
+  // display::DisplayObserver:
+  void OnDisplayTabletStateChanged(display::TabletState state) override;
 
   // Starts the Welcome Tour if and only if the primary user session is active.
   void MaybeStartWelcomeTour();
@@ -154,10 +157,10 @@
   // not outlive its dependencies.
   base::ScopedObservation<Shell, ShellObserver> shell_observation_{this};
 
-  // Tablet mode is observed only while the Welcome Tour is in progress, and
-  // will trigger an abort of the tour if the device switches to tablet mode.
-  base::ScopedObservation<TabletMode, TabletModeObserver>
-      tablet_mode_observation_{this};
+  // Display is observed only while the Welcome Tour is in progress, and will
+  // trigger an abort of the tour if the device switches to tablet mode.
+  base::ScopedObservation<display::Screen, display::DisplayObserver>
+      display_observation_{this};
 
   // It is theoretically possible for the Welcome Tour tutorial to outlive
   // `this` controller during the destruction sequence.
diff --git a/ash/webui/help_app_ui/BUILD.gn b/ash/webui/help_app_ui/BUILD.gn
index fd5eeaa..9292ec1 100644
--- a/ash/webui/help_app_ui/BUILD.gn
+++ b/ash/webui/help_app_ui/BUILD.gn
@@ -6,7 +6,6 @@
 import("//ash/webui/web_applications/system_apps.gni")
 import("//build/buildflag_header.gni")
 import("//build/config/chromeos/ui_mode.gni")
-import("//chrome/test/base/ash/js2gtest.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//third_party/closure_compiler/compile_js.gni")
 
@@ -107,20 +106,6 @@
   ]
 }
 
-js2gtest("browser_tests_js") {
-  test_type = "mojo_webui"
-
-  sources = [ "test/help_app_ui_gtest_browsertest.js" ]
-
-  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
-
-  deps = [
-    ":browser_test_support",
-    "//ash/constants",
-    "//chromeos/constants",
-  ]
-}
-
 source_set("browser_test_support") {
   testonly = true
   sources = [
@@ -132,6 +117,7 @@
 
   deps = [
     ":help_app_ui",
+    "//ash/public/cpp:cpp",
     "//ash/webui/web_applications/test:test_support",
     "//chrome/test:test_support_ui",
   ]
@@ -178,7 +164,6 @@
   deps = [
     ":test_help_app_guest_ui_browsertest_js",
     ":test_help_app_ui_browsertest_js",
-    ":test_help_app_ui_gtest_browsertest_js",
   ]
 }
 
@@ -208,13 +193,6 @@
   ]
 }
 
-js_library("test_help_app_ui_gtest_browsertest_js") {
-  testonly = true
-  sources = [ "test/help_app_ui_gtest_browsertest.js" ]
-  externs_list = [ "//ash/webui/web_applications/js2gtest_support.externs.js" ]
-  deps = [ ":test_help_app_ui_browsertest_js" ]
-}
-
 js_library("test_help_app_ui_browsertest_js") {
   testonly = true
   sources = [ "test/help_app_ui_browsertest.js" ]
diff --git a/ash/webui/help_app_ui/test/help_app_ui_browsertest.cc b/ash/webui/help_app_ui/test/help_app_ui_browsertest.cc
index 8046b8f..b43f1a04 100644
--- a/ash/webui/help_app_ui/test/help_app_ui_browsertest.cc
+++ b/ash/webui/help_app_ui/test/help_app_ui_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "ash/webui/help_app_ui/test/help_app_ui_browsertest.h"
 
+#include "ash/public/cpp/style/dark_light_mode_controller.h"
 #include "ash/webui/help_app_ui/help_app_ui.h"
 #include "ash/webui/help_app_ui/url_constants.h"
 #include "ash/webui/web_applications/test/sandboxed_web_ui_test_base.h"
@@ -11,19 +12,23 @@
 #include "base/files/file_util.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/path_service.h"
+#include "content/public/test/browser_test.h"
 
 // Path to test files loaded via the TestFileRequestFilter.
 constexpr base::FilePath::CharType kTestFileLocation[] =
     FILE_PATH_LITERAL("ash/webui/help_app_ui/test");
 
-// Test cases that run in the guest context.
+// Test cases that run in the guest (untrusted) context.
 constexpr char kGuestTestCases[] = "help_app_guest_ui_browsertest.js";
 
+// Test cases that run in the host (trusted) context.
+constexpr char kTestHarness[] = "help_app_ui_browsertest.js";
+
 // Paths requested on the media-app origin that should be delivered by the test
 // handler.
 constexpr const char* kTestFiles[] = {
     kGuestTestCases,
-    "help_app_ui_browsertest.js",
+    kTestHarness,
     "driver.js",
     "guest_query_receiver.js",
 };
@@ -32,10 +37,52 @@
     : SandboxedWebUiAppTestBase(ash::kChromeUIHelpAppURL,
                                 ash::kChromeUIHelpAppUntrustedURL,
                                 {},
-                                kGuestTestCases) {
+                                kGuestTestCases,
+                                kTestHarness) {
   ConfigureDefaultTestRequestHandler(
       base::FilePath(kTestFileLocation),
       {std::begin(kTestFiles), std::end(kTestFiles)});
 }
 
 HelpAppUiBrowserTest::~HelpAppUiBrowserTest() = default;
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest, HasChromeSchemeURL) {
+  RunCurrentTest();
+}
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest, HasTitleAndLang) {
+  RunCurrentTest();
+}
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest,
+                       BodyHasCorrectBackgroundColorInDarkMode) {
+  ash::DarkLightModeController::Get()->SetDarkModeEnabledForTest(true);
+  RunCurrentTest();
+}
+
+// Test cases injected into the guest context.
+// See implementations in `help_app_guest_ui_browsertest.js`.
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest, GuestHasLang) {
+  RunCurrentTest("runTestInGuest");
+}
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest, GuestLoadsLoadTimeData) {
+  RunCurrentTest("runTestInGuest");
+}
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest, GuestCanSearchWithHeadings) {
+  RunCurrentTest("runTestInGuest");
+}
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest, GuestCanSearchWithCategories) {
+  RunCurrentTest("runTestInGuest");
+}
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest, GuestCanClearSearchIndex) {
+  RunCurrentTest("runTestInGuest");
+}
+
+IN_PROC_BROWSER_TEST_F(HelpAppUiBrowserTest, GuestCanGetDeviceInfo) {
+  RunCurrentTest("runTestInGuest");
+}
diff --git a/ash/webui/help_app_ui/test/help_app_ui_browsertest.js b/ash/webui/help_app_ui/test/help_app_ui_browsertest.js
index 34c0e76..94efb7ec 100644
--- a/ash/webui/help_app_ui/test/help_app_ui_browsertest.js
+++ b/ash/webui/help_app_ui/test/help_app_ui_browsertest.js
@@ -12,6 +12,7 @@
  */
 import {runTestInGuest} from './driver.js';
 
+const HOST_ORIGIN = 'chrome://help-app';
 const GUEST_ORIGIN = 'chrome-untrusted://help-app';
 
 /** @struct */
@@ -24,8 +25,8 @@
   runTestInGuest,
 };
 
-// Expose an old-style export for js2gtest.
-window['HelpAppUIBrowserTest_for_js2gtest'] = HelpAppUIBrowserTest;
+// Expose an export for tests run through `isolatedTestRunner`.
+window['HelpAppUiBrowserTest'] = HelpAppUIBrowserTest;
 
 // Tests that chrome://help-app goes somewhere instead of 404ing or crashing.
 HelpAppUIBrowserTest.HasChromeSchemeURL = () => {
diff --git a/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js b/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js
deleted file mode 100644
index 469281d..0000000
--- a/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview js2gtest wrapper for the chrome://help-app test suite. Actual
- * test implementations live in help_app_ui_browsertest.js and
- * help_app_guest_ui_browsertest.js.
- */
-GEN('#include "ash/webui/help_app_ui/test/help_app_ui_browsertest.h"');
-
-GEN('#include "ash/constants/ash_features.h"');
-GEN('#include "ash/public/cpp/style/dark_light_mode_controller.h"');
-GEN('#include "content/public/test/browser_test.h"');
-
-const HOST_ORIGIN = 'chrome://help-app';
-
-// js2gtest fixtures require var here (https://crbug.com/1033337).
-// eslint-disable-next-line no-var
-var HelpAppUIGtestBrowserTest = class extends testing.Test {
-  /** @override */
-  get browsePreload() {
-    return HOST_ORIGIN;
-  }
-
-  /** @override */
-  get isAsync() {
-    return true;
-  }
-
-  /** @override */
-  get featureList() {
-    return {
-      enabled: [
-        'ash::features::kHelpAppLauncherSearch',
-      ],
-    };
-  }
-
-  /** @override */
-  get typedefCppFixture() {
-    return 'HelpAppUiBrowserTest';
-  }
-};
-
-// js2gtest fixtures require var here (https://crbug.com/1033337).
-// eslint-disable-next-line no-var
-var HelpAppUIWithDarkModeGtestBrowserTest =
-    class extends HelpAppUIGtestBrowserTest {
-  /** @override */
-  get testGenPreamble() {
-    return () => {
-      // Switch to dark mode.
-      GEN('ash::DarkLightModeController::Get()->SetDarkModeEnabledForTest(true);');
-    };
-  }
-};
-
-async function GetTestHarness() {
-  const testHarnessPolicy = trustedTypes.createPolicy('test-harness', {
-    createScriptURL: () => './help_app_ui_browsertest.js',
-  });
-
-  const tests =
-      /** @type {!HTMLScriptElement} */ (document.createElement('script'));
-  tests.src = testHarnessPolicy.createScriptURL('');
-  tests.type = 'module';
-  await new Promise((resolve, reject) => {
-    tests.onload = resolve;
-    tests.onerror = reject;
-    document.body.appendChild(tests);
-  });
-
-  // When help_app_ui_browsertest.js loads, it will add this onto the window.
-  return window['HelpAppUIBrowserTest_for_js2gtest'];
-}
-
-/**
- * Small helper to run the `name` test function on the `HelpAppUIBrowserTest`
- * object we get from `help_app_ui_browsertest.js`.
- */
-async function runHelpAppTest(name, guest = false) {
-  await import('chrome://webui-test/chromeos/mojo_webui_test_support.js');
-  const HelpAppUIBrowserTest = await GetTestHarness();
-  try {
-    if (guest) {
-      await HelpAppUIBrowserTest.runTestInGuest(name);
-    } else {
-      await HelpAppUIBrowserTest[name]();
-    }
-    testDone();
-  } catch (/* @type {Error} */ error) {
-    let message = 'exception';
-    if (typeof error === 'object' && error !== null && error['message']) {
-      message = error['message'];
-      console.log(error['stack']);
-    } else {
-      console.log(error);
-    }
-    /** @type {function(*)} */ (testDone)([false, message]);
-  }
-}
-
-function runHelpAppTestInGuest(name) {
-  return runHelpAppTest(name, true);
-}
-
-// Ensure every test body has a `TEST_F` call in this file.
-TEST_F('HelpAppUIGtestBrowserTest', 'ConsistencyCheck', async () => {
-  await import('chrome://webui-test/chromeos/mojo_webui_test_support.js');
-  const HelpAppUIBrowserTest = await GetTestHarness();
-  const bodies = {
-    ...(/** @type {{testCaseBodies: Object}} */ (HelpAppUIGtestBrowserTest))
-        .testCaseBodies,
-    ...(/** @type {{testCaseBodies: Object}} */ (
-            HelpAppUIWithDarkModeGtestBrowserTest))
-        .testCaseBodies,
-  };
-  for (const f in HelpAppUIBrowserTest) {
-    if (f === 'runTestInGuest') {
-      continue;
-    }
-    if (!(f in bodies || `DISABLED_${f}` in bodies)) {
-      console.error(
-          `HelpAppUIBrowserTest.${f} is missing a TEST_F and will not be run.`);
-    }
-  }
-  testDone();
-});
-
-TEST_F('HelpAppUIGtestBrowserTest', 'HasChromeSchemeURL', () => {
-  runHelpAppTest('HasChromeSchemeURL');
-});
-
-TEST_F('HelpAppUIGtestBrowserTest', 'HasTitleAndLang', () => {
-  runHelpAppTest('HasTitleAndLang');
-});
-
-TEST_F(
-    'HelpAppUIWithDarkModeGtestBrowserTest',
-    'BodyHasCorrectBackgroundColorInDarkMode', () => {
-      runHelpAppTest('BodyHasCorrectBackgroundColorInDarkMode');
-    });
-
-// Test cases injected into the guest context.
-// See implementations in `help_app_guest_ui_browsertest.js`.
-
-TEST_F('HelpAppUIGtestBrowserTest', 'GuestHasLang', () => {
-  runHelpAppTestInGuest('GuestHasLang');
-});
-
-TEST_F('HelpAppUIGtestBrowserTest', 'GuestLoadsLoadTimeData', () => {
-  runHelpAppTestInGuest('GuestLoadsLoadTimeData');
-});
-
-TEST_F('HelpAppUIGtestBrowserTest', 'GuestCanSearchWithHeadings', () => {
-  runHelpAppTestInGuest('GuestCanSearchWithHeadings');
-});
-
-TEST_F('HelpAppUIGtestBrowserTest', 'GuestCanSearchWithCategories', () => {
-  runHelpAppTestInGuest('GuestCanSearchWithCategories');
-});
-
-TEST_F('HelpAppUIGtestBrowserTest', 'GuestCanClearSearchIndex', () => {
-  runHelpAppTestInGuest('GuestCanClearSearchIndex');
-});
-
-TEST_F('HelpAppUIGtestBrowserTest', 'GuestCanGetDeviceInfo', () => {
-  runHelpAppTestInGuest('GuestCanGetDeviceInfo');
-});
diff --git a/ash/wm/desks/desk_action_view.cc b/ash/wm/desks/desk_action_view.cc
index c35d795..f291470 100644
--- a/ash/wm/desks/desk_action_view.cc
+++ b/ash/wm/desks/desk_action_view.cc
@@ -90,4 +90,4 @@
 BEGIN_METADATA(DeskActionView, views::BoxLayoutView)
 END_METADATA
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/wm/desks/desk_action_view.h b/ash/wm/desks/desk_action_view.h
index e7445f8..4f8ac8e0 100644
--- a/ash/wm/desks/desk_action_view.h
+++ b/ash/wm/desks/desk_action_view.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "ash/ash_export.h"
 #include "ash/style/blurred_background_shield.h"
 #include "base/memory/raw_ptr.h"
 #include "ui/base/metadata/metadata_header_macros.h"
@@ -19,7 +20,8 @@
 
 // A view that holds buttons that act on a single DeskMiniView instance, such as
 // combining two desks or closing a desk and all of its windows.
-class DeskActionView : public views::BoxLayoutView, views::ViewObserver {
+class ASH_EXPORT DeskActionView : public views::BoxLayoutView,
+                                  views::ViewObserver {
  public:
   METADATA_HEADER(DeskActionView);
 
@@ -71,4 +73,4 @@
 
 }  // namespace ash
 
-#endif
\ No newline at end of file
+#endif
diff --git a/ash/wm/desks/desk_bar_view_base.cc b/ash/wm/desks/desk_bar_view_base.cc
index a6cd50e..3b1670dc 100644
--- a/ash/wm/desks/desk_bar_view_base.cc
+++ b/ash/wm/desks/desk_bar_view_base.cc
@@ -6,6 +6,7 @@
 
 #include <vector>
 
+#include "ash/ash_element_identifiers.h"
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
 #include "ash/public/cpp/saved_desk_delegate.h"
 #include "ash/public/cpp/shelf_types.h"
@@ -59,7 +60,7 @@
 #include "ui/views/background.h"
 #include "ui/views/event_monitor.h"
 #include "ui/views/highlight_border.h"
-#include "ui/views/view.h"
+#include "ui/views/view_class_properties.h"
 #include "ui/wm/core/window_animations.h"
 
 namespace ash {
@@ -527,6 +528,8 @@
               type_ == Type::kDeskButton
                   ? DesksCreationRemovalSource::kDeskButtonDeskBarButton
                   : DesksCreationRemovalSource::kButton)));
+  new_desk_button_->SetProperty(views::kElementIdentifierKey,
+                                kOverviewDeskBarNewDeskButtonElementId);
   new_desk_button_label_ =
       scroll_view_contents_->AddChildView(std::make_unique<views::Label>());
   new_desk_button_label_->SetPaintToLayer();
@@ -1252,7 +1255,9 @@
 
 void DeskBarViewBase::OnDeskRemoved(const Desk* desk) {
   DeskNameView::CommitChanges(GetWidget());
-  auto iter = base::ranges::find(mini_views_, desk, &DeskMiniView::desk);
+  auto iter = base::ranges::find_if(
+      mini_views_,
+      [desk](DeskMiniView* mini_view) { return mini_view->desk() == desk; });
 
   // There are cases where a desk may be removed before the `desk_bar_view`
   // finishes initializing (i.e. removed on a separate root window before the
diff --git a/ash/wm/desks/desk_mini_view.cc b/ash/wm/desks/desk_mini_view.cc
index c80e08c..973cefe 100644
--- a/ash/wm/desks/desk_mini_view.cc
+++ b/ash/wm/desks/desk_mini_view.cc
@@ -493,10 +493,6 @@
   }
 }
 
-const char* DeskMiniView::GetClassName() const {
-  return "DeskMiniView";
-}
-
 void DeskMiniView::Layout() {
   const gfx::Rect preview_bounds = GetDeskPreviewBounds(root_window_);
   desk_preview_->SetBoundsRect(preview_bounds);
diff --git a/ash/wm/desks/desk_mini_view.h b/ash/wm/desks/desk_mini_view.h
index 9fa8166e..5a75af5 100644
--- a/ash/wm/desks/desk_mini_view.h
+++ b/ash/wm/desks/desk_mini_view.h
@@ -58,6 +58,7 @@
 
   aura::Window* root_window() { return root_window_; }
 
+  const Desk* desk() const { return desk_; }
   Desk* desk() { return desk_; }
 
   DeskNameView* desk_name_view() { return desk_name_view_; }
@@ -138,7 +139,6 @@
   void OnPreviewAboutToBeFocusedByReverseTab();
 
   // views::View:
-  const char* GetClassName() const override;
   void Layout() override;
   gfx::Size CalculatePreferredSize() const override;
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
diff --git a/ash/wm/desks/desks_test_api.cc b/ash/wm/desks/desks_test_api.cc
index a9799f8..d38581ea4 100644
--- a/ash/wm/desks/desks_test_api.cc
+++ b/ash/wm/desks/desks_test_api.cc
@@ -182,4 +182,10 @@
   run_loop.Run();
 }
 
+// static
+void DesksTestApi::SetDeskBarUiUpdateCallback(DeskBarViewBase* desk_bar_view,
+                                              base::OnceClosure done) {
+  desk_bar_view->on_update_ui_closure_for_testing_ = std::move(done);
+}
+
 }  // namespace ash
diff --git a/ash/wm/desks/desks_test_api.h b/ash/wm/desks/desks_test_api.h
index a3a1ecb..ec0ef83 100644
--- a/ash/wm/desks/desks_test_api.h
+++ b/ash/wm/desks/desks_test_api.h
@@ -74,6 +74,10 @@
 
   // Waits for `desk_bar_view` to finish its UI update.
   static void WaitForDeskBarUiUpdate(DeskBarViewBase* desk_bar_view);
+
+  // Invoke `done` when `desk_bar_view` finishes its UI updates.
+  static void SetDeskBarUiUpdateCallback(DeskBarViewBase* desk_bar_view,
+                                         base::OnceClosure done);
 };
 
 }  // namespace ash
diff --git a/ash/wm/desks/legacy_desk_bar_view.cc b/ash/wm/desks/legacy_desk_bar_view.cc
index e540cc9..ccd9ad8 100644
--- a/ash/wm/desks/legacy_desk_bar_view.cc
+++ b/ash/wm/desks/legacy_desk_bar_view.cc
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 #include "ash/wm/desks/legacy_desk_bar_view.h"
+#include "ash/ash_element_identifiers.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/views/view_class_properties.h"
 
 namespace ash {
 
@@ -13,6 +15,7 @@
 LegacyDeskBarView::LegacyDeskBarView(base::WeakPtr<OverviewGrid> overview_grid)
     : DeskBarViewBase(overview_grid->root_window(),
                       DeskBarViewBase::Type::kOverview) {
+  SetProperty(views::kElementIdentifierKey, kOverviewDeskBarElementId);
   overview_grid_ = overview_grid;
 }
 
diff --git a/ash/wm/tablet_mode/tablet_mode_controller.cc b/ash/wm/tablet_mode/tablet_mode_controller.cc
index ccff601..8ad81e1 100644
--- a/ash/wm/tablet_mode/tablet_mode_controller.cc
+++ b/ash/wm/tablet_mode/tablet_mode_controller.cc
@@ -926,9 +926,6 @@
     Shell::Get()->display_manager()->SetTabletState(
         display::TabletState::kExitingTabletMode);
 
-    for (auto& observer : tablet_mode_observers_)
-      observer.OnTabletModeEnding();
-
     if (tablet_mode_window_manager_)
       tablet_mode_window_manager_->Shutdown();
     tablet_mode_window_manager_.reset();
@@ -937,8 +934,6 @@
     RecordTabletModeUsageInterval(TABLET_MODE_INTERVAL_ACTIVE);
     Shell::Get()->display_manager()->SetTabletState(
         display::TabletState::kInClamshellMode);
-    for (auto& observer : tablet_mode_observers_)
-      observer.OnTabletModeEnded();
     VLOG(1) << "Exit tablet mode.";
 
     UpdateInternalInputDevicesEventBlocker();
@@ -1188,8 +1183,6 @@
   DCHECK_EQ(display::TabletState::kEnteringTabletMode,
             display::Screen::GetScreen()->GetTabletState());
 
-  for (auto& observer : tablet_mode_observers_)
-    observer.OnTabletModeStarting();
   tablet_mode_window_manager_ = std::make_unique<TabletModeWindowManager>();
   tablet_mode_window_manager_->Init();
 
@@ -1198,9 +1191,6 @@
   Shell::Get()->display_manager()->SetTabletState(
       display::TabletState::kInTabletMode);
 
-  for (auto& observer : tablet_mode_observers_)
-    observer.OnTabletModeStarted();
-
   // In some cases, TabletModeWindowManager::TabletModeWindowManager uses
   // split view to represent windows that were snapped in desktop mode. If
   // there is a window snapped on one side but no window snapped on the other
diff --git a/base/allocator/partition_alloc_support.cc b/base/allocator/partition_alloc_support.cc
index 30a9ad30..d17eeb1ff 100644
--- a/base/allocator/partition_alloc_support.cc
+++ b/base/allocator/partition_alloc_support.cc
@@ -1232,8 +1232,6 @@
           base::features::kPartitionAllocLargeEmptySlotSpanRing)) {
     allocator_shim::internal::PartitionAllocMalloc::Allocator()
         ->EnableLargeEmptySlotSpanRing();
-    allocator_shim::internal::PartitionAllocMalloc::AlignedAllocator()
-        ->EnableLargeEmptySlotSpanRing();
   }
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/extended_api.cc b/base/allocator/partition_allocator/src/partition_alloc/extended_api.cc
index f87f071..8d3132b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/extended_api.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/extended_api.cc
@@ -40,14 +40,8 @@
 void DisablePartitionAllocThreadCacheForProcess() {
   PA_CHECK(allocator_shim::internal::PartitionAllocMalloc::
                AllocatorConfigurationFinalized());
-  auto* regular_allocator =
-      allocator_shim::internal::PartitionAllocMalloc::Allocator();
-  auto* aligned_allocator =
-      allocator_shim::internal::PartitionAllocMalloc::AlignedAllocator();
-  DisableThreadCacheForRootIfEnabled(regular_allocator);
-  if (aligned_allocator != regular_allocator) {
-    DisableThreadCacheForRootIfEnabled(aligned_allocator);
-  }
+  DisableThreadCacheForRootIfEnabled(
+      allocator_shim::internal::PartitionAllocMalloc::Allocator());
   DisableThreadCacheForRootIfEnabled(
       allocator_shim::internal::PartitionAllocMalloc::OriginalAllocator());
 }
diff --git a/base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc
index bbe680f..ca52502 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc
@@ -28,7 +28,6 @@
   char* to_corrupt = const_cast<char*>(important_data.c_str());
 
   PartitionOptions opts;
-  opts.aligned_alloc = PartitionOptions::kAllowed;
   PartitionRoot root(opts);
   root.UncapEmptySlotSpanMemoryForTesting();
 
@@ -53,7 +52,6 @@
   char* to_corrupt = const_cast<char*>(important_data.c_str());
 
   PartitionOptions opts;
-  opts.aligned_alloc = PartitionOptions::kAllowed;
   PartitionRoot root(opts);
   root.UncapEmptySlotSpanMemoryForTesting();
 
@@ -74,7 +72,6 @@
 
 TEST(HardeningTest, MetadataPointerCrashing) {
   PartitionOptions opts;
-  opts.aligned_alloc = PartitionOptions::kAllowed;
   PartitionRoot root(opts);
   root.UncapEmptySlotSpanMemoryForTesting();
 
@@ -101,7 +98,6 @@
 
 TEST(HardeningTest, SuccessfulCorruption) {
   PartitionOptions opts;
-  opts.aligned_alloc = PartitionOptions::kAllowed;
   PartitionRoot root(opts);
   root.UncapEmptySlotSpanMemoryForTesting();
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
index 48269da..1242ad0 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
@@ -231,12 +231,11 @@
 
 const size_t kTestAllocSize = 16;
 
+constexpr size_t kPointerOffset = 0;
 #if !BUILDFLAG(PA_DCHECK_IS_ON)
-const size_t kPointerOffset = kPartitionRefCountOffsetAdjustment;
-const size_t kExtraAllocSizeWithoutRefCount = 0ull;
+constexpr size_t kExtraAllocSizeWithoutRefCount = 0ull;
 #else
-const size_t kPointerOffset = kPartitionRefCountOffsetAdjustment;
-const size_t kExtraAllocSizeWithoutRefCount = kCookieSize;
+constexpr size_t kExtraAllocSizeWithoutRefCount = kCookieSize;
 #endif
 
 const char* type_name = nullptr;
@@ -379,7 +378,6 @@
     }
 
     PartitionOptions pkey_opts = GetCommonPartitionOptions();
-    pkey_opts.aligned_alloc = PartitionOptions::kAllowed;
     pkey_opts.thread_isolation = ThreadIsolationOption(pkey_);
     // We always want to have a pkey allocator initialized to make sure that the
     // other pools still work. As part of the initializition, we tag some memory
@@ -400,7 +398,6 @@
 #endif  // BUILDFLAG(ENABLE_PKEYS)
 
     PartitionOptions opts = GetCommonPartitionOptions();
-    opts.aligned_alloc = PartitionOptions::kAllowed;
 #if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
     opts.backup_ref_ptr = enable_backup_ref_ptr;
 #endif
@@ -421,14 +418,6 @@
         PartitionTestOptions{.use_memory_reclaimer = true,
                              .uncap_empty_slot_span_memory = true,
                              .set_bucket_distribution = true});
-
-    PartitionOptions aligned_opts = GetCommonPartitionOptions();
-    aligned_opts.aligned_alloc = PartitionOptions::kAllowed;
-    InitializeTestRoot(
-        aligned_allocator.root(), aligned_opts,
-        PartitionTestOptions{.use_memory_reclaimer = true,
-                             .uncap_empty_slot_span_memory = true,
-                             .set_bucket_distribution = true});
   }
 
   size_t RealAllocSize() const {
@@ -635,9 +624,6 @@
   bool UseBRPPool() const { return allocator.root()->brp_enabled(); }
 
   partition_alloc::PartitionAllocatorForTesting allocator;
-  // TODO(bartekn): Remove. We no longer have partitions that don't support
-  // aligned alloc, so no need for a special aligned allocator.
-  partition_alloc::PartitionAllocatorForTesting aligned_allocator;
 #if BUILDFLAG(ENABLE_PKEYS)
   partition_alloc::PartitionAllocatorForTesting pkey_allocator;
 #endif
@@ -3852,7 +3838,6 @@
   for (size_t alloc_size : alloc_sizes) {
     for (size_t alignment = 1; alignment <= kMaxSupportedAlignment;
          alignment <<= 1) {
-      VerifyAlignment(aligned_allocator.root(), alloc_size, alignment);
       VerifyAlignment(allocator.root(), alloc_size, alignment);
     }
   }
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc
index b68461a..eda13c53 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc
@@ -22,10 +22,8 @@
 void DCheckIsValidShiftFromSlotStart(internal::SlotSpanMetadata* slot_span,
                                      uintptr_t shift_from_slot_start) {
   PartitionRoot* root = PartitionRoot::FromSlotSpan(slot_span);
-  PA_DCHECK(shift_from_slot_start >= root->settings.extras_offset);
   // Use <= to allow an address immediately past the object.
-  PA_DCHECK(shift_from_slot_start <=
-            root->settings.extras_offset + root->GetSlotUsableSize(slot_span));
+  PA_DCHECK(shift_from_slot_start <= root->GetSlotUsableSize(slot_span));
 }
 
 void DCheckIsWithInSuperPagePayload(uintptr_t address) {
@@ -39,9 +37,8 @@
 void DCheckIsValidObjectAddress(internal::SlotSpanMetadata* slot_span,
                                 uintptr_t object_addr) {
   uintptr_t slot_span_start = SlotSpanMetadata::ToSlotSpanStart(slot_span);
-  auto* root = PartitionRoot::FromSlotSpan(slot_span);
   PA_DCHECK((object_addr - slot_span_start) % slot_span->bucket->slot_size ==
-            root->settings.extras_offset);
+            0);
 }
 
 void DCheckNumberOfPartitionPagesInSuperPagePayload(
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h b/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h
index e1f368a..73c1fdc7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h
@@ -52,8 +52,7 @@
                                      size_t shift_from_slot_start)
     PA_EMPTY_BODY_IF_DCHECK_IS_OFF();
 
-// Checks that the object is exactly |extras_offset| away from a multiple of
-// slot size (i.e. from a slot start).
+// Checks that the object is a multiple of slot size (i.e. at a slot start).
 PA_EXPORT_IF_DCHECK_IS_ON()
 void DCheckIsValidObjectAddress(internal::SlotSpanMetadata* slot_span,
                                 uintptr_t object_addr)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h b/base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h
index df766e7..a3d5585 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h
@@ -398,7 +398,6 @@
 // Allocate extra space for the reference count to satisfy the alignment
 // requirement.
 static constexpr size_t kInSlotRefCountBufferSize = sizeof(PartitionRefCount);
-constexpr size_t kPartitionRefCountOffsetAdjustment = 0;
 constexpr size_t kPartitionPastAllocationAdjustment = 0;
 
 #if BUILDFLAG(ENABLE_DANGLING_RAW_PTR_CHECKS)
@@ -474,7 +473,6 @@
 #else  // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
 
 static constexpr size_t kInSlotRefCountBufferSize = 0;
-constexpr size_t kPartitionRefCountOffsetAdjustment = 0;
 
 #endif  // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
 
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 5b120806..b19aba1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
@@ -972,8 +972,6 @@
     ReserveBackupRefPtrGuardRegionIfNeeded();
 #endif
 
-    settings.allow_aligned_alloc =
-        opts.aligned_alloc == PartitionOptions::kAllowed;
 #if BUILDFLAG(PA_DCHECK_IS_ON)
     settings.use_cookie = true;
 #else
@@ -1036,7 +1034,6 @@
 
 #if PA_CONFIG(EXTRAS_REQUIRED)
     settings.extras_size = 0;
-    settings.extras_offset = 0;
 
     if (settings.use_cookie) {
       settings.extras_size += internal::kPartitionCookieSizeAdjustment;
@@ -1060,15 +1057,9 @@
 #endif  // PA_CONFIG(INCREASE_REF_COUNT_SIZE_FOR_MTE)
       PA_CHECK(internal::kPartitionRefCountSizeAdjustment <= ref_count_size);
       settings.extras_size += ref_count_size;
-      settings.extras_offset += internal::kPartitionRefCountOffsetAdjustment;
     }
 #endif  // PA_CONFIG(EXTRAS_REQUIRED)
 
-    // Re-confirm the above PA_CHECKs, by making sure there are no
-    // pre-allocation extras when AlignedAlloc is allowed. Post-allocation
-    // extras are ok.
-    PA_CHECK(!settings.allow_aligned_alloc || !settings.extras_offset);
-
     settings.quarantine_mode =
 #if BUILDFLAG(USE_STARSCAN)
         (opts.star_scan_quarantine == PartitionOptions::kDisallowed
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_root.h b/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
index dbde3aab..788e49ca 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
@@ -166,16 +166,6 @@
   static constexpr auto kDisabled = EnableToggle::kDisabled;
   static constexpr auto kEnabled = EnableToggle::kEnabled;
 
-  // By default all allocations will be aligned to `kAlignment`,
-  // likely to be 8B or 16B depending on platforms and toolchains.
-  // AlignedAlloc() allows to enforce higher alignment.
-  // This option determines whether it is supported for the partition.
-  // Allowing AlignedAlloc() comes at a cost of disallowing extras in front
-  // of the allocation.
-  // TODO(bartekn): Remove. We no longer have a need for partitions that don't
-  // support aligned alloc.
-  AllowToggle aligned_alloc = kDisallowed;
-
   EnableToggle thread_cache = kDisabled;
   AllowToggle star_scan_quarantine = kDisallowed;
   EnableToggle backup_ref_ptr = kDisabled;
@@ -265,7 +255,6 @@
 
     bool with_thread_cache = false;
 
-    bool allow_aligned_alloc = false;
 #if BUILDFLAG(PA_DCHECK_IS_ON)
     bool use_cookie = false;
 #else
@@ -299,12 +288,10 @@
 
 #if PA_CONFIG(EXTRAS_REQUIRED)
     uint32_t extras_size = 0;
-    uint32_t extras_offset = 0;
 #else
     // Teach the compiler that code can be optimized in builds that use no
     // extras.
     static inline constexpr uint32_t extras_size = 0;
-    static inline constexpr uint32_t extras_offset = 0;
 #endif  // PA_CONFIG(EXTRAS_REQUIRED)
   };
 
@@ -827,7 +814,7 @@
 
   PA_ALWAYS_INLINE uintptr_t SlotStartToObjectAddr(uintptr_t slot_start) const {
     // TODO(bartekn): Check that |slot_start| is indeed a slot start.
-    return slot_start + settings.extras_offset;
+    return slot_start;
   }
 
   PA_ALWAYS_INLINE void* SlotStartToObject(uintptr_t slot_start) const {
@@ -843,12 +830,12 @@
   }
 
   PA_ALWAYS_INLINE uintptr_t ObjectToSlotStart(void* object) const {
-    return UntagPtr(object) - settings.extras_offset;
+    return UntagPtr(object);
     // TODO(bartekn): Check that the result is indeed a slot start.
   }
 
   PA_ALWAYS_INLINE uintptr_t ObjectToTaggedSlotStart(void* object) const {
-    return reinterpret_cast<uintptr_t>(object) - settings.extras_offset;
+    return reinterpret_cast<uintptr_t>(object);
     // TODO(bartekn): Check that the result is indeed a slot start.
   }
 
@@ -2315,12 +2302,12 @@
   // particularly if these allocations are back to back.
   // TODO(bartekn): We should check that this is not causing issues in practice.
   //
-  // Extras before the allocation are forbidden as they shift the returned
-  // allocation from the beginning of the slot, thus messing up alignment.
-  // Extras after the allocation are acceptable, but they have to be taken into
-  // account in the request size calculation to avoid crbug.com/1185484.
-  PA_DCHECK(settings.allow_aligned_alloc);
-  PA_DCHECK(!settings.extras_offset);
+  // This relies on the fact that there are no extras before the allocation, as
+  // they'd shift the returned allocation from the beginning of the slot, thus
+  // messing up alignment. Extras after the allocation are acceptable, but they
+  // have to be taken into account in the request size calculation to avoid
+  // crbug.com/1185484.
+
   // This is mandated by |posix_memalign()|, so should never fire.
   PA_CHECK(std::has_single_bit(alignment));
   // Catch unsupported alignment requests early.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
index 79fb4ca95..71b5dcfe 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -155,7 +155,6 @@
         partition_alloc::PartitionOptions::kDisabled;
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
     partition_alloc::PartitionOptions opts;
-    opts.aligned_alloc = partition_alloc::PartitionOptions::kAllowed;
     opts.thread_cache = thread_cache;
     opts.star_scan_quarantine = partition_alloc::PartitionOptions::kAllowed;
     opts.backup_ref_ptr = partition_alloc::PartitionOptions::kDisabled;
@@ -176,26 +175,10 @@
 
 std::atomic<bool> g_roots_finalized = false;
 
-class AlignedPartitionConstructor {
- public:
-  static partition_alloc::PartitionRoot* New(void* buffer) {
-    return g_root.Get();
-  }
-};
-
-// TODO(bartekn): Remove. Main partition now always supports aligned alloc, so
-// no need for dedicated partition.
-LeakySingleton<partition_alloc::PartitionRoot, AlignedPartitionConstructor>
-    g_aligned_root PA_CONSTINIT = {};
-
 partition_alloc::PartitionRoot* OriginalAllocator() {
   return g_original_root.load(std::memory_order_relaxed);
 }
 
-partition_alloc::PartitionRoot* AlignedAllocator() {
-  return g_aligned_root.Get();
-}
-
 bool AllocatorConfigurationFinalized() {
   return g_roots_finalized.load();
 }
@@ -203,21 +186,12 @@
 void* AllocateAlignedMemory(size_t alignment, size_t size) {
   // Memory returned by the regular allocator *always* respects |kAlignment|,
   // which is a power of two, and any valid alignment is also a power of two. So
-  // we can directly fulfill these requests with the main allocator.
-  //
-  // This has several advantages:
-  // - The thread cache is supported on the main partition
-  // - Reduced fragmentation
-  // - Better coverage for MiraclePtr variants requiring extras
+  // we can directly fulfill these requests with the regular Alloc function.
   //
   // There are several call sites in Chromium where base::AlignedAlloc is called
   // with a small alignment. Some may be due to overly-careful code, some are
   // because the client code doesn't know the required alignment at compile
   // time.
-  //
-  // Note that all "AlignedFree()" variants (_aligned_free() on Windows for
-  // instance) directly call PartitionFree(), so there is no risk of
-  // mismatch. (see below the default_dispatch definition).
   if (alignment <= partition_alloc::internal::kAlignment) {
     // This is mandated by |posix_memalign()| and friends, so should never fire.
     PA_CHECK(std::has_single_bit(alignment));
@@ -227,9 +201,8 @@
         size);
   }
 
-  return AlignedAllocator()
-      ->AlignedAllocInline<partition_alloc::AllocFlags::kNoHooks>(alignment,
-                                                                  size);
+  return Allocator()->AlignedAllocInline<partition_alloc::AllocFlags::kNoHooks>(
+      alignment, size);
 }
 
 }  // namespace
@@ -500,11 +473,6 @@
   return ::OriginalAllocator();
 }
 
-// static
-partition_alloc::PartitionRoot* PartitionAllocMalloc::AlignedAllocator() {
-  return ::AlignedAllocator();
-}
-
 }  // namespace allocator_shim::internal
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
@@ -524,7 +492,6 @@
   // registered for memory reclaimer there.
   PA_DCHECK(!AllocatorConfigurationFinalized());
   PA_DCHECK(OriginalAllocator() == nullptr);
-  PA_DCHECK(AlignedAllocator() == Allocator());
 }
 
 void ConfigurePartitions(
@@ -543,12 +510,10 @@
   // out the aligned partition.
   PA_CHECK(!enable_brp || split_main_partition);
 
-  // Calling Get() is actually important, even if the return values weren't
-  // used, because it has a side effect of initializing the variables, if they
-  // weren't already.
+  // Calling Get() is actually important, even if the return value isn't
+  // used, because it has a side effect of initializing the variable, if it
+  // wasn't already.
   auto* current_root = g_root.Get();
-  auto* current_aligned_root = g_aligned_root.Get();
-  PA_DCHECK(current_root == current_aligned_root);
 
   if (!split_main_partition) {
     switch (distribution) {
@@ -575,7 +540,6 @@
       partition_alloc::PartitionAllocator>
       new_main_allocator([&]() {
         partition_alloc::PartitionOptions opts;
-        opts.aligned_alloc = partition_alloc::PartitionOptions::kAllowed;
         opts.thread_cache = partition_alloc::PartitionOptions::kDisabled;
         opts.star_scan_quarantine = partition_alloc::PartitionOptions::kAllowed;
         opts.backup_ref_ptr =
@@ -603,16 +567,10 @@
       }());
   partition_alloc::PartitionRoot* new_root = new_main_allocator->root();
 
-  // Now switch traffic to the new partitions.
-  // The new main root can also support AlignedAlloc.
+  // Now switch traffic to the new partition.
   g_original_root = current_root;
-  g_aligned_root.Replace(new_root);
   g_root.Replace(new_root);
 
-  // No need for g_original_aligned_root, because in cases where g_aligned_root
-  // is replaced, it must've been g_original_root.
-  PA_CHECK(current_aligned_root == g_original_root);
-
   // Purge memory, now that the traffic to the original partition is cut off.
   current_root->PurgeMemory(
       partition_alloc::PurgeFlags::kDecommitEmptySlotSpans |
@@ -681,10 +639,6 @@
     partition_alloc::internal::PCScan::RegisterScannableRoot(
         OriginalAllocator());
   }
-  if (Allocator() != AlignedAllocator()) {
-    partition_alloc::internal::PCScan::RegisterScannableRoot(
-        AlignedAllocator());
-  }
 
   allocator_shim::NonScannableAllocator::Instance().NotifyPCScanEnabled();
   allocator_shim::NonQuarantinableAllocator::Instance().NotifyPCScanEnabled();
@@ -754,13 +708,6 @@
   partition_alloc::SimplePartitionStatsDumper allocator_dumper;
   Allocator()->DumpStats("malloc", true, &allocator_dumper);
   // TODO(bartekn): Dump OriginalAllocator() into "malloc" as well.
-
-  partition_alloc::SimplePartitionStatsDumper aligned_allocator_dumper;
-  if (AlignedAllocator() != Allocator()) {
-    AlignedAllocator()->DumpStats("posix_memalign", true,
-                                  &aligned_allocator_dumper);
-  }
-
   // Dump stats for nonscannable and nonquarantinable allocators.
   auto& nonscannable_allocator =
       allocator_shim::NonScannableAllocator::Instance();
@@ -784,21 +731,18 @@
   info.hblks =
       partition_alloc::internal::base::checked_cast<decltype(info.hblks)>(
           allocator_dumper.stats().total_mmapped_bytes +
-          aligned_allocator_dumper.stats().total_mmapped_bytes +
           nonscannable_allocator_dumper.stats().total_mmapped_bytes +
           nonquarantinable_allocator_dumper.stats().total_mmapped_bytes);
   // Resident bytes.
   info.hblkhd =
       partition_alloc::internal::base::checked_cast<decltype(info.hblkhd)>(
           allocator_dumper.stats().total_resident_bytes +
-          aligned_allocator_dumper.stats().total_resident_bytes +
           nonscannable_allocator_dumper.stats().total_resident_bytes +
           nonquarantinable_allocator_dumper.stats().total_resident_bytes);
   // Allocated bytes.
   info.uordblks =
       partition_alloc::internal::base::checked_cast<decltype(info.uordblks)>(
           allocator_dumper.stats().total_active_bytes +
-          aligned_allocator_dumper.stats().total_active_bytes +
           nonscannable_allocator_dumper.stats().total_active_bytes +
           nonquarantinable_allocator_dumper.stats().total_active_bytes);
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
index e753737..7613079 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
@@ -23,8 +23,6 @@
   static partition_alloc::PartitionRoot* Allocator();
   // May return |nullptr|, will never return the same pointer as |Allocator()|.
   static partition_alloc::PartitionRoot* OriginalAllocator();
-  // May return the same pointer as |Allocator()|.
-  static partition_alloc::PartitionRoot* AlignedAllocator();
 };
 
 PA_COMPONENT_EXPORT(ALLOCATOR_SHIM)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
index 6d75fe1..ef2bec3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
@@ -184,9 +184,6 @@
   EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(
                     PartitionAllocMalloc::OriginalAllocator()) %
                     alignof(partition_alloc::PartitionRoot));
-  EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(
-                    PartitionAllocMalloc::AlignedAllocator()) %
-                    alignof(partition_alloc::PartitionRoot));
 }
 
 #if BUILDFLAG(IS_APPLE) && BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_unittest.cc
index b26ca89..7c203b7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_unittest.cc
@@ -53,7 +53,6 @@
   PartitionAllocPCScanTestBase()
       : allocator_([]() {
           PartitionOptions opts;
-          opts.aligned_alloc = PartitionOptions::kAllowed;
           opts.star_scan_quarantine = PartitionOptions::kAllowed;
           opts.memory_tagging = {
               .enabled = base::CPU::GetInstanceNoAllocation().has_mte()
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc
index cee8e29..435b82cf 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc
@@ -61,7 +61,6 @@
 // Forbid extras, since they make finding out which bucket is used harder.
 std::unique_ptr<PartitionAllocatorForTesting> CreateAllocator() {
   PartitionOptions opts;
-  opts.aligned_alloc = PartitionOptions::kAllowed;
 #if !BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
   opts.thread_cache = PartitionOptions::kEnabled;
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
@@ -275,7 +274,6 @@
 
 TEST_P(PartitionAllocThreadCacheTest, NoCrossPartitionCache) {
   PartitionOptions opts;
-  opts.aligned_alloc = PartitionOptions::kAllowed;
   opts.star_scan_quarantine = PartitionOptions::kAllowed;
   PartitionAllocatorForTesting allocator(opts);
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc
index 7e9ec5c..5cd7314 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc
@@ -113,7 +113,6 @@
 
     isolated_globals.allocator->init([]() {
       partition_alloc::PartitionOptions opts;
-      opts.aligned_alloc = PartitionOptions::kAllowed;
       opts.thread_isolation = ThreadIsolationOption(isolated_globals.pkey);
       return opts;
     }());
diff --git a/base/memory/safety_checks.h b/base/memory/safety_checks.h
index 90d02b3..47e98db 100644
--- a/base/memory/safety_checks.h
+++ b/base/memory/safety_checks.h
@@ -119,11 +119,6 @@
 GetPartitionRootForMemorySafetyCheckedAllocation() {
   return allocator_shim::internal::PartitionAllocMalloc::Allocator();
 }
-
-ALWAYS_INLINE partition_alloc::PartitionRoot*
-GetAlignedPartitionRootForMemorySafetyCheckedAllocation() {
-  return allocator_shim::internal::PartitionAllocMalloc::AlignedAllocator();
-}
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 
 template <MemorySafetyCheck checks>
@@ -145,7 +140,7 @@
     std::align_val_t alignment) {
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
   if constexpr (ShouldUsePartitionAlloc(checks)) {
-    return GetAlignedPartitionRootForMemorySafetyCheckedAllocation()
+    return GetPartitionRootForMemorySafetyCheckedAllocation()
         ->AlignedAlloc<GetAllocFlags(checks)>(static_cast<size_t>(alignment),
                                               count);
   } else
@@ -174,7 +169,7 @@
     std::align_val_t alignment) {
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
   if constexpr (ShouldUsePartitionAlloc(checks)) {
-    GetAlignedPartitionRootForMemorySafetyCheckedAllocation()
+    GetPartitionRootForMemorySafetyCheckedAllocation()
         ->Free<GetFreeFlags(checks)>(ptr);
   } else
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
diff --git a/base/trace_event/malloc_dump_provider.cc b/base/trace_event/malloc_dump_provider.cc
index b573535..74f967f 100644
--- a/base/trace_event/malloc_dump_provider.cc
+++ b/base/trace_event/malloc_dump_provider.cc
@@ -133,12 +133,6 @@
     original_allocator->DumpStats("original", is_light_dump,
                                   &partition_stats_dumper);
   }
-  auto* aligned_allocator =
-      allocator_shim::internal::PartitionAllocMalloc::AlignedAllocator();
-  if (aligned_allocator != allocator) {
-    aligned_allocator->DumpStats("aligned", is_light_dump,
-                                 &partition_stats_dumper);
-  }
   auto& nonscannable_allocator =
       allocator_shim::NonScannableAllocator::Instance();
   if (auto* root = nonscannable_allocator.root())
diff --git a/base/trace_event/memory_usage_estimator.h b/base/trace_event/memory_usage_estimator.h
index 1f1fa06..d194ce89 100644
--- a/base/trace_event/memory_usage_estimator.h
+++ b/base/trace_event/memory_usage_estimator.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include <array>
+#include <concepts>
 #include <deque>
 #include <list>
 #include <map>
@@ -31,6 +32,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/stl_util.h"
 #include "base/template_util.h"
+#include "base/types/always_false.h"
 
 // Composable memory usage estimators.
 //
@@ -203,122 +205,69 @@
 
 namespace internal {
 
-// HasEMU<T>::value is true iff EstimateMemoryUsage(T) is available.
-// (This is the default version, which is false.)
-template <class T, class X = void>
-struct HasEMU : std::false_type {};
-
-// This HasEMU specialization is only picked up if there exists function
-// EstimateMemoryUsage(const T&) that returns size_t. Simpler ways to
-// achieve this don't work on MSVC.
-template <class T>
-struct HasEMU<T,
-              std::enable_if_t<std::is_same_v<size_t,
-                                              decltype(EstimateMemoryUsage(
-                                                  std::declval<const T&>()))>>>
-    : std::true_type {};
-
-// EMUCaller<T> does three things:
-// 1. Defines Call() method that calls EstimateMemoryUsage(T) if it's
-//    available.
-// 2. If EstimateMemoryUsage(T) is not available, but T has trivial dtor
-//    (i.e. it's POD, integer, pointer, enum, etc.) then it defines Call()
-//    method that returns 0. This is useful for containers, which allocate
-//    memory regardless of T (also for cases like std::map<int, MyClass>).
-// 3. Finally, if EstimateMemoryUsage(T) is not available, then it triggers
-//    a static_assert with a helpful message. That cuts numbers of errors
-//    considerably - if you just call EstimateMemoryUsage(T) but it's not
-//    available for T, then compiler will helpfully list *all* possible
-//    variants of it, with an explanation for each.
-template <class T, class X = void>
-struct EMUCaller {
-  // std::is_same<> below makes static_assert depend on T, in order to
-  // prevent it from asserting regardless instantiation.
-  static_assert(std::is_same_v<T, std::false_type>,
-                "Neither global function 'size_t EstimateMemoryUsage(T)' "
-                "nor member function 'size_t T::EstimateMemoryUsage() const' "
-                "is defined for the type.");
-
-  static size_t Call(const T&) { return 0; }
+// HasEMU<T> is true iff EstimateMemoryUsage(const T&) is available.
+template <typename T>
+concept HasEMU = requires(const T& t) {
+  { EstimateMemoryUsage(t) } -> std::same_as<size_t>;
 };
 
-template <class T>
-struct EMUCaller<T, std::enable_if_t<HasEMU<T>::value>> {
-  static size_t Call(const T& value) { return EstimateMemoryUsage(value); }
-};
+template <typename I>
+using IteratorValueType = typename std::iterator_traits<I>::value_type;
 
-template <template <class...> class Container, class I, class = void>
-struct IsComplexIteratorForContainer : std::false_type {};
+template <typename I, typename InstantiatedContainer>
+concept IsIteratorOfInstantiatedContainer =
+    (std::same_as<typename InstantiatedContainer::iterator, I> ||
+     std::same_as<typename InstantiatedContainer::const_iterator, I> ||
+     std::same_as<typename InstantiatedContainer::reverse_iterator, I> ||
+     std::same_as<typename InstantiatedContainer::const_reverse_iterator, I>);
 
-template <template <class...> class Container, class I>
-struct IsComplexIteratorForContainer<
-    Container,
-    I,
-    std::enable_if_t<!std::is_pointer_v<I> &&
-                     base::internal::is_iterator<I>::value>> {
-  using value_type = typename std::iterator_traits<I>::value_type;
-  using container_type = Container<value_type>;
+template <typename I, template <typename...> typename Container>
+concept IsIteratorOfContainer =
+    !std::is_pointer_v<I> &&
+    IsIteratorOfInstantiatedContainer<I, Container<IteratorValueType<I>>>;
 
-  // We use enum instead of static constexpr bool, beause we don't have inline
-  // variables until c++17.
-  //
-  // The downside is - value is not of type bool.
-  enum : bool {
-    value = std::is_same_v<typename container_type::iterator, I> ||
-            std::is_same_v<typename container_type::const_iterator, I> ||
-            std::is_same_v<typename container_type::reverse_iterator, I> ||
-            std::is_same_v<typename container_type::const_reverse_iterator, I>,
-  };
-};
-
-template <class I, template <class...> class... Containers>
-constexpr bool OneOfContainersComplexIterators() {
-  // We are forced to create a temporary variable to workaround a compilation
-  // error in msvs.
-  const bool all_tests[] = {
-      IsComplexIteratorForContainer<Containers, I>::value...};
-  for (bool test : all_tests)
-    if (test)
-      return true;
-  return false;
-}
-
-// std::array has an extra required template argument. We curry it.
-template <class T>
+// std::array has an extra required template argument.
+template <typename T>
 using array_test_helper = std::array<T, 1>;
 
-template <class I>
-constexpr bool IsStandardContainerComplexIterator() {
-  // TODO(dyaroshev): deal with maps iterators if there is a need.
-  // It requires to parse pairs into keys and values.
-  // TODO(dyaroshev): deal with unordered containers: they do not have reverse
-  // iterators.
-  return OneOfContainersComplexIterators<
-      I, array_test_helper, std::vector, std::deque,
-      /*std::forward_list,*/ std::list, std::set, std::multiset>();
-}
-
-// Work around MSVS bug. For some reason constexpr function doesn't work.
-// However variable template does.
+// TODO(dyaroshev): deal with maps iterators if there is a need.
+// It requires to parse pairs into keys and values.
+// TODO(dyaroshev): deal with unordered containers: they do not have reverse
+// iterators.
 template <typename T>
-constexpr bool IsKnownNonAllocatingType_v =
-    std::is_trivially_destructible_v<T> ||
-    IsStandardContainerComplexIterator<T>();
+concept IsIteratorOfStandardContainer =
+    IsIteratorOfContainer<T, array_test_helper> ||
+    IsIteratorOfContainer<T, std::vector> ||
+    IsIteratorOfContainer<T, std::deque> ||
+    IsIteratorOfContainer<T, std::list> || IsIteratorOfContainer<T, std::set> ||
+    IsIteratorOfContainer<T, std::multiset>;
 
-template <class T>
-struct EMUCaller<
-    T,
-    std::enable_if_t<!HasEMU<T>::value && IsKnownNonAllocatingType_v<T>>> {
-  static size_t Call(const T& value) { return 0; }
-};
+template <typename T>
+concept IsKnownNonAllocatingType =
+    std::is_trivially_destructible_v<T> || IsIteratorOfStandardContainer<T>;
 
 }  // namespace internal
 
-// Proxy that deducts T and calls EMUCaller<T>.
-// To be used by EstimateMemoryUsage() implementations for containers.
+// Estimates T's memory usage as follows:
+// 1. Calls `EstimateMemoryUsage(T)` if it is available.
+// 2. If `EstimateMemoryUsage(T)` is not available, but T has trivial dtor
+//    (i.e. it's POD, integer, pointer, enum, etc.) then it returns 0. This is
+//    useful for containers, which allocate memory regardless of T (also for
+//    cases like std::map<int, MyClass>).
+// 3. Otherwise, it triggers a `static_assert` with a helpful message.
+//
+// To be used by `EstimateMemoryUsage()` implementations for containers.
 template <class T>
 size_t EstimateItemMemoryUsage(const T& value) {
-  return internal::EMUCaller<T>::Call(value);
+  if constexpr (internal::HasEMU<T>) {
+    return EstimateMemoryUsage(value);
+  } else if constexpr (!internal::IsKnownNonAllocatingType<T>) {
+    static_assert(base::AlwaysFalse<T>,
+                  "Neither global function 'size_t EstimateMemoryUsage(T)' "
+                  "nor member function 'size_t T::EstimateMemoryUsage() const' "
+                  "is defined for the type.");
+  }
+  return 0;
 }
 
 template <class I>
@@ -334,7 +283,7 @@
 template <class T>
 auto EstimateMemoryUsage(const T& object)
     -> decltype(object.EstimateMemoryUsage()) {
-  static_assert(std::is_same_v<decltype(object.EstimateMemoryUsage()), size_t>,
+  static_assert(std::same_as<decltype(object.EstimateMemoryUsage()), size_t>,
                 "'T::EstimateMemoryUsage() const' must return size_t.");
   return object.EstimateMemoryUsage();
 }
diff --git a/base/trace_event/memory_usage_estimator_unittest.cc b/base/trace_event/memory_usage_estimator_unittest.cc
index 0ab20055..838e020 100644
--- a/base/trace_event/memory_usage_estimator_unittest.cc
+++ b/base/trace_event/memory_usage_estimator_unittest.cc
@@ -247,19 +247,18 @@
   };
 
   static_assert(
-      internal::IsStandardContainerComplexIterator<std::list<int>::iterator>(),
+      internal::IsIteratorOfStandardContainer<std::list<int>::iterator>, "");
+  static_assert(
+      internal::IsIteratorOfStandardContainer<std::list<int>::const_iterator>,
       "");
-  static_assert(internal::IsStandardContainerComplexIterator<
-                    std::list<int>::const_iterator>(),
+  static_assert(
+      internal::IsIteratorOfStandardContainer<std::list<int>::reverse_iterator>,
+      "");
+  static_assert(internal::IsIteratorOfStandardContainer<
+                    std::list<int>::const_reverse_iterator>,
                 "");
-  static_assert(internal::IsStandardContainerComplexIterator<
-                    std::list<int>::reverse_iterator>(),
-                "");
-  static_assert(internal::IsStandardContainerComplexIterator<
-                    std::list<int>::const_reverse_iterator>(),
-                "");
-  static_assert(!internal::IsStandardContainerComplexIterator<int>(), "");
-  static_assert(!internal::IsStandardContainerComplexIterator<abstract*>(), "");
+  static_assert(!internal::IsIteratorOfStandardContainer<int>, "");
+  static_assert(!internal::IsIteratorOfStandardContainer<abstract*>, "");
 }
 
 }  // namespace trace_event
diff --git a/build/android/apply_shared_preference_file.py b/build/android/apply_shared_preference_file.py
deleted file mode 100755
index a4aa499..0000000
--- a/build/android/apply_shared_preference_file.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env vpython3
-#
-# 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.
-
-"""Manually applies a shared preference JSON file.
-
-If needed during automation, use the --shared-prefs-file in test_runner.py
-instead.
-"""
-
-import argparse
-import sys
-
-# pylint: disable=ungrouped-imports
-from pylib.constants import host_paths
-if host_paths.DEVIL_PATH not in sys.path:
-  sys.path.append(host_paths.DEVIL_PATH)
-
-from devil.android import device_utils
-from devil.android.sdk import shared_prefs
-from pylib.utils import shared_preference_utils
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description='Manually apply shared preference JSON files.')
-  parser.add_argument('filepaths', nargs='*',
-                      help='Any number of paths to shared preference JSON '
-                           'files to apply.')
-  args = parser.parse_args()
-
-  all_devices = device_utils.DeviceUtils.HealthyDevices()
-  if not all_devices:
-    raise RuntimeError('No healthy devices attached')
-
-  for filepath in args.filepaths:
-    all_settings = shared_preference_utils.ExtractSettingsFromJson(filepath)
-    for setting in all_settings:
-      for device in all_devices:
-        shared_pref = shared_prefs.SharedPrefs(
-            device, setting['package'], setting['filename'],
-            use_encrypted_path=setting.get('supports_encrypted_path', False))
-        shared_preference_utils.ApplySharedPreferenceSetting(
-            shared_pref, setting)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/build/android/diff_resource_sizes.py b/build/android/diff_resource_sizes.py
index ff21d818..e3fd90b 100755
--- a/build/android/diff_resource_sizes.py
+++ b/build/android/diff_resource_sizes.py
@@ -14,7 +14,6 @@
 import sys
 
 from pylib.constants import host_paths
-from pylib.utils import shared_preference_utils
 
 with host_paths.SysPath(host_paths.BUILD_COMMON_PATH):
   import perf_tests_results_helper # pylint: disable=import-error
@@ -166,10 +165,10 @@
       raise
 
     # Combine the separate results
-    base_file = os.path.join(base_dir, _CHARTJSON_FILENAME)
-    diff_file = os.path.join(diff_dir, _CHARTJSON_FILENAME)
-    base_results = shared_preference_utils.ExtractSettingsFromJson(base_file)
-    diff_results = shared_preference_utils.ExtractSettingsFromJson(diff_file)
+    with open(os.path.join(base_dir, _CHARTJSON_FILENAME)) as base_file:
+      base_results = json.load(base_file)
+    with open(os.path.join(diff_dir, _CHARTJSON_FILENAME)) as diff_file:
+      diff_results = json.load(diff_file)
     DiffResults(chartjson, base_results, diff_results)
     if args.include_intermediate_results:
       AddIntermediateResults(chartjson, base_results, diff_results)
diff --git a/build/android/pylib/instrumentation/instrumentation_test_instance.py b/build/android/pylib/instrumentation/instrumentation_test_instance.py
index 800e51a..c3e2968 100644
--- a/build/android/pylib/instrumentation/instrumentation_test_instance.py
+++ b/build/android/pylib/instrumentation/instrumentation_test_instance.py
@@ -21,7 +21,6 @@
 from pylib.symbols import stack_symbolizer
 from pylib.utils import dexdump
 from pylib.utils import gold_utils
-from pylib.utils import shared_preference_utils
 from pylib.utils import test_filter
 
 
@@ -641,9 +640,6 @@
     self._deobfuscator = None
     self._initializeLogAttributes(args)
 
-    self._edit_shared_prefs = []
-    self._initializeEditPrefsAttributes(args)
-
     self._replace_system_package = None
     self._initializeReplaceSystemPackageAttributes(args)
 
@@ -865,15 +861,6 @@
     self._symbolizer = stack_symbolizer.Symbolizer(
         self.apk_under_test.path if self.apk_under_test else None)
 
-  def _initializeEditPrefsAttributes(self, args):
-    if not hasattr(args, 'shared_prefs_file') or not args.shared_prefs_file:
-      return
-    if not isinstance(args.shared_prefs_file, str):
-      logging.warning("Given non-string for a filepath")
-      return
-    self._edit_shared_prefs = shared_preference_utils.ExtractSettingsFromJson(
-        args.shared_prefs_file)
-
   def _initializeReplaceSystemPackageAttributes(self, args):
     if (not hasattr(args, 'replace_system_package')
         or not args.replace_system_package):
@@ -963,10 +950,6 @@
     return self._coverage_directory
 
   @property
-  def edit_shared_prefs(self):
-    return self._edit_shared_prefs
-
-  @property
   def enable_breakpad_dump(self):
     return self._enable_breakpad_dump
 
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
index a5483af..892e6aa 100644
--- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py
+++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -5,7 +5,6 @@
 
 import collections
 import contextlib
-import copy
 import hashlib
 import json
 import logging
@@ -23,7 +22,6 @@
 from devil.android import device_errors
 from devil.android import device_temp_file
 from devil.android import flag_changer
-from devil.android.sdk import shared_prefs
 from devil.android.sdk import version_codes
 from devil.android import logcat_monitor
 from devil.android.tools import system_app
@@ -44,7 +42,6 @@
 from pylib.utils import code_coverage_utils
 from pylib.utils import gold_utils
 from pylib.utils import instrumentation_tracing
-from pylib.utils import shared_preference_utils
 from pylib.utils.device_dependencies import DevicePathComponentsFor
 from py_trace_event import trace_event
 from py_trace_event import trace_time
@@ -202,7 +199,6 @@
     self._flag_changers = {}
     self._webview_flag_changers = {}
     self._render_tests_device_output_dir = None
-    self._shared_prefs_to_restore = []
     self._skia_gold_session_manager = None
     self._skia_gold_work_dir = None
 
@@ -419,19 +415,6 @@
         dev.RunShellCommand(cmd, check_return=True)
 
       @trace_event.traced
-      def edit_shared_prefs(dev):
-        for setting in self._test_instance.edit_shared_prefs:
-          shared_pref = shared_prefs.SharedPrefs(
-              dev, setting['package'], setting['filename'],
-              use_encrypted_path=setting.get('supports_encrypted_path', False))
-          pref_to_restore = copy.copy(shared_pref)
-          pref_to_restore.Load()
-          self._shared_prefs_to_restore.append(pref_to_restore)
-
-          shared_preference_utils.ApplySharedPreferenceSetting(
-              shared_pref, setting)
-
-      @trace_event.traced
       def approve_app_links(dev):
         self._ToggleAppLinks(dev, 'STATE_APPROVED')
 
@@ -514,8 +497,8 @@
 
       install_steps += [push_test_data, create_flag_changer]
       post_install_steps += [
-          set_debug_app, edit_shared_prefs, approve_app_links,
-          set_vega_permissions, DismissCrashDialogs
+          set_debug_app, approve_app_links, set_vega_permissions,
+          DismissCrashDialogs
       ]
 
       def bind_crash_handler(step, dev):
@@ -602,13 +585,6 @@
 
       valgrind_tools.SetChromeTimeoutScale(dev, None)
 
-      # Restore any shared preference files that we stored during setup.
-      # This should be run sometime before the replace package contextmanager
-      # gets exited so we don't have to special case restoring files of
-      # replaced system apps.
-      for pref_to_restore in self._shared_prefs_to_restore:
-        pref_to_restore.Commit(force_commit=True)
-
       # If we've force approved app links for a package, undo that now.
       self._ToggleAppLinks(dev, 'STATE_NO_RESPONSE')
 
diff --git a/build/android/pylib/utils/shared_preference_utils.py b/build/android/pylib/utils/shared_preference_utils.py
deleted file mode 100644
index 93324c6..0000000
--- a/build/android/pylib/utils/shared_preference_utils.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# Copyright 2017 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Utility functions for modifying an app's settings file using JSON."""
-
-import json
-import logging
-
-
-def UnicodeToStr(data):
-  """Recursively converts any Unicode to Python strings.
-
-  Args:
-    data: The data to be converted.
-
-  Return:
-    A copy of the given data, but with instances of Unicode converted to Python
-    strings.
-  """
-  if isinstance(data, dict):
-    return {
-        UnicodeToStr(key): UnicodeToStr(value)
-        for key, value in data.items()
-    }
-  if isinstance(data, list):
-    return [UnicodeToStr(element) for element in data]
-  try:
-    # Python-2 compatibility.
-    if isinstance(data, unicode):
-      return data.encode('utf-8')
-  except NameError:
-    # Strings are already unicode in python3.
-    pass
-  return data
-
-
-def ExtractSettingsFromJson(filepath):
-  """Extracts the settings data from the given JSON file.
-
-  Args:
-    filepath: The path to the JSON file to read.
-
-  Return:
-    The data read from the JSON file with strings converted to Python strings.
-  """
-  # json.load() loads strings as unicode, which causes issues when trying
-  # to edit string values in preference files, so convert to Python strings
-  with open(filepath) as prefs_file:
-    return UnicodeToStr(json.load(prefs_file))
-
-
-def ApplySharedPreferenceSetting(shared_pref, setting):
-  """Applies the given app settings to the given device.
-
-  Modifies an installed app's settings by modifying its shared preference
-  settings file. Provided settings data must be a settings dictionary,
-  which are in the following format:
-  {
-    "package": "com.example.package",
-    "filename": "AppSettingsFile.xml",
-    "supports_encrypted_path": true,
-    "set": {
-      "SomeBoolToSet": true,
-      "SomeStringToSet": "StringValue",
-    },
-    "remove": [
-      "list",
-      "of",
-      "keys",
-      "to",
-      "remove",
-    ]
-  }
-
-  Example JSON files that can be read with ExtractSettingsFromJson and passed to
-  this function are in //chrome/android/shared_preference_files/test/.
-
-  Args:
-    shared_pref: The devil SharedPrefs object for the device the settings will
-        be applied to.
-    setting: A settings dictionary to apply.
-  """
-  shared_pref.Load()
-  for key in setting.get('remove', []):
-    try:
-      shared_pref.Remove(key)
-    except KeyError:
-      logging.warning("Attempted to remove non-existent key %s", key)
-  for key, value in setting.get('set', {}).items():
-    is_set = False
-    if not is_set and isinstance(value, bool):
-      shared_pref.SetBoolean(key, value)
-      is_set = True
-    try:
-      # Python-2 compatibility.
-      if not is_set and isinstance(value, basestring):
-        shared_pref.SetString(key, value)
-        is_set = True
-      if not is_set and isinstance(value, (long, int)):
-        shared_pref.SetLong(key, value)
-        is_set = True
-    except NameError:
-      if not is_set and isinstance(value, str):
-        shared_pref.SetString(key, value)
-        is_set = True
-      if not is_set and isinstance(value, int):
-        shared_pref.SetLong(key, value)
-        is_set = True
-    if not is_set and isinstance(value, list):
-      shared_pref.SetStringSet(key, value)
-      is_set = True
-    if not is_set:
-      raise ValueError("Given invalid value type %s for key %s" % (
-          str(type(value)), key))
-  shared_pref.Commit()
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index 47833d8..ed12c469 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -613,22 +613,6 @@
       dest='screenshot_dir', type=os.path.realpath,
       help='Capture screenshots of test failures')
   parser.add_argument(
-      '--shared-prefs-file',
-      dest='shared_prefs_file', type=_RealPath,
-      help='The relative path to a file containing JSON list of shared '
-           'preference files to edit and how to do so. Example list: '
-           '[{'
-           '  "package": "com.package.example",'
-           '  "filename": "ExampleSettings.xml",'
-           '  "set": {'
-           '    "boolean_key_in_xml": true,'
-           '    "string_key_in_xml": "string_value"'
-           '  },'
-           '  "remove": ['
-           '    "key_in_xml_to_remove"'
-           '  ]'
-           '}]')
-  parser.add_argument(
       '--store-tombstones',
       action='store_true', dest='store_tombstones',
       help='Add tombstones in results if crash.')
diff --git a/build/android/test_runner.pydeps b/build/android/test_runner.pydeps
index 926a7d1..ddeb67d 100644
--- a/build/android/test_runner.pydeps
+++ b/build/android/test_runner.pydeps
@@ -64,7 +64,6 @@
 ../../third_party/catapult/devil/devil/android/sdk/bundletool.py
 ../../third_party/catapult/devil/devil/android/sdk/intent.py
 ../../third_party/catapult/devil/devil/android/sdk/keyevent.py
-../../third_party/catapult/devil/devil/android/sdk/shared_prefs.py
 ../../third_party/catapult/devil/devil/android/sdk/split_select.py
 ../../third_party/catapult/devil/devil/android/sdk/version_codes.py
 ../../third_party/catapult/devil/devil/android/tools/__init__.py
@@ -224,7 +223,6 @@
 pylib/utils/logdog_helper.py
 pylib/utils/logging_utils.py
 pylib/utils/repo_utils.py
-pylib/utils/shared_preference_utils.py
 pylib/utils/test_filter.py
 pylib/utils/time_profile.py
 pylib/valgrind_tools.py
diff --git a/build/fuchsia/test/flash_device.py b/build/fuchsia/test/flash_device.py
index 6ead9b5..55017df 100755
--- a/build/fuchsia/test/flash_device.py
+++ b/build/fuchsia/test/flash_device.py
@@ -80,7 +80,6 @@
 def _run_flash_command(system_image_dir: str, target_id: Optional[str]):
     """Helper function for running `ffx target flash`."""
     logging.info('Flashing %s to %s', system_image_dir, target_id)
-    product_bundle = os.path.join(system_image_dir, 'product_bundle.json')
     configs = [
         'fastboot.usb.disabled=true',
         'ffx.fastboot.inline_target=true',
@@ -100,7 +99,7 @@
         logging.info(
             'Flash result %s',
             common.run_ffx_command(cmd=('target', 'flash', '-b',
-                                        product_bundle,
+                                        system_image_dir,
                                         '--no-bootloader-reboot'),
                                    target_id=target_id,
                                    capture_output=True,
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index c64c6500..fc5495e 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision vars in //DEPS.
-  libcxx_revision = "dbea8476722304fba54a843659313f2ecf2252c3"
+  libcxx_revision = "99f5e4d09e3014e1b178dfd7ebf451e652461ad6"
 }
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index b5ce647..ce25705a 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -844,7 +844,6 @@
 
   DataForRecursion data_for_recursion;
   data_for_recursion.transform_tree_parent = kInvalidPropertyNodeId;
-  data_for_recursion.clip_tree_parent = kRootPropertyNodeId;
   data_for_recursion.effect_tree_parent = kInvalidPropertyNodeId;
   data_for_recursion.scroll_tree_parent = kRootPropertyNodeId;
   data_for_recursion.closest_ancestor_with_cached_render_surface =
diff --git a/chrome/VERSION b/chrome/VERSION
index 7d91a367..f78eb093 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=122
 MINOR=0
-BUILD=6186
+BUILD=6187
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 83e06e5..a609982 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -1105,6 +1105,7 @@
       "//chrome/browser/version:java",
       "//chrome/browser/wallet/android:junit",
       "//chrome/browser/webapps/android:java",
+      "//chrome/browser/webauthn/android:java",
       "//chrome/browser/xsurface:java",
       "//chrome/browser/xsurface_provider:junit",
       "//chrome/test:sync_integration_test_support_java",
@@ -1202,8 +1203,6 @@
       "//components/webapk/android/libs/client:java",
       "//components/webapk/android/libs/common:java",
       "//components/webapps/browser/android:java",
-      "//components/webauthn/android:java",
-      "//components/webauthn/android:test_support_java",
       "//content/public/android:content_java",
       "//content/public/common:common_java",
       "//content/public/test/android:content_java_test_support",
@@ -1211,7 +1210,6 @@
       "//mojo/public/java:system_java",
       "//mojo/public/mojom/base:base_java",
       "//net/android:net_java",
-      "//services/device/public/java:device_feature_list_java",
       "//services/device/public/mojom:mojom_java",
       "//services/media_session/public/cpp/android:media_session_java",
       "//services/media_session/public/mojom:mojom_java",
@@ -1251,7 +1249,6 @@
       "//url:gurl_java",
       "//url:gurl_junit_test_support",
       "//url/mojom:url_mojom_gurl_java",
-      "//url/mojom:url_mojom_origin_java",
     ]
 
     deps += chrome_junit_test_java_deps
@@ -3629,7 +3626,6 @@
     "java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java",
     "java/src/org/chromium/chrome/browser/tab/TabFavicon.java",
     "java/src/org/chromium/chrome/browser/tab/TabImpl.java",
-    "java/src/org/chromium/chrome/browser/tab/TabUtils.java",
     "java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java",
     "java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabSaverImpl.java",
     "java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index 9162ece..81f67fd 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -368,18 +368,5 @@
   "junit/src/org/chromium/chrome/browser/webapps/WebappDirectoryManagerTest.java",
   "junit/src/org/chromium/chrome/browser/webapps/WebappLauncherActivityTest.java",
   "junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java",
-  "junit/src/org/chromium/chrome/browser/webauth/BarrierTest.java",
-  "junit/src/org/chromium/chrome/browser/webauth/CredManHelperRobolectricTest.java",
-  "junit/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestRobolectricTest.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialException.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialRequest.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialResponse.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowCredential.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowCredentialManager.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowCredentialOption.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialException.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialRequest.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialResponse.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowPrepareGetCredentialResponse.java",
-  "junit/src/org/chromium/chrome/browser/webauth/ShadowWebContentStatics.java",
+  "junit/src/org/chromium/chrome/browser/webauthn/AuthenticatorIncognitoConfirmationBottomsheetTest.java",
 ]
diff --git a/chrome/android/expectations/monochrome_public_bundle__base.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle__base.AndroidManifest.expected
index 147a50e..4d28107 100644
--- a/chrome/android/expectations/monochrome_public_bundle__base.AndroidManifest.expected
+++ b/chrome/android/expectations/monochrome_public_bundle__base.AndroidManifest.expected
@@ -737,5 +737,6 @@
         android:process=":sandboxed_process9"
         android:visibleToInstantApps="true">
     </service>  # DIFF-ANCHOR: e2f3bbbd
+    <uses-library android:name="android.ext.adservices" android:required="false"/>
   </application>
 </manifest>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgentImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgentImpl.java
index 26f111e..59166bf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgentImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgentImpl.java
@@ -53,7 +53,8 @@
 @SuppressWarnings("UseSharedPreferencesManagerFromChromeCheck")
 public class ChromeBackupAgentImpl extends ChromeBackupAgent.Impl {
     private static final String ANDROID_DEFAULT_PREFIX = "AndroidDefault.";
-    private static final String NATIVE_PREF_PREFIX = "native.";
+    private static final String NATIVE_BOOL_PREF_PREFIX = "native.";
+    private static final String NATIVE_DICT_PREF_PREFIX = "NativeJsonDict.";
 
     private static final String TAG = "ChromeBackupAgent";
 
@@ -211,18 +212,23 @@
                                             .getIdentityManager(Profile.getLastUsedRegularProfile())
                                             .getPrimaryAccountInfo(ConsentLevel.SIGNIN));
 
-                            String[] nativeBackupNames =
-                                    ChromeBackupAgentImplJni.get().getBoolBackupNames(this);
-                            boolean[] nativeBackupValues =
-                                    ChromeBackupAgentImplJni.get().getBoolBackupValues(this);
+                            Natives jni = ChromeBackupAgentImplJni.get();
+
+                            String[] nativeBackupNames = jni.getBoolBackupNames(this);
+                            boolean[] nativeBackupValues = jni.getBoolBackupValues(this);
                             assert nativeBackupNames.length == nativeBackupValues.length;
 
                             for (String name : nativeBackupNames) {
-                                backupNames.add(NATIVE_PREF_PREFIX + name);
+                                backupNames.add(NATIVE_BOOL_PREF_PREFIX + name);
                             }
                             for (boolean val : nativeBackupValues) {
                                 backupValues.add(booleanToBytes(val));
                             }
+                            backupNames.add(
+                                    NATIVE_DICT_PREF_PREFIX
+                                            + jni.getAccountSettingsBackupName(this));
+                            backupValues.add(jni.getAccountSettingsBackupValue(this).getBytes());
+
                             return true;
                         });
         SharedPreferences sharedPrefs = ContextUtils.getAppSharedPreferences();
@@ -394,23 +400,27 @@
         PostTask.runSynchronously(
                 TaskTraits.UI_DEFAULT,
                 () -> {
-                    ArrayList<String> nativeBackupNames = new ArrayList<>();
-                    boolean[] nativeBackupValues = new boolean[backupNames.size()];
+                    ArrayList<String> nativeBoolBackupNames = new ArrayList<>();
+                    boolean[] nativeBoolBackupValues = new boolean[backupNames.size()];
                     int count = 0;
-                    int prefixLength = NATIVE_PREF_PREFIX.length();
+                    int boolPrefixLength = NATIVE_BOOL_PREF_PREFIX.length();
                     for (int i = 0; i < backupNames.size(); i++) {
                         String name = backupNames.get(i);
-                        if (name.startsWith(NATIVE_PREF_PREFIX)) {
-                            nativeBackupNames.add(name.substring(prefixLength));
-                            nativeBackupValues[count] = bytesToBoolean(backupValues.get(i));
+                        if (name.startsWith(NATIVE_BOOL_PREF_PREFIX)) {
+                            nativeBoolBackupNames.add(name.substring(boolPrefixLength));
+                            nativeBoolBackupValues[count] = bytesToBoolean(backupValues.get(i));
                             count++;
+                        } else if (name.startsWith(NATIVE_DICT_PREF_PREFIX)) {
+                            // TODO(crbug.com/1493706): Implement the restoration of the account
+                            // settings.
+                            continue;
                         }
                     }
                     ChromeBackupAgentImplJni.get()
                             .setBoolBackupPrefs(
                                     this,
-                                    nativeBackupNames.toArray(new String[count]),
-                                    Arrays.copyOf(nativeBackupValues, count));
+                                    nativeBoolBackupNames.toArray(new String[count]),
+                                    Arrays.copyOf(nativeBoolBackupValues, count));
                 });
 
         // Now that everything looks good so restore the Android preferences.
@@ -510,5 +520,9 @@
         boolean[] getBoolBackupValues(ChromeBackupAgentImpl caller);
 
         void setBoolBackupPrefs(ChromeBackupAgentImpl caller, String[] name, boolean[] value);
+
+        String getAccountSettingsBackupName(ChromeBackupAgentImpl caller);
+
+        String getAccountSettingsBackupValue(ChromeBackupAgentImpl caller);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java
index 0b000bf0..c2b15cb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java
@@ -57,31 +57,6 @@
     }
 
     /**
-     * This method is for filtering the tabs, which will only return the tabs which are http or
-     * https. This method is called when the AndroidAppIntegrationSafeSearch is not enabled.
-     *
-     * @param tabs A list of {@link Tab}s want to be check if there should be searched by Auxiliary
-     *         Search.
-     * @return tabs which can be searched by Auxiliary Searchh.
-     */
-    public @NonNull List<Tab> getSearchableTabs(@NonNull List<Tab> tabs) {
-        ArrayList<Tab> tabList = new ArrayList<>();
-        if (mNativeBridge != 0) {
-            Object[] tab_objects =
-                    AuxiliarySearchBridgeJni.get()
-                            .getSearchableTabs(mNativeBridge, tabs.toArray(new Tab[0]));
-
-            for (Object o : tab_objects) {
-                if (o instanceof Tab) {
-                    tabList.add((Tab) o);
-                }
-            }
-        }
-
-        return tabList;
-    }
-
-    /**
      * This method will return non sensitive url tabs, and the scheme is http or https.
      * This method is called when the AndroidAppIntegrationSafeSearch not enabled.
      *
@@ -129,7 +104,5 @@
 
         void getNonSensitiveTabs(
                 long nativeAuxiliarySearchProvider, Tab[] tabs, Callback<Object[]> callback);
-
-        Object[] getSearchableTabs(long nativeAuxiliarySearchProvider, Tab[] tabs);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProvider.java
index 8e78eb4f..793a2c37 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProvider.java
@@ -42,34 +42,6 @@
     }
 
     /**
-     * @return AuxiliarySearchGroup for {@link Tab}s.
-     */
-    public AuxiliarySearchTabGroup getTabsSearchableDataProto() {
-        TabList tabList = mTabModelSelector.getModel(false).getComprehensiveModel();
-
-        // Find the the bottom of tabs in the tab switcher view if the number of the tabs more than
-        // 'kNumTabsToSend'. In the multiwindow mode, the order of the 'tabList' is one window's
-        // tabs, and then another's.
-        int firstTabIndex = Math.max(tabList.getCount() - kNumTabsToSend, 0);
-        int end = tabList.getCount() - 1;
-        List<Tab> listTab = new ArrayList<>();
-        for (int i = firstTabIndex; i <= end; i++) {
-            listTab.add(tabList.getTabAt(i));
-        }
-
-        // Send tabs to native to filter the tabs.
-        List<Tab> filteredTabs = mAuxiliarySearchBridge.getSearchableTabs(listTab);
-        var tabGroupBuilder = AuxiliarySearchTabGroup.newBuilder();
-        for (Tab tab : filteredTabs) {
-            AuxiliarySearchEntry entry = tabToAuxiliarySearchEntry(tab);
-            if (entry != null) {
-                tabGroupBuilder.addTab(entry);
-            }
-        }
-        return tabGroupBuilder.build();
-    }
-
-    /**
      * @param callback {@link Callback} to pass back the AuxiliarySearchGroup for {@link Tab}s.
      */
     public void getTabsSearchableDataProtoAsync(Callback<AuxiliarySearchTabGroup> callback) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProviderTest.java b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProviderTest.java
index 6b5d12c..45b1357 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProviderTest.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProviderTest.java
@@ -23,7 +23,6 @@
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
-import org.mockito.stubbing.Answer;
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.Callback;
@@ -38,7 +37,6 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel;
 import org.chromium.url.GURL;
@@ -50,7 +48,6 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 @EnableFeatures({ChromeFeatureList.ANDROID_APP_INTEGRATION})
-@DisableFeatures({ChromeFeatureList.ANDROID_APP_INTEGRATION_SAFE_SEARCH})
 public class AuxiliarySearchProviderTest {
     private static final String TAB_TITLE = "tab";
     private static final String TAB_URL = "https://tab.google.com/";
@@ -73,46 +70,11 @@
     public void setUp() {
         mJniMocker.mock(AuxiliarySearchBridgeJni.TEST_HOOKS, mMockAuxiliarySearchBridgeJni);
         doReturn(FAKE_NATIVE_PROVIDER).when(mMockAuxiliarySearchBridgeJni).getForProfile(mProfile);
-        doAnswer((Answer<Object[]>) invocation -> ((Object[]) invocation.getArguments()[1]))
-                .when(mMockAuxiliarySearchBridgeJni)
-                .getSearchableTabs(eq(FAKE_NATIVE_PROVIDER), any(Tab[].class));
         mAuxiliarySearchProvider = new AuxiliarySearchProvider(mProfile, mTabModelSelector);
     }
 
     @Test
     @SmallTest
-    public void testGetTabsSearchableDataProto() throws InterruptedException {
-        MockTabModel mockTabModel = new MockTabModel(mProfile, null);
-        for (int i = 0; i < 200; i++) {
-            MockTab tab = mockTabModel.addTab(i);
-            tab.setGurlOverrideForTesting(new GURL(TAB_URL + Integer.toString(i)));
-            tab.setTitle(TAB_TITLE + Integer.toString(i));
-            tab.setTimestampMillis(i);
-        }
-
-        doReturn(mockTabModel).when(mTabModelSelector).getModel(false);
-        AuxiliarySearchTabGroup tabGroup = mAuxiliarySearchProvider.getTabsSearchableDataProto();
-
-        assertEquals(tabGroup.getTabCount(), 100);
-        HashSet<Integer> returnedTabsNumbers = new HashSet<Integer>();
-        for (int i = 0; i < tabGroup.getTabCount(); i++) {
-            AuxiliarySearchEntry tab = tabGroup.getTab(i);
-            assertTrue(tab.hasTitle());
-            assertTrue(tab.hasUrl());
-            assertTrue(tab.hasLastAccessTimestamp());
-            assertFalse(tab.hasCreationTimestamp());
-            assertFalse(tab.hasLastModificationTimestamp());
-
-            int number = Integer.valueOf(tab.getUrl().substring(TAB_URL.length()));
-            assertTrue(number >= 100 && number <= 199);
-            assertEquals(number, (int) tab.getLastAccessTimestamp());
-            returnedTabsNumbers.add(number);
-        }
-        assertEquals(returnedTabsNumbers.size(), 100);
-    }
-
-    @Test
-    @SmallTest
     public void testGetBookmarksSearchableDataProto() {
         var bookmark =
                 AuxiliarySearchEntry.newBuilder()
@@ -152,114 +114,6 @@
 
     @Test
     @SmallTest
-    public void testTabHasNullTitle() {
-        MockTabModel mockTabModel = new MockTabModel(mProfile, null);
-
-        // Add a normal tab
-        MockTab tab = mockTabModel.addTab(0);
-        tab.setGurlOverrideForTesting(new GURL(TAB_URL + "0"));
-        tab.setTitle(TAB_TITLE + "0");
-        tab.setTimestampMillis(0);
-
-        // Add a null title tab
-        tab = mockTabModel.addTab(1);
-        tab.setGurlOverrideForTesting(new GURL(TAB_URL + Integer.toString(1)));
-        tab.setTimestampMillis(1);
-        tab.setTitle(null);
-
-        doReturn(mockTabModel).when(mTabModelSelector).getModel(false);
-        AuxiliarySearchTabGroup tabGroup = mAuxiliarySearchProvider.getTabsSearchableDataProto();
-
-        assertEquals(1, tabGroup.getTabCount());
-        assertTrue(tabGroup.getTab(0).hasTitle());
-        assertEquals(TAB_TITLE + "0", tabGroup.getTab(0).getTitle());
-        assertTrue(tabGroup.getTab(0).hasUrl());
-        assertEquals(TAB_URL + "0", tabGroup.getTab(0).getUrl());
-    }
-
-    @Test
-    @SmallTest
-    public void testTabHasEmptyTitle() {
-        MockTabModel mockTabModel = new MockTabModel(mProfile, null);
-
-        // Add a normal tab
-        MockTab tab = mockTabModel.addTab(0);
-        tab.setGurlOverrideForTesting(new GURL(TAB_URL + "0"));
-        tab.setTitle(TAB_TITLE + "0");
-        tab.setTimestampMillis(0);
-
-        // Add an empty title tab
-        tab = mockTabModel.addTab(1);
-        tab.setGurlOverrideForTesting(new GURL(TAB_URL + "1"));
-        tab.setTimestampMillis(1);
-        tab.setTitle("");
-
-        doReturn(mockTabModel).when(mTabModelSelector).getModel(false);
-        AuxiliarySearchTabGroup tabGroup = mAuxiliarySearchProvider.getTabsSearchableDataProto();
-
-        assertEquals(1, tabGroup.getTabCount());
-        assertTrue(tabGroup.getTab(0).hasTitle());
-        assertEquals(TAB_TITLE + "0", tabGroup.getTab(0).getTitle());
-        assertTrue(tabGroup.getTab(0).hasUrl());
-        assertEquals(TAB_URL + "0", tabGroup.getTab(0).getUrl());
-    }
-
-    @Test
-    @SmallTest
-    public void testTabHasNullUrl() {
-        MockTabModel mockTabModel = new MockTabModel(mProfile, null);
-
-        // Add a normal tab
-        MockTab tab = mockTabModel.addTab(0);
-        tab.setGurlOverrideForTesting(new GURL(TAB_URL + "0"));
-        tab.setTitle(TAB_TITLE + "0");
-        tab.setTimestampMillis(0);
-
-        // Add a null url tab
-        tab = mockTabModel.addTab(1);
-        tab.setGurlOverrideForTesting(null);
-        tab.setTimestampMillis(1);
-        tab.setTitle(TAB_TITLE + "0");
-
-        doReturn(mockTabModel).when(mTabModelSelector).getModel(false);
-        AuxiliarySearchTabGroup tabGroup = mAuxiliarySearchProvider.getTabsSearchableDataProto();
-
-        assertEquals(1, tabGroup.getTabCount());
-        assertTrue(tabGroup.getTab(0).hasTitle());
-        assertEquals(TAB_TITLE + "0", tabGroup.getTab(0).getTitle());
-        assertTrue(tabGroup.getTab(0).hasUrl());
-        assertEquals(TAB_URL + "0", tabGroup.getTab(0).getUrl());
-    }
-
-    @Test
-    @SmallTest
-    public void testTabHasInvalidlUrl() {
-        MockTabModel mockTabModel = new MockTabModel(mProfile, null);
-
-        // Add a normal tab
-        MockTab tab = mockTabModel.addTab(0);
-        tab.setGurlOverrideForTesting(new GURL(TAB_URL + "0"));
-        tab.setTitle(TAB_TITLE + "0");
-        tab.setTimestampMillis(0);
-
-        // Add an invalid url tab
-        tab = mockTabModel.addTab(1);
-        tab.setGurlOverrideForTesting(new GURL("invalid"));
-        tab.setTimestampMillis(1);
-        tab.setTitle(TAB_TITLE + "0");
-
-        doReturn(mockTabModel).when(mTabModelSelector).getModel(false);
-        AuxiliarySearchTabGroup tabGroup = mAuxiliarySearchProvider.getTabsSearchableDataProto();
-
-        assertEquals(1, tabGroup.getTabCount());
-        assertTrue(tabGroup.getTab(0).hasTitle());
-        assertEquals(TAB_TITLE + "0", tabGroup.getTab(0).getTitle());
-        assertTrue(tabGroup.getTab(0).hasUrl());
-        assertEquals(TAB_URL + "0", tabGroup.getTab(0).getUrl());
-    }
-
-    @Test
-    @SmallTest
     public void testGetTabsSearchableDataProtoAsync() {
         MockTabModel mockTabModel = new MockTabModel(mProfile, null);
         ArrayList<Tab> tabList = new ArrayList<>();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar.java b/chrome/android/java/src/org/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar.java
index ff680472..8f9a64b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar.java
@@ -10,6 +10,7 @@
 import org.chromium.chrome.browser.browserservices.digitalgoods.DigitalGoodsFactoryFactory;
 import org.chromium.chrome.browser.installedapp.InstalledAppProviderFactory;
 import org.chromium.chrome.browser.payments.ChromePaymentRequestFactory;
+import org.chromium.chrome.browser.webauthn.ChromeAuthenticatorConfirmationFactory;
 import org.chromium.chrome.browser.webshare.ShareServiceImplementationFactory;
 import org.chromium.components.webauthn.AuthenticatorFactory;
 import org.chromium.content_public.browser.InterfaceRegistrar;
@@ -49,7 +50,10 @@
                     PaymentRequest.MANAGER, new ChromePaymentRequestFactory(renderFrameHost));
             registry.addInterface(
                     InstalledAppProvider.MANAGER, new InstalledAppProviderFactory(renderFrameHost));
-            registry.addInterface(Authenticator.MANAGER, new AuthenticatorFactory(renderFrameHost));
+            registry.addInterface(
+                    Authenticator.MANAGER,
+                    new AuthenticatorFactory(
+                            renderFrameHost, new ChromeAuthenticatorConfirmationFactory()));
             registry.addInterface(
                     DigitalGoodsFactory.MANAGER, new DigitalGoodsFactoryFactory(renderFrameHost));
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
index 85177ad5..6d36f86c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
@@ -117,9 +117,7 @@
                     UserPrefs.get(getProfile()).setBoolean(Pref.PRIVACY_GUIDE_VIEWED, true);
                     return false;
                 });
-        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.PRIVACY_GUIDE)
-                || getProfile().isChild()
-                || ManagedBrowserUtils.isBrowserManaged(getProfile())) {
+        if (getProfile().isChild() || ManagedBrowserUtils.isBrowserManaged(getProfile())) {
             getPreferenceScreen().removePreference(privacyGuidePreference);
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
index 1621f2c..9d09586 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -48,7 +48,6 @@
 import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataFragmentBasic;
 import org.chromium.chrome.browser.feedback.FragmentHelpAndFeedbackLauncher;
 import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.image_descriptions.ImageDescriptionsController;
 import org.chromium.chrome.browser.image_descriptions.ImageDescriptionsSettings;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
@@ -464,9 +463,7 @@
     private void initBackPressHandler() {
         // Handlers registered last will be called first.
         registerMainFragmentBackPressHandler();
-        if (ChromeFeatureList.sPrivacyGuidePostMVP.isEnabled()) {
-            registerBottomSheetBackPressHandler();
-        }
+        registerBottomSheetBackPressHandler();
     }
 
     private void registerMainFragmentBackPressHandler() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS
index 7ce90fe..a781d87 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS
@@ -104,8 +104,6 @@
     "+components/navigation_interception/android/java/src/org/chromium/components/navigation_interception",
     "+components/security_state/content/android/java/src/org/chromium/components/security_state/SecurityStateModel.java",
     "+components/version_info/android",
-    "+components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java",
-    "+components/user_prefs/android/java/src/org/chromium/components/user_prefs/UserPrefs.java",
   ],
   'TabStateBrowserControlsVisibilityDelegate\.java': [
     "+chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/ChromeAccessibilityUtil.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
index f5f10dd..8270616 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -4,8 +4,6 @@
 
 package org.chromium.chrome.browser.tab;
 
-import static org.chromium.components.content_settings.PrefNames.DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED;
-
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Context;
@@ -54,11 +52,9 @@
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.embedder_support.view.ContentView;
-import org.chromium.components.prefs.PrefService;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.components.security_state.SecurityStateModel;
 import org.chromium.components.url_formatter.UrlFormatter;
-import org.chromium.components.user_prefs.UserPrefs;
 import org.chromium.components.version_info.VersionInfo;
 import org.chromium.content_public.browser.ChildProcessImportance;
 import org.chromium.content_public.browser.ContentFeatureList;
@@ -1871,14 +1867,6 @@
                                 && !RequestDesktopUtils.shouldApplyWindowSetting(
                                         mProfile, url, getContext()));
 
-        if (!shouldRequestDesktopSite
-                && ContentFeatureMap.isEnabled(ContentFeatureList.REQUEST_DESKTOP_SITE_ADDITIONS)) {
-            // TODO(shuyng): Make additional setting compatible with site level setting.
-            PrefService prefService = UserPrefs.get(mProfile);
-            boolean peripheralPref =
-                    prefService.getBoolean(DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED);
-            shouldRequestDesktopSite = TabUtils.isHardwareKeyboardAvailable(this) && peripheralPref;
-        }
         if (shouldRequestDesktopSite != currentRequestDesktopSite) {
             // The user is not forcing any mode and we determined that we need to
             // change, therefore we are using TRUE or FALSE option. On Android TRUE mean
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
index a4e6e15..3892763 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
@@ -22,8 +22,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
-import org.jni_zero.CalledByNative;
-
 import org.chromium.base.BuildInfo;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
@@ -227,19 +225,6 @@
     }
 
     /**
-     * Return whether hardware keyboard is available, including QWERTY and 12Key keyboards.
-     * @param tab The tab used to retrieve context for keyboard configuration.
-     * TODO(shuyng): Create ConfigurationChangedObserver to update the current value in C++; to
-     * avoid extra JNI request on each navigation.
-     */
-    @CalledByNative
-    public static boolean isHardwareKeyboardAvailable(Tab tab) {
-        int keyboard = tab.getContext().getResources().getConfiguration().keyboard;
-        return keyboard == Configuration.KEYBOARD_QWERTY
-                || keyboard == Configuration.KEYBOARD_12KEY;
-    }
-
-    /**
      * Return aspect ratio for grid tab card based on form factor and orientation.
      * @param context - Context of the application.
      * @param browserControlsStateProvider - For getting browser controls height.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsFragmentTest.java
index 942e572..0736d2e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsFragmentTest.java
@@ -55,7 +55,6 @@
 import org.chromium.chrome.test.R;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
-import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.signin.SigninTestRule;
 import org.chromium.components.policy.test.annotations.Policies;
 import org.chromium.components.user_prefs.UserPrefs;
@@ -205,7 +204,6 @@
     @Test
     @LargeTest
     @Feature({"RenderTest"})
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
     public void testRenderWhenPrivacyGuideViewed() throws IOException {
         setPrivacyGuideViewed(true);
         mSettingsActivityTestRule.startSettingsActivity();
@@ -221,7 +219,6 @@
     @Test
     @LargeTest
     @Feature({"RenderTest"})
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
     public void testRenderWhenPrivacyGuideNotViewed() throws IOException {
         setPrivacyGuideViewed(false);
         mSettingsActivityTestRule.startSettingsActivity();
@@ -337,7 +334,6 @@
 
     @Test
     @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
     public void testPrivacyGuideLinkRowEntryPointUserAction() throws IOException {
         mSettingsActivityTestRule.startSettingsActivity();
         mActionTester = new UserActionTester();
@@ -351,7 +347,6 @@
 
     @Test
     @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
     public void testPrivacyGuideLinkRowEntryExitHistogram() throws IOException {
         mSettingsActivityTestRule.startSettingsActivity();
 
@@ -368,7 +363,6 @@
 
     @Test
     @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
     public void testPrivacyGuideNewLabelVisibility() throws ExecutionException {
         setPrivacyGuideViewed(false);
         mSettingsActivityTestRule.startSettingsActivity();
@@ -382,7 +376,6 @@
 
     @Test
     @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
     // A random policy is required to make the device managed
     @Policies.Add({@Policies.Item(key = "RandomPolicy", string = "true")})
     public void testPrivacyGuideNotDisplayedWhenDeviceIsManaged() {
@@ -392,7 +385,6 @@
 
     @Test
     @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
     @DisabledTest(message = "crbug.com/1437093")
     public void testPrivacyGuideNotDisplayedWhenUserIsChild() {
         // TODO(crbug.com/1433652): Remove once SigninChecker is automatically created.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java
index ff07818..df292bb4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java
@@ -33,8 +33,6 @@
 
 import static org.chromium.components.browser_ui.site_settings.AutoDarkMetrics.AutoDarkSettingsChangeSource.SITE_SETTINGS_GLOBAL;
 import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
-import static org.chromium.components.content_settings.PrefNames.DESKTOP_SITE_DISPLAY_SETTING_ENABLED;
-import static org.chromium.components.content_settings.PrefNames.DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED;
 import static org.chromium.components.content_settings.PrefNames.DESKTOP_SITE_WINDOW_SETTING_ENABLED;
 import static org.chromium.ui.test.util.ViewUtils.VIEW_GONE;
 import static org.chromium.ui.test.util.ViewUtils.VIEW_INVISIBLE;
@@ -1782,23 +1780,7 @@
     @Test
     @SmallTest
     @Feature({"Preferences"})
-    @EnableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_ADDITIONS)
-    @DisableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_WINDOW_SETTING)
-    public void testOnlyExpectedPreferencesRequestDesktopSiteAdditionalSettings() {
-        String[] rdsDisabled = {
-            "binary_toggle", "desktop_site_peripheral", "desktop_site_display", "add_exception"
-        };
-        testExpectedPreferences(
-                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE,
-                rdsDisabled,
-                BINARY_TOGGLE_WITH_EXCEPTION);
-    }
-
-    @Test
-    @SmallTest
-    @Feature({"Preferences"})
     @EnableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_WINDOW_SETTING)
-    @DisableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_ADDITIONS)
     public void testOnlyExpectedPreferencesRequestDesktopSiteWindowSettings() {
         String[] rdsEnabled = {"binary_toggle", "desktop_site_window", "add_exception"};
         testExpectedPreferences(
@@ -2598,74 +2580,6 @@
     @Test
     @SmallTest
     @Feature({"Preferences"})
-    @EnableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_ADDITIONS)
-    public void testDesktopSitePeripherals() {
-        final SettingsActivity settingsActivity =
-                SiteSettingsTestUtils.startSiteSettingsCategory(
-                        SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE);
-
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    SingleCategorySettings preferences =
-                            (SingleCategorySettings) settingsActivity.getMainFragment();
-                    ChromeBaseCheckBoxPreference peripheralPref =
-                            preferences.findPreference(
-                                    SingleCategorySettings.DESKTOP_SITE_PERIPHERAL_TOGGLE_KEY);
-                    PrefService prefService = UserPrefs.get(getBrowserContextHandle());
-                    Assert.assertFalse(
-                            "Peripherals setting should be OFF.",
-                            prefService.getBoolean(DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED));
-
-                    preferences.onPreferenceChange(peripheralPref, true);
-                    Assert.assertTrue(
-                            "Peripherals setting should be ON.",
-                            prefService.getBoolean(DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED));
-
-                    preferences.onPreferenceChange(peripheralPref, false);
-                    Assert.assertFalse(
-                            "Peripherals setting should be OFF.",
-                            prefService.getBoolean(DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED));
-                });
-        settingsActivity.finish();
-    }
-
-    @Test
-    @SmallTest
-    @Feature({"Preferences"})
-    @EnableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_ADDITIONS)
-    public void testDesktopSiteExternalDisplay() {
-        final SettingsActivity settingsActivity =
-                SiteSettingsTestUtils.startSiteSettingsCategory(
-                        SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE);
-
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    SingleCategorySettings preferences =
-                            (SingleCategorySettings) settingsActivity.getMainFragment();
-                    ChromeBaseCheckBoxPreference externalDisplayPref =
-                            preferences.findPreference(
-                                    SingleCategorySettings.DESKTOP_SITE_DISPLAY_TOGGLE_KEY);
-                    PrefService prefService = UserPrefs.get(getBrowserContextHandle());
-                    Assert.assertFalse(
-                            "Display setting should be OFF.",
-                            prefService.getBoolean(DESKTOP_SITE_DISPLAY_SETTING_ENABLED));
-
-                    preferences.onPreferenceChange(externalDisplayPref, true);
-                    Assert.assertTrue(
-                            "Display setting should be ON.",
-                            prefService.getBoolean(DESKTOP_SITE_DISPLAY_SETTING_ENABLED));
-
-                    preferences.onPreferenceChange(externalDisplayPref, false);
-                    Assert.assertFalse(
-                            "Display setting should be OFF.",
-                            prefService.getBoolean(DESKTOP_SITE_DISPLAY_SETTING_ENABLED));
-                });
-        settingsActivity.finish();
-    }
-
-    @Test
-    @SmallTest
-    @Feature({"Preferences"})
     @EnableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_WINDOW_SETTING)
     public void testDesktopSiteWindowSettings() {
         final SettingsActivity settingsActivity =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
index 814be02..31878ed 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
@@ -66,6 +66,7 @@
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.components.webauthn.AuthenticatorImpl;
+import org.chromium.components.webauthn.CreateConfirmationUiDelegate;
 import org.chromium.components.webauthn.Fido2Api;
 import org.chromium.components.webauthn.Fido2ApiCallHelper;
 import org.chromium.components.webauthn.Fido2ApiTestHelper;
@@ -782,7 +783,7 @@
     @SmallTest
     public void testAuthenticatorImplMakeCredential_withConfirmationUi_success() {
         boolean[] wasCalled = new boolean[1];
-        AuthenticatorImpl.CreateConfirmationUiDelegate createConfirmationUiDelegate =
+        CreateConfirmationUiDelegate createConfirmationUiDelegate =
                 (accept, reject) -> {
                     wasCalled[0] = true;
                     accept.run();
@@ -812,7 +813,7 @@
     @SmallTest
     public void testAuthenticatorImplMakeCredential_withConfirmationUi_rejected() {
         boolean[] wasCalled = new boolean[1];
-        AuthenticatorImpl.CreateConfirmationUiDelegate createConfirmationUiDelegate =
+        CreateConfirmationUiDelegate createConfirmationUiDelegate =
                 (accept, reject) -> {
                     wasCalled[0] = true;
                     reject.run();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
index f2eecb6..f7fe5d9 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
@@ -112,6 +112,9 @@
             CoreAccountInfo.createFromEmailAndGaiaId("user1", "gaia_id_user1");
 
     private static final String PREFERENCE_KEY_NOT_BACKED_UP = "not_backed_up";
+    private static int sBackupValuesCount = 8;
+    private static final String sAccountSettingsPrefKey = "account_settings_pref_key";
+    private static final String sAccountSettingsPrefValue = "account_settings_pref_value";
 
     private void setUpTestPrefs(SharedPreferences prefs) {
         SharedPreferences.Editor editor = prefs.edit();
@@ -151,6 +154,10 @@
                 .thenReturn(new String[] {"pref1"});
         when(mChromeBackupAgentJniMock.getBoolBackupValues(mAgent))
                 .thenReturn(new boolean[] {true});
+        when(mChromeBackupAgentJniMock.getAccountSettingsBackupName(mAgent))
+                .thenReturn(sAccountSettingsPrefKey);
+        when(mChromeBackupAgentJniMock.getAccountSettingsBackupValue(mAgent))
+                .thenReturn(sAccountSettingsPrefValue);
 
         IdentityServicesProvider identityServicesProvider = mock(IdentityServicesProvider.class);
         IdentityServicesProvider.setInstanceForTests(identityServicesProvider);
@@ -188,6 +195,12 @@
 
         // Check that the right things were written to the backup
         verify(backupData).writeEntityHeader("native.pref1", 1);
+        byte[] accountSettingsPrefBytes =
+                ApiCompatibilityUtils.getBytesUtf8(sAccountSettingsPrefValue);
+        verify(backupData)
+                .writeEntityHeader(
+                        "NativeJsonDict." + sAccountSettingsPrefKey,
+                        accountSettingsPrefBytes.length);
         verify(backupData)
                 .writeEntityHeader(
                         "AndroidDefault." + ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE, 1);
@@ -226,8 +239,9 @@
         try (ObjectInputStream newStateStream =
                 new ObjectInputStream(new FileInputStream(stateFile))) {
             ArrayList<String> names = (ArrayList<String>) newStateStream.readObject();
-            assertThat(names.size(), equalTo(7));
+            assertThat(names.size(), equalTo(sBackupValuesCount));
             assertThat(names, hasItem("native.pref1"));
+            assertThat(names, hasItem("NativeJsonDict." + sAccountSettingsPrefKey));
             assertThat(
                     names,
                     hasItem("AndroidDefault." + ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE));
@@ -253,9 +267,10 @@
                     names,
                     hasItem("AndroidDefault." + ChromeBackupAgentImpl.SIGNED_IN_ACCOUNT_ID_KEY));
             ArrayList<byte[]> values = (ArrayList<byte[]>) newStateStream.readObject();
-            assertThat(values.size(), equalTo(7));
+            assertThat(values.size(), equalTo(sBackupValuesCount));
             assertThat(values, hasItem(unameBytes));
             assertThat(values, hasItem(uidBytes));
+            assertThat(values, hasItem(accountSettingsPrefBytes));
             assertThat(values, hasItem(new byte[] {0}));
             assertThat(values, hasItem(new byte[] {1}));
 
@@ -288,6 +303,12 @@
 
         // Check that the right things were written to the backup
         verify(backupData).writeEntityHeader("native.pref1", 1);
+        byte[] accountSettingsPrefBytes =
+                ApiCompatibilityUtils.getBytesUtf8(sAccountSettingsPrefValue);
+        verify(backupData)
+                .writeEntityHeader(
+                        "NativeJsonDict." + sAccountSettingsPrefKey,
+                        accountSettingsPrefBytes.length);
         verify(backupData)
                 .writeEntityHeader(
                         "AndroidDefault." + ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE, 1);
@@ -325,8 +346,9 @@
         try (ObjectInputStream newStateStream =
                 new ObjectInputStream(new FileInputStream(stateFile))) {
             ArrayList<String> names = (ArrayList<String>) newStateStream.readObject();
-            assertThat(names.size(), equalTo(7));
+            assertThat(names.size(), equalTo(sBackupValuesCount));
             assertThat(names, hasItem("native.pref1"));
+            assertThat(names, hasItem("NativeJsonDict." + sAccountSettingsPrefKey));
             assertThat(
                     names,
                     hasItem("AndroidDefault." + ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE));
@@ -352,9 +374,10 @@
                     names,
                     hasItem("AndroidDefault." + ChromeBackupAgentImpl.SIGNED_IN_ACCOUNT_ID_KEY));
             ArrayList<byte[]> values = (ArrayList<byte[]>) newStateStream.readObject();
-            assertThat(values.size(), equalTo(7));
+            assertThat(values.size(), equalTo(sBackupValuesCount));
             assertThat(values, not(hasItem(unameBytes)));
             assertThat(values, hasItem(uidBytes));
+            assertThat(values, hasItem(accountSettingsPrefBytes));
             assertThat(values, hasItem(new byte[] {0}));
             assertThat(values, hasItem(new byte[] {1}));
 
@@ -383,8 +406,8 @@
         }
 
         // Minimal check on first backup, this isn't the test here.
-        verify(backupData, times(7)).writeEntityHeader(anyString(), anyInt());
-        verify(backupData, times(7)).writeEntityData(any(byte[].class), anyInt());
+        verify(backupData, times(sBackupValuesCount)).writeEntityHeader(anyString(), anyInt());
+        verify(backupData, times(sBackupValuesCount)).writeEntityData(any(byte[].class), anyInt());
 
         File stateFile2 = mTempDir.newFile();
         try (ParcelFileDescriptor oldState =
@@ -433,8 +456,8 @@
             mAgent.onBackup(null, backupData, newState);
         }
         // Minimal check on first backup, this isn't the test here.
-        verify(backupData, times(7)).writeEntityHeader(anyString(), anyInt());
-        verify(backupData, times(7)).writeEntityData(any(byte[].class), anyInt());
+        verify(backupData, times(sBackupValuesCount)).writeEntityHeader(anyString(), anyInt());
+        verify(backupData, times(sBackupValuesCount)).writeEntityData(any(byte[].class), anyInt());
 
         // Change some data.
         SharedPreferences.Editor editor = prefs.edit();
@@ -454,8 +477,8 @@
         }
 
         // Check that the second backup wrote something.
-        verify(backupData, times(7)).writeEntityHeader(anyString(), anyInt());
-        verify(backupData, times(7)).writeEntityData(any(byte[].class), anyInt());
+        verify(backupData, times(sBackupValuesCount)).writeEntityHeader(anyString(), anyInt());
+        verify(backupData, times(sBackupValuesCount)).writeEntityData(any(byte[].class), anyInt());
 
         // the two state files should contain different data (although the names are unchanged).
         try (ObjectInputStream oldStateStream =
@@ -515,14 +538,19 @@
         final String[] keys = {
             "native.pref1",
             "native.pref2",
+            "NativeJsonDict." + sAccountSettingsPrefKey,
             "AndroidDefault." + ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE,
             "AndroidDefault.junk",
             "AndroidDefault." + ChromeBackupAgentImpl.SYNCING_ACCOUNT_KEY,
             "AndroidDefault." + ChromeBackupAgentImpl.SIGNED_IN_ACCOUNT_ID_KEY,
         };
+        byte[] accountSettingsPrefBytes =
+                ApiCompatibilityUtils.getBytesUtf8(sAccountSettingsPrefValue);
         byte[] unameBytes = ApiCompatibilityUtils.getBytesUtf8(mAccountInfo.getEmail());
         byte[] uidBytes = ApiCompatibilityUtils.getBytesUtf8(mAccountInfo.getGaiaId());
-        final byte[][] values = {{0}, {1}, {1}, {23, 42}, unameBytes, uidBytes};
+        final byte[][] values = {
+            {0}, {1}, accountSettingsPrefBytes, {1}, {23, 42}, unameBytes, uidBytes
+        };
         when(backupData.getKey())
                 .thenAnswer(
                         new Answer<String>() {
@@ -567,7 +595,7 @@
 
                             @Override
                             public Boolean answer(InvocationOnMock invocation) {
-                                return mPos++ < 6;
+                                return mPos++ < sBackupValuesCount - 1;
                             }
                         });
         return backupData;
@@ -593,6 +621,7 @@
         assertTrue(prefs.getBoolean(ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE, false));
         assertFalse(prefs.contains("junk"));
         assertFalse(prefs.contains(ChromeBackupAgentImpl.SIGNED_IN_ACCOUNT_ID_KEY));
+        assertFalse(prefs.contains(sAccountSettingsPrefKey));
         verify(mChromeBackupAgentJniMock)
                 .setBoolBackupPrefs(
                         mAgent, new String[] {"pref1", "pref2"}, new boolean[] {false, true});
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/AuthenticatorIncognitoConfirmationBottomsheetTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webauthn/AuthenticatorIncognitoConfirmationBottomsheetTest.java
similarity index 98%
rename from components/webauthn/android/junit/src/org/chromium/components/webauthn/AuthenticatorIncognitoConfirmationBottomsheetTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/webauthn/AuthenticatorIncognitoConfirmationBottomsheetTest.java
index 7f09d485..b33bc88 100644
--- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/AuthenticatorIncognitoConfirmationBottomsheetTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webauthn/AuthenticatorIncognitoConfirmationBottomsheetTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.components.webauthn;
+package org.chromium.chrome.browser.webauthn;
 
 import android.content.Context;
 import android.widget.Button;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/webauthn/OWNERS
similarity index 95%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/OWNERS
rename to chrome/android/junit/src/org/chromium/chrome/browser/webauthn/OWNERS
index dd5ad77..007f5430 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/OWNERS
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webauthn/OWNERS
@@ -1 +1 @@
-file://device/fido/OWNERS
+file://device/fido/OWNERS
\ No newline at end of file
diff --git a/chrome/android/monochrome/scripts/monochrome_android_manifest_test.py b/chrome/android/monochrome/scripts/monochrome_android_manifest_test.py
index e3fb733..952bab8 100644
--- a/chrome/android/monochrome/scripts/monochrome_android_manifest_test.py
+++ b/chrome/android/monochrome/scripts/monochrome_android_manifest_test.py
@@ -24,6 +24,13 @@
     car_lib =  r'uses-library.*\n.*android.car'
     stripped_manifest = re.sub(car_lib, "", manifest)
 
+    # android.ext.adservices is a library needed for
+    # androidx.privacysandbox.ads:ads-adservices to work on Android R & S.
+    # Strip it from the manifest before asserting there are no other uses of
+    # uses-library.
+    ext_adservices_lib = r'uses-library.*\n.*android.ext.adservices'
+    stripped_manifest = re.sub(ext_adservices_lib, "", stripped_manifest)
+
     # Check that AndroidManifest.xml does not have any <uses-library> tags.
     # crbug.com/1115604
     self.assertNotIn('uses-library', stripped_manifest)
diff --git a/chrome/android/profiles/arm.newest.txt b/chrome/android/profiles/arm.newest.txt
index e666ff0..2e32907 100644
--- a/chrome/android/profiles/arm.newest.txt
+++ b/chrome/android/profiles/arm.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-122.0.6184.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-arm-122.0.6185.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 77f63771..3b63426d 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-122.0.6183.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-122.0.6185.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chrome_crash_reporter_client.cc b/chrome/app/chrome_crash_reporter_client.cc
index a9e2004..5b07a7da 100644
--- a/chrome/app/chrome_crash_reporter_client.cc
+++ b/chrome/app/chrome_crash_reporter_client.cc
@@ -42,6 +42,11 @@
 #include "ash/constants/ash_switches.h"
 #endif
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/startup/browser_params_proxy.h"  // nogncheck
+#include "chromeos/startup/startup.h"               // nogncheck
+#endif
+
 void ChromeCrashReporterClient::Create() {
   static base::NoDestructor<ChromeCrashReporterClient> crash_client;
   crash_reporter::SetCrashReporterClient(crash_client.get());
@@ -191,7 +196,20 @@
             << "so returning false";
     return false;
   }
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  bool settings_consent;
+  // If Lacros is prelaunched at login screen and the user hasn't logged in,
+  // we use the same consent file as Ash until login.
+  if (chromeos::IsLaunchedWithPostLoginParams() &&
+      !chromeos::BrowserParamsProxy::IsLoggedIn()) {
+    settings_consent = GoogleUpdateSettings::GetCollectStatsConsentFromDir(
+        base::FilePath("/home/chronos"));
+  } else {
+    settings_consent = GoogleUpdateSettings::GetCollectStatsConsent();
+  }
+#else
   bool settings_consent = GoogleUpdateSettings::GetCollectStatsConsent();
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
   VLOG(1) << "GetCollectStatsConsent(): settings_consent: " << settings_consent
           << " so returning that";
   return settings_consent;
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 6efea0b..08f2e66 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -2870,22 +2870,6 @@
                desc="Tooltip label for the button to open all downloads">
         Show all downloads in a new tab
       </message>
-      <message name="IDS_DOWNLOAD_BUBBLE_ESB_PROMO"
-               desc="Text for the in-product-help bubble shown for the esb promo download bubble.">
-        Chrome just blocked a dangerous file from downloading. Get even stronger security with enhanced protection.
-      </message>
-      <message name="IDS_DOWNLOAD_BUBBLE_ESB_PROMO_CUSTOM_ACTION"
-               desc="Text for the custom action within the in-product-help bubble shown for the esb promo download bubble.">
-        Settings
-      </message>
-      <message name="IDS_DOWNLOAD_BUBBLE_ESB_PROMO_DISMISS"
-               desc="Text for the dismiss action within the in-product-help bubble shown for the esb promo download bubble.">
-        No thanks
-      </message>
-      <message name="IDS_DOWNLOAD_BUBBLE_ESB_PROMO_TITLE"
-               desc="Title for the in-product-help bubble shown for the esb promo download bubble.">
-        Improve download protection
-      </message>
       <message name="IDS_DOWNLOAD_BUBBLE_PROMO"
                desc="Text for the in-product-help bubble shown for the download bubble.">
         Manage files as they download, and open them when they're done
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO.png.sha1
deleted file mode 100644
index 641aece..0000000
--- a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-53c2ea6d43f6002221d6aebd014f5b754564ae76
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_CUSTOM_ACTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_CUSTOM_ACTION.png.sha1
deleted file mode 100644
index 641aece..0000000
--- a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_CUSTOM_ACTION.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-53c2ea6d43f6002221d6aebd014f5b754564ae76
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_DISMISS.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_DISMISS.png.sha1
deleted file mode 100644
index 641aece..0000000
--- a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_DISMISS.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-53c2ea6d43f6002221d6aebd014f5b754564ae76
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_TITLE.png.sha1
deleted file mode 100644
index 641aece..0000000
--- a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_ESB_PROMO_TITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-53c2ea6d43f6002221d6aebd014f5b754564ae76
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index 817f7a9..6b5bfa7a 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -1230,14 +1230,23 @@
   <message name="IDS_SETTINGS_LARGE_MOUSE_CURSOR_LABEL" desc="Label for checkbox which enables showing a larger mouse cursor than normal.">
     Show large mouse cursor
   </message>
-  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_LABEL" desc="Label for checkbox which enables controlling the mouse cursor and keyboard with face movements.">
-    Face tracking
+  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_LABEL" desc="Label for checkbox which enables controlling the mouse cursor and keyboard with face movements." translateable="false">
+    Face control
   </message>
-  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_DESCRIPTION" desc="The description for the checkbox that enables controlling the mouse cursor and keyboard with face movements.">
-    Control your cursor and keyboard with face movements
+  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_DESCRIPTION" desc="The description for the checkbox that enables controlling the mouse cursor and keyboard with face movements." translateable="false">
+    Use face and gaze movement to control cursor and keyboard
   </message>
-  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_SETTINGS" desc="Label for the option to configure the feature that enables controlling the mouse cursor and keyboard with face movements.">
-    Face tracking settings
+  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_LABEL" desc="Label for the option to configure the feature that enables controlling the mouse cursor and keyboard with face movements." translateable="false">
+    Cursor control
+  </message>
+  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_DESCRIPTION" desc="Label description for the option to configure the feature that enables controlling the mouse cursor and keyboard with face movements." translateable="false">
+    Cursor calibration and movement settings
+  </message>
+  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_LABEL" desc="Label for the option to configure facial expressions for Face Gaze." translateable="false">
+    Facial expressions
+  </message>
+  <message name="IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_DESCRIPTION" desc="Label description for the option to configure facial expressions for Face Gaze." translateable="false">
+    Use facial expressions to click and trigger key presses
   </message>
   <message name="IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LABEL" desc="Label for a slider which changes the size of large mouse cursor.">
     Cursor size
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_DESCRIPTION.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..138a365
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+c0fa0225f9afc375098f72ce79be46166578edda
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_LABEL.png.sha1
new file mode 100644
index 0000000..138a365
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_LABEL.png.sha1
@@ -0,0 +1 @@
+c0fa0225f9afc375098f72ce79be46166578edda
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_DESCRIPTION.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..138a365
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+c0fa0225f9afc375098f72ce79be46166578edda
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_DESCRIPTION.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..138a365
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+c0fa0225f9afc375098f72ce79be46166578edda
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_LABEL.png.sha1
new file mode 100644
index 0000000..138a365
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_LABEL.png.sha1
@@ -0,0 +1 @@
+c0fa0225f9afc375098f72ce79be46166578edda
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_LABEL.png.sha1
new file mode 100644
index 0000000..138a365
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_LABEL.png.sha1
@@ -0,0 +1 @@
+c0fa0225f9afc375098f72ce79be46166578edda
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_DESCRIPTION.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_DESCRIPTION.png.sha1
deleted file mode 100644
index 3c3d16c..0000000
--- a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_DESCRIPTION.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0e78a0428824243cf6d1f92e4494df609f53d159
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_LABEL.png.sha1
deleted file mode 100644
index 3c3d16c..0000000
--- a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_LABEL.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0e78a0428824243cf6d1f92e4494df609f53d159
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_SETTINGS.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_SETTINGS.png.sha1
deleted file mode 100644
index 3c3d16c..0000000
--- a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_SETTINGS.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0e78a0428824243cf6d1f92e4494df609f53d159
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index 18376ce..266dded 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -240,7 +240,7 @@
 <translation id="5473971139929175403">हो सकता है कि Chromium सही तरीके से काम न करे, क्योंकि अब वह Linux के इस वर्शन पर काम नहीं करता है</translation>
 <translation id="5480860683791598150">इस साइट से आपकी जगह की जानकारी शेयर करने के लिए क्रोमियम को आपकी जगह की जानकारी का एक्सेस चाहिए</translation>
 <translation id="5487574057737591516">आपकी निजता को सुरक्षित रखने के लिए, हम आपकी पसंद के उन विषयों को ऑटोमैटिकली मिटा देते हैं जिनका अनुमान चार हफ़्ते पहले लगाया गया था. ब्राउज़ करते रहने पर, आपकी पसंद का कोई विषय, सूची में फिर से शामिल किया जा सकता है. इसके अलावा, अगर आपको लगता है कि Chromium ने आपकी पसंद के विषय को शामिल नहीं किया है या आपको कोई खास विज्ञापन नहीं देखना है, तो आपके पास उस विषय को हटाने का विकल्प होता है.</translation>
-<translation id="549669000822060376">कृपया क्रोमियम द्वारा नवीनतम सिस्टम अपडेट इंस्टॉल करने के दौरान प्रतीक्षा करें.</translation>
+<translation id="549669000822060376">कृपया क्रोमियम द्वारा नवीनतम सिस्टम अपडेट इंस्टॉल करने के दौरान इंतज़ार करें.</translation>
 <translation id="5496810170689441661">क्रोमियम, पासवर्ड कॉपी करने की कोशिश कर रहा है. इसकी अनुमति देने के लिए Windows का पासवर्ड डालें.</translation>
 <translation id="5527463683072221100">Chromium में पीडीएफ़ खोलें</translation>
 <translation id="5623402015214259806">{0,plural, =0{क्रोमियम का एक अपडेट उपलब्ध है}=1{क्रोमियम का एक अपडेट उपलब्ध है}one{क्रोमियम का एक अपडेट # दिनों से उपलब्ध है}other{क्रोमियम का एक अपडेट # दिनों से उपलब्ध है}}</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index cf66fbe..d482669d 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">Skermvergrootglas</translation>
 <translation id="3474218480460386727">Gebruik 99 letters of minder vir nuwe woorde</translation>
 <translation id="3474624961160222204">Gaan voort as <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Jammer, jou vingerafdruk word steeds nie herken nie. Voer asseblief jou wagwoord in.</translation>
 <translation id="3476303763173086583">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. Die eienaar kan kies om diagnostiese en gebruikdata vir hierdie toestel na Google toe te stuur. As die bykomende Web- en App-aktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Oeps! Die stelsel kon nie die beleid vir jou toestel gaan haal nie.</translation>
 <translation id="347785443197175480">Hou aan om <ph name="HOST" /> toegang tot jou kamera en mikrofoon te gee</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">Blokkeer dele van webbladsye</translation>
 <translation id="3760460896538743390">Ondersoek agtergrondbladsy</translation>
 <translation id="37613671848467444">Maak in incognitovenster oop</translation>
-<translation id="3761390540041101668">Verskaf ’n duidelike beskrywing van die probleem en stappe om die probleem weer te laat gebeur (indien moontlik)</translation>
 <translation id="3761556954875533505">Laat werf lêers wysig?</translation>
 <translation id="3763433740586298940">Jy kan werwe blokkeer wat jy nie wil hê nie. Chrome vee werwe wat ouer as 30 dae is, ook outomaties van die lys af uit.</translation>
 <translation id="3763549179847864476">Privaatheidgids se terugknoppie</translation>
@@ -5903,7 +5901,6 @@
 <translation id="5608580678041221894">Tik op die volgende sleutels om die snoei-area te verstel of te skuif</translation>
 <translation id="5609231933459083978">Dit lyk of die program ongeldig is.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Jammer, jou wagwoord kon steeds nie geverifieer word nie. Let wel: as jy jou wagwoord onlangs verander het, sal jou nuwe wagwoord van toepassing wees sodra jy afmeld. Gebruik die ou wagwoord hier.</translation>
 <translation id="5614190747811328134">Gebruikerkennisgewing</translation>
 <translation id="5614553682702429503">Stoor wagwoord?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 60b4a23..b0ac0bb 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -3218,7 +3218,6 @@
 <translation id="3473479545200714844">የማያ ገፅ ማጉያ</translation>
 <translation id="3474218480460386727">ለአዲስ ቃላት 99 ፊደሎችን ወይም ከዚያ ያነሰ ይጠቀሙ</translation>
 <translation id="3474624961160222204">እንደ <ph name="NAME" /> ይቀጥሉ</translation>
-<translation id="3475843873335999118">ይቅርታ፣ የጣት አሻራዎ አሁንም አልታወቀም። እባክዎ የይለፍ ቃልዎን ያስገቡት።</translation>
 <translation id="3476303763173086583">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ በራስ-ሰር ወደ Google በመላክ የልጅዎን የAndroid ተሞክሮ እንዲሻሻል ያግዙ። ይህ ልጅዎን ለመለየት ሥራ ላይ አይውልም፣ እና የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። ይህ <ph name="BEGIN_LINK1" />ቅንብር<ph name="END_LINK1" /> በባለቤቱ ተፈጻሚ ይደረጋል። ባለቤቱ የዚህ መሣሪያ የምርመራ እና የአጠቃቀም ለGoogle ለመላክ ሊመርጥ ይችላሉ። የተጨማሪ የድር እና መተግበሪያ እንቅስቃሴ ቅንብር ለልጅዎ በርቶ ከሆነ ይህ ውሂብ ወደ የGoogle መለያቸው ሊቀመጥ ይችላል። <ph name="BEGIN_LINK2" />የበለጠ ለመረዳት<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">ውይ!  ሥርዓቱ ለመሣሪያዎ መመሪያን ማግኘት አልተሳካለትም።</translation>
 <translation id="347785443197175480"><ph name="HOST" /> ካሜራዎን እና ማይክሮፎንዎን እንዲደርስ መፍቀዱን ይቀጥሉ</translation>
@@ -3585,7 +3584,6 @@
 <translation id="3759933321830434300">የድረ-ገጾች ክፍሎችን ያግዳል</translation>
 <translation id="3760460896538743390">&amp;የጀርባ ገፅ ይመርምሩ</translation>
 <translation id="37613671848467444">&amp;ማንነትን በማያሳውቅ መስኮት ውስጥ ክፈት</translation>
-<translation id="3761390540041101668">የችግሩን ግልጽ መግለጫ እና ችግሩን መልሶ ለመፍጠር እርምጃዎችን (የሚቻል ከሆነ) ያቅርቡ</translation>
 <translation id="3761556954875533505">ጣቢያ ፋይሎችን እንዲያርትዕ ይፈቀድለት?</translation>
 <translation id="3763433740586298940">የማይፈልጓቸውን ጣቢያዎች ማገድ ይችላሉ። እንዲሁም Chrome ከ30 ቀናት በላይ የሆናቸው ጣቢያዎችን ከዝርዝሩ በራስ-ሰር ይሰርዛል።</translation>
 <translation id="3763549179847864476">የግላዊነት መመሪያ የተመለስ አዝራር</translation>
@@ -5895,7 +5893,6 @@
 <translation id="5608580678041221894">የመከርከሚያ አካባቢውን ለማስተካከል ወይም ለመውሰድ የሚከተሉትን ቁልፎች መታ ያድርጉ</translation>
 <translation id="5609231933459083978">መተግበሪያው ልክ ያልሆነ ይመስላል።</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 5939a619..5ab0f83 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -3212,7 +3212,6 @@
 <translation id="3473479545200714844">مكبّر الشاشة</translation>
 <translation id="3474218480460386727">يجب استخدام ما لا يزيد عن 99 حرفًا للكلمات الجديدة.</translation>
 <translation id="3474624961160222204">المتابعة بحساب "<ph name="NAME" />"</translation>
-<translation id="3475843873335999118">عذرًا، لا يزال التعرُّف على بصمة الإصبع متعذّرًا. يُرجى إدخال كلمة المرور.</translation>
 <translation id="3476303763173086583">‏يمكنك إرسال بيانات الاستخدام والتشخيص. يمكنك المساعدة في تحسين تجربة نظام التشغيل Android على حسابك الفرعي من خلال إرسال بيانات التطبيق والجهاز والتشخيص تلقائيًا إلى Google. لن يتم استخدام ذلك لتعريف حسابك الفرعي وسيساعد في استقرار عمل النظام والتطبيقات، بالإضافة إلى التحسينات الأخرى. كما ستساعد بعض البيانات المجمّعة تطبيقات Google وشركائها، مثل مطوّري برامج نظام التشغيل Android. ويفرض المالك هذا <ph name="BEGIN_LINK1" />الإعداد<ph name="END_LINK1" />. قد يختار المالك إرسال بيانات الاستخدام والتشخيص لهذا الجهاز إلى Google. في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات" لحسابك الفرعي، قد يتم حفظ هذه البيانات في حسابك على Google. <ph name="BEGIN_LINK2" />مزيد من المعلومات<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">عفوًا! تعذّر النظام في جلب السياسة لجهازك.</translation>
 <translation id="347785443197175480">مواصلة إتاحة دخول <ph name="HOST" /> إلى الكاميرا والميكروفون التابعين لك</translation>
@@ -3580,7 +3579,6 @@
 <translation id="3759933321830434300">الأجزاء المقيدة من صفحات الويب</translation>
 <translation id="3760460896538743390">فحص &amp;صفحة الخلفية</translation>
 <translation id="37613671848467444">فتح في &amp;نافذة التصفح المتخفي</translation>
-<translation id="3761390540041101668">يُرجى تقديم وصف واضح للمشكلة وخطوات إعادة إظهار هذه المشكلة (إن أمكن ذلك).</translation>
 <translation id="3761556954875533505">هل تريد السماح للموقع الإلكتروني بتعديل الملفات؟</translation>
 <translation id="3763433740586298940">‏يمكنك حظر المواقع الإلكترونية التي لا تريدها. بالإضافة إلى ذلك، يحذف Chrome تلقائيًا المواقع الإلكترونية التي يمر أكثر من 30 يومًا على إضافتها إلى قائمة "المواقع الإلكترونية التي تقترح الإعلانات".</translation>
 <translation id="3763549179847864476">زر الرجوع في "دليل الخصوصية"</translation>
@@ -5889,7 +5887,6 @@
 <translation id="5608580678041221894">انقر على المفاتيح التالية لضبط منطقة الاقتصاص أو تحريكها</translation>
 <translation id="5609231933459083978">يبدو أن التطبيق غير صالح.</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>
 <translation id="5614947000616625327">‏سلسلة مفاتيح iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index e1bcfec..01257ca 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -3221,7 +3221,6 @@
 <translation id="3473479545200714844">স্ক্ৰীন বিৱৰ্ধক</translation>
 <translation id="3474218480460386727">নতুন শব্দবোৰৰ বাবে ৯৯ টা অথবা তাতকৈ কম আখৰ ব্যৱহাৰ কৰক</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> হিচাপে অব্যাহত ৰাখক</translation>
-<translation id="3475843873335999118">দুঃখিত, আপোনাৰ ফিংগাৰপ্ৰিণ্ট এতিয়াও চিনাক্ত কৰিব পৰা নাই। অনুগ্ৰহ কৰি আপোনাৰ পাছৱৰ্ড দিয়ক।</translation>
 <translation id="3476303763173086583">ব্যৱহাৰ আৰু ডায়েগন’ষ্টিক ডেটা পঠিয়াওক। Googleলৈ স্বয়ংক্ৰিয়ভাৱে ডায়েগন’ষ্টিক, ডিভাইচ আৰু এপ্ ব্যৱহাৰৰ ডেটা পঠিয়াই আপোনাৰ শিশুৰ Android ব্যৱহাৰৰ অভিজ্ঞতা উন্নত কৰক। এই ডেটা আপোনাৰ শিশুক চিনাক্ত কৰিবলৈ ব্যৱহাৰ কৰা নহয় আৰু ই ছিষ্টেম আৰু এপৰ স্থিৰতা আৰু অন্য সুবিধাসমূহ উন্নত কৰাত সহায় কৰিব। কিছুমান ডেটাৰ সমষ্টিয়ে লগতে Google এপ্ আৰু অংশীদাৰ, যেনে Androidৰ বিকাশকর্তাকো সহায় কৰিব। এই <ph name="BEGIN_LINK1" />ছেটিং<ph name="END_LINK1" />টো গৰাকীয়ে বলপূৰ্বকভাৱে সন্নিবিষ্ট কৰিছে। গৰাকীজনে Googleলৈ ডায়েগন’ষ্টিক আৰু ব্যৱহাৰৰ ডেটা পঠিয়াবলৈ সিন্ধান্ত ল’ব পাৰে। যদি আপোনাৰ শিশুৰ বাবে অতিৰিক্ত ৱেব আৰু এপৰ কার্যকলাপ অন কৰা হৈছে, তেন্তে এই ডেটা তেওঁলোকৰ Google একাউণ্টত ছেভ কৰা হ’ব পাৰে। <ph name="BEGIN_LINK2" />অধিক জানক<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">আমি দুঃখিত!  ছিষ্টেমটোৱে আপোনাৰ ডিভাইচটোৰ বাবে নীতি আহৰণ কৰিব নোৱাৰিলে।</translation>
 <translation id="347785443197175480"><ph name="HOST" />ক আপোনাৰ কেমেৰা আৰু মাইক্ৰ’ফ’ন এক্সেছ কৰি থাকিবলৈ দিয়ক</translation>
@@ -3588,7 +3587,6 @@
 <translation id="3759933321830434300">ৱেব পৃষ্ঠাৰ অংশবিশেষ অৱৰোধ কৰক</translation>
 <translation id="3760460896538743390">&amp;নেপথ্যৰ পৃষ্ঠা পৰীক্ষা কৰক</translation>
 <translation id="37613671848467444">&amp;ইনক'গনিট' ৱিণ্ড'ত খোলক</translation>
-<translation id="3761390540041101668">সমস্যাটোৰ বিষয়ে আৰু লগতে ইয়াৰ পুনৰ সৃষ্টিৰ বাবে ল’বলগীয়া পদক্ষেপসমূহৰ এক স্পষ্ট বৰ্ণনা প্ৰদান কৰক (যদি সম্ভৱ)</translation>
 <translation id="3761556954875533505">ছাইটটোক ফাইলসমূহ সম্পাদনা কৰিবলৈ দিবনে?</translation>
 <translation id="3763433740586298940">আপুনি নিবিচৰা ছাইটসমূহ অৱৰোধ কৰিব পাৰে। Chromeএ লগতে ৩০ দিনতকৈ পুৰণি ছাইটসমূহ সূচীখনৰ পৰা স্বয়ংক্ৰিয়ভাৱে মচে।</translation>
 <translation id="3763549179847864476">গোপনীয়তা সম্পৰ্কীয় নিৰ্দেশনাৰ পৰা পিছলৈ যোৱাৰ বুটাম</translation>
@@ -5900,7 +5898,6 @@
 <translation id="5608580678041221894">ক্ৰপ কৰা অংশ মিলাবলৈ বা আঁতৰাবলৈ তলত উল্লেখ কৰা চাবিসমূহ টিপক</translation>
 <translation id="5609231933459083978">এই এপ্লিকেশ্বনটো অমান্য যেন লাগিছে।</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>
 <translation id="5614947000616625327">iCloud কীচেইন</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 12618f3..04e6d54 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -3207,7 +3207,6 @@
 <translation id="3473479545200714844">Ekran böyüdücü</translation>
 <translation id="3474218480460386727">Yeni sözlər üçün 99 və ya daha az hərfdən istifadə edin</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> olaraq davam edin</translation>
-<translation id="3475843873335999118">Barmaq iziniz hələ də tanınmır. Parol daxil edin.</translation>
 <translation id="3476303763173086583">İstifadə və diaqnostika datasını göndərin. Google'a diaqnostika, cihaz və tətbiq istifadə datasını avtomatik göndərməklə övladınızın Android təcrübəsini təkmilləşdirin. Bu, övladınızı müəyyən etmək üçün istifadə edilməyəcək, eyni zamanda, sistem və tətbiq sabitliyi və digər təkmilləşdirmələrə kömək edəcək. Ümumi data, həmçinin, Google tətbiqləri və Android developerləri kimi partnyorlara kömək edəcək. Bu <ph name="BEGIN_LINK1" />ayar<ph name="END_LINK1" /> sahibi tərəfindən tətbiq edilir. Sahibi bu cihaz üçün diaqnostika və istifadə datasını Google'a göndərməyi seçə bilər. Övladınız üçün əlavə Veb və Tətbiq Fəaliyyəti ayarı aktiv edilərsə, həmin data Google hesabında yadda saxlana bilər. <ph name="BEGIN_LINK2" />Ətraflı Məlumat<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ups! Sistem cihaz siyasətini əldə edə bilmədi.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> hostuna kameranıza və mikrofonunuza giriş verirsiniz</translation>
@@ -3574,7 +3573,6 @@
 <translation id="3759933321830434300">Veb səhifələrin hissələrini bloklayın</translation>
 <translation id="3760460896538743390">Arxa fonu ispeksiya edin</translation>
 <translation id="37613671848467444">Gizli Pəncərədə Açın</translation>
-<translation id="3761390540041101668">Problemin aydın təsvirini və reproduksiya yollarını təqdim edin (mümkündürsə)</translation>
 <translation id="3761556954875533505">Sayta faylları redaktə etmək üçün icazə verilsin?</translation>
 <translation id="3763433740586298940">İstəmədiyiniz saytları bloklaya bilərsiniz. Chrome 30 gündən əvvələ aid saytları siyahıdan avtomatik silir.</translation>
 <translation id="3763549179847864476">Məxfilik Bələdçisi geri düyməsi</translation>
@@ -5884,7 +5882,6 @@
 <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="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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index ef4829b..e999f970 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -3209,7 +3209,6 @@
 <translation id="3473479545200714844">Экранная лупа</translation>
 <translation id="3474218480460386727">Новыя словы павінны складацца з не больш чым 99 літар</translation>
 <translation id="3474624961160222204">Працягнуць як <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Адбітак пальца распазнаць не ўдалося. Увядзіце пароль.</translation>
 <translation id="3476303763173086583">Адпраўка даных пра выкарыстанне і дыягностыку. Дапамажыце палепшыць функцыянальнасць прылады Android для дзіцяці шляхам аўтаматычнай адпраўкі даных пра дыягностыку, выкарыстанне прылады і праграм у Google. Яны не будуць выкарыстаны для ідэнтыфікацыі асобы дзіцяці, але дапамогуць у паляпшэнні стабільнасці сістэмы і праграм і для іншых удасканаленняў. Некаторыя згрупаваныя даныя таксама будуць карысныя для праграм і партнёраў Google, напрыклад распрацоўшчыкаў Android. Гэта <ph name="BEGIN_LINK1" />налада<ph name="END_LINK1" /> ўключана ўладальнікам. Уладальнік можа ўключыць адпраўку даных пра выкарыстанне і дыягностыку гэтай прылады ў Google. Калі для вашага дзіцяці ўключана налада дадатковай гісторыі дзеянняў у інтэрнэце і праграмах, то адпаведныя даныя могуць захоўвацца ў яго Уліковым запісе Google. <ph name="BEGIN_LINK2" />Даведацца больш<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Памылка.  Сістэме не ўдалося атрымаць палітыку для прылады.</translation>
 <translation id="347785443197175480">І далей даваць <ph name="HOST" /> доступ да камеры і мікрафона</translation>
@@ -3574,7 +3573,6 @@
 <translation id="3759933321830434300">Блакіраваць часткі вэб-старонак</translation>
 <translation id="3760460896538743390">Праглядзець &amp;фонавую старонку</translation>
 <translation id="37613671848467444">Адкрыць у &amp;акне ў рэжыме інкогніта</translation>
-<translation id="3761390540041101668">Дайце дакладнае апісанне праблемы і крокаў, якія да яе прыводзяць (калі гэта магчыма)</translation>
 <translation id="3761556954875533505">Дазволіць сайту змяняць файлы?</translation>
 <translation id="3763433740586298940">Вы можаце блакіраваць непажаданыя сайты. Chrome таксама аўтаматычна выдаляе сайты са спіса, унесеныя ў яго больш чым за 30 дзён таму.</translation>
 <translation id="3763549179847864476">Кнопка "Назад" у Дапаможніку па прыватнасці</translation>
@@ -5886,7 +5884,6 @@
 <translation id="5608580678041221894">Каб змяніць або перамясціць вобласць абрэзкі, выкарыстоўвайце наступныя клавішы</translation>
 <translation id="5609231933459083978">Здаецца, праграма недапушчальная.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index bf342c6..ca6d086 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1653,6 +1653,7 @@
 <translation id="2249111429176737533">Отваряне като прозорец с раздели</translation>
 <translation id="2249605167705922988">напр. 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Персонализиране на информацията, използвана от сайтовете с цел показване на реклами</translation>
+<translation id="2250624716625396929">Този раздел използва камерата и микрофона ви</translation>
 <translation id="2251218783371366160">Отваряне със системния визуализатор</translation>
 <translation id="225163402930830576">Опресняване на мрежите</translation>
 <translation id="2251809247798634662">Нов прозорец инкогнито</translation>
@@ -3219,7 +3220,6 @@
 <translation id="3473479545200714844">Екранна лупа</translation>
 <translation id="3474218480460386727">Използвайте до 99 букви за новите думи</translation>
 <translation id="3474624961160222204">Продължаване като <ph name="NAME" /></translation>
-<translation id="3475843873335999118">За съжаление, отпечатъкът ви е все още неразпознат. Моля, въведете паролата си.</translation>
 <translation id="3476303763173086583">Изпращане на данни за употребата и диагностиката. Помогнете за подобряването на работата на детето ви с Android, като автоматично изпращате до Google диагностична информация и данни за употребата на устройството и приложенията. Тази информация няма да се използва за идентифициране на детето ви, а ще послужи за подобряване на стабилността на системата и приложенията и др. Някои обобщени данни също така ще подпомогнат приложенията и партньорите на Google, напр. програмистите за Android. Тази <ph name="BEGIN_LINK1" />настройка<ph name="END_LINK1" /> е наложена от собственика. Той може да избере до Google да се изпращат диагностична информация и данни за употребата на това устройство. Ако настройката „Допълнителна активност в мрежата и приложенията“ е включена за детето ви, тези данни може да се запазват в профила му в Google. <ph name="BEGIN_LINK2" />Научете повече<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ами сега! Системата не успя да извлече правилата за устройството ви.</translation>
 <translation id="347785443197175480">Достъпът на <ph name="HOST" /> до камерата и микрофона ви да продължава да е разрешен</translation>
@@ -3586,7 +3586,6 @@
 <translation id="3759933321830434300">Блокиране на части от уеб страници</translation>
 <translation id="3760460896538743390">Инспектиране на &amp;фоновата страница</translation>
 <translation id="37613671848467444">Отваряне на прозорец в режим „&amp;инкогнито“</translation>
-<translation id="3761390540041101668">Предоставете ясно описание на проблема и стъпките за възпроизвеждането му (ако е възможно)</translation>
 <translation id="3761556954875533505">Да се разреши ли на сайта да редактира файлове?</translation>
 <translation id="3763433740586298940">Можете да блокирате нежеланите сайтове. Също така Chrome автоматично изтрива от списъка сайтовете, посетени преди повече от 30 дни.</translation>
 <translation id="3763549179847864476">Бутон за връщане в ръководството за поверителност</translation>
@@ -5900,7 +5899,6 @@
 <translation id="5608580678041221894">Докоснете следните клавиши, за да коригирате или преместите областта за подрязване</translation>
 <translation id="5609231933459083978">Изглежда, че приложението е невалидно.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6635,6 +6633,7 @@
 <translation id="6202304368170870640">Можете да използвате ПИН кода си, за да влизате в устройството си и да го отключвате.</translation>
 <translation id="6203247599828309566">Запазихте бележка за парола на този сайт. За да я видите, кликнете върху иконата на ключ.</translation>
 <translation id="6205314730813004066">Поверителност при рекламите</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – записва чрез микрофона</translation>
 <translation id="6206199626856438589">Ще излезете от профила си в показаните сайтове, включително в отворените раздели</translation>
 <translation id="6206311232642889873">Копи&amp;ране на изображението</translation>
 <translation id="6207200176136643843">Възстановяване на стандартното ниво на мащаба</translation>
@@ -7186,6 +7185,7 @@
 <translation id="6657585470893396449">Парола</translation>
 <translation id="6659213950629089752">Мащабът на тази страница бе променен от разширението <ph name="NAME" /></translation>
 <translation id="6659594942844771486">Раздел</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – записва чрез камерата</translation>
 <translation id="6660819301598582123">Ах, чудна българска земьо, полюшвай цъфтящи жита!</translation>
 <translation id="666099631117081440">Сървъри за печат</translation>
 <translation id="6662931079349804328">Корпоративните правила бяха променени. Бутонът за експерименти бе премахнат от лентата с инструменти.</translation>
@@ -8999,6 +8999,7 @@
 <translation id="8059417245945632445">&amp;Инспектиране на устройствата</translation>
 <translation id="8059456211585183827">Няма налични принтери за запазване.</translation>
 <translation id="8061091456562007989">Възстановяване на настройките</translation>
+<translation id="8061244502316511332">Този раздел използва микрофона ви</translation>
 <translation id="8061970399284390013">Проверка на правописа и граматиката</translation>
 <translation id="8061991877177392872">Изглежда, че вече сте настроили Voice Match за Асистент на друго устройство. Предишните записи бяха използвани за създаване на гласов модел на това устройство.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 лист хартия}other{{COUNT} листа хартия}}</translation>
@@ -9480,6 +9481,7 @@
 <translation id="844063558976952706">Винаги на този сайт</translation>
 <translation id="8441313165929432954">Активиране/деактивиране на тетъринга</translation>
 <translation id="8443986842926457191">URL адресът е повече от 2048 знака</translation>
+<translation id="8445281870900174108">Този раздел използва камерата ви</translation>
 <translation id="8446884382197647889">Научете повече</translation>
 <translation id="8447409163267621480">Използвайте или Ctrl, или Alt</translation>
 <translation id="844850004779619592">Няма намерени команди</translation>
@@ -10554,6 +10556,7 @@
 <translation id="981121421437150478">Офлайн</translation>
 <translation id="983192555821071799">Затваряне на всички раздели</translation>
 <translation id="983511809958454316">Тази функция не се поддържа във VR</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – записва чрез камерата и микрофона</translation>
 <translation id="984275831282074731">Начини на плащане</translation>
 <translation id="984705303330760860">Добавяне на езици за проверка на правописа</translation>
 <translation id="98515147261107953">Хоризонтално</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 6fb487d..6290aca 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -3225,7 +3225,6 @@
 <translation id="3473479545200714844">স্ক্রিন ম্যাগনিফায়ার</translation>
 <translation id="3474218480460386727">নতুন শব্দের জন্য ৯৯টি অথবা তার চেয়ে কম বর্ণ ব্যবহার করুন</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> হিসাবে চালিয়ে যান</translation>
-<translation id="3475843873335999118">দুঃখিত, আপনার আঙ্গুলের ছাপ এখনো শনাক্ত করা যায়নি। অনুগ্রহ করে আপনার পাসওয়ার্ড লিখুন।</translation>
 <translation id="3476303763173086583">ব্যবহার এবং ডায়াগনস্টিক ডেটা পাঠান। Google-এ নিজে থেকে ডায়াগনস্টিক, ডিভাইস এবং অ্যাপ ব্যবহারের ডেটা পাঠিয়ে, আপনার সন্তানের Android অভিজ্ঞতাকে উন্নত করতে সাহায্য করুন। এটি আপনার সন্তানকে শনাক্ত করতে ব্যবহার করা হবে না এবং সিস্টেম ও অ্যাপের স্থিতিশীলতা এবং অন্যান্য উন্নতিতে সাহায্য করবে। ব্যবহারকারীদের কিছু সম্মিলিত ডেটা Google অ্যাপ এবং Android ডেভেলপারদের মতো পার্টনারদের কাজে লাগবে। এই <ph name="BEGIN_LINK1" />সেটিং<ph name="END_LINK1" /> মালিকের নিয়ন্ত্রণে রয়েছে। এই ডিভাইসের জন্য Google-কে ডায়গনস্টিক এবং ব্যবহারের ডেটা পাঠানোর বিষয়টি মালিক বেছে নিতে পারেন। অতিরিক্ত ওয়েব ও অ্যাপ অ্যাক্টিভিটি সেটিংটি আপনার সন্তানের ডিভাইসের জন্য চালু করা থাকলে, এই ডেটা তাদের Google অ্যাকাউন্টে সেভ করা হতে পারে। <ph name="BEGIN_LINK2" />আরও জানুন<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">ওহো!  সিস্টেম আপনার ডিভাইসের জন্য নীতি আনতে পারেনি।</translation>
 <translation id="347785443197175480">আপনার ক্যামেরা এবং মাইক্রোফোন অ্যাক্সেস করতে <ph name="HOST" /> এর মঞ্জুরি অবিরত রাখুন</translation>
@@ -3592,7 +3591,6 @@
 <translation id="3759933321830434300">ওয়েব পৃষ্ঠাগুলির অংশগুলি অবরুদ্ধ করুন</translation>
 <translation id="3760460896538743390">&amp;পশ্চাদপট পৃষ্ঠা পরিদর্শন করুন</translation>
 <translation id="37613671848467444">ছদ্মবেশী উইন্ডোতে খুলু&amp;ন</translation>
-<translation id="3761390540041101668">সমস্যার সুস্পষ্ট একটি বিবরণ দিন এবং সমস্যাটি রিপ্রোডিউস করার পদক্ষেপগুলি জানান (যদি সম্ভব হয়)</translation>
 <translation id="3761556954875533505">সাইটকে এই ফাইল এডিট করার অনুমতি দেবেন?</translation>
 <translation id="3763433740586298940">আপনি চান না এমন সাইটগুলি ব্লক করতে পারবেন। এছাড়াও তালিকা থেকে ৩০ দিনের পুরনো সাইট Chrome অটোমেটিক মুছে দেয়।</translation>
 <translation id="3763549179847864476">গোপনীয়তা সংক্রান্ত গাইডে ফিরে যাওয়ার বোতাম</translation>
@@ -5906,7 +5904,6 @@
 <translation id="5608580678041221894">কাটছাঁট করার এলাকা সমন্বয় করতে বা সরাতে নীচের কী’গুলি আলতো চাপুন</translation>
 <translation id="5609231933459083978">অ্যাপটি ভুল বলে মনে হচ্ছে৷</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>
 <translation id="5614947000616625327">iCloud কী-চেন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 925575f..df7ded1 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">Povećalo ekrana</translation>
 <translation id="3474218480460386727">Za nove riječi koristite 99 slova ili manje</translation>
 <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Još uvijek ne možemo prepoznati vaše otiske prsta. Unesite lozinku.</translation>
 <translation id="3476303763173086583">Šaljite podatke o korištenju i dijagnostici. Poboljšajte iskustvo korištenja Androida svog djeteta automatskim slanjem podataka o dijagnostici, uređaju i korištenju aplikacija Googleu. Ovo se neće koristiti za identifikaciju vašeg djeteta, a pomoći će stabilnosti sistema i aplikacija, kao i drugim poboljšanjima. Neki zbirni podaci će također pomoći Googleovim aplikacijama i partnerima, kao što su Androidovi programeri. Ovu <ph name="BEGIN_LINK1" />postavku<ph name="END_LINK1" /> je nametnuo vlasnik. Vlasnik može odlučiti da šalje podatke o dijagnostici i korištenju ovog uređaja u Google. Ako je za vaše dijete uključena postavka dodatna Aktivnost na webu i u aplikacijama, ti podaci mogu biti sačuvani na njegovom Google računu. <ph name="BEGIN_LINK2" />Saznajte više<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ups!  Sistem nije uspio preuzeti pravila za vaš uređaj.</translation>
 <translation id="347785443197175480">I dalje dozvoljavaj host računaru <ph name="HOST" /> da pristupa kameri i mikrofonu</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">Blokiranje dijelova web stranica</translation>
 <translation id="3760460896538743390">Pregledaj &amp;stranicu u pozadini</translation>
 <translation id="37613671848467444">Otvori u &amp;anonimnom prozoru</translation>
-<translation id="3761390540041101668">Navedite jasan opis problema i korake za njegovu reprodukciju (ako je moguće)</translation>
 <translation id="3761556954875533505">Dozvoliti web lokaciji da uredi fajlove?</translation>
 <translation id="3763433740586298940">Možete blokirati web lokacije koje ne želite. Chrome također automatski briše web lokacije s liste koje su starije od 30 dana.</translation>
 <translation id="3763549179847864476">Dugme "Nazad" Vodiča za privatnost</translation>
@@ -5903,7 +5901,6 @@
 <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="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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 17942e8..047dfcb 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -3208,7 +3208,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">Utilitza 99 lletres o menys per a les paraules noves</translation>
 <translation id="3474624961160222204">Continua com a <ph name="NAME" /></translation>
-<translation id="3475843873335999118">No es reconeix la teva empremta digital. Escriu la contrasenya.</translation>
 <translation id="3476303763173086583">Envia dades d'ús i de diagnòstic. Ajuda a millorar l'experiència a Android del teu fill enviant automàticament a Google dades de diagnòstic, del dispositiu i d'ús d'aplicacions. Aquestes dades no es faran servir per identificar el teu fill i ajudaran a millorar l'estabilitat del sistema i de les aplicacions, entre altres característiques. Una part de les dades agregades també serà útil per a les aplicacions i per als partners de Google, com ara els desenvolupadors d'Android. El propietari ha aplicat aquesta <ph name="BEGIN_LINK1" />opció de configuració<ph name="END_LINK1" />. És possible que el propietari decideixi enviar a Google dades de diagnòstic i d'ús sobre aquest dispositiu. Si l'opció Activitat al web i en aplicacions addicional està activada per al teu fill, és possible que aquestes dades es desin al seu Compte de Google. <ph name="BEGIN_LINK2" />Més informació<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">El sistema no ha pogut obtenir la política per al dispositiu.</translation>
 <translation id="347785443197175480">Continua permetent que <ph name="HOST" /> accedeixi a la càmera i al micròfon</translation>
@@ -3575,7 +3574,6 @@
 <translation id="3759933321830434300">Bloquejar elements de pàgines web</translation>
 <translation id="3760460896538743390">Inspecciona la &amp;pàgina de fons</translation>
 <translation id="37613671848467444">Obre en una &amp;finestra d'incògnit</translation>
-<translation id="3761390540041101668">Proporciona una descripció clara del problema i els passos per reproduir-lo (si és possible)</translation>
 <translation id="3761556954875533505">Vols permetre que el lloc web editi els fitxers?</translation>
 <translation id="3763433740586298940">Pots bloquejar els llocs web que no t'interessen. Chrome també suprimeix automàticament els llocs web de la llista que tenen més de 30 dies.</translation>
 <translation id="3763549179847864476">Botó Enrere de la Guia de privadesa</translation>
@@ -5887,7 +5885,6 @@
 <translation id="5608580678041221894">Toca aquestes tecles per ajustar o moure l'àrea per retallar</translation>
 <translation id="5609231933459083978">Sembla que l'aplicació no és vàlida.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Encara no s'ha pogut verificar la contrasenya. Nota: Si l'has canviat fa poc, la contrasenya nova s'aplicarà un cop hagis tancat la sessió. Fes servir la contrasenya anterior aquí.</translation>
 <translation id="5614190747811328134">Avís per a l'usuari </translation>
 <translation id="5614553682702429503">Vols desar la contrasenya?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 1381009..684c8bc 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -3210,7 +3210,6 @@
 <translation id="3473479545200714844">Lupa obrazovky</translation>
 <translation id="3474218480460386727">Nová slova smí mít maximálně 99 písmen</translation>
 <translation id="3474624961160222204">Pokračovat jako <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Otisk prstu stále nebyl rozpoznán. Zadejte prosím heslo.</translation>
 <translation id="3476303763173086583">Odesílat údaje o využití a diagnostice. Pomozte prostředí Android svého dítěte zlepšit tím, že necháte do Googlu automaticky odesílat diagnostické údaje a údaje o využití zařízení a aplikací. Tyto údaje nebudou používány ke zjištění totožnosti dítěte a pomohou nám se zvyšováním stability systému a aplikací a dalšími vylepšeními. Některá souhrnná data budou moci využít také naši partneři, např. vývojáři aplikací pro Android. Toto nastavení je <ph name="BEGIN_LINK1" />vyžadováno<ph name="END_LINK1" /> vlastníkem. Vlastník může zvolit, že se diagnostické údaje a údaje o využití z tohoto zařízení mají odesílat do Googlu. Pokud má dítě zapnuté dodatečné nastavení Aktivita na webu a v aplikacích, mohou se tato data ukládat do jeho účtu Google. <ph name="BEGIN_LINK2" />Další informace<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Jejda! Systému se nepodařilo načíst zásady pro vaše zařízení.</translation>
 <translation id="347785443197175480">Povolit webu <ph name="HOST" /> přístup k webové kameře a mikrofonu i nadále</translation>
@@ -3577,7 +3576,6 @@
 <translation id="3759933321830434300">Blokování částí webových stránek</translation>
 <translation id="3760460896538743390">Prozkoumat stránku na &amp;pozadí</translation>
 <translation id="37613671848467444">Otevřít v &amp;anonymním okně</translation>
-<translation id="3761390540041101668">Poskytněte jasný popis problému a kroky k jeho reprodukci (pokud je to možné)</translation>
 <translation id="3761556954875533505">Povolit webu upravovat soubory?</translation>
 <translation id="3763433740586298940">Nežádoucí weby můžete zablokovat. Chrome z tohoto seznamu také automaticky odstraňuje weby, které jsou starší než 30 dní.</translation>
 <translation id="3763549179847864476">Průvodce ochranou soukromí, tlačítko Zpět</translation>
@@ -5888,7 +5886,6 @@
 <translation id="5608580678041221894">Oblast oříznutí můžete upravit nebo přesunout klepnutím na následující klávesy</translation>
 <translation id="5609231933459083978">Aplikace je pravděpodobně neplatná.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Je nám líto, vaše heslo se stále nedaří ověřit. Poznámka: Pokud jste heslo nedávno změnili, vaše nové heslo bude použitelné až po odhlášení. Použijte své staré heslo.</translation>
 <translation id="5614190747811328134">Sdělení pro uživatele</translation>
 <translation id="5614553682702429503">Uložit heslo?</translation>
 <translation id="5614947000616625327">Klíčenka na iCloudu</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb
index c5439ae..62945e29 100644
--- a/chrome/app/resources/generated_resources_cy.xtb
+++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -3226,7 +3226,6 @@
 <translation id="3473479545200714844">Chwyddwydr sgrîn</translation>
 <translation id="3474218480460386727">Defnyddiwch 99 llythyren neu lai ar gyfer geiriau newydd</translation>
 <translation id="3474624961160222204">Parhau fel <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Mae'n ddrwg gennym, nid yw'ch ôl bys yn cael ei adnabod o hyd. Rhowch eich cyfrinair.</translation>
 <translation id="3476303763173086583">Anfon data defnydd a diagnostig. Helpwch i wella profiad Android eich plentyn drwy anfon data diagnostig, dyfais ac ap yn awtomatig at Google. Ni ddefnyddir hwn i adnabod eich plentyn a bydd yn helpu sefydlogrwydd system ac ap a gwelliannau eraill. Bydd rhywfaint o ddata cyfanredol hefyd yn helpu apiau a phartneriaid Google, megis datblygwyr Android. Gorfodir y <ph name="BEGIN_LINK1" />gosodiad<ph name="END_LINK1" /> hwn gan y perchennog. Mae'n bosib y bydd y perchennog yn dewis anfon data diagnostig a defnydd ar gyfer y ddyfais hon at Google. Os yw'r gosodiad Gweithgarwch ar y We ac Apiau ychwanegol wedi'i droi ymlaen ar gyfer eich plentyn, gellir cadw'r data hyn i'w gyfrif Google. <ph name="BEGIN_LINK2" />Dysgu rhagor<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Wps!  Gwnaeth y system fethu â nôl polisi ar gyfer eich dyfais.</translation>
 <translation id="347785443197175480">Parhau i ganiatáu i <ph name="HOST" /> gael mynediad at eich camera a'ch meicroffon</translation>
@@ -3593,7 +3592,6 @@
 <translation id="3759933321830434300">Rhwystro rhannau o dudalennau gwe</translation>
 <translation id="3760460896538743390">Archwilio'r &amp;Dudalen Gefndir</translation>
 <translation id="37613671848467444">Agor mewn &amp;Ffenestr Anhysbys</translation>
-<translation id="3761390540041101668">Rhowch ddisgrifiad clir o’r broblem a chamau i atgynhyrchu’r broblem (os yn bosib)</translation>
 <translation id="3761556954875533505">Caniatáu i'r wefan olygu ffeiliau?</translation>
 <translation id="3763433740586298940">Gallwch rwystro gwefannau nad ydych eu heisiau. Mae Chrome hefyd yn dileu gwefannau yn awtomatig o'r rhestr sy'n hŷn na 30 diwrnod.</translation>
 <translation id="3763549179847864476">Botwm yn ôl y Canllaw Preifatrwydd</translation>
@@ -5906,7 +5904,6 @@
 <translation id="5608580678041221894">Tapiwch y bysellau canlynol i addasu neu symud yr ardal docio</translation>
 <translation id="5609231933459083978">Mae'n ymddangos bod y cais yn annilys.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Mae'n ddrwg gennym, ni ellid dilysu'ch cyfrinair o hyd. Sylwer: Os gwnaethoch newid eich cyfrinair yn ddiweddar, bydd eich cyfrinair newydd yn cael ei ddefnyddio ar ôl i chi allgofnodi, defnyddiwch yr hen gyfrinair yma.</translation>
 <translation id="5614190747811328134">Hysbysiad i'r Defnyddiwr</translation>
 <translation id="5614553682702429503">Cadw'r cyfrinair?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index e0d3fd2..2edbf93 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -3224,7 +3224,6 @@
 <translation id="3473479545200714844">Skærmforstørrer</translation>
 <translation id="3474218480460386727">Nye ord må højst være på 99 bogstaver</translation>
 <translation id="3474624961160222204">Fortsæt som <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Dit fingeraftryk genkendes stadig ikke. Angiv din adgangskode.</translation>
 <translation id="3476303763173086583">Send brugs- og diagnosticeringsdata. Hjælp med at forbedre dit barns Android-oplevelse ved automatisk at sende diagnosticerings- og enhedsdata samt data om brug af apps til Google. Disse data bruges ikke til at identificere dit barn. De bruges kun til forbedring af bl.a. systemets og appens stabilitet. Visse samlede data hjælper også Google-apps og -partnere, f.eks. Android-udviklere. Denne <ph name="BEGIN_LINK1" />indstilling<ph name="END_LINK1" /> håndhæves af ejeren. Ejeren kan vælge at sende diagnosticerings- og brugsdata for denne enhed til Google. Hvis indstillingen til yderligere web- og appaktivitet er aktiveret for dit barn, gemmes disse data muligvis på barnets Google-konto. <ph name="BEGIN_LINK2" />Få flere oplysninger<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ups! Systemet kunne ikke hente politikken til din enhed.</translation>
 <translation id="347785443197175480">Tillad fortsat, at <ph name="HOST" /> har adgang til dit kamera og din mikrofon</translation>
@@ -3591,7 +3590,6 @@
 <translation id="3759933321830434300">Blokere dele af websiderne</translation>
 <translation id="3760460896538743390">Undersøg &amp;baggrundsside</translation>
 <translation id="37613671848467444">Åbn i &amp;inkognitovindue</translation>
-<translation id="3761390540041101668">Giv en grundig beskrivelse af problemet, og hvad du kan gøre for at genskabe problemet (hvis det er muligt)</translation>
 <translation id="3761556954875533505">Skal websitet kunne redigere filer?</translation>
 <translation id="3763433740586298940">Du kan blokere websites, du ikke er interesseret i. Chrome sletter også automatisk websites fra listen, som er mere end 30 dage gamle.</translation>
 <translation id="3763549179847864476">Knappen Tilbage i Privatlivsguide</translation>
@@ -5904,7 +5902,6 @@
 <translation id="5608580678041221894">Tryk på følgende taster for at tilpasse eller flytte beskæringsområdet</translation>
 <translation id="5609231933459083978">Applikationen ser ud til at være ugyldig.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Din adgangskode kunne desværre stadig ikke verificeres. Bemærk! Hvis du har ændret din adgangskode for nylig, anvendes din nye adgangskode først, når du har logget ud. Du skal bruge den gamle adgangskode her.</translation>
 <translation id="5614190747811328134">Brugerbesked</translation>
 <translation id="5614553682702429503">Vil du gemme adgangskoden?</translation>
 <translation id="5614947000616625327">iCloud-nøglering</translation>
@@ -7959,7 +7956,7 @@
 <translation id="7272674038937250585">Der er ingen beskrivelse</translation>
 <translation id="7273110280511444812">senest tilknyttet den <ph name="DATE" /></translation>
 <translation id="727441411541283857"><ph name="PERCENTAGE" /> % – fuldt opladet om <ph name="TIME" /></translation>
-<translation id="727595954130325265">Køb nu</translation>
+<translation id="727595954130325265">Shop nu</translation>
 <translation id="7276100255011548441">Chrome sletter automatisk emner, der er mere end 4 uger gamle. Når du browser videre, kan et emne dukke op på listen igen. Du kan også blokere de emner, som du ikke vil have, at Chrome skal dele med websites. Få flere oplysninger om <ph name="BEGIN_LINK" />administration af privatliv ved annoncering i Chrome<ph name="END_LINK" />.</translation>
 <translation id="727952162645687754">Downloadfejl</translation>
 <translation id="7280649757394340890">Taleindstillinger for oplæsning</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 889a78d6..05ea6d5 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1642,6 +1642,7 @@
 <translation id="2249111429176737533">Als Tab-Fenster öffnen</translation>
 <translation id="2249605167705922988">z. B. 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Du kannst die Informationen anpassen, die von Websites verwendet werden, um dir Werbung zu präsentieren</translation>
+<translation id="2250624716625396929">Dieser Tab verwendet deine Kamera und dein Mikrofon</translation>
 <translation id="2251218783371366160">Mit System Viewer öffnen</translation>
 <translation id="225163402930830576">Netzwerke aktualisieren</translation>
 <translation id="2251809247798634662">Neues Inkognitofenster</translation>
@@ -3205,7 +3206,6 @@
 <translation id="3473479545200714844">Lupe</translation>
 <translation id="3474218480460386727">Neue Wörter dürfen maximal 99 Buchstaben lang sein</translation>
 <translation id="3474624961160222204">Als "<ph name="NAME" />" fortfahren</translation>
-<translation id="3475843873335999118">Dein Fingerabdruck wurde immer noch nicht erkannt. Bitte gib dein Passwort ein.</translation>
 <translation id="3476303763173086583">Du hast die Möglichkeit, Nutzungsdaten &amp; Fehlerberichte zu senden. So kannst du uns helfen, Android für dein Kind zu verbessern, indem du zulässt, dass Diagnose- sowie Geräte- und App-Nutzungsdaten automatisch an Google gesendet werden. Dein Kind wird mithilfe dieser Daten nicht identifiziert, sie helfen jedoch beispielsweise dabei, die Stabilität des Systems und der Apps zu verbessern. Einige aggregierte Daten sind auch für Apps und Partner von Google, beispielsweise Android-Entwickler, nützlich. Diese <ph name="BEGIN_LINK1" />Einstellung<ph name="END_LINK1" /> wird vom Inhaber erzwungen. Der Inhaber kann festlegen, ob Diagnose- und Nutzungsdaten von diesem Gerät an Google gesendet werden. Wenn zusätzlich die Einstellung "Web- &amp; App-Aktivitäten" für dein Kind aktiviert ist, werden diese Daten in seinem Google-Konto gespeichert. <ph name="BEGIN_LINK2" />Weitere Informationen<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Hoppla! Das System konnte die Richtlinie für dein Gerät nicht abrufen.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> weiterhin Zugriff auf Kamera und Mikrofon gestatten</translation>
@@ -3572,7 +3572,6 @@
 <translation id="3759933321830434300">Teile von Webseiten blockieren</translation>
 <translation id="3760460896538743390">&amp;Hintergrundseite prüfen</translation>
 <translation id="37613671848467444">In &amp;Inkognito-Fenster öffnen</translation>
-<translation id="3761390540041101668">Beschreibe so gut wie möglich das Problem und die Schritte, mit denen es reproduziert werden kann</translation>
 <translation id="3761556954875533505">Website erlauben, Dateien zu bearbeiten?</translation>
 <translation id="3763433740586298940">Du kannst unerwünschte Websites blockieren. Außerdem werden Websites, die länger als 30 Tage gelistet sind, von Chrome automatisch aus der Liste gelöscht.</translation>
 <translation id="3763549179847864476">Schaltfläche „Zurück“ im Datenschutz-Leitfaden</translation>
@@ -5884,7 +5883,6 @@
 <translation id="5608580678041221894">Tippe auf die folgenden Tasten, um den Overscan-Bereich anzupassen oder zu verschieben</translation>
 <translation id="5609231933459083978">Die Anwendung ist anscheinend ungültig.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Dein Passwort konnte leider immer noch nicht bestätigt werden. Hinweis: Falls du dein Passwort kürzlich geändert hast, wird dein neues Passwort übernommen, sobald du dich abmeldest. Verwende hier das alte Passwort.</translation>
 <translation id="5614190747811328134">Nutzerhinweis</translation>
 <translation id="5614553682702429503">Passwort speichern?</translation>
 <translation id="5614947000616625327">iCloud-Schlüsselbund</translation>
@@ -6615,6 +6613,7 @@
 <translation id="6202304368170870640">Mit deiner PIN kannst du dich auf deinem Gerät anmelden oder es entsperren.</translation>
 <translation id="6203247599828309566">Du hast eine Notiz für ein Passwort auf dieser Website gespeichert. Wenn du die Notiz aufrufen möchtest, klicke auf das Schlüsselsymbol.</translation>
 <translation id="6205314730813004066">Datenschutz bei Anzeigen</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – Mikrofon zeichnet auf</translation>
 <translation id="6206199626856438589">Du wirst von angezeigten Websites abgemeldet, auch in geöffneten Tabs</translation>
 <translation id="6206311232642889873">Bild kop&amp;ieren</translation>
 <translation id="6207200176136643843">Auf Standard-Zoomstufe zurücksetzen</translation>
@@ -7166,6 +7165,7 @@
 <translation id="6657585470893396449">Passwort</translation>
 <translation id="6659213950629089752">Diese Seite wurde mit der Erweiterung "<ph name="NAME" />" gezoomt.</translation>
 <translation id="6659594942844771486">Tab</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – Kamera zeichnet auf</translation>
 <translation id="6660819301598582123">Zwölf Boxkämpfer jagen Viktor quer über den großen Sylter Deich.</translation>
 <translation id="666099631117081440">Druckserver</translation>
 <translation id="6662931079349804328">Die Unternehmensrichtlinie hat sich geändert. Die Schaltfläche für Tests wurde aus der Symbolleiste entfernt.</translation>
@@ -8979,6 +8979,7 @@
 <translation id="8059417245945632445">&amp;Geräte untersuchen</translation>
 <translation id="8059456211585183827">Es sind keine Drucker verfügbar, die gespeichert werden können.</translation>
 <translation id="8061091456562007989">Änderung rückgängig machen</translation>
+<translation id="8061244502316511332">Dieser Tab verwendet dein Mikrofon</translation>
 <translation id="8061970399284390013">Rechtschreib- und Grammatikprüfung</translation>
 <translation id="8061991877177392872">Du hast Voice Match schon auf einem anderen Gerät mit Assistant eingerichtet. Diese vorherigen Aufnahmen wurden verwendet, um ein Sprachmodell auf diesem Gerät zu erstellen.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 Blatt Papier}other{{COUNT} Blätter Papier}}</translation>
@@ -9460,6 +9461,7 @@
 <translation id="844063558976952706">Immer auf dieser Website</translation>
 <translation id="8441313165929432954">Tethering aktivieren/deaktivieren</translation>
 <translation id="8443986842926457191">Die URL ist länger als 2048 Zeichen.</translation>
+<translation id="8445281870900174108">Dieser Tab verwendet deine Kamera</translation>
 <translation id="8446884382197647889">Weitere Informationen</translation>
 <translation id="8447409163267621480">Entweder Strg oder Alt integrieren</translation>
 <translation id="844850004779619592">Keine Befehle gefunden</translation>
@@ -10534,6 +10536,7 @@
 <translation id="981121421437150478">Offline</translation>
 <translation id="983192555821071799">Alle Tabs schließen</translation>
 <translation id="983511809958454316">Diese Funktion wird im VR-Modus nicht unterstützt</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – Kamera und Mikrofon zeichnen auf</translation>
 <translation id="984275831282074731">Zahlungsmethoden</translation>
 <translation id="984705303330760860">Sprachen für die Rechtschreibprüfung hinzufügen</translation>
 <translation id="98515147261107953">Querformat</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index c00ef52..ec4cacbb 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">Μεγεθυντής οθόνης</translation>
 <translation id="3474218480460386727">Χρησιμοποιήστε έως 99 γράμματα για τις νέες λέξεις.</translation>
 <translation id="3474624961160222204">Συνέχεια <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Δυστυχώς, το δακτυλικό σας αποτύπωμα εξακολουθεί να μην αναγνωρίζεται. Πληκτρολογήστε τον κωδικό πρόσβασής σας.</translation>
 <translation id="3476303763173086583">Αποστολή δεδομένων χρήσης και διαγνωστικών. Συμβάλλετε στη βελτίωση της εμπειρίας Android του παιδιού σας με την αυτόματη αποστολή διαγνωστικών δεδομένων και δεδομένων συσκευής και χρήσης εφαρμογών στην Google. Αυτά τα δεδομένα δεν θα χρησιμοποιηθούν για την ταυτοποίηση του παιδιού σας και θα βοηθήσουν με τη σταθερότητα του συστήματος και των εφαρμογών και την παροχή άλλων βελτιώσεων. Ορισμένα συγκεντρωτικά δεδομένα θα βοηθήσουν επίσης τις εφαρμογές και τους συνεργάτες της Google, όπως τους προγραμματιστές Android. Αυτή η <ph name="BEGIN_LINK1" />ρύθμιση<ph name="END_LINK1" /> επιβάλλεται από τον κάτοχο. Ο κάτοχος μπορεί να επιλέξει να στέλνει διαγνωστικά δεδομένα και δεδομένα χρήσης για αυτήν τη συσκευή στην Google. Εάν είναι ενεργή η ρύθμιση της πρόσθετης Δραστηριότητας ιστού και εφαρμογών για το παιδί σας, αυτά τα δεδομένα μπορεί να αποθηκευτούν στον Λογαριασμό του Google. <ph name="BEGIN_LINK2" />Μάθετε περισσότερα<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ωχ! Το σύστημα δεν κατάφερε να ανακτήσει την πολιτική για τη συσκευή σας.</translation>
 <translation id="347785443197175480">Να συνεχίσει να επιτρέπεται στο <ph name="HOST" /> η πρόσβαση στην κάμερα και στο μικρόφωνό σας</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">Αποκλεισμός τμημάτων ιστοσελίδων</translation>
 <translation id="3760460896538743390">Έλεγχος &amp;σελίδας παρασκηνίου</translation>
 <translation id="37613671848467444">Άνοιγμα σε παράθυρο ανώνυμης περιήγησης</translation>
-<translation id="3761390540041101668">Εισαγάγετε μια σαφή περιγραφή του ζητήματος και βήματα για την αναπαραγωγή του (αν είναι εφικτό)</translation>
 <translation id="3761556954875533505">Να επιτρέπεται στον ιστότοπο η επεξεργασία των αρχείων;</translation>
 <translation id="3763433740586298940">Μπορείτε να αποκλείσετε τους ιστοτόπους που δεν επιθυμείτε. Επίσης, το Chrome διαγράφει αυτόματα τους ιστοτόπους που είναι παλαιότεροι των 30 ημερών.</translation>
 <translation id="3763549179847864476">Κουμπί επιστροφής Οδηγού απορρήτου</translation>
@@ -5903,7 +5901,6 @@
 <translation id="5608580678041221894">Πατήστε τα παρακάτω πλήκτρα για να προσαρμόσετε ή να μετακινήσετε την περιοχή περικοπής</translation>
 <translation id="5609231933459083978">Φαίνεται πως η εφαρμογή δεν είναι έγκυρη.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index b8bb4994..fefccfa1 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">Screen magnifier</translation>
 <translation id="3474218480460386727">Use 99 letters or fewer for new words</translation>
 <translation id="3474624961160222204">Continue as <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Sorry, your fingerprint is still not recognised. Please enter your password.</translation>
 <translation id="3476303763173086583">Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> is enforced by the owner. The owner may choose to send diagnostic and usage data for this device to Google. If additional Web &amp; App Activity setting is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK2" />Find out more<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Oops!  The system failed to fetch policy for your device.</translation>
 <translation id="347785443197175480">Continue allowing <ph name="HOST" /> to access your camera and microphone</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">Block parts of web pages</translation>
 <translation id="3760460896538743390">Inspect &amp;Background Page</translation>
 <translation id="37613671848467444">Open in &amp;Incognito Window</translation>
-<translation id="3761390540041101668">Provide a clear description of the issue and steps to reproduce the issue (if possible)</translation>
 <translation id="3761556954875533505">Let site edit files?</translation>
 <translation id="3763433740586298940">You can block sites that you don't want. Chrome also auto-deletes sites that are older than 30 days from the list.</translation>
 <translation id="3763549179847864476">Privacy Guide back button</translation>
@@ -5903,7 +5901,6 @@
 <translation id="5608580678041221894">Tap the following keys to adjust or move the cropping area</translation>
 <translation id="5609231933459083978">The application appears to be invalid.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Sorry, your password still could not be verified. Note: if you changed your password recently, your new password will be applied once you sign out, please use the old password here.</translation>
 <translation id="5614190747811328134">User Notice</translation>
 <translation id="5614553682702429503">Save password?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 5f7c5a5..ac4b2089 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -3205,7 +3205,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">Las palabras nuevas pueden tener un máximo de 99 letras.</translation>
 <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation>
-<translation id="3475843873335999118">No se puede reconocer tu huella dactilar. Ingresa tu contraseña.</translation>
 <translation id="3476303763173086583">Envía datos de uso y diagnóstico. Para ayudar a mejorar la experiencia de Android de tu hijo, envía a Google datos de diagnóstico y uso de dispositivos y apps de forma automática. Esta información no se usará para identificar a tu hijo y ayudará a lograr la estabilidad de las apps y el sistema, entre otras mejoras. Algunos datos agregados también ayudarán a las apps y los socios de Google, como los desarrolladores de Android. El propietario controla esta <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" />. Es posible que el propietario decida enviar a Google datos de uso y diagnóstico de este dispositivo. Si habilitaste la "Actividad de web y de aplicaciones adicional" en la Cuenta de Google de tu hijo, es posible que se almacenen estos datos en esa cuenta. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">El sistema no pudo recuperar la política para tu dispositivo.</translation>
 <translation id="347785443197175480">Continuar permitiendo que <ph name="HOST" /> acceda a la cámara y al micrófono</translation>
@@ -3572,7 +3571,6 @@
 <translation id="3759933321830434300">Bloquear partes de páginas web</translation>
 <translation id="3760460896538743390">Inspeccionar página &amp;de fondo</translation>
 <translation id="37613671848467444">Abrir en una ventana de &amp;incógnito</translation>
-<translation id="3761390540041101668">Brinda una descripción clara del problema y los pasos para reproducirlo (si es posible)</translation>
 <translation id="3761556954875533505">¿Quieres permitir que el sitio edite archivos?</translation>
 <translation id="3763433740586298940">Puedes bloquear los sitios que no quieres. Chrome también borra los sitios de la lista que tienen más de 30 días de forma automática.</translation>
 <translation id="3763549179847864476">Botón Atrás de la Guía de privacidad</translation>
@@ -5884,7 +5882,6 @@
 <translation id="5608580678041221894">Presionar las siguientes teclas para ajustar o mover el área recortada</translation>
 <translation id="5609231933459083978">Parece que la aplicación no es válida.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Aún no se pudo verificar tu contraseña. Ten en cuenta que si cambiaste tu contraseña recientemente, podrás usar tu nueva contraseña cuando salgas. Usa la contraseña antigua aquí.</translation>
 <translation id="5614190747811328134">Aviso de usuario</translation>
 <translation id="5614553682702429503">¿Quieres guardar la contraseña?</translation>
 <translation id="5614947000616625327">Llavero de iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 3799794..ba3ed4b 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -3209,7 +3209,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">Las palabras nuevas deben tener 99 letras o menos</translation>
 <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Sigue sin reconocerse tu huella digital. Introduce la contraseña.</translation>
 <translation id="3476303763173086583">Enviar datos de uso y diagnóstico. Contribuye a mejorar la experiencia de Android de tu hijo enviando automáticamente a Google datos de diagnóstico, del dispositivo y del uso de las aplicaciones. Los datos no se usarán para identificar a tu hijo, sino para aumentar la estabilidad de las aplicaciones y del sistema y realizar otras mejoras. Parte de los datos agregados también ayudarán a las aplicaciones y los colaboradores de Google, como los desarrolladores de Android. El propietario ha aplicado este <ph name="BEGIN_LINK1" />ajuste<ph name="END_LINK1" />. El propietario puede elegir si se envían a Google datos de uso y diagnóstico de este dispositivo. Si la opción Actividad en la Web y en Aplicaciones adicional está activada, es posible que estos datos se guarden en la cuenta de Google de tu hijo. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">¡Vaya! El sistema no ha podido recuperar la política para tu dispositivo.</translation>
 <translation id="347785443197175480">Seguir permitiendo que <ph name="HOST" /> acceda a la cámara y al micrófono</translation>
@@ -3576,7 +3575,6 @@
 <translation id="3759933321830434300">Bloquear partes de páginas web</translation>
 <translation id="3760460896538743390">Inspeccionar página &amp;en segundo plano</translation>
 <translation id="37613671848467444">Abrir en una ventana de &amp;incógnito</translation>
-<translation id="3761390540041101668">Proporciona una descripción clara del problema y los pasos para reproducirlo (si es posible)</translation>
 <translation id="3761556954875533505">¿Permitir que el sitio web edite archivos?</translation>
 <translation id="3763433740586298940">Puedes bloquear los sitios que no quieras. Chrome también elimina automáticamente los sitios de la lista si tienen una antigüedad superior a 30 días.</translation>
 <translation id="3763549179847864476">Botón para volver de la guía de privacidad</translation>
@@ -5887,7 +5885,6 @@
 <translation id="5608580678041221894">Toca las siguientes teclas para ajustar o mover la zona para recortar</translation>
 <translation id="5609231933459083978">Parece que la aplicación no es válida.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">No ha sido posible verificar tu contraseña. Nota: si has cambiado la contraseña recientemente, la nueva contraseña se aplicará una vez que hayas cerrado sesión. Utiliza la antigua contraseña aquí.</translation>
 <translation id="5614190747811328134">Aviso al usuario</translation>
 <translation id="5614553682702429503">¿Guardar la contraseña?</translation>
 <translation id="5614947000616625327">Llavero de iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 9ce94013..3f13921 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1648,6 +1648,7 @@
 <translation id="2249111429176737533">Ava vahelehestatud aknas</translation>
 <translation id="2249605167705922988">nt 1–5, 8, 11–13</translation>
 <translation id="2249635629516220541">Kohandage teavet, mida saidid teile reklaamide kuvamiseks kasutavad</translation>
+<translation id="2250624716625396929">See vaheleht kasutab teie kaamerat ja mikrofoni</translation>
 <translation id="2251218783371366160">Ava süsteemivaaturiga</translation>
 <translation id="225163402930830576">Värskenda võrke</translation>
 <translation id="2251809247798634662">Uus inkognito aken</translation>
@@ -3214,7 +3215,6 @@
 <translation id="3473479545200714844">Ekraanisuurendi</translation>
 <translation id="3474218480460386727">Uutes sõnades võib olla kuni 99 tähte</translation>
 <translation id="3474624961160222204">Jätka kasutajana <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Kahjuks ei suudetud ikka teie sõrmejälge tuvastada. Sisestage oma parool.</translation>
 <translation id="3476303763173086583">Saada kasutus- ja diagnostikaandmeid. Aidake täiustada oma lapse Androidi kasutuskogemust, saates Google'ile automaatselt seadme teavet ning rakenduse kasutus- ja  diagnostikaandmeid. Neid andmeid ei kasutata teie lapse isiku tuvastamiseks ning need aitavad parandada süsteemi ja rakenduse stabiilsust ning muud. Teatud koondandmed on abiks ka Google'i rakendustele ja partneritele, näiteks Androidi arendajatele. Selle <ph name="BEGIN_LINK1" />seade<ph name="END_LINK1" /> on jõustanud omanik. Omanik võib otsustada saata Google'ile selle seadme diagnostika- ja kasutusandmeid. Kui täiendavad veebi- ja rakendustegevused on teie lapse jaoks sisse lülitatud, võidakse need andmed salvestada tema Google'i kontole. <ph name="BEGIN_LINK2" />Lisateave<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Vabandust! Süsteemil ei õnnestunud teie seadme jaoks eeskirju tuua.</translation>
 <translation id="347785443197175480">Luba hostile <ph name="HOST" /> jätkuvalt juurdepääs kaamerale ja mikrofonile</translation>
@@ -3581,7 +3581,6 @@
 <translation id="3759933321830434300">Veebilehtede osade blokeerimine</translation>
 <translation id="3760460896538743390">Uuri &amp;taustalehte</translation>
 <translation id="37613671848467444">&amp;Ava inkognito aknas</translation>
-<translation id="3761390540041101668">Kirjeldage selgelt probleemi ja (võimaluse korral) toiminguid selle taastekitamiseks.</translation>
 <translation id="3761556954875533505">Kas lubada saidil faile muuta?</translation>
 <translation id="3763433740586298940">Saate blokeerida saidid, millel te ei soovi lubada andmeid salvestada. Chrome kustutab loendist automaatselt ka saidid, mis on vanemad kui 30 päeva.</translation>
 <translation id="3763549179847864476">Privaatsusjuhendi tagasinupp</translation>
@@ -5893,7 +5892,6 @@
 <translation id="5608580678041221894">Kärpimisala kohandamiseks või teisaldamiseks puudutage järgmiseid klahve</translation>
 <translation id="5609231933459083978">Rakendus näib olevat sobimatu.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Kahjuks ei saanud teie parooli kinnitada. Märkus: kui muutsite hiljuti parooli, rakendub uus parool pärast väljalogimist. Kasutage siin vana parooli.</translation>
 <translation id="5614190747811328134">Teatis kasutajale</translation>
 <translation id="5614553682702429503">Kas salvestada parool?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6627,6 +6625,7 @@
 <translation id="6202304368170870640">PIN-kood võimaldab seadmesse sisse logida või selle avada.</translation>
 <translation id="6203247599828309566">Salvestasite sellel saidil märkme parooli kohta. Selle vaatamiseks klõpsake võtmeikoonil.</translation>
 <translation id="6205314730813004066">Reklaamide privaatsus</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – mikrofon salvestab</translation>
 <translation id="6206199626856438589">Teid logitakse kuvatud saitidelt (sh avatud vahelehtedelt) välja</translation>
 <translation id="6206311232642889873">Kop&amp;eeri pilt</translation>
 <translation id="6207200176136643843">Lähtesta suumi vaiketasemele</translation>
@@ -7178,6 +7177,7 @@
 <translation id="6657585470893396449">Parool</translation>
 <translation id="6659213950629089752">Seda lehte suumis laiendus „<ph name="NAME" />”</translation>
 <translation id="6659594942844771486">Vaheleht</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – kaamera salvestab</translation>
 <translation id="6660819301598582123">The quick brown fox jumped over the lazy dog.</translation>
 <translation id="666099631117081440">Prindiserverid</translation>
 <translation id="6662931079349804328">Ettevõtte reegel on muutunud. Tööriistaribalt on eemaldatud katsete nupp.</translation>
@@ -8991,6 +8991,7 @@
 <translation id="8059417245945632445">&amp;Seadmete kontrollimine</translation>
 <translation id="8059456211585183827">Salvestamiseks pole saadaval ühtegi printerit.</translation>
 <translation id="8061091456562007989">Taasta</translation>
+<translation id="8061244502316511332">See vaheleht kasutab teie mikrofoni</translation>
 <translation id="8061970399284390013">Õigekirja- ja grammatikakontroll</translation>
 <translation id="8061991877177392872">Näib, et olete Voice Matchi oma assistendiga muus seadmes juba seadistanud. Neid varasemaid salvestisi kasutati häälemudeli loomiseks selles seadmes.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 paberileht}other{{COUNT} paberilehte}}</translation>
@@ -9472,6 +9473,7 @@
 <translation id="844063558976952706">Sellel saidil alati</translation>
 <translation id="8441313165929432954">Jagamise lubamine/keelamine</translation>
 <translation id="8443986842926457191">URL on pikem kui 2048 tähemärki</translation>
+<translation id="8445281870900174108">See vaheleht kasutab teie kaamerat</translation>
 <translation id="8446884382197647889">Lisateave</translation>
 <translation id="8447409163267621480">Kaasake Ctrl või Alt</translation>
 <translation id="844850004779619592">Käske ei leitud</translation>
@@ -10546,6 +10548,7 @@
 <translation id="981121421437150478">Võrguühenduseta</translation>
 <translation id="983192555821071799">Sule kõik vahelehed</translation>
 <translation id="983511809958454316">Seda funktsiooni VR-režiimis ei toetata</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – kaamera ja mikrofon salvestavad</translation>
 <translation id="984275831282074731">Makseviisid</translation>
 <translation id="984705303330760860">Õigekirjakontrolli keelte lisamine</translation>
 <translation id="98515147261107953">Horisontaalpaigutus</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index e460a93..ea91ee2c 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -3208,7 +3208,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">Erabili 99 letra edo gutxiago beste hitz bat gehitzeko</translation>
 <translation id="3474624961160222204">Erabili <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Ez dugu ezagutu hatz-marka. Idatzi pasahitza.</translation>
 <translation id="3476303763173086583">Bidali erabilera- eta diagnostiko-datuak. Bidali diagnostikoak eta gailu zein aplikazioen erabilerari buruzko datuak Google-ri automatikoki haurrak darabiltzan Android zerbitzuak hobetzen laguntzeko. Informazio hori ez da erabiliko haurra identifikatzeko eta, hari esker, sistemaren eta aplikazioen egonkortasuna hobetuko da, besteak beste. Gainera, multzokatutako datu batzuk oso baliagarriak izango dira Google-ren aplikazioak hobetzeko eta bazkideei laguntzeko (adibidez, Android-en garatzaileei). Jabeak konfiguratu du <ph name="BEGIN_LINK1" />ezarpen<ph name="END_LINK1" /> hori. Gailu honen diagnostiko- eta erabilera-datuak Google-ri bidaltzea aukera dezake jabeak. Haurraren kontuko Sareko eta aplikazioetako jarduera gehigarriak ezarpena aktibatuta badago, baliteke datu horiek haren Google-ko kontuan gordetzea. <ph name="BEGIN_LINK2" />Lortu informazio gehiago<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Sistemak ezin izan ditu eskuratu gailuaren gidalerroak.</translation>
 <translation id="347785443197175480">Jarraitu <ph name="HOST" /> webguneari kamera eta mikrofonoa atzitzea baimentzen</translation>
@@ -3575,7 +3574,6 @@
 <translation id="3759933321830434300">Blokeatu web-orrietako zatiak</translation>
 <translation id="3760460896538743390">Ikuskatu &amp;atzeko planoko orria</translation>
 <translation id="37613671848467444">Ireki &amp;ezkutuko nabigazio-leihoan</translation>
-<translation id="3761390540041101668">Azaldu garbi arazoa eta zer urrats egin dituzun hura gertatu aurretik (ahal baduzu)</translation>
 <translation id="3761556954875533505">Fitxategiak editatzeko baimena eman nahi diozu webguneari?</translation>
 <translation id="3763433740586298940">Nahi ez dituzun webguneak blokea ditzakezu. Gainera, Chrome-k automatikoki ezabatzen ditu zerrendatik 30 egun baino gehiago dituzten webguneak.</translation>
 <translation id="3763549179847864476">Pribatutasun-gidan atzera egiteko botoia</translation>
@@ -5887,7 +5885,6 @@
 <translation id="5608580678041221894">Sakatu tekla hauek ebaki beharreko eremua doitzeko edo mugitzeko</translation>
 <translation id="5609231933459083978">Dirudienez, aplikazioak ez du balio.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Orain ere, ezin izan da egiaztatu pasahitza. Oharra: pasahitza duela gutxi aldatu baduzu, saioa amaitu eta gero aplikatuko da pasahitz berria, beraz, erabili pasahitz zaharra hemen.</translation>
 <translation id="5614190747811328134">Erabiltzaileentzako oharra</translation>
 <translation id="5614553682702429503">Pasahitza gorde nahi duzu?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index ba1b697..11cdb26 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1654,6 +1654,7 @@
 <translation id="2249111429176737533">باز کردن به‌عنوان پنجره برگه‌دار</translation>
 <translation id="2249605167705922988">برای مثال 5-1، 8، 13-11</translation>
 <translation id="2249635629516220541">سفارشی کردن اطلاعات مورداستفاده سایت‌ها برای نمایش آگهی به شما</translation>
+<translation id="2250624716625396929">این برگه از دوربین یا میکروفن شما استفاده می‌کند</translation>
 <translation id="2251218783371366160">بازکردن با نظاره‌گر سیستم</translation>
 <translation id="225163402930830576">بازآوری شبکه‌ها</translation>
 <translation id="2251809247798634662">پنجرهٔ جدید حالت ناشناس</translation>
@@ -3220,7 +3221,6 @@
 <translation id="3473479545200714844">ذره‌بین صفحه</translation>
 <translation id="3474218480460386727">واژه جدید حداکثر ۹۹ حرف می‌تواند داشته باشد</translation>
 <translation id="3474624961160222204">ادامه دادن به‌عنوان <ph name="NAME" /></translation>
-<translation id="3475843873335999118">متأسفیم، اثر انگشتتان هنوز شناسایی نشده است. لطفاً گذرواژه‌تان را وارد کنید.</translation>
 <translation id="3476303763173086583">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">وای! سیستم نتوانست خط‌مشی را برای دستگاهتان واکشی کند.</translation>
 <translation id="347785443197175480">همچنان دسترسی به دوربین و میکروفون شما، توسط <ph name="HOST" /> مجاز باشد</translation>
@@ -3587,7 +3587,6 @@
 <translation id="3759933321830434300">مسدود کردن بخش‌هایی از صفحات وب</translation>
 <translation id="3760460896538743390">بازرسی صفحه &amp;پس‌زمینه</translation>
 <translation id="37613671848467444">باز کردن در پنجره &amp;ناشناس</translation>
-<translation id="3761390540041101668">شرح صریحی از مشکل و (درصورت امکان) مراحل بازتولید مشکل را ارائه دهید</translation>
 <translation id="3761556954875533505">به سایت اجازه می‌دهید فایل‌ها را ویرایش کند؟</translation>
 <translation id="3763433740586298940">‏می‌توانید سایت‌هایی را که نمی‌خواهید مسدود کنید. Chrome همچنین سایت‌هایی را که قدیمی‌تر از ۳۰ روز باشند به‌طور خودکار از فهرست حذف می‌کند.</translation>
 <translation id="3763549179847864476">دکمه برگشت «راهنمای حریم خصوصی»</translation>
@@ -5900,7 +5899,6 @@
 <translation id="5608580678041221894">برای تنظیم یا انتقال ناحیه بریده‌شده، روی کلیدهای زیر ضربه بزنید</translation>
 <translation id="5609231933459083978">به نظر می‌رسد این برنامه معتبر نیست.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6634,6 +6632,7 @@
 <translation id="6202304368170870640">می‌توانید برای ورود به سیستم یا باز کردن قفل دستگاه از پین استفاده کنید.</translation>
 <translation id="6203247599828309566">یادداشتی برای گذرواژه در این سایت ذخیره کردید. برای نمایش آن، روی نماد کلید کلیک کنید.</translation>
 <translation id="6205314730813004066">حریم خصوصی آگهی</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - میکروفون درحال ضبط است</translation>
 <translation id="6206199626856438589">از سیستم سایت‌های نشان‌داده‌شده (ازجمله در برگه‌های باز) خارج خواهید شد</translation>
 <translation id="6206311232642889873">&amp;کپی تصویر</translation>
 <translation id="6207200176136643843">بازنشانی به سطح بزرگ‌نمایی پیش‌فرض</translation>
@@ -7187,6 +7186,7 @@
 <translation id="6657585470893396449">گذرواژه</translation>
 <translation id="6659213950629089752">برنامه افزودنی «<ph name="NAME" />» این صفحه را بزرگ‌نمایی کرده است</translation>
 <translation id="6659594942844771486">برگه</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - دوربین درحال ضبط است</translation>
 <translation id="6660819301598582123">روباه قهوه‌ای چالاک از روی سگ تنبل پرید.</translation>
 <translation id="666099631117081440">سرورهای چاپ</translation>
 <translation id="6662931079349804328">خط‌مشی شرکت تغییر کرد. دکمه آزمایش‌ها از نوار ابزار برداشته شد.</translation>
@@ -8999,6 +8999,7 @@
 <translation id="8059417245945632445">&amp;بازرسی دستگاه‌ها</translation>
 <translation id="8059456211585183827">هیچ چاپگری برای ذخیره در دسترس نیست.</translation>
 <translation id="8061091456562007989">تغییر را لغو کنید</translation>
+<translation id="8061244502316511332">این برگه درحال استفاده از میکروفون است</translation>
 <translation id="8061970399284390013">بررسی املا و دستور زبان</translation>
 <translation id="8061991877177392872">‏به‌نظر می‌رسد ازقبل Voice Match را با «دستیار» در دستگاه دیگری راه‌اندازی کرده‌اید. از این قطعه‌های قبلاً ضبط‌شده می‌توان برای ایجاد مدل صوتی در این دستگاه استفاده کرد.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{۱ برگ کاغذ}one{{COUNT} برگ کاغذ}other{{COUNT} برگ کاغذ}}</translation>
@@ -9480,6 +9481,7 @@
 <translation id="844063558976952706">همیشه در این سایت</translation>
 <translation id="8441313165929432954">فعال/ غیرفعال کردن اشتراک‌گذاری اینترنت</translation>
 <translation id="8443986842926457191">نشانی وب بیش‌از ۲۰۴۸ نویسه دارد</translation>
+<translation id="8445281870900174108">این برگه درحال استفاده از دوربین است</translation>
 <translation id="8446884382197647889">بیشتر بدانید</translation>
 <translation id="8447409163267621480">‏باید شامل Ctrl یا Alt باشد</translation>
 <translation id="844850004779619592">هیچ فرمانی پیدا نشد</translation>
@@ -10555,6 +10557,7 @@
 <translation id="981121421437150478">آفلاین</translation>
 <translation id="983192555821071799">بستن همه برگه‌ها</translation>
 <translation id="983511809958454316">‏این ویژگی در VR پشتیبانی نمی‌شود</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - دوربین و میکروفون درحال ضبط هستند</translation>
 <translation id="984275831282074731">روش‌های پرداخت</translation>
 <translation id="984705303330760860">افزودن زبان‌های غلط‌گیر املایی</translation>
 <translation id="98515147261107953">افقی</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index cc3a43a3..34a3f95f 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -3222,7 +3222,6 @@
 <translation id="3473479545200714844">Ruudun suurentaminen</translation>
 <translation id="3474218480460386727">Käytä uudessa sanassa korkeintaan 99 kirjainta</translation>
 <translation id="3474624961160222204">Jatka käyttäjänä <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Sormenjälkeäsi ei tunnistettu vieläkään. Lisää salasana.</translation>
 <translation id="3476303763173086583">Lähetä käyttö- ja diagnostiikkadataa. Auta parantamaan lapsesi Android-käyttökokemusta lähettämällä diagnostiikkadataa sekä laitteen ja sovellusten käyttödataa automaattisesti Googlelle. Dataa ei käytetä lapsesi henkilöllisyyden selvittämiseen – sen avulla parannetaan esimerkiksi järjestelmän ja sovellusten vakautta. Kootusta datasta on hyötyä myös Googlen sovelluksille ja kumppaneille, kuten Android-kehittäjille. Omistaja on ottanut tämän <ph name="BEGIN_LINK1" />asetuksen<ph name="END_LINK1" /> käyttöön. Omistaja voi lähettää tätä laitetta koskevaa diagnostiikka- ja käyttödataa Googlelle. Jos muun verkko- ja sovellustoiminnan asetus on lapsella käytössä, tätä dataa voidaan tallentaa hänen Google-tililleen. <ph name="BEGIN_LINK2" />Lue lisää<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Hups! Järjestelmä ei onnistunut noutamaan käytäntöä laitteellesi.</translation>
 <translation id="347785443197175480">Anna sivuston <ph name="HOST" /> käyttää edelleen kameraasi ja mikrofoniasi</translation>
@@ -3589,7 +3588,6 @@
 <translation id="3759933321830434300">Estä joitain verkkosivujen osia</translation>
 <translation id="3760460896538743390">Tarkista &amp;taustasivu</translation>
 <translation id="37613671848467444">Avaa incognito-ikkunassa</translation>
-<translation id="3761390540041101668">Lisää selkeä kuvaus ongelmasta ja vaiheet, joilla ongelma voidaan toistaa (jos mahdollista)</translation>
 <translation id="3761556954875533505">Saako sivusto muokata tiedostoja?</translation>
 <translation id="3763433740586298940">Voit estää sivustot, joita et halua. Chrome myös poistaa listalta automaattisesti yli 30 päivää vanhat sivustot.</translation>
 <translation id="3763549179847864476">Yksityisyysoppaan takaisin-painike</translation>
@@ -5899,7 +5897,6 @@
 <translation id="5608580678041221894">Muokkaa tai siirrä rajattua aluetta seuraavilla näppäimillä.</translation>
 <translation id="5609231933459083978">Sovellus vaikuttaa virheelliseltä.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Salasanan vahvistaminen ei onnistunut vieläkään. Huomaa: Jos vaihdoit salasanasi äskettäin, uusi salasana otetaan käyttöön kirjauduttuasi ulos. Käytä tässä vanhaa salasanaasi.</translation>
 <translation id="5614190747811328134">Käyttäjäilmoitus</translation>
 <translation id="5614553682702429503">Tallennetaanko salasana?</translation>
 <translation id="5614947000616625327">iCloud-avainnippu</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index dfb27c57..603f36ac 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -3224,7 +3224,6 @@
 <translation id="3473479545200714844">Screen magnifier</translation>
 <translation id="3474218480460386727">Gumamit ng 99 na titik o mas kaunti para sa mga bagong salita</translation>
 <translation id="3474624961160222204">Magpatuloy bilang si <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Paumanhin, hindi pa rin nakikilala ang iyong fingerprint. Pakilagay ang password mo.</translation>
 <translation id="3476303763173086583">Magpadala ng data ng paggamit at diagnostic na data. Tumulong sa pagpapaganda ng karanasan ng iyong anak sa Android sa pamamagitan ng awtomatikong pagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Hindi ito gagamitin para tukuyin ang pagkakakilanlan ng iyong anak, at makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Ipinapatupad ng may-ari ang <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> na ito. Maaaring piliin ng may-aring magpadala ng diagnostic na data at data ng paggamit para sa device na ito sa Google. Kung naka-on ang karagdagang setting ng Aktibidad sa Web at App para sa iyong anak, maaaring ma-save ang data na ito sa kanyang Google account. <ph name="BEGIN_LINK2" />Matuto Pa<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Oops!  Hindi nakuha ng system ang patakaran para sa iyong device.</translation>
 <translation id="347785443197175480">Magpatuloy sa pagpayag sa <ph name="HOST" /> na i-access ang iyong camera at mikropono</translation>
@@ -3591,7 +3590,6 @@
 <translation id="3759933321830434300">Mag-block ng mga bahagi ng mga web page</translation>
 <translation id="3760460896538743390">Siyasatin ang Pahina ng &amp;Background</translation>
 <translation id="37613671848467444">Buksan sa &amp;Incognito Window</translation>
-<translation id="3761390540041101668">Magbigay ng malinaw na paglalarawan ng isyu at mga hakbang para makopya ang isyu (kung posible)</translation>
 <translation id="3761556954875533505">Payagan ang site na i-edit ang mga file?</translation>
 <translation id="3763433740586298940">Puwede kang mag-block ng mga site na ayaw mo. Awtomatiko ring ide-delete ng Chrome ang mga site sa listahang mahigit 30 araw na.</translation>
 <translation id="3763549179847864476">Button na bumalik sa Gabay sa Privacy</translation>
@@ -5904,7 +5902,6 @@
 <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="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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 848444f7..a2650d6 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1646,6 +1646,7 @@
 <translation id="2249111429176737533">Ouvrir en tant que fenêtre à onglets</translation>
 <translation id="2249605167705922988">par exemple : 1-5, 8 ou 11-13</translation>
 <translation id="2249635629516220541">Personnaliser les renseignements utilisés par les sites pour vous suggérer des annonces</translation>
+<translation id="2250624716625396929">Cet onglet utilise votre appareil photo et votre microphone</translation>
 <translation id="2251218783371366160">Ouvrir avec le visualiseur du système</translation>
 <translation id="225163402930830576">Actualiser les réseaux</translation>
 <translation id="2251809247798634662">Nouvelle fenêtre de navigation privée</translation>
@@ -3211,7 +3212,6 @@
 <translation id="3473479545200714844">Loupe d'écran</translation>
 <translation id="3474218480460386727">Les nouveaux mots ne doivent pas contenir plus de 99 lettres</translation>
 <translation id="3474624961160222204">Contin. comme <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Désolés, votre empreinte digitale n'a toujours pas été reconnue. Veuillez entrer votre mot de passe.</translation>
 <translation id="3476303763173086583">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer l'expérience Android de votre enfant en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Ce <ph name="BEGIN_LINK1" />paramètre<ph name="END_LINK1" /> est appliqué par le propriétaire du compte. C'est à lui de choisir d'envoyer ou non à Google les données de diagnostic et d'utilisation de cet appareil. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google. <ph name="BEGIN_LINK2" />En savoir plus<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Oups! Le système n'a pas réussi à récupérer la politique pour votre appareil.</translation>
 <translation id="347785443197175480">Continuer à autoriser <ph name="HOST" /> à accéder à votre caméra et à votre microphone</translation>
@@ -3578,7 +3578,6 @@
 <translation id="3759933321830434300">Bloquer des parties de pages Web</translation>
 <translation id="3760460896538743390">Inspecter la page d'&amp;arrière-plan</translation>
 <translation id="37613671848467444">Ouvrir dans une fenêtre de &amp;navigation privée</translation>
-<translation id="3761390540041101668">Décrivez clairement le problème et indiquez les étapes à suivre pour reproduire le problème (si possible)</translation>
 <translation id="3761556954875533505">Autoriser le site à modifier les fichiers?</translation>
 <translation id="3763433740586298940">Vous pouvez bloquer les sites que vous ne voulez pas. En outre, Chrome supprime automatiquement les sites de la liste datant de plus de 30 jours.</translation>
 <translation id="3763549179847864476">Bouton Précédent du Guide sur la confidentialité</translation>
@@ -5890,7 +5889,6 @@
 <translation id="5608580678041221894">Touchez les touches suivantes pour ajuster ou déplacer la zone de recadrage</translation>
 <translation id="5609231933459083978">L'application ne semble pas valide.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Désolés, nous ne pouvons toujours pas valider votre mot de passe. Remarque : si vous l'avez modifié dernièrement, votre nouveau mot de passe ne sera mis à jour qu'une fois que vous vous serez déconnecté. Veuillez donc utiliser votre ancien mot de passe.</translation>
 <translation id="5614190747811328134">Avis pour les utilisateurs</translation>
 <translation id="5614553682702429503">Enregistrer le mot de passe?</translation>
 <translation id="5614947000616625327">Trousseau iCloud</translation>
@@ -6624,6 +6622,7 @@
 <translation id="6202304368170870640">Vous pouvez utiliser votre NIP pour vous connecter à votre appareil ou pour le déverrouiller.</translation>
 <translation id="6203247599828309566">Vous avez enregistré une note pour un mot de passe sur ce site. Pour l'afficher, cliquez sur l'icône de la clé.</translation>
 <translation id="6205314730813004066">Confidentialité des annonces</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – Enregistrement par microphone</translation>
 <translation id="6206199626856438589">Vous serez déconnecté des sites affichés, y compris dans les onglets ouverts</translation>
 <translation id="6206311232642889873">Cop&amp;ier l'image</translation>
 <translation id="6207200176136643843">Rétablir le niveau de zoom par défaut</translation>
@@ -7177,6 +7176,7 @@
 <translation id="6657585470893396449">Mot de passe</translation>
 <translation id="6659213950629089752">Zoom effectué par l'extension « <ph name="NAME" /> » sur cette page</translation>
 <translation id="6659594942844771486">Onglet</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – Enregistrement par appareil photo</translation>
 <translation id="6660819301598582123">Voici à quoi ressemblera votre texte.</translation>
 <translation id="666099631117081440">Serveurs d'impression</translation>
 <translation id="6662931079349804328">La politique de l'entreprise a changé. Le bouton des fonctionnalités expérimentales a été retiré de la barre d'outils.</translation>
@@ -8988,6 +8988,7 @@
 <translation id="8059417245945632445">&amp;Inspecter les appareils</translation>
 <translation id="8059456211585183827">Il n'y a aucune imprimante à enregistrer.</translation>
 <translation id="8061091456562007989">Rétablir</translation>
+<translation id="8061244502316511332">Cet onglet utilise votre microphone</translation>
 <translation id="8061970399284390013">Vérification de l'orthographe et de la grammaire</translation>
 <translation id="8061991877177392872">On dirait que vous avez déjà configuré Voice Match avec votre Assistant sur un autre appareil. Ces enregistrements précédents ont été utilisés pour créer un modèle vocal sur cet appareil.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 feuille de papier}one{{COUNT} feuille de papier}other{{COUNT} feuilles de papier}}</translation>
@@ -9469,6 +9470,7 @@
 <translation id="844063558976952706">Toujours sur ce site</translation>
 <translation id="8441313165929432954">Activer/Désactiver le partage de connexion</translation>
 <translation id="8443986842926457191">L'URL contient plus de 2 048 caractères</translation>
+<translation id="8445281870900174108">Cet onglet utilise votre appareil photo</translation>
 <translation id="8446884382197647889">En savoir plus</translation>
 <translation id="8447409163267621480">Vous devez inclure la touche Ctrl ou Alt</translation>
 <translation id="844850004779619592">Aucune commande trouvée</translation>
@@ -10543,6 +10545,7 @@
 <translation id="981121421437150478">Hors ligne</translation>
 <translation id="983192555821071799">Fermer tous les onglets</translation>
 <translation id="983511809958454316">Cette fonctionnalité n'est pas prise en charge dans la RV</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – Enregistrement par appareil photo et microphone</translation>
 <translation id="984275831282074731">Modes de paiement</translation>
 <translation id="984705303330760860">Ajouter des langues pour le correcteur orthographique</translation>
 <translation id="98515147261107953">Paysage</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 0193ef1..992da1a 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -3209,7 +3209,6 @@
 <translation id="3473479545200714844">Loupe</translation>
 <translation id="3474218480460386727">Les nouveaux termes ne doivent pas contenir plus de 99 lettres</translation>
 <translation id="3474624961160222204">Continuer en tant que <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Désolé, votre empreinte digitale n'est toujours pas reconnue. Veuillez saisir votre mot de passe.</translation>
 <translation id="3476303763173086583">Envoyer des données d'utilisation et de diagnostic. Contribuez à l'amélioration de l'expérience de votre enfant sur Android en envoyant automatiquement à Google des données relatives aux diagnostics et à l'utilisation de l'appareil et des applications. Ces informations ne seront pas utilisées pour identifier votre enfant, mais elles nous aideront à améliorer, entre autres, la stabilité du système et des applications. Certaines données globales seront également utiles aux développeurs des applications Google et à nos partenaires, tels que les développeurs Android. Ce <ph name="BEGIN_LINK1" />paramètre<ph name="END_LINK1" /> est appliqué par le propriétaire. Le propriétaire de cet appareil peut choisir d'envoyer à Google des données de diagnostic et d'utilisation. Si vous activez le paramètre relatif à l'activité supplémentaire sur le Web et les applications pour votre enfant, ces données peuvent être enregistrées dans son compte Google. <ph name="BEGIN_LINK2" />En savoir plus<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Petit problème… Le système n'a pas réussi à récupérer les règles pour votre appareil.</translation>
 <translation id="347785443197175480">Continuer à autoriser <ph name="HOST" /> à accéder à votre caméra et à votre micro</translation>
@@ -3576,7 +3575,6 @@
 <translation id="3759933321830434300">Bloquer des parties de pages Web</translation>
 <translation id="3760460896538743390">Inspecter la page d'&amp;arrière-plan</translation>
 <translation id="37613671848467444">Ouvrir dans une fenêtre de &amp;navigation privée</translation>
-<translation id="3761390540041101668">Décrivez clairement le problème et les étapes permettant de le reproduire (si possible).</translation>
 <translation id="3761556954875533505">Autoriser le site à modifier les fichiers ?</translation>
 <translation id="3763433740586298940">Vous pouvez bloquer les sites qui ne vous intéressent pas. De plus, Chrome supprime automatiquement de la liste les sites de plus de 30 jours.</translation>
 <translation id="3763549179847864476">Bouton "Retour" du Guide sur la confidentialité</translation>
@@ -5888,7 +5886,6 @@
 <translation id="5608580678041221894">Appuyez sur les touches suivantes pour ajuster ou déplacer la zone de recadrage</translation>
 <translation id="5609231933459083978">L'application ne semble pas valide.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Désolé, nous ne pouvons toujours pas valider votre mot de passe. Remarque : si vous l'avez modifié dernièrement, votre nouveau mot de passe ne sera appliqué qu'une fois que vous vous serez déconnecté. Veuillez donc utiliser votre ancien mot de passe.</translation>
 <translation id="5614190747811328134">Avertissement utilisateur</translation>
 <translation id="5614553682702429503">Enregistrer le mot de passe ?</translation>
 <translation id="5614947000616625327">Trousseau iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index f2cd066..1f613a5d 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -3207,7 +3207,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">As palabras novas non deben ter máis de 99 letras</translation>
 <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Aínda non se recoñece a túa impresión dixital. Introduce o teu contrasinal.</translation>
 <translation id="3476303763173086583">Enviar datos de uso e de diagnóstico. Envía automaticamente datos de diagnóstico e de uso do dispositivo e das aplicacións a Google para axudar a mellorar a experiencia do teu fillo en Android. Esta información non se utilizará para identificar o teu fillo, senón co obxectivo de aumentar a estabilidade do sistema e das aplicacións, e de realizar outras melloras. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android. Esta <ph name="BEGIN_LINK1" />opción de configuración<ph name="END_LINK1" /> contrólaa o propietario. O cal pode optar por enviar datos de diagnóstico e uso deste dispositivo a Google. Se está activada a opción de configuración Actividade web e das aplicacións adicional para o teu fillo, estes datos pódense gardar na súa conta de Google <ph name="BEGIN_LINK2" />Máis información<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">O sistema non puido obter a política do teu dispositivo.</translation>
 <translation id="347785443197175480">Continuar permitindo a <ph name="HOST" /> acceder á túa cámara e micrófono</translation>
@@ -3577,7 +3576,6 @@
 <translation id="3759933321830434300">Bloquear partes das páxinas web</translation>
 <translation id="3760460896538743390">Inspeccionar &amp;páxina en segundo plano</translation>
 <translation id="37613671848467444">Abrir nunha ventá de &amp;incógnito</translation>
-<translation id="3761390540041101668">Describe claramente o problema e os pasos para reproducilo (se é posible)</translation>
 <translation id="3761556954875533505">Queres permitir que o sitio edite os ficheiros?</translation>
 <translation id="3763433740586298940">Podes bloquear os sitios que non che interesen. Chrome tamén elimina automaticamente da lista os sitios que teñan máis de 30 días de antigüidade.</translation>
 <translation id="3763549179847864476">Botón Atrás da Guía de privacidade</translation>
@@ -5889,7 +5887,6 @@
 <translation id="5608580678041221894">Toca as seguintes teclas para axustar ou mover a zona que se recortará</translation>
 <translation id="5609231933459083978">Parece que a aplicación non é válida.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Aínda non se pode verificar o teu contrasinal. Nota: Se cambiaches o teu contrasinal recentemente, o contrasinal novo aplicarase en canto peches sesión. Utiliza o contrasinal antigo aquí.</translation>
 <translation id="5614190747811328134">Aviso do usuario</translation>
 <translation id="5614553682702429503">Queres gardar o contrasinal?</translation>
 <translation id="5614947000616625327">Chaveiro de iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index c8d7e8d..44f033fb 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -3206,7 +3206,6 @@
 <translation id="3473479545200714844">સ્ક્રીન બૃહદદર્શક</translation>
 <translation id="3474218480460386727">નવા શબ્દો માટે 99 કે તેથી ઓછા અક્ષરોનો ઉપયોગ કરો</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> તરીકે ચાલુ રાખો</translation>
-<translation id="3475843873335999118">માફ કરશો, તમારી ફિંગરપ્રિંટ હજી પણ ઓળખવામાં આવી નથી. કૃપા કરીને તમારો પાસવર્ડ દાખલ કરો.</translation>
 <translation id="3476303763173086583">વપરાશ અને નિદાનનો ડેટા મોકલો. Googleને નિદાન, ડિવાઇસ અને ઍપ વપરાશનો ડેટા ઑટોમૅટિક રીતે મોકલીને તમારા બાળકના Android અનુભવને બહેતર બનાવવામાં સહાય કરો. આનો ઉપયોગ તમારા બાળકને ઓળખવા માટે થશે નહીં અને સિસ્ટમ અને ઍપની સ્થિરતા અને અન્ય સુધારણાઓમાં સહાય કરશે. એકત્રીકરણ કરેલો કેટલોક ડેટા Google ઍપ અને ભાગીદારોને પણ મદદ કરશે, જેમ કે Android ડેવલપર. આ <ph name="BEGIN_LINK1" />સેટિંગ<ph name="END_LINK1" /> માલિક દ્વારા લાગુ કરવામાં આવેલ છે. માલિક, Googleને આ ડિવાઇસ માટે નિદાન અને વપરાશ ડેટા મોકલવાનું પસંદ કરી શકે છે. જો તમારા બાળક માટે વધારાની વેબ અને ઍપ પ્રવૃત્તિ સેટિંગ ચાલુ હોય, તો આ ડેટા તેમના Google એકાઉન્ટમાં સાચવવામાં આવી શકે છે. <ph name="BEGIN_LINK2" />વધુ જાણો<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">અરેરે!  તમારા ડિવાઇસ માટે સિસ્ટમ પૉલિસી લાવવામાં નિષ્ફળ થયું.</translation>
 <translation id="347785443197175480">તમારા કૅમેરા અને માઇક્રોફોનને ઍક્સેસ કરવા માટે <ph name="HOST" />ને સતત મંજૂરી આપે છે</translation>
@@ -3573,7 +3572,6 @@
 <translation id="3759933321830434300">વેબ પેજના બ્લૉક થયેલા ભાગ</translation>
 <translation id="3760460896538743390">&amp;બૅકગ્રાઉન્ડ પેજની તપાસ કરો</translation>
 <translation id="37613671848467444">&amp;છુપી વિંડોમાં ખોલો</translation>
-<translation id="3761390540041101668">સમસ્યાનું સ્પષ્ટ વર્ણન તથા સમસ્યાની પુન:પ્રસ્તુતિ કરવા માટેના પગલાં આપો (શક્ય હોય તો)</translation>
 <translation id="3761556954875533505">સાઇટને ફાઇલોમાં ફેરફાર કરવાની મંજૂરી આપીએ?</translation>
 <translation id="3763433740586298940">તમને ન જોઈતી સાઇટ તમે બ્લૉક કરી શકો છો. Chrome સૂચિમાંથી 30 દિવસથી જૂની સાઇટને પણ ઑટોમૅટિક રીતે ડિલીટ કરે છે.</translation>
 <translation id="3763549179847864476">'પ્રાઇવસી સંબંધિત માર્ગદર્શિકા' પર પાછા ફરવાનું બટન</translation>
@@ -5885,7 +5883,6 @@
 <translation id="5608580678041221894">કાપવા માટેના ક્ષેત્રને સમાયોજિત કરવા અથવા ખસેડવા માટે નીચેની કીને ટૅપ કરો</translation>
 <translation id="5609231933459083978">ઍપ્લિકેશન અમાન્ય હોય તેવું લાગે છે.</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>
 <translation id="5614947000616625327">iCloud કીચેન</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index f82b8965..428e288 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -143,7 +143,7 @@
 <translation id="1107482171728500359">माइक्रोफ़ोन शेयर करें</translation>
 <translation id="1108600514891325577">&amp;रोकें</translation>
 <translation id="1108938384783527433">इतिहास सिंक करें</translation>
-<translation id="1110155001042129815">प्रतीक्षा करें</translation>
+<translation id="1110155001042129815">इंतज़ार करें</translation>
 <translation id="1110965959145884739">चुनें कि इस डिवाइस पर कौनसी भाषाएं इंस्टॉल करनी है. डिस्क में बचा स्टोरेज सेव करने के लिए, भाषा फ़ाइलों को उपयोगकर्ताओं में शेयर किया जाता है. <ph name="BEGIN_LINK_LEARN_MORE" />ज़्यादा जानें<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="1112420131909513020">बैकग्राउंड टैब ब्लूटूथ का इस्तेमाल कर रहा है</translation>
 <translation id="1112998165730922436">कास्ट करने की प्रोसेस रोकी गई</translation>
@@ -1658,6 +1658,7 @@
 <translation id="2249111429176737533">टैब की गई विंडो के तौर पर खोलें</translation>
 <translation id="2249605167705922988">जैसे कि 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">विज्ञापन दिखाने के लिए साइटें जिस जानकारी का इस्तेमाल करती हैं उसमें अपनी ज़रूरत के हिसाब से बदलाव करें</translation>
+<translation id="2250624716625396929">यह टैब आपके कैमरे और माइक्रोफ़ोन का इस्तेमाल कर रहा है</translation>
 <translation id="2251218783371366160">सिस्टम दर्शक के साथ खोलें</translation>
 <translation id="225163402930830576">नेटवर्क रीफ्रेश करें</translation>
 <translation id="2251809247798634662">नई गुप्त विंडो</translation>
@@ -2308,7 +2309,7 @@
 <translation id="2730901670247399077">इमोजी के सुझाव</translation>
 <translation id="273093730430620027">यह पेज आपका कैमरा ऐक्सेस कर रहा है.</translation>
 <translation id="2731392572903530958">बंद की गई विंडो पु&amp;न: खोलें</translation>
-<translation id="2731700343119398978">कृपया प्रतीक्षा करें...</translation>
+<translation id="2731700343119398978">कृपया इंतज़ार करें...</translation>
 <translation id="2731971182069536520">जब आप अगली बार डिवाइस रीस्टार्ट करेंगे, तो आपका एडमिन एक बार किया जाने वाला अपडेट करेगा जिससे आपका स्थानीय डेटा मिट जाएगा.</translation>
 <translation id="2732134891301408122">ज़्यादा कॉन्टेंट वाले <ph name="TOTAL_ELEMENTS" /> पेजों में से पेज <ph name="CURRENT_ELEMENT" /></translation>
 <translation id="2733992589856193783">आपने इस साइट के लिए पासकी बनाई है. साइन इन करने के लिए, आपको मोबाइल डिवाइस की ज़रूरत होगी.</translation>
@@ -3022,7 +3023,7 @@
 <translation id="3303818374450886607">प्रतियां</translation>
 <translation id="3303855915957856445">कोई खोज नतीजे नहीं मिले</translation>
 <translation id="3304212451103136496"><ph name="DISCOUNT_AMOUNT" /> की छूट</translation>
-<translation id="3305389145870741612">स्‍वरूपण प्रक्रिया में कुछ सेकंड लग सकते हैं. कृपया प्रतीक्षा करें.</translation>
+<translation id="3305389145870741612">स्‍वरूपण प्रक्रिया में कुछ सेकंड लग सकते हैं. कृपया इंतज़ार करें.</translation>
 <translation id="3305661444342691068">PDF को 'झलक' में खोलें</translation>
 <translation id="3307176291962384345"><ph name="MERCHANT_NAME" /> के लिए छूट पाएं</translation>
 <translation id="3307283429759317478">अपनी सबसे हाल की गतिविधि पर आसानी से वापस जाने के लिए, आपको दूसरे डिवाइसों पर टैब दिख रहे हैं.
@@ -3224,7 +3225,6 @@
 <translation id="3473479545200714844">स्क्रीन पर मौजूद कॉन्टेंट को बड़ा करके दिखाने की सुविधा</translation>
 <translation id="3474218480460386727">नए शब्दों के लिए 99 अक्षरों या उससे कम का इस्तेमाल करें</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> के रूप में जारी रखें</translation>
-<translation id="3475843873335999118">माफ़ कीजिए, आपके फ़िंगरप्रिंट की अब भी पहचान नहीं हुई हैैै. कृपया अपना पासवर्ड डालें.</translation>
 <translation id="3476303763173086583">इस्तेमाल और निदान से जुड़ा डेटा भेजें. Google को निदान, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने आप भेजकर, अपने बच्चे के Android अनुभव को बेहतर बनाने में मदद करें. इसका इस्तेमाल आपके बच्चे की पहचान करने के लिए नहीं किया जाएगा. यह सिस्टम और ऐप्लिकेशन की स्थिरता और दूसरे सुधारों में मदद करेगा. कुछ एग्रीगेट डेटा Google ऐप्लिकेशन और पार्टनर, जैसे कि Android डेवलपरों की भी मदद करेगा. यह <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> डिवाइस के मालिक ने लागू की है. डिवाइस का मालिक यह चुन सकता है कि निदान और इस डिवाइस के इस्तेमाल से जुड़ा डेटा Google को भेजना है. अगर आपके बच्चे के लिए दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है. <ph name="BEGIN_LINK2" />ज़्यादा जानें<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">ओह!  सिस्टम आपके डिवाइस की नीति नहीं निकाल पाया.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> को अपने कैमरे और माइक्रोफ़ोन को एक्सेस करते रहने दें</translation>
@@ -3591,7 +3591,6 @@
 <translation id="3759933321830434300">वेब पेज के भाग अवरोधित करें</translation>
 <translation id="3760460896538743390">निरीक्षण और पेजभूमि पेज</translation>
 <translation id="37613671848467444">&amp;गुप्त विंडों में खोलें</translation>
-<translation id="3761390540041101668">समस्या को साफ़ तौर पर बताएं. साथ ही, यह भी बताएं कि इस समस्या तक पहुंचने के लिए क्या कदम उठाने होंगे</translation>
 <translation id="3761556954875533505">क्या आप साइट को फ़ाइलों में बदलाव करने देना चाहते हैं?</translation>
 <translation id="3763433740586298940">आपके पास उन साइटों को ब्लॉक करने का विकल्प होता है जो आपको नहीं देखनी हैं. Chrome, ब्लॉक की गई साइटों की सूची से उन साइटों को भी अपने-आप मिटा देता है जिन्हें 30 दिन पहले इस सूची में जोड़ा गया था.</translation>
 <translation id="3763549179847864476">निजता गाइड वाले पेज से, सेटिंग पर ले जाने वाला बटन</translation>
@@ -3666,7 +3665,7 @@
 <translation id="3810593934879994994"><ph name="ORIGIN" /> नीचे दिए गए फ़ोल्डर में मौजूद फ़ाइलों को देख सकती है</translation>
 <translation id="3810770279996899697">Password Manager को MacOS Keychain का ऐक्सेस चाहिए</translation>
 <translation id="3810914450553844415">आपका एडमिन अतिरिक्त Google खाते जोड़ने की अनुमति नहीं देता है.</translation>
-<translation id="3810973564298564668">प्रबंधित करें</translation>
+<translation id="3810973564298564668">मैनेज करें</translation>
 <translation id="381202950560906753">दूसरा जोड़ें</translation>
 <translation id="3812525830114410218">गलत प्रमाणपत्र</translation>
 <translation id="3813296892522778813">अगर आपको वह चीज़ नहीं मिल रही है जिसे आप खोज रहे हैं, तो <ph name="BEGIN_LINK_CHROMIUM" />Google Chrome सहायता<ph name="END_LINK_CHROMIUM" /> पर जाएं</translation>
@@ -5903,7 +5902,6 @@
 <translation id="5608580678041221894">काटे जाने वाले क्षेत्र को एडजस्ट करने या उसकी जगह बदलने के लिए इन कुंजियों पर टैप करें</translation>
 <translation id="5609231933459083978">ऐप्लिकेशन अमान्य मालूम होता है.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6637,6 +6635,7 @@
 <translation id="6202304368170870640">आप अपने डिवाइस में साइन इन करने या उसे अनलॉक करने के लिए अपने पिन का इस्तेमाल कर सकते हैं.</translation>
 <translation id="6203247599828309566">आपने इस साइट पर पासवर्ड के लिए एक नोट सेव किया है. उसे देखने के लिए, 'की' आइकॉन पर क्लिक करें.</translation>
 <translation id="6205314730813004066">विज्ञापन से जुड़ी निजता सेटिंग</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - माइक्रोफ़ोन से रिकॉर्डिंग की जा रही है</translation>
 <translation id="6206199626856438589">आपको उन साइटों से साइन आउट कर दिया जाएगा जिन्हें आपने देखा है. इसमें, वे साइटें भी शामिल हैं जो टैब में अभी खुली हुई हैं</translation>
 <translation id="6206311232642889873">इमेज को कॉपी करें</translation>
 <translation id="6207200176136643843">डिफ़ॉल्ट ज़ूम स्तर पर रीसेट करें</translation>
@@ -7190,6 +7189,7 @@
 <translation id="6657585470893396449">पासवर्ड</translation>
 <translation id="6659213950629089752">इस पेज को "<ph name="NAME" />" एक्सटेंशन द्वारा ज़ूम किया गया था</translation>
 <translation id="6659594942844771486">ब्राउज़र टैब</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - कैमरे से रिकॉर्डिंग की जा रही है</translation>
 <translation id="6660819301598582123">The quick brown fox jumped over the lazy dog.</translation>
 <translation id="666099631117081440">प्रिंट सर्वर</translation>
 <translation id="6662931079349804328">Chrome Enterprise नीति बदल गई है. एक्सपेरिमेंट बटन को टूलबार से हटाया गया.</translation>
@@ -9001,6 +9001,7 @@
 <translation id="8059417245945632445">&amp;उपकरणों का परीक्षण करें</translation>
 <translation id="8059456211585183827">सेव करने के लिए कोई भी प्रिंटर उपलब्ध नहीं है.</translation>
 <translation id="8061091456562007989">पहले जैसा कर दें</translation>
+<translation id="8061244502316511332">यह टैब आपके माइक्रोफ़ोन का इस्तेमाल कर रहा है</translation>
 <translation id="8061970399284390013">स्पेलिंग और व्याकरण की जांच</translation>
 <translation id="8061991877177392872">ऐसा लगता है कि आपने पहले ही किसी दूसरे डिवाइस पर, Assistant के साथ वॉइस मैच की सुविधा को सेट अप कर लिया है. इस डिवाइस पर आवाज़ का नमूना बनाने के लिए, इन पुरानी रिकॉर्डिंग का इस्तेमाल किया गया है.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{काग़ज़ की 1 शीट}one{काग़ज़ की {COUNT} शीट}other{काग़ज़ की {COUNT} शीट}}</translation>
@@ -9482,6 +9483,7 @@
 <translation id="844063558976952706">इस साइट पर हमेशा</translation>
 <translation id="8441313165929432954">टेदरिंग को चालू/बंद करें</translation>
 <translation id="8443986842926457191">यूआरएल 2048 वर्णों से ज़्यादा का है</translation>
+<translation id="8445281870900174108">यह टैब आपके कैमरे का इस्तेमाल कर रहा है</translation>
 <translation id="8446884382197647889">ज़्यादा जानें</translation>
 <translation id="8447409163267621480">Ctrl या Alt में से किसी एक को शामिल करें</translation>
 <translation id="844850004779619592">कोई निर्देश नहीं मिला</translation>
@@ -9505,7 +9507,7 @@
 <translation id="8460448946170646641">निजता और सुरक्षा से जुड़े मुख्य कंट्रोल देखें</translation>
 <translation id="8460490661223303637">मेमोरी बचाने के लिए, Chrome ने कुछ कॉन्टेंट हटा दिया है</translation>
 <translation id="8460932807646981183">सर्च इंजन और साइट खोज को मैनेज करें</translation>
-<translation id="84613761564611563">नेटवर्क कॉन्फ़िगर यूज़र इंटरफ़ेस (यूआई) का अनुरोध किया गया, कृृपया प्रतीक्षा करें...</translation>
+<translation id="84613761564611563">नेटवर्क कॉन्फ़िगर यूज़र इंटरफ़ेस (यूआई) का अनुरोध किया गया, कृृपया इंतज़ार करें...</translation>
 <translation id="8461914792118322307">प्रॉक्सी</translation>
 <translation id="8461973047386722744">कोई पासवर्ड नहीं मिला</translation>
 <translation id="8463001014623882202">अनुमति नहीं मिल सकी</translation>
@@ -10557,6 +10559,7 @@
 <translation id="981121421437150478">ऑफ़लाइन</translation>
 <translation id="983192555821071799">सभी टैब बंद करें</translation>
 <translation id="983511809958454316">यह सुविधा VR में काम नहीं करती</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - कैमरे और माइक्रोफ़ोन से रिकॉर्डिंग की जा रही है</translation>
 <translation id="984275831282074731">पैसे चुकाने के तरीके</translation>
 <translation id="984705303330760860">स्पेलिंग जांच की भाषाएं जोड़ें</translation>
 <translation id="98515147261107953">लैंडस्केप</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 1999730..e82f6b44 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -3212,7 +3212,6 @@
 <translation id="3473479545200714844">Povećalo</translation>
 <translation id="3474218480460386727">Za nove riječi koristite najviše 99 slova</translation>
 <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Žao nam je, uređaj i dalje ne prepoznaje vaš otisak prsta. Unesite zaporku.</translation>
 <translation id="3476303763173086583">Slanje podataka o upotrebi i dijagnostici. Pomognite poboljšati djetetov doživljaj Androida automatskim slanjem dijagnostičkih podataka i podataka o upotrebi uređaja i aplikacija Googleu. Ti se podaci neće upotrebljavati za identifikaciju vašeg djeteta, a pomoći će poboljšati sustav, stabilnost aplikacija i drugo. Neki skupni podaci pomoći će i Googleovim aplikacijama i partnerima, na primjer razvojnim programerima za Android. Ovu <ph name="BEGIN_LINK1" />postavku<ph name="END_LINK1" /> zadao je vlasnik. Vlasnik može Googleu slati dijagnostiku i podatke o upotrebi za ovaj uređaj. Ako je za vaše dijete uključena dodatna postavka Aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na djetetov Google račun. <ph name="BEGIN_LINK2" />Saznajte više<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ups! Sustav nije uspio dohvatiti pravila za vaš uređaj.</translation>
 <translation id="347785443197175480">Nastavi dopuštati hostu <ph name="HOST" /> pristup kameri i mikrofonu</translation>
@@ -3579,7 +3578,6 @@
 <translation id="3759933321830434300">blokirati dijelove web-stranica</translation>
 <translation id="3760460896538743390">Provjeri &amp;pozadinsku stranicu</translation>
 <translation id="37613671848467444">Otvori u &amp;anonimnom prozoru</translation>
-<translation id="3761390540041101668">Jasno objasnite problem i korake za njegovo reproduciranje (ako je moguće)</translation>
 <translation id="3761556954875533505">Dopustiti web-lokaciji da uredi datoteke?</translation>
 <translation id="3763433740586298940">Možete blokirati web-lokacije koje ne želite. Chrome također automatski briše web-lokacije koje su na popisu više od 30 dana.</translation>
 <translation id="3763549179847864476">Gumb za natrag u vodiču za privatnost</translation>
@@ -5891,7 +5889,6 @@
 <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="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>
 <translation id="5614947000616625327">iCloud privjesak ključeva</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index fbf763e..f31e342 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">Képernyőnagyító</translation>
 <translation id="3474218480460386727">Új szavak megadásához legfeljebb 99 betűt használhat</translation>
 <translation id="3474624961160222204">Folytatás mint <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Sajnos az ujjlenyomatát továbbra sem sikerült felismerni. Adja meg jelszavát.</translation>
 <translation id="3476303763173086583">Használati és diagnosztikai adatok küldése. Segítsen gyermeke Android-élményének továbbfejlesztésében azzal, hogy automatikusan diagnosztikai, valamint eszköz- és alkalmazáshasználati adatokat küld a Google-nak. Az adatok a rendszer- és alkalmazásstabilitás javításában, valamint más fejlesztésekben segítenek, nem használjuk fel őket az Ön gyermekének azonosítására. Bizonyos összesített adatok a Google-alkalmazásoknak és -partnereknek, például az Android-fejlesztőknek is segítenek. Ezt a <ph name="BEGIN_LINK1" />beállítást<ph name="END_LINK1" /> kötelezővé tette az eszköz tulajdonosa. A tulajdonos dönthet úgy, hogy elküldi az eszközzel kapcsolatos diagnosztikai és használati adatokat a Google-nak. Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva a gyermekénél, akkor a rendszer ezeket az adatokat mentheti a gyermek Google-fiókjába. <ph name="BEGIN_LINK2" />További információ.<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Hoppá! A rendszer nem tudta lehívni az eszköz házirendjét.</translation>
 <translation id="347785443197175480">A(z) <ph name="HOST" /> továbbra is hozzáférhet az Ön kamerájához és mikrofonjához</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">Weboldalak adott részeinek letiltása</translation>
 <translation id="3760460896538743390">&amp;Háttéroldal vizsgálata</translation>
 <translation id="37613671848467444">Megnyitás &amp;inkognitóablakban</translation>
-<translation id="3761390540041101668">Adja meg a probléma egyértelmű leírását és a probléma reprodukálásának lépéseit (ha lehetséges).</translation>
 <translation id="3761556954875533505">Engedélyezi a webhelynek a fájlok szerkesztését?</translation>
 <translation id="3763433740586298940">Önnek lehetősége van a nem kívánt webhelyek letiltására. A Chrome emellett automatikusan törli a listáról a 30 napnál régebbi webhelyeket.</translation>
 <translation id="3763549179847864476">Adatvédelmi útmutató vissza gombja</translation>
@@ -5902,7 +5900,6 @@
 <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="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>
 <translation id="5614947000616625327">iCloud-kulcskarika</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 6453b2f..6947ede 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1647,6 +1647,7 @@
 <translation id="2249111429176737533">Բացել որպես ներդիրով պատուհան</translation>
 <translation id="2249605167705922988">օր. 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Կառավարեք տվյալները, որոնք օգտագործում են կայքերը՝ ձեզ գովազդ ցուցադրելու համար</translation>
+<translation id="2250624716625396929">Այս ներդիրն օգտագործում է ձեր տեսախցիկը և խոսափողը</translation>
 <translation id="2251218783371366160">Բացել համակարգի դիտակով</translation>
 <translation id="225163402930830576">Թարմացնել ցանցերը</translation>
 <translation id="2251809247798634662">Նոր ինկոգնիտո պատուհան</translation>
@@ -3206,7 +3207,6 @@
 <translation id="3473479545200714844">Էկրանի խոշորացույց</translation>
 <translation id="3474218480460386727">Նոր բառերում տառերի առավելագույն քանակը՝ 99</translation>
 <translation id="3474624961160222204">Շարունակել <ph name="NAME" /> հաշվով</translation>
-<translation id="3475843873335999118">Ձեր մատնահետքը չի ճանաչվում։ Մուտքագրեք ձեր գաղտնաբառը։</translation>
 <translation id="3476303763173086583">Օգտագործման և դիագնոստիկ տվյալների ուղարկում Օգնեք բարելավել ձեր երեխայի Android-ի աշխատանքը՝ Google-ին ավտոմատ ուղարկելով ախտորոշման, ինչպես նաև սարքի ու հավելվածի օգտագործման տվյալներ: Այս տեղեկությունները չեն օգտագործվի ձեր երեխային նույնականացնելու համար և կօգնեն բարելավել համակարգի ու հավելվածի աշխատանքի կայունությունը: Հավաքված տեղեկությունների մի մասը օգտակար կլինի մեր գործընկերների, օրինակ, Android ծրագրավորողների համար։ Այս <ph name="BEGIN_LINK1" />կարգավորումը<ph name="END_LINK1" /> պարտադրված է սեփականատիրոջ կողմից: Սեփականատերը կարող է թույլատրել, որ այս սարքի օգտագործման և դիագնոստիկ տվյալներն ուղարկվեն Google-ին: Եթե Վեբ որոնման և հավելվածների պատմությունը միացված է, այս տվյալները կպահվեն երեխայի Google հաշվում։ <ph name="BEGIN_LINK2" />Մանրամասն<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Համակարգին չհաջողվեց առբերել սարքի քաղաքականությունը։</translation>
 <translation id="347785443197175480">Շարունակել թույլ տալ <ph name="HOST" />-ին օգտագործել ձեր տեսախցիկն ու խոսափողը</translation>
@@ -3573,7 +3573,6 @@
 <translation id="3759933321830434300">Արգելափակել վեբ էջերի մասերը</translation>
 <translation id="3760460896538743390">Հետազոտել &amp;հետնաշերտի էջը</translation>
 <translation id="37613671848467444">Բացել &amp;ինկոգնիտո պատուհանում</translation>
-<translation id="3761390540041101668">Հստակ նկարագրեք խնդիրը և այն վերարտադրելու քայլերը (եթե հնարավոր է)</translation>
 <translation id="3761556954875533505">Թույլատրե՞լ կայքին փոփոխել ֆայլեր</translation>
 <translation id="3763433740586298940">Դուք կարող եք արգելափակել անցանկալի կայքերը։ Chrome-ը նաև ցանկից ավտոմատ ջնջում է այն կայքերը, որոնք ավելացվել են առնվազն 30 օր առաջ։</translation>
 <translation id="3763549179847864476">«Հետ» կոճակ Գաղտնիության ուղեցույցի էջում</translation>
@@ -5886,7 +5885,6 @@
 <translation id="5608580678041221894">Սեղմեք հետևյալ ստեղները` եզրատվող տարածքը ճշգրտելու կամ տեղաշարժելու համար</translation>
 <translation id="5609231933459083978">Հավելվածն անվավեր է:</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6617,6 +6615,7 @@
 <translation id="6202304368170870640">Դուք կարող եք օգտագործել ձեր PIN կոդը՝ ձեր սարք մտնելու կամ այն ապակողպելու համար:</translation>
 <translation id="6203247599828309566">Դուք նշում եք պահել այս կայքի գաղտնաբառի մասին։ Այն դիտելու համար սեղմեք բանալու պատկերակին։</translation>
 <translation id="6205314730813004066">Գովազդի գաղտնիություն</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – Խոսափողով ձայնագրում</translation>
 <translation id="6206199626856438589">Դուք դուրս կգաք հաշվից ցուցադրված կայքերում, այդ թվում՝ բաց ներդիրներում</translation>
 <translation id="6206311232642889873">Պատ&amp;ճենել պատկերը</translation>
 <translation id="6207200176136643843">Վերակայել կանխադրված մասշտաբը</translation>
@@ -7170,6 +7169,7 @@
 <translation id="6657585470893396449">Գաղտնաբառ</translation>
 <translation id="6659213950629089752">Այս էջի չափերը փոփոխել է <ph name="NAME" /> ընդլայնումը</translation>
 <translation id="6659594942844771486">Ներդիր</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – Տեսախցիկով տեսագրում</translation>
 <translation id="6660819301598582123">Մուկը մատը մատին կտա, տան կարասը պատին կտա։</translation>
 <translation id="666099631117081440">Տպման սերվերներ</translation>
 <translation id="6662931079349804328">Կորպորատիվ կանոն է փոխվել։ «Փորձարկումներ» կոճակը հեռացվել է գործիքագոտուց։</translation>
@@ -8980,6 +8980,7 @@
 <translation id="8059417245945632445">&amp;Հետազոտել սարքերը</translation>
 <translation id="8059456211585183827">Տպիչներ չկան, որոնք կարող եք պահել։</translation>
 <translation id="8061091456562007989">Հետ փոխել</translation>
+<translation id="8061244502316511332">Այս ներդիրն օգտագործում է ձեր խոսափողը</translation>
 <translation id="8061970399284390013">Ուղղագրության և քերականության ստուգում</translation>
 <translation id="8061991877177392872">Դուք արդեն կարգավորել եք Voice Match-ը այլ սարքում։ Այս նախկին ձայնագրություններն օգտագործվել են՝ ձեր ձայնի նմուշն այս սարքում ստեղծելու համար։</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 թերթ}one{{COUNT} թերթ}other{{COUNT} թերթ}}</translation>
@@ -9461,6 +9462,7 @@
 <translation id="844063558976952706">Միշտ այս կայքում</translation>
 <translation id="8441313165929432954">Միացնել/անջատել մոդեմի ռեժիմը</translation>
 <translation id="8443986842926457191">URL-ը կարող է պարունակել առավելագույնը 2048 նիշ</translation>
+<translation id="8445281870900174108">Այս ներդիրն օգտագործում է ձեր տեսախցիկը</translation>
 <translation id="8446884382197647889">Մանրամասն</translation>
 <translation id="8447409163267621480">Սկզբում սեղմեք Ctrl կամ Alt</translation>
 <translation id="844850004779619592">Հրամաններ չեն գտնվել</translation>
@@ -10536,6 +10538,7 @@
 <translation id="981121421437150478">Անցանց</translation>
 <translation id="983192555821071799">Փակել բոլոր ներդիրները</translation>
 <translation id="983511809958454316">Այս գործառույթը չի աջակցվում VR ռեժիմում</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – Տեսախցիկով և խոսափողով տեսագրում</translation>
 <translation id="984275831282074731">Վճարման եղանակներ</translation>
 <translation id="984705303330760860">Ավելացրեք լեզուներ ուղղագրության ստուգման համար</translation>
 <translation id="98515147261107953">Հորիզոնական</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 777a452..b610183 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1657,6 +1657,7 @@
 <translation id="2249111429176737533">Buka sebagai jendela multi-tab</translation>
 <translation id="2249605167705922988">misal: 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Sesuaikan info yang digunakan situs untuk menampilkan iklan</translation>
+<translation id="2250624716625396929">Tab ini menggunakan kamera dan mikrofon Anda</translation>
 <translation id="2251218783371366160">Buka menggunakan penampil sistem</translation>
 <translation id="225163402930830576">Segarkan Jaringan</translation>
 <translation id="2251809247798634662">Jendela Samaran baru</translation>
@@ -3223,7 +3224,6 @@
 <translation id="3473479545200714844">Kaca pembesar layar</translation>
 <translation id="3474218480460386727">Gunakan maksimal 99 huruf untuk kata baru</translation>
 <translation id="3474624961160222204">Lanjutkan sebagai <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Maaf, sidik jari Anda masih tidak dapat dikenali. Masukkan sandi Anda.</translation>
 <translation id="3476303763173086583">Kirim data penggunaan dan diagnostik. Bantu sempurnakan pengalaman Android Anak Anda dengan otomatis mengirim data diagnostik, perangkat, dan penggunaan aplikasi ke Google. Data ini tidak akan digunakan untuk mengidentifikasi anak Anda serta akan membantu sistem dan stabilitas aplikasi serta penyempurnaan lainnya. Beberapa data gabungan juga akan membantu aplikasi dan partner Google, seperti developer Android. <ph name="BEGIN_LINK1" />Setelan<ph name="END_LINK1" /> ini diterapkan oleh pemilik. Pemilik dapat memilih untuk mengirim data diagnostik dan penggunaan untuk perangkat ini ke Google. Jika setelan Aktivitas Web &amp; Aplikasi tambahan diaktifkan untuk anak Anda, data ini mungkin akan disimpan ke akun Google miliknya. <ph name="BEGIN_LINK2" />Pelajari Lebih Lanjut<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Maaf!  Sistem gagal mengambil kebijakan untuk perangkat Anda.</translation>
 <translation id="347785443197175480">Terus izinkan <ph name="HOST" /> untuk mengakses kamera dan mikrofon Anda</translation>
@@ -3590,7 +3590,6 @@
 <translation id="3759933321830434300">Blokir bagian halaman web</translation>
 <translation id="3760460896538743390">Periksa Halaman Latar &amp;Belakang</translation>
 <translation id="37613671848467444">Buka di &amp;Jendela Samaran</translation>
-<translation id="3761390540041101668">Berikan deskripsi masalah yang jelas dan langkah-langkah untuk mereproduksi masalah (jika memungkinkan)</translation>
 <translation id="3761556954875533505">Izinkan situs mengedit file?</translation>
 <translation id="3763433740586298940">Anda dapat memblokir situs yang tidak diinginkan. Chrome juga otomatis menghapus situs dari daftar yang tersimpan lebih dari 30 hari.</translation>
 <translation id="3763549179847864476">Tombol kembali Panduan Privasi</translation>
@@ -4971,7 +4970,7 @@
 <translation id="4849517651082200438">Jangan Dipasang</translation>
 <translation id="485053257961878904">Tidak dapat menyiapkan sinkronisasi notifikasi</translation>
 <translation id="4850548109381269495">Di kedua perangkat, periksa koneksi internet Anda dan aktifkan Bluetooth. Lalu, coba lagi.</translation>
-<translation id="4850669014075537160">Gulir</translation>
+<translation id="4850669014075537160">Scroll</translation>
 <translation id="4850886885716139402">Lihat</translation>
 <translation id="485088796993065002">Situs mungkin dapat memutar suara guna memberikan audio untuk musik, video, dan media lainnya</translation>
 <translation id="4852383141291180386">Kelola notifikasi aplikasi</translation>
@@ -5903,7 +5902,6 @@
 <translation id="5608580678041221894">Ketuk tombol berikut untuk menyesuaikan atau memindahkan area pemangkasan</translation>
 <translation id="5609231933459083978">Tampaknya aplikasi ini tidak valid.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Maaf, sandi Anda masih belum dapat diverifikasi. Catatan: jika Anda baru saja mengubah sandi Anda, sandi yang baru akan diterapkan saat Anda keluar, gunakan sandi lama di sini.</translation>
 <translation id="5614190747811328134">Notifikasi Pengguna</translation>
 <translation id="5614553682702429503">Simpan sandi?</translation>
 <translation id="5614947000616625327">Rantai Kunci iCloud</translation>
@@ -6637,6 +6635,7 @@
 <translation id="6202304368170870640">Anda dapat menggunakan PIN untuk login atau membuka kunci perangkat.</translation>
 <translation id="6203247599828309566">Anda menyimpan catatan untuk sandi di situs ini. Untuk melihatnya, klik ikon kunci.</translation>
 <translation id="6205314730813004066">Privasi iklan</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - Perekaman mikrofon</translation>
 <translation id="6206199626856438589">Anda akan logout dari situs yang ditampilkan, termasuk di tab yang terbuka</translation>
 <translation id="6206311232642889873">Sali&amp;n Gambar</translation>
 <translation id="6207200176136643843">Reset ke tingkat zoom default</translation>
@@ -7188,6 +7187,7 @@
 <translation id="6657585470893396449">Sandi</translation>
 <translation id="6659213950629089752">Halaman ini diperbesar/diperkecil oleh ekstensi "<ph name="NAME" />"</translation>
 <translation id="6659594942844771486">Tab</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - Perekaman kamera</translation>
 <translation id="6660819301598582123">Budayawan dan xilograf pencetak tujuh mozaik Istiqlal diberitakan di televisi.</translation>
 <translation id="666099631117081440">Server pencetakan</translation>
 <translation id="6662931079349804328">Kebijakan perusahaan diubah. Tombol eksperimen dihapus dari toolbar.</translation>
@@ -9000,6 +9000,7 @@
 <translation id="8059417245945632445">&amp;Periksa perangkat</translation>
 <translation id="8059456211585183827">Tidak ada printer yang tersedia untuk disimpan.</translation>
 <translation id="8061091456562007989">Kembalikan</translation>
+<translation id="8061244502316511332">Tab ini menggunakan mikrofon Anda</translation>
 <translation id="8061970399284390013">Pemeriksaan ejaan dan tata bahasa</translation>
 <translation id="8061991877177392872">Sepertinya Anda sudah menyiapkan Voice Match dengan Asisten Anda di perangkat lain. Rekaman sebelumnya tersebut digunakan untuk membuat model suara di perangkat ini.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 lembar kertas}other{{COUNT} lembar kertas}}</translation>
@@ -9481,6 +9482,7 @@
 <translation id="844063558976952706">Selalu di halaman ini</translation>
 <translation id="8441313165929432954">Aktifkan/Nonaktifkan Tethering</translation>
 <translation id="8443986842926457191">URL berisi lebih dari 2048 karakter</translation>
+<translation id="8445281870900174108">Tab ini menggunakan kamera Anda</translation>
 <translation id="8446884382197647889">Pelajari Lebih Lanjut</translation>
 <translation id="8447409163267621480">Sertakan Ctrl atau Alt</translation>
 <translation id="844850004779619592">Perintah tidak ditemukan</translation>
@@ -10555,6 +10557,7 @@
 <translation id="981121421437150478">Offline</translation>
 <translation id="983192555821071799">Tutup semua tab</translation>
 <translation id="983511809958454316">Fitur ini tidak didukung di VR</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - Perekaman kamera dan mikrofon</translation>
 <translation id="984275831282074731">Metode pembayaran</translation>
 <translation id="984705303330760860">Tambahkan bahasa periksa ejaan</translation>
 <translation id="98515147261107953">Lanskap</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 3d22fb20..08a02e8 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -3224,7 +3224,6 @@
 <translation id="3473479545200714844">Skjástækkun</translation>
 <translation id="3474218480460386727">Notaðu 99 stafi eða færri fyrir ný orð</translation>
 <translation id="3474624961160222204">Halda áfram sem <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Ennþá tekst ekki að bera kennsl á fingrafarið þitt. Sláðu inn aðgangsorðið þitt.</translation>
 <translation id="3476303763173086583">Senda notkunar- og greiningargögn. Hjálpaðu okkur að bæta Android fyrir barnið þitt með því að senda sjálfkrafa greiningargögn, tækisgögn og upplýsingar um forritanotkun til Google. Þetta verður ekki notað til að bera kennsl á barnið þitt og mun stuðla að því að bæta stöðugleika kerfa og forrita auk annarra endurbóta. Sum uppsöfnuð gögn munu einnig gagnast forritum og samstarfsaðilum Google, til dæmis þróunaraðilum Android. Eigandi valdi þessa <ph name="BEGIN_LINK1" />stillingu<ph name="END_LINK1" />. Eigandi getur kosið að senda greiningar- og notkunargögn þessa tækis til Google. Ef kveikt er á ítarlegri vef- og forritavirkni fyrir barnið geta þessi gögn verið vistuð á Google reikningi barnsins. <ph name="BEGIN_LINK2" />Frekari upplýsingar<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Úbbs!  Kerfið gat ekki sótt stefnu úr tækinu þínu.</translation>
 <translation id="347785443197175480">Halda áfram að veita <ph name="HOST" /> aðgang að myndavélinni og hljóðnemanum</translation>
@@ -3591,7 +3590,6 @@
 <translation id="3759933321830434300">Loka á hluta vefsíðna</translation>
 <translation id="3760460896538743390">Kanna &amp;bakgrunnssíðu</translation>
 <translation id="37613671848467444">Opna í hul&amp;iðsglugga</translation>
-<translation id="3761390540041101668">Gefðu skýra lýsingu á vandamálinu og skrefum til að kalla það aftur fram (ef hægt er)</translation>
 <translation id="3761556954875533505">Viltu leyfa svæði að breyta skrám?</translation>
 <translation id="3763433740586298940">Þú getur sett hvaða vefsvæði sem er á bannlista. Chrome eyðir einnig vefsvæðum sem eru eldri en 30 daga sjálfkrafa af listanum.</translation>
 <translation id="3763549179847864476">Hnappur til að fara til baka í leiðbeiningum um persónuvernd</translation>
@@ -5904,7 +5902,6 @@
 <translation id="5608580678041221894">Ýttu á eftirfarandi lykla til að breyta eða færa skurðarsvæðið</translation>
 <translation id="5609231933459083978">Forritið virðist vera ógilt.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Því miður var ekki hægt að staðfesta aðgangsorðið þitt. Hafðu í huga að ef þú hefur breytt aðgangsorðinu nýlega tekur nýja aðgangsorðið gildi eftir útskráningu. Notaðu gamla aðgangsorðið hér.</translation>
 <translation id="5614190747811328134">Notandatilkynning</translation>
 <translation id="5614553682702429503">Vista aðgangsorð?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index e90b079..13ab1719 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -3208,7 +3208,6 @@
 <translation id="3473479545200714844">Ingrandimento dello schermo</translation>
 <translation id="3474218480460386727">Usa al massimo 99 lettere per le nuove parole</translation>
 <translation id="3474624961160222204">Continua come <ph name="NAME" /></translation>
-<translation id="3475843873335999118">La tua impronta digitale non è stata ancora riconosciuta. Inserisci la password.</translation>
 <translation id="3476303763173086583">Invia dati diagnostici e sull'utilizzo. Contribuisci a migliorare l'esperienza Android di tuo figlio tramite l'invio automatico a Google di dati diagnostici e sull'utilizzo delle app e del dispositivo. Non verranno utilizzati per identificare tuo figlio e contribuiranno alla stabilità di app e sistema, nonché ad altri miglioramenti. Alcuni dati aggregati saranno utili anche alle app e ai partner di Google, ad esempio agli sviluppatori Android. Questa <ph name="BEGIN_LINK1" />impostazione<ph name="END_LINK1" /> è applicata dal proprietario. Il proprietario potrebbe decidere di inviare a Google dati di diagnostica e utilizzo relativi a questo dispositivo. Se l'impostazione Attività web e app aggiuntiva è attiva per tuo figlio, questi dati potrebbero essere salvati nel suo Account Google. <ph name="BEGIN_LINK2" />Ulteriori informazioni<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Spiacenti. Il sistema non è riuscito a recuperare le norme del tuo dispositivo.</translation>
 <translation id="347785443197175480">Continua a consentire l'accesso di <ph name="HOST" /> alla webcam e al microfono</translation>
@@ -3575,7 +3574,6 @@
 <translation id="3759933321830434300">Blocco di parti delle pagine web</translation>
 <translation id="3760460896538743390">Ispeziona pagina in &amp;background</translation>
 <translation id="37613671848467444">Apri in finestra di navigazione in &amp;incognito</translation>
-<translation id="3761390540041101668">Fornisci una chiara descrizione del problema e i passaggi per riprodurlo (se possibile)</translation>
 <translation id="3761556954875533505">Vuoi consentire al sito di modificare file?</translation>
 <translation id="3763433740586298940">Puoi bloccare i siti indesiderati. Inoltre, Chrome elimina automaticamente dall'elenco i siti risalenti a più di 30 giorni prima della data corrente.</translation>
 <translation id="3763549179847864476">Pulsante Indietro della Guida alla privacy</translation>
@@ -5887,7 +5885,6 @@
 <translation id="5608580678041221894">Tocca i seguenti tasti per regolare o spostare l'area di ritaglio</translation>
 <translation id="5609231933459083978">L'applicazione non sembra essere valida.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Spiacenti, la password non è stata ancora verificata. Nota. Se l'hai modificata di recente, la nuova password verrà applicata quando esci, quindi ti invitiamo a utilizzare la tua vecchia password qui.</translation>
 <translation id="5614190747811328134">Notifica all'utente</translation>
 <translation id="5614553682702429503">Salvare la password?</translation>
 <translation id="5614947000616625327">Portachiavi iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index d0c53bdb..581c728 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">מגדיל התצוגה</translation>
 <translation id="3474218480460386727">יש לכתוב מילים חדשות עם 99 אותיות או פחות</translation>
 <translation id="3474624961160222204">המשך כ-<ph name="NAME" /></translation>
-<translation id="3475843873335999118">המערכת עדיין לא מזהה את טביעת האצבע. יש להזין את הסיסמה שלך.</translation>
 <translation id="3476303763173086583">‏שליחה של נתוני אבחון ונתונים על השימוש. אפשר לעזור בשיפור החוויה של הילד/ה שלך ב-Android. לשם כך יש לשלוח אל Google באופן אוטומטי נתוני אבחון ונתונים לגבי השימוש במכשיר ובאפליקציות. נתונים אלה לא ישמשו כדי לזהות את הילד/ה שלך, והם יעזרו לשמור על יציבות המערכת והאפליקציות, כמו גם לביצוע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לאפליקציות ולשותפים של Google, כמו מפתחי Android. ה<ph name="BEGIN_LINK1" />הגדרה<ph name="END_LINK1" /> הזו נאכפת על-ידי הבעלים. ייתכן שהבעלים יבחרו לשלוח אל Google נתוני אבחון ונתונים לגבי אופן השימוש במכשיר הזה. אם הופעלה בשביל הילד/ה שלך האפשרות 'פעילות באתרי אינטרנט ובאפליקציות נוספים', ייתכן שהנתונים יישמרו בחשבון Google שלו/ה. <ph name="BEGIN_LINK2" />מידע נוסף<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">אופס! המערכת לא הצליחה לשלוף מדיניות למכשיר שלך.</translation>
 <translation id="347785443197175480">אני רוצה להמשיך לאפשר ל-<ph name="HOST" /> לגשת למצלמה ולמיקרופון</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">חסימת חלקים של דפי אינטרנט</translation>
 <translation id="3760460896538743390">בדיקת דף ה&amp;רקע</translation>
 <translation id="37613671848467444">פתיחה בחלון &amp;אנונימי</translation>
-<translation id="3761390540041101668">צריך לתאר בקצרה את הבעיה ואת השלבים לשחזור הבעיה (אם אפשר)</translation>
 <translation id="3761556954875533505">האם לאפשר לאתר לערוך קבצים?</translation>
 <translation id="3763433740586298940">‏אפשר לחסום אתרים שלא רוצים לתת להם הרשאה. בנוסף, אתרים שנוספו לפני יותר מ-30 יום נמחקים מהרשימה ב-Chrome באופן אוטומטי.</translation>
 <translation id="3763549179847864476">לחצן 'הקודם' במדריך בנושא פרטיות</translation>
@@ -5904,7 +5902,6 @@
 <translation id="5608580678041221894">יש להקיש על המקשים הבאים כדי לשנות או להזיז את אזור החיתוך</translation>
 <translation id="5609231933459083978">נראה שהיישום אינו חוקי.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index c0238961..c7f6a10c 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1642,6 +1642,7 @@
 <translation id="2249111429176737533">タブ付きウィンドウとして開く</translation>
 <translation id="2249605167705922988">例 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">ウェブサイトが広告表示に使用する情報をカスタマイズします</translation>
+<translation id="2250624716625396929">このタブはカメラとマイクを使用しています</translation>
 <translation id="2251218783371366160">システム ビューアで開く</translation>
 <translation id="225163402930830576">ネットワークを更新</translation>
 <translation id="2251809247798634662">新しいシークレット ウィンドウ</translation>
@@ -3202,7 +3203,6 @@
 <translation id="3473479545200714844">画面拡大鏡</translation>
 <translation id="3474218480460386727">新しい語句は 99 文字以内で指定してください</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> として続行</translation>
-<translation id="3475843873335999118">指紋を認識できません。パスワードを入力してください。</translation>
 <translation id="3476303763173086583">使用状況データや診断データを送信します。診断データやデバイスとアプリの使用状況データを Google に自動送信して、お子様向けの Android 機能の向上にご協力ください。この情報を使ってお子様個人が特定されることはありません。この情報は、システムとアプリの安定性の向上やその他の機能の改善に役立てられます。また、Google のアプリやパートナー(Android デベロッパーなど)も、集計データとしてこの情報を活用します。この<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />は所有者によって管理されています。このデバイスの診断データや使用状況データを Google に送信するよう所有者が設定している可能性があります。お子様の [その他のウェブとアプリのアクティビティ] の設定がオンになっている場合、このデータはお子様の Google アカウントに保存されます。<ph name="BEGIN_LINK2" />詳細<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">デバイスのポリシーを取得できませんでした。</translation>
 <translation id="347785443197175480"><ph name="HOST" /> によるカメラとマイクへのアクセスを引き続き許可する</translation>
@@ -3568,7 +3568,6 @@
 <translation id="3759933321830434300">一部のウェブページをブロックする</translation>
 <translation id="3760460896538743390">バックグラウンド ページの検証(&amp;B)</translation>
 <translation id="37613671848467444">シークレット ウィンドウで開く(&amp;I)</translation>
-<translation id="3761390540041101668">問題の明確な説明と再現手順(可能な場合)を入力してください</translation>
 <translation id="3761556954875533505">サイトにファイルの編集を許可しますか?</translation>
 <translation id="3763433740586298940">広告主のウェブサイトを訪れた後、その企業からの広告を希望しない場合はブロックすることができます。また、30 日以上経過した広告主のウェブサイトはリストから自動削除されます。</translation>
 <translation id="3763549179847864476">プライバシー ガイドの戻るボタン</translation>
@@ -5877,7 +5876,6 @@
 <translation id="5608580678041221894">トリミング範囲を調整または移動するには次のキーをタップします</translation>
 <translation id="5609231933459083978">アプリケーションが無効になっているようです。</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>
 <translation id="5614947000616625327">iCloud キーチェーン</translation>
@@ -6611,6 +6609,7 @@
 <translation id="6202304368170870640">デバイスのログインやロック解除に PIN を使用できます。</translation>
 <translation id="6203247599828309566">このサイトでパスワードのメモを保存しました。メモを表示するには、鍵アイコンをクリックします。</translation>
 <translation id="6205314730813004066">広告プライバシー</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - マイク録音</translation>
 <translation id="6206199626856438589">開いているタブを含め、表示されたサイトからログアウトします</translation>
 <translation id="6206311232642889873">画像をコピー(&amp;Y)</translation>
 <translation id="6207200176136643843">リセットしてデフォルトのズームレベルに戻す</translation>
@@ -7161,6 +7160,7 @@
 <translation id="6657585470893396449">パスワード</translation>
 <translation id="6659213950629089752">このページには「<ph name="NAME" />」拡張機能によるズームが適用されています</translation>
 <translation id="6659594942844771486">タブ</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - カメラ録画</translation>
 <translation id="6660819301598582123">あいうえおアイウエオABCabc123漢字</translation>
 <translation id="666099631117081440">プリント サーバー</translation>
 <translation id="6662931079349804328">エンタープライズ ポリシーが変更され、ツールバーからテストボタンが削除されました。</translation>
@@ -8971,6 +8971,7 @@
 <translation id="8059417245945632445">デバイスを検証(&amp;I)</translation>
 <translation id="8059456211585183827">保存できるプリンタはありません。</translation>
 <translation id="8061091456562007989">元に戻す</translation>
+<translation id="8061244502316511332">このタブはマイクを使用しています</translation>
 <translation id="8061970399284390013">スペルと文法のチェック</translation>
 <translation id="8061991877177392872">アシスタントの Voice Match は、すでに別のデバイスで設定されたようです。このデバイスの音声モデルは、登録済みの音声を使って作成されています。</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 枚}other{{COUNT} 枚}}</translation>
@@ -9452,6 +9453,7 @@
 <translation id="844063558976952706">常にこのサイトのプラグインを実行する</translation>
 <translation id="8441313165929432954">テザリングを有効または無効にする</translation>
 <translation id="8443986842926457191">URL が 2048 文字を超えています</translation>
+<translation id="8445281870900174108">このタブはカメラを使用しています</translation>
 <translation id="8446884382197647889">詳細</translation>
 <translation id="8447409163267621480">Ctrl キーまたは Alt キーが必要です</translation>
 <translation id="844850004779619592">コマンドが見つかりません</translation>
@@ -10526,6 +10528,7 @@
 <translation id="981121421437150478">オフライン</translation>
 <translation id="983192555821071799">すべてのタブを閉じる</translation>
 <translation id="983511809958454316">この機能は VR ではサポートされていません</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - カメラ録画とマイク録音</translation>
 <translation id="984275831282074731">お支払い方法</translation>
 <translation id="984705303330760860">スペルチェックの言語を追加</translation>
 <translation id="98515147261107953">横</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 261aff1..c1490ad 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -3209,7 +3209,6 @@
 <translation id="3473479545200714844">ეკრანის ლუპა</translation>
 <translation id="3474218480460386727">ახალი სიტყვებისთვის გამოიყენეთ მაქსიმუმ 99 ასო</translation>
 <translation id="3474624961160222204">გაგრძელება, როგორც <ph name="NAME" /></translation>
-<translation id="3475843873335999118">სამწუხაროდ, თქვენი თითის ანაბეჭდის ამოცნობა კვლავ ვერ მოხერხდა. გთხოვთ, შეიყვანოთ პაროლი.</translation>
 <translation id="3476303763173086583">გამოყენებისა და დიაგნოსტიკის მონაცემების გაგზავნა. ხელი შეუწყვეთ Android-ის გაუმჯობესებას თქვენი შვილისთვის, დიაგნოსტიკისა და მოწყობილობის/აპების გამოყენების მონაცემების ავტომატურად გაგზავნით Google-ში. აღნიშნული მონაცემები არ იქნება გამოყენებული თქვენი შვილის ვინაობის დასადგენად, არამედ დაგვეხმარება სისტემის/აპების სტაბილურობისა და სხვა ფუნქციების გაუმჯობესებაში. გარდა ამისა, გაერთიანებული მონაცემების ნაწილი ხელს შეუწყობს Google აპებსა და პარტნიორებს, მაგალითად, Android-ის დეველოპერებს. ეს <ph name="BEGIN_LINK1" />პარამეტრი<ph name="END_LINK1" /> არის იძულებით გააქტიურებული მფლობელის მიერ. მფლობელს შეუძლია ამ მოწყობილობის დიაგნოსტიკისა და გამოყენების მონაცემების Google-ისთვის გაგზავნის დაშვება. თუ თქვენი შვილისთვის ჩართულია ვებსა და აპებში დამატებითი აქტივობის პარამეტრი, აღნიშნული მონაცემები შესაძლოა შეინახოს მის Google ანგარიშში. <ph name="BEGIN_LINK2" />შეიტყვეთ მეტი<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">სამწუხაროდ, სისტემამ თქვენი მოწყობილობისთვის წესები ვერ გადმოიტანა.</translation>
 <translation id="347785443197175480">გაგრძელება <ph name="HOST" />-ისთვის კამერაზე და მიკროფონზე წვდომის მიცემით</translation>
@@ -3576,7 +3575,6 @@
 <translation id="3759933321830434300">ვებ გვერდების ნაწილების დაბლოკვა</translation>
 <translation id="3760460896538743390">&amp;ფონური გვერდის შემოწმება</translation>
 <translation id="37613671848467444">&amp;ინკოგნიტო ფანჯარაში გახსნა</translation>
-<translation id="3761390540041101668">მკაფიოდ აღწერეთ პრობლემა და როგორ შეიძლება მისი რეპროდუცირება (შეძლებისდაგვარად)</translation>
 <translation id="3761556954875533505">გსურთ საიტისთვის ფაილების რედაქტირების დაშვება?</translation>
 <translation id="3763433740586298940">შეგიძლიათ დაბლოკოთ არასასურველი საიტები. გარდა ამისა, Chrome ავტომატურად წაშლის სიიდან 30 დღეზე ძველ საიტებს.</translation>
 <translation id="3763549179847864476">კონფიდენციალურობის სახელმძღვანელოს უკან გადასვლის ღილაკი</translation>
@@ -5888,7 +5886,6 @@
 <translation id="5608580678041221894">ჩამოჭრის არის დასარეგულირებლად ან გადასაადგილებლად დააჭირეთ მითითებულ კლავიშებს</translation>
 <translation id="5609231933459083978">ჩანს აპლიკაცია არ არის მოქმედი.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 25ed14d..8e6af0d 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1642,6 +1642,7 @@
 <translation id="2249111429176737533">Қойындысы бар терезе етіп ашу</translation>
 <translation id="2249605167705922988">мысалы, 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Жарнамаларыңызды көрсету үшін сайттар пайдаланатын ақпаратты бейімдеу</translation>
+<translation id="2250624716625396929">Бұл қойынды камераңыз бен микрофоныңызды пайдаланып жатыр</translation>
 <translation id="2251218783371366160">Жүйелік көру құралымен ашу</translation>
 <translation id="225163402930830576">Желілерді жаңарту</translation>
 <translation id="2251809247798634662">Жаңа инкогнито терезесі</translation>
@@ -3205,7 +3206,6 @@
 <translation id="3473479545200714844">Экран ұлғайтқыш</translation>
 <translation id="3474218480460386727">Жаңа сөздер үшін 99 немесе одан аз әріп пайдаланыңыз.</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> болып жалғастыру</translation>
-<translation id="3475843873335999118">Кешіріңіз, саусақ ізі әлі танылмады. Құпия сөзіңізді енгізіңіз.</translation>
 <translation id="3476303763173086583">Пайдаланылуы және диагностикасы туралы деректерді жіберу. Диагностикалық деректерді, сондай-ақ құрылғы мен қолданбаларды пайдалану деректерін Google қызметіне автоматты түрде жіберу арқылы балаңыздың Android жүйесін пайдалану тәжірибесін жақсартуға көмектесіңіз. Бұл деректер баланың жеке басын анықтауға пайдаланылмайды. Олар жүйе мен қолданбаның тұрақты жұмыс істеуіне және басқа да жақсартулар енгізуге көмектеседі. Кейбір жиынтық деректер Google қолданбаларын жетілдіруге және Android әзірлеушілері сияқты серіктестердің жұмысына көмектеседі. Бұл <ph name="BEGIN_LINK1" />параметрді<ph name="END_LINK1" /> иесі орнатқан. Иесі бұл құрылғының диагностикасы және пайдаланылуы туралы деректерді Google қызметіне жіберуге рұқсат бере алады. Егер "Интернет пен қолданбаларды пайдаланудың қосымша тарихы" параметрі қосулы болса, бұл деректер балаңыздың Google аккаунтына сақталуы мүмкін. <ph name="BEGIN_LINK2" />Толығырақ<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Қап! Жүйе құрылғыңызға арналған саясатты ала алмады.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> хостына камераңыз бен микрофоныңызды пайдалануға берген рұқсатты сақтау</translation>
@@ -3572,7 +3572,6 @@
 <translation id="3759933321830434300">Веб-беттердің бөлімдерін бөгеу</translation>
 <translation id="3760460896538743390">&amp;Фондық бетті тексеру</translation>
 <translation id="37613671848467444">&amp;Инкогнито терезесінде ашу</translation>
-<translation id="3761390540041101668">Мәселенің нақты сипаттамасын және мәселенің туындау қадамдарын қамтамасыз ету (мүмкін болса)</translation>
 <translation id="3761556954875533505">Сайтқа файлдарды өзгертуге рұқсат етілсін бе?</translation>
 <translation id="3763433740586298940">Қаламайтын сайттарды блоктай аласыз. Сонымен қатар Chrome браузері тізімнен 30 күннен асқан сайттарды автоматты түрде жояды.</translation>
 <translation id="3763549179847864476">Құпиялық нұсқаулығына оралу түймесі</translation>
@@ -5884,7 +5883,6 @@
 <translation id="5608580678041221894">Қию аймағын реттеу не жылжыту үшін келесі пернелерді түртіңіз</translation>
 <translation id="5609231933459083978">Қолданба жарамсыз.</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>
 <translation id="5614947000616625327">iCloud кілттер тізбегі</translation>
@@ -6615,6 +6613,7 @@
 <translation id="6202304368170870640">Құрылғыларға кіру немесе құлпын ашу үшін PIN кодыңызды пайдалануыңызға болады.</translation>
 <translation id="6203247599828309566">Бұл сайтта құпия сөзге арналған ескертпені сақтадыңыз. Оны көру үшін перне белгішесін басыңыз.</translation>
 <translation id="6205314730813004066">Жарнамадағы құпиялық</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – микрофонмен жазып жатыр</translation>
 <translation id="6206199626856438589">Көрсетілген сайттардан, оның ішінде ашық қойындылардан шығарыласыз.</translation>
 <translation id="6206311232642889873">Кескінді көші&amp;ру</translation>
 <translation id="6207200176136643843">Әдепкі масштабтау деңгейін қайтару</translation>
@@ -7166,6 +7165,7 @@
 <translation id="6657585470893396449">Құпия сөз</translation>
 <translation id="6659213950629089752">Бұл бет "<ph name="NAME" />" кеңейтімі арқылы масштабталды</translation>
 <translation id="6659594942844771486">Қойынды</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – камерамен жазып жатыр</translation>
 <translation id="6660819301598582123">аәбвгғдеёжзийкқлмнңоөпрстуұүфхһцчшщъыіьэюя</translation>
 <translation id="666099631117081440">Баспа серверлері</translation>
 <translation id="6662931079349804328">Корпоративтік саясат өзгертілді. "Эксперименттер" түймесі құралдар тақтасынан өшірілді.</translation>
@@ -8976,6 +8976,7 @@
 <translation id="8059417245945632445">&amp;Құрылғыларды тексеру</translation>
 <translation id="8059456211585183827">Сақтауға болатын принтер жоқ.</translation>
 <translation id="8061091456562007989">Оны қайта өзгерту</translation>
+<translation id="8061244502316511332">Бұл қойынды микрофоныңызды пайдаланып жатыр</translation>
 <translation id="8061970399284390013">Емлені және грамматиканы тексеру</translation>
 <translation id="8061991877177392872">Voice Match функциясын Assistant қызметімен басқа құрылғыда реттеп қойған сияқтысыз. Бұл алдыңғы жазбалар осы құрылғыда дауыс үлгісін жасау үшін пайдаланылған.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 қағаз парақ}other{{COUNT} қағаз парақ}}</translation>
@@ -9457,6 +9458,7 @@
 <translation id="844063558976952706">Әрдайым осы сайтта</translation>
 <translation id="8441313165929432954">Тетерингті қосу/өшіру</translation>
 <translation id="8443986842926457191">URL мекенжайының ұзындығы 2048 таңба шегінен асып кеткен.</translation>
+<translation id="8445281870900174108">Бұл қойынды камераңызды пайдаланып жатыр</translation>
 <translation id="8446884382197647889">Толығырақ</translation>
 <translation id="8447409163267621480">Ctrl не Alt пернесінен басталуы керек</translation>
 <translation id="844850004779619592">Ешқандай пәрмен табылмады.</translation>
@@ -10531,6 +10533,7 @@
 <translation id="981121421437150478">Желіден тыс</translation>
 <translation id="983192555821071799">Барлық қойындыларды жабу</translation>
 <translation id="983511809958454316">Бұл функция VR режимінде қолданылмайды</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – камерамен және микрофонмен жазып жатыр</translation>
 <translation id="984275831282074731">Төлеу әдістері</translation>
 <translation id="984705303330760860">Емлені тексеру функциясы бар тілдерді қосу</translation>
 <translation id="98515147261107953">Альбомдық</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 546de8f..77be7701 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -3224,7 +3224,6 @@
 <translation id="3473479545200714844">ឧបករណ៍ពង្រីកអេក្រង់</translation>
 <translation id="3474218480460386727">ប្រើ 99 តួ ឬតិចជាងនេះសម្រាប់ពាក្យថ្មី</translation>
 <translation id="3474624961160222204">បន្តជា <ph name="NAME" /></translation>
-<translation id="3475843873335999118">សូម​ទោស នៅតែមិនស្គាល់ស្នាមម្រាមដៃ​របស់អ្នក​ដដែល។ សូម​បញ្ចូល​ពាក្យ​សម្ងាត់​របស់អ្នក។</translation>
 <translation id="3476303763173086583">បញ្ជូន​ទិន្នន័យ​ប្រើប្រាស់ និង​វិភាគ។ ជួយធ្វើឱ្យ​បទពិសោធន៍ប្រើប្រាស់ Android របស់កូនអ្នក​ប្រសើរឡើង ដោយ​បញ្ជូន​ទិន្នន័យ​នៃការ​វិភាគ ​​ឧបករណ៍ និង​ការប្រើប្រាស់កម្មវិធី​ទៅ Google ដោយ​ស្វ័យប្រវត្តិ។ សកម្មភាពនេះ​នឹងមិនត្រូវ​បានធ្វើឡើង ដើម្បី​កំណត់​អត្តសញ្ញាណ​កូន​របស់អ្នក​នោះទេ តែការធ្វើបែបនេះ​នឹងជួយដល់ស្ថិរភាពកម្មវិធី និងប្រព័ន្ធ ព្រមទាំង​ការកែលម្អ​ផ្សេងទៀត។ ទិន្នន័យ​ប្រមូលបាន​មួយចំនួន​ក៏នឹង​ជួយដល់​កម្មវិធី និង​ដៃគូ Google ដូចជា​អ្នកអភិវឌ្ឍន៍ Android ផងដែរ។ <ph name="BEGIN_LINK1" />ការកំណត់<ph name="END_LINK1" />នេះត្រូវបាន​អនុវត្ត​ដោយម្ចាស់។ ម្ចាស់អាចនឹង​ជ្រើសរើស ដើម្បីបញ្ជូនទិន្នន័យប្រើប្រាស់ និងវិភាគសម្រាប់​ឧបករណ៍នេះ​ទៅ Google ។ ប្រសិនបើ​ការកំណត់​សកម្មភាព​កម្មវិធី និង​គេហទំព័រ​បន្ថែម​ត្រូវបាន​បើកសម្រាប់​កូនរបស់អ្នក នោះទិន្នន័យនេះ​អាចត្រូវ​បានរក្សាទុក​ទៅក្នុង​គណនី Google របស់គាត់។ <ph name="BEGIN_LINK2" />ស្វែងយល់​បន្ថែម<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">អូ៎! ប្រព័ន្ធ​មិនអាចទាញយកគោលការណ៍​សម្រាប់ឧបករណ៍របស់អ្នកបានទេ។</translation>
 <translation id="347785443197175480">បន្តអនុញ្ញាត <ph name="HOST" /> ឲ្យចូលប្រើកាមេរ៉ា និងម៉ៃក្រូហ្វូនរបស់អ្នក</translation>
@@ -3591,7 +3590,6 @@
 <translation id="3759933321830434300">រារាំងផ្នែកមួយចំនួននៃគេហទំព័រ</translation>
 <translation id="3760460896538743390">តាមដានទំព័រផ្ទៃខាងក្រោយ</translation>
 <translation id="37613671848467444">បើកនៅក្នុងផ្ទាំងអនាមិក</translation>
-<translation id="3761390540041101668">ផ្ដល់​ការពណ៌នា​ច្បាស់លាស់​អំពី​បញ្ហា និង​ជំហាន​ក្នុងការបង្កើត​បញ្ហានោះ​ឡើងវិញ (ប្រសិនបើ​អាច)</translation>
 <translation id="3761556954875533505">អនុញ្ញាតឱ្យ​គេហទំព័រ​កែឯកសារ​ឬ?</translation>
 <translation id="3763433740586298940">អ្នក​អាច​ទប់ស្កាត់​គេហទំព័រ​ដែល​អ្នកមិន​ចង់​បាន។ Chrome ក៏លុប​គេហទំព័រ​ដែលចាស់ជាង 30 ថ្ងៃ​ចេញពីបញ្ជី​ដោយស្វ័យប្រវត្តិ​ផងដែរ។</translation>
 <translation id="3763549179847864476">ប៊ូតុងថយក្រោយរបស់ការណែនាំអំពី​ឯកជនភាព</translation>
@@ -5904,7 +5902,6 @@
 <translation id="5608580678041221894">ចុច​គ្រាប់​ចុច​ខាង​ក្រោម ដើម្បី​កែសម្រួល​ ឬ​រំកិល​តំបន់​ដែល​ត្រូវច្រឹប</translation>
 <translation id="5609231933459083978">កម្មវិធីនេះទំនងជាគ្មានសុពលភាព។</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 659ef13d..5fe16bf 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -3217,7 +3217,6 @@
 <translation id="3473479545200714844">ಪರದೆ ವರ್ಧಕ</translation>
 <translation id="3474218480460386727">ಹೊಸ ಪದಗಳಿಗಾಗಿ 99 ಅಥವಾ ಕಡಿಮೆ ಅಕ್ಷರಗಳನ್ನು ಬಳಸಿ</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> ನಂತೆ ಮುಂದುವರಿಸಿ</translation>
-<translation id="3475843873335999118">ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ ಫಿಂಗರ್‌‌ಫ್ರಿಂಟ್‌ ಇನ್ನೂ ಗುರುತಿಸಲಾಗಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ.</translation>
 <translation id="3476303763173086583">ಬಳಕೆ ಮತ್ತು ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಿ. ಡಯಾಗ್ನಾಸ್ಟಿಕ್, ಸಾಧನ, ಹಾಗೂ ಆ್ಯಪ್ ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಮಗುವಿನ Android ಅನುಭವವನ್ನು ಉತ್ತಮಗೊಳಿಸುವುದಕ್ಕೆ ಸಹಾಯ ಮಾಡಿ. ಈ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಮಗುವನ್ನು ಗುರುತಿಸುವುದಕ್ಕೆ ಬಳಸುವುದಿಲ್ಲ, ಹಾಗೂ ಇದು ಸಿಸ್ಟಮ್ ಮತ್ತು ಆ್ಯಪ್ ಸ್ಥಿರತೆಗೆ, ಹಾಗೂ ಇತರ ಸುಧಾರಣೆಗಳಿಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಕೆಲವು ಒಟ್ಟುಗೂಡಿಸಿದ ಡೇಟಾವು, Google ಆ್ಯಪ್‌ಗಳಿಗೆ ಮತ್ತು ಪಾಲುದಾರರಿಗೂ ಸಹ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, Android ಡೆವಲಪರ್‌ಗಳು. ಈ <ph name="BEGIN_LINK1" />ಸೆಟ್ಟಿಂಗ್<ph name="END_LINK1" />ಅನ್ನು ಮಾಲೀಕರೇ ಜಾರಿಗೊಳಿಸುತ್ತಾರೆ. ಈ ಸಾಧನದ ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಮತ್ತು ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಕಳುಹಿಸಲು ಮಾಲೀಕರು ಆಯ್ಕೆ ಮಾಡಬಹುದು. ನಿಮ್ಮ ಮಗುವಿಗಾಗಿ ಹೆಚ್ಚುವರಿ ವೆಬ್‌ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆನ್‌ ಮಾಡಿದ್ದಲ್ಲಿ, ಈ ಡೇಟಾವು ಅವರ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲ್ಪಡಬಹುದು. <ph name="BEGIN_LINK2" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">ಓಹ್‌‌! ನಿಮ್ಮ ಸಾಧನಕ್ಕಾಗಿ ನೀತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಸಿಸ್ಟಂ ವಿಫಲಗೊಂಡಿದೆ.</translation>
 <translation id="347785443197175480">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಗೆ ಅನುಮತಿಸುವುದನ್ನು ಮುಂದುವರೆಸಿ</translation>
@@ -3585,7 +3584,6 @@
 <translation id="3759933321830434300">ವೆಬ್ ಪುಟಗಳ ಭಾಗಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
 <translation id="3760460896538743390">&amp;ಹಿನ್ನಲೆ ಪುಟ ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="37613671848467444">&amp;ಅದೃಶ್ಯ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
-<translation id="3761390540041101668">ಸಮಸ್ಯೆಯ ಸ್ಪಷ್ಟ ವಿವರಣೆಯನ್ನು ಮತ್ತು ಸಮಸ್ಯೆಯನ್ನು ಪುನರುತ್ಪಾದಿಸುವ ಕ್ರಮಗಳನ್ನು ಒದಗಿಸಿ (ಸಾಧ್ಯವಾದರೆ)</translation>
 <translation id="3761556954875533505">ಸೈಟ್ ಫೈಲ್‌ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಲು ಅನುಮತಿಸುವುದೇ?</translation>
 <translation id="3763433740586298940">ನಿಮಗೆ ಬೇಡವಾದ ಸೈಟ್‌ಗಳನ್ನು ನೀವು ನಿರ್ಬಂಧಿಸಬಹುದು. 30 ದಿನಗಳಿಗಿಂತ ಹಳೆಯದಾದ ಸೈಟ್‌ಗಳನ್ನು ಪಟ್ಟಿಯಿಂದ Chrome ಸ್ವಯಂ ಅಳಿಸುತ್ತದೆ.</translation>
 <translation id="3763549179847864476">ಗೌಪ್ಯತೆ ಗೈಡ್ ಹಿಂದೆ ಬಟನ್</translation>
@@ -5898,7 +5896,6 @@
 <translation id="5608580678041221894">ಕ್ರಾಪ್ ಮಾಡಿರುವ ಪ್ರದೇಶವನ್ನು ಸರಿಹೊಂದಿಸಲು ಅಥವಾ ಸರಿಸಲು ಈ ಮುಂದಿನ ಕೀಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ</translation>
 <translation id="5609231933459083978">ಅಪ್ಲಿಕೇಶನ್ ಅಮಾನ್ಯವಾಗಿರುವಂತೆ ತೋರುತ್ತಿದೆ.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index aa1759a..4cbc1b4 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -3225,7 +3225,6 @@
 <translation id="3473479545200714844">화면 돋보기</translation>
 <translation id="3474218480460386727">새 단어는 99자 이하(영문 기준)여야 합니다.</translation>
 <translation id="3474624961160222204"><ph name="NAME" />(으)로 계속</translation>
-<translation id="3475843873335999118">죄송합니다. 지문이 인식되지 않았습니다. 비밀번호를 입력하세요.</translation>
 <translation id="3476303763173086583">사용 및 진단 데이터를 보냅니다. 진단, 기기, 앱 사용 데이터를 Google에 자동으로 보내 자녀의 Android 사용 환경 개선에 참여합니다. 이 데이터는 자녀를 식별하는 용도로 사용되지 않으며, 시스템 및 앱 안정성 등을 개선하는 데 활용됩니다. 일부 수집 데이터는 Google 앱과 파트너(Android 개발자 등)에게도 도움을 줍니다. 이 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />은 소유자가 지정합니다. 소유자가 이 기기의 진단 및 사용 데이터를 Google에 전송할지 선택할 수 있습니다. 자녀의 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 자녀의 Google 계정에 저장될 수 있습니다. <ph name="BEGIN_LINK2" />자세히 알아보기<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">시스템에서 기기 정책을 가져오지 못했습니다.</translation>
 <translation id="347785443197175480"><ph name="HOST" />에서 카메라와 마이크에 액세스하도록 계속 허용</translation>
@@ -3592,7 +3591,6 @@
 <translation id="3759933321830434300">웹페이지의 일부 차단</translation>
 <translation id="3760460896538743390">백그라운드 페이지 검사(&amp;B)</translation>
 <translation id="37613671848467444">시크릿 창에서 열기(&amp;I)</translation>
-<translation id="3761390540041101668">문제를 명확하게 설명하고 문제를 재현하기 위한 단계를 제공합니다(가능한 경우).</translation>
 <translation id="3761556954875533505">사이트에서 파일을 수정하도록 허용하시겠습니까?</translation>
 <translation id="3763433740586298940">원치 않는 사이트를 차단할 수 있습니다. 또한 Chrome에서는 30일이 지난 사이트도 목록에서 자동 삭제합니다.</translation>
 <translation id="3763549179847864476">개인 정보 보호 가이드 뒤로 버튼</translation>
@@ -5903,7 +5901,6 @@
 <translation id="5608580678041221894">다음 키를 탭하여 자르기 영역을 조정하거나 이동하세요.</translation>
 <translation id="5609231933459083978">애플리케이션이 잘못된 것 같습니다.</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>
 <translation id="5614947000616625327">iCloud 키체인</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index a1c1bcb..a335562 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1657,6 +1657,7 @@
 <translation id="2249111429176737533">Өтмөктөгү терезе катары ачуу</translation>
 <translation id="2249605167705922988">мис. 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Жарнамаларды көрсөтүү үчүн сайттар колдонгон маалыматты ыңгайлаштыруу</translation>
+<translation id="2250624716625396929">Бул өтмөк камераңызды жана микрофонуңузду колдонуп жатат</translation>
 <translation id="2251218783371366160">Тутумга көз чаптыргыч менен ачуу</translation>
 <translation id="225163402930830576">Тармактарды жаңылоо</translation>
 <translation id="2251809247798634662">Жаңы жашыруун терезе</translation>
@@ -3223,7 +3224,6 @@
 <translation id="3473479545200714844">Экран чоңойткуч</translation>
 <translation id="3474218480460386727">Жаңы сөздөр үчүн 99 же андан аз тамгаларды колдонуңуз</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> катары улантуу</translation>
-<translation id="3475843873335999118">Кечиресиз, манжа изиңиз дагы эле тааныла элек. Сырсөзүңүздү киргизиңиз.</translation>
 <translation id="3476303763173086583">Түзмөктүн иштеши тууралуу маалыматтарды жөнөтүү. Балаңыздын Android'ди колдонуу тажрыйбасын жакшыртууга көмөктөшүп, мүчүлүштүктөрдү издөө жана түзмөк менен колдонмолорду пайдалануу дайындарын автоматтык түрдө Google'га жөнөтүүгө уруксат бериңиз. Бул маалымат балаңыздын өздүгүн аныктоо үчүн колдонулбайт жана тутум менен колдонмонун кыйла туруктуу иштешин камсыз кылууга жана башка нерселерди жакшыртууга көмөктөшөт. Айрым нерселердин Google'дун өнөктөштөрүнө, мисалы, Android'ди иштеп чыгуучуларга да кереги тийиши мүмкүн. Бул <ph name="BEGIN_LINK1" />жөндөөнү<ph name="END_LINK1" /> түзмөктүн ээси иштетет. Түзмөктүн ээси бул түзмөктөн мүчүлүштүктөрдү аныктоо жана колдонуу дайындарын Google'га жөнөтүү мүмкүнчүлүгүн иштетиши мүмкүн. Эгер кошумча Колдонмолор жана Интернеттеги аракеттер таржымалы балаңыз үчүн күйгүзүлгөн болсо, бул нерселер анын Google аккаунтуна сакталышы мүмкүн. <ph name="BEGIN_LINK2" />Кеңири маалымат<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ой!  Система бул түзмөк үчүн саясатты ала албай калды.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> камераңыз менен микрофонуңузду колдоно берсин</translation>
@@ -3590,7 +3590,6 @@
 <translation id="3759933321830434300">Веб-баракчанын бөлүмдөрүн бөгөттөө</translation>
 <translation id="3760460896538743390">&amp;Фон баракчасын иликтөө</translation>
 <translation id="37613671848467444">Жашыруун терезеде &amp;ачуу</translation>
-<translation id="3761390540041101668">Көйгөйдү жана ал пайда болгон кадамдарды так сүрөттөп бериңиз (мүмкүн болсо)</translation>
 <translation id="3761556954875533505">Сайт файлдарды түзөтсүнбү?</translation>
 <translation id="3763433740586298940">Каалаган сайтты бөгөттөй аласыз. Chrome тизмеге 30 күн мурун кошулган сайттарды автоматтык түрдө жок кылып турат.</translation>
 <translation id="3763549179847864476">Купуялык жетектемесинен кайтуу баскычы</translation>
@@ -5903,7 +5902,6 @@
 <translation id="5608580678041221894">Кесиле турган аймакты тууралоо же жылдыруу үчүн төмөнкү баскычтарды басыңыз</translation>
 <translation id="5609231933459083978">Колдонмо жараксыз окшойт.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6637,6 +6635,7 @@
 <translation id="6202304368170870640">Түзмөгүңүзгө кирүү же кулпусун ачуу үчүн PIN кодуңузду колдонсоңуз болот.</translation>
 <translation id="6203247599828309566">Бул сайттагы сырсөз жөнүндө эскертме сактадыңыз. Аны көрүү үчүн ачкыч сүрөтчөсүн басыңыз.</translation>
 <translation id="6205314730813004066">Жарнаманын купуялыгы</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - Микрофондон жаздырууда</translation>
 <translation id="6206199626856438589">Көрсөтүлгөн сайттардан, анын ичинде ачылып турган өтмөктөрдөн чыгарыласыз</translation>
 <translation id="6206311232642889873">Сүрөттү көчү&amp;рүү</translation>
 <translation id="6207200176136643843">Чоңойтуп/кичирейтүү деңгээлин баштапкы абалга келтирүү</translation>
@@ -7188,6 +7187,7 @@
 <translation id="6657585470893396449">Сырсөз</translation>
 <translation id="6659213950629089752">Бул түзмөк "<ph name="NAME" />" кеңейтүүсү менен чоңойтулган</translation>
 <translation id="6659594942844771486">Өтмөк</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - Камерадан жаздырууда</translation>
 <translation id="6660819301598582123">Билимдүүнүн түнү - күн, билимсиздин күнү - түн.</translation>
 <translation id="666099631117081440">Басып чыгаруу серверлери</translation>
 <translation id="6662931079349804328">Ишкананын саясаты өзгөрдү. Куралдар тилкесинен "Тажрыйбалар" баскычы өчүрүлдү.</translation>
@@ -8999,6 +8999,7 @@
 <translation id="8059417245945632445">Түзмөктөрдү &amp;текшерүү</translation>
 <translation id="8059456211585183827">Сактоо үчүн жеткиликтүү принтерлер жок.</translation>
 <translation id="8061091456562007989">Кайра өзгөртүү</translation>
+<translation id="8061244502316511332">Бул өтмөк микрофонуңузду колдонуп жатат</translation>
 <translation id="8061970399284390013">Орфографияны жана грамматиканы текшерүү</translation>
 <translation id="8061991877177392872">Жардамчыңыздагы Voice Match'ти буга чейин башка түзмөктө жөндөп алган окшойсуз. Мурунку жаздырууларыңыздын негизинде үнүңүздүн үлгүсүн ушул түзмөктө даярдоого болот.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 барак}other{{COUNT} барак}}</translation>
@@ -9480,6 +9481,7 @@
 <translation id="844063558976952706">Ушул сайтта ар дайым</translation>
 <translation id="8441313165929432954">Байланыш түйүнүн иштетүү/өчүрүү</translation>
 <translation id="8443986842926457191">URL дареги 2048 символдон ашып кетти</translation>
+<translation id="8445281870900174108">Бул өтмөк камераңызды колдонуп жатат</translation>
 <translation id="8446884382197647889">Көбүрөөк билүү</translation>
 <translation id="8447409163267621480">Же Ctrl, же Alt камтылсын</translation>
 <translation id="844850004779619592">Буйруктар табылган жок</translation>
@@ -10554,6 +10556,7 @@
 <translation id="981121421437150478">Офлайн</translation>
 <translation id="983192555821071799">Бардык өтмөктөрдү жабуу</translation>
 <translation id="983511809958454316">Бул функция VR режиминде иштебейт</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - Камера менен микрофондон жаздырууда</translation>
 <translation id="984275831282074731">Төлөм ыкмалары</translation>
 <translation id="984705303330760860">Орфографиялык текшерүү тилдерин кошуу</translation>
 <translation id="98515147261107953">Туурасынан</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 43408a8..1e0a597 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">ເຄື່ອງຂະຫຍາຍໜ້າຈໍ</translation>
 <translation id="3474218480460386727">ໃຊ້ຕົວອັກສອນ 99 ຕົວລົງມາສຳລັບຄຳໃໝ່</translation>
 <translation id="3474624961160222204">ສືບຕໍ່ໃຊ້ໃນຊື່ <ph name="NAME" /></translation>
-<translation id="3475843873335999118">ຂໍອະໄພ, ຍັງຄົງບໍ່ຮັບຮູ້ລາຍນິ້ວມືຂອງທ່ານເທື່ອ. ກະລຸນາປ້ອນລະຫັດຜ່ານຂອງທ່ານແທນ.</translation>
 <translation id="3476303763173086583">ສົ່ງຂໍ້ມູນການນຳໃຊ້ ແລະ ການວິເຄາະ. ຊ່ວຍປັບປຸງປະສົບການ Android ຂອງລູກທ່ານໂດຍການສົ່ງຂໍ້ມູນການວິເຄາະ, ຂໍ້ມູນອຸປະກອນ ແລະ ການໃຊ້ແອັບໃຫ້ Google ໂດຍອັດຕະໂນມັດ. ຂໍ້ມູນນີ້ຈະບໍ່ຖືກໃຊ້ເພື່ອລະບຸຕົວລູກຂອງທ່ານ ແລະ ຈະຊ່ວຍປັບປຸງຄວາມສະຖຽນຂອງລະບົບ ແລະ ແອັບ ແລະ ການປັບປຸງອື່ນໆ. ບາງຂໍ້ມູນແບບຮວມກັນຍັງຈະຊ່ວຍແອັບ ແລະ ຮຸ້ນສ່ວນຂອງ Google ນຳອີກ ເຊັ່ນ: ຜູ້ພັດທະນາ Android. ເຈົ້າຂອງບັງຄັບໃຊ້ <ph name="BEGIN_LINK1" />ການຕັ້ງຄ່າ<ph name="END_LINK1" /> ນີ້. ເຈົ້າຂອງອາດຈະເລືອກສົ່ງຂໍ້ມູນການວິເຄາະ ແລະ ການໃຊ້ສຳລັບອຸປະກອນນີ້ໃຫ້ Google ກໍໄດ້. ຖ້າເປີດການຕັ້ງຄ່າການເຄື່ອນໄຫວເວັບ ແລະ ແອັບເພີ່ມເຕີມສໍາລັບລູກຂອງທ່ານ, ລະບົບອາດຈະບັນທຶກຂໍ້ມູນນີ້ໄວ້ໃນບັນຊີ Google ຂອງເຂົາເຈົ້າ. <ph name="BEGIN_LINK2" />ສຶກສາ​ເພີ່ມ​ເຕີມ<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">ອຸ້ຍ!  ລະບົບດຶງຂໍ້ມູນນະໂຍບາຍສຳລັບອຸປະກອນຂອງທ່ານບໍ່ສຳເລັດ.</translation>
 <translation id="347785443197175480">ສືບຕໍ່ອະນຸຍາດໃຫ້ <ph name="HOST" /> ​​ເຂົ້າຫາ​ກ້ອງ​ຖ່າຍ​ຮູບ​ ແລະໄມໂຄຣໂຟນຂອງ​ທ່ານບໍ່</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">ບລັອກບາງ​ສ່ວນ​ຂອງ​ຫນ້າ​ເວັບ</translation>
 <translation id="3760460896538743390">ກວດກາໜ້າພື້ນຫຼັງ</translation>
 <translation id="37613671848467444">ເປີດ​ຢູ່ໃນໜ້າຕ່າງ​ທີ່ບໍ່ເຜີຍຕົນຕົວ</translation>
-<translation id="3761390540041101668">ລະບຸຄຳອະທິບາຍທີ່ຈະແຈ້ງຂອງບັນຫາ ແລະ ຂັ້ນຕອນໃນການເຮັດໃຫ້ເກີດບັນຫາຊ້ຳ (ຫາກເປັນໄປໄດ້)</translation>
 <translation id="3761556954875533505">ອະນຸຍາດໃຫ້ເວັບໄຊແກ້ໄຂໄຟລ໌ບໍ?</translation>
 <translation id="3763433740586298940">ທ່ານສາມາດບລັອກເວັບໄຊທີ່ທ່ານບໍ່ຕ້ອງການໄດ້. ນອກຈາກນັ້ນ, Chrome ຈະລຶບເວັບໄຊທີ່ເກົ່າກວ່າ 30 ມື້ອອກຈາກລາຍຊື່ໂດຍອັດຕະໂນມັດນຳ.</translation>
 <translation id="3763549179847864476">ປຸ່ມກັບຄືນຂອງຂໍ້ແນະນຳຄວາມເປັນສ່ວນຕົວ</translation>
@@ -5902,7 +5900,6 @@
 <translation id="5608580678041221894">ແຕະປຸ່ມຕໍ່ໄປນີ້ເພື່ອປັບ ຫຼື ຍ້າຍພື້ນທີ່ຕັດແຕ່ງ</translation>
 <translation id="5609231933459083978">ປະກົດວ່າແອັບພລິເຄຊັນໃຊ້ບໍ່ໄດ້.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 5de45df..548b3b2b 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -3226,7 +3226,6 @@
 <translation id="3473479545200714844">Ekrano didintuvas</translation>
 <translation id="3474218480460386727">Naujus žodžius gali sudaryti ne daugiau nei 99 raidės</translation>
 <translation id="3474624961160222204">Tęsti kaip <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Deja, piršto antspaudas vis dar neatpažintas. Įveskite slaptažodį.</translation>
 <translation id="3476303763173086583">Siųskite naudojimo ir diagnostikos duomenis. Padėkite tobulinti vaiko „Android“ funkcijas automatiškai siųsdami „Google“ diagnostikos, įrenginio ir programų naudojimo duomenis. Tai nebus naudojama siekiant nustatyti jūsų vaiko tapatybę ir padės pagerinti sistemos bei programos stabilumą ir teikti kitus patobulinimus. Kai kurie sukaupti duomenys taip pat bus naudingi „Google“ programoms ir partneriams, pvz., „Android“ kūrėjams. Šį <ph name="BEGIN_LINK1" />nustatymą<ph name="END_LINK1" /> taiko savininkas. Savininkas gali pasirinkti siųsti šio įrenginio diagnostikos ir naudojimo duomenis „Google“. Jei papildomas „Žiniatinklio ir programų veiklos“ nustatymas įjungtas vaiko įrenginyje, šie duomenys gali būti išsaugoti vaiko „Google“ paskyroje. <ph name="BEGIN_LINK2" />Sužinokite daugiau<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Oi! Sistemai nepavyko pateikti įrenginio politikos.</translation>
 <translation id="347785443197175480">Toliau leisti <ph name="HOST" /> pasiekti fotoaparatą ir mikrofoną</translation>
@@ -3593,7 +3592,6 @@
 <translation id="3759933321830434300">Blokuoti tinklalapių dalis</translation>
 <translation id="3760460896538743390">Tikrinti fono puslapį</translation>
 <translation id="37613671848467444">Atidaryti inkognito lange</translation>
-<translation id="3761390540041101668">Pateikite aiškų problemos aprašą ir problemos atkūrimo veiksmus (jei įmanoma)</translation>
 <translation id="3761556954875533505">Leisti svetainei redaguoti failus?</translation>
 <translation id="3763433740586298940">Galite užblokuoti nepageidaujamas svetaines. „Chrome“ taip pat iš sąrašo automatiškai ištrina senesnes nei trisdešimt dienų svetaines.</translation>
 <translation id="3763549179847864476">Privatumo vadovo mygtukas „Atgal“</translation>
@@ -5906,7 +5904,6 @@
 <translation id="5608580678041221894">Palieskite toliau nurodytus klavišus, kad koreguotumėte ar perkeltumėte apkarpomą sritį</translation>
 <translation id="5609231933459083978">Panašu, kad ši programa yra netinkama.</translation>
 <translation id="561236229031062396">„<ph name="SHORTCUT_NAME" />“, „<ph name="APP_FULL_NAME" />“</translation>
-<translation id="5612734644261457353">Deja, jūsų slaptažodžio patvirtinti vis tiek nepavyko. Pastaba: jei neseniai pakeitėte slaptažodį, naujas slaptažodis bus taikomas, kai atsijungsite. Čia naudokite senąjį slaptažodį.</translation>
 <translation id="5614190747811328134">Naudotojo pastaba</translation>
 <translation id="5614553682702429503">Išsaugoti slaptažodį?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 7ece5c2..1730473 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -3210,7 +3210,6 @@
 <translation id="3473479545200714844">Ekrāna lupa</translation>
 <translation id="3474218480460386727">Jaunajiem vārdiem neizmantojiet vairāk par 99 burtiem</translation>
 <translation id="3474624961160222204">Turpināt kā: <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Diemžēl jūsu pirksta nospiedums joprojām nav atpazīts. Lūdzu, ievadiet savu paroli.</translation>
 <translation id="3476303763173086583">Lietojuma un diagnostikas datu sūtīšana. Palīdziet uzlabot bērna Android lietošanas pieredzi, automātiski nosūtot diagnostikas, ierīces un lietotņu lietojuma datus uzņēmumam Google. Šī informācija netiks izmantota jūsu bērna identificēšanai, un tā palīdzēs uzlabot sistēmas un lietotņu stabilitāti un daudz ko citu. Noteiktus apkopotus datus izmantos arī Google lietotņu izstrādātāji un partneri, piemēram, Android izstrādātāji. Šo <ph name="BEGIN_LINK1" />iestatījumu<ph name="END_LINK1" /> ir noteicis īpašnieks. Īpašnieks var izvēlēties nosūtīt šīs ierīces diagnostikas un lietojuma datus uz Google serveriem. Ja jūsu bērnam ir ieslēgts papildu iestatījums “Darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti bērna Google kontā. <ph name="BEGIN_LINK2" />Uzzināt vairāk<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Diemžēl sistēmai neizdevās izgūt politiku jūsu ierīcei.</translation>
 <translation id="347785443197175480">Arī turpmāk ļaut vietnei <ph name="HOST" /> piekļūt kamerai un mikrofonam</translation>
@@ -3577,7 +3576,6 @@
 <translation id="3759933321830434300">Bloķēt tīmekļa lapu daļas</translation>
 <translation id="3760460896538743390">Pārbaudīt &amp;fona lapu</translation>
 <translation id="37613671848467444">Atvērt &amp;inkognito režīma logā</translation>
-<translation id="3761390540041101668">Skaidri aprakstiet problēmu un darbības tās reproducēšanai (ja iespējams)</translation>
 <translation id="3761556954875533505">Vai ļaut vietnei rediģēt failus?</translation>
 <translation id="3763433740586298940">Varat bloķēt nevēlamas vietnes. Turklāt pārlūkā Chrome no saraksta tiek automātiski dzēstas vietnes, kas tajā ir glabātas ilgāk nekā 30 dienas.</translation>
 <translation id="3763549179847864476">Konfidencialitātes ceļveža poga Atpakaļ</translation>
@@ -5889,7 +5887,6 @@
 <translation id="5608580678041221894">Pieskarieties tālāk norādītajiem taustiņiem, lai pielāgotu vai pārvietotu apgriešanas apgabalu.</translation>
 <translation id="5609231933459083978">Šķiet, ka lietojumprogramma nav derīga.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Diemžēl jūsu paroli joprojām nevarēja verificēt. Piezīme. Ja nesen mainījāt paroli, jaunā parole tiks lietota pēc izrakstīšanās. Lūdzu, šeit izmantojiet iepriekšējo paroli.</translation>
 <translation id="5614190747811328134">Paziņojums lietotājam</translation>
 <translation id="5614553682702429503">Vai saglabāt paroli?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 03df35f..7fae707b 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -3225,7 +3225,6 @@
 <translation id="3473479545200714844">Лупа за екран</translation>
 <translation id="3474218480460386727">Користете до 99 букви за новите зборови</translation>
 <translation id="3474624961160222204">Продолжете како <ph name="NAME" /></translation>
-<translation id="3475843873335999118">За жал, сѐ уште не може да се препознае вашиот отпечаток. Внесете ја лозинката.</translation>
 <translation id="3476303763173086583">Испраќајте податоци за користење и дијагностика. Помогнете ни да го подобриме искуството на вашето дете со Android со автоматско испраќање дијагностички и податоци за користењето на уредот и апликациите до Google. Овие податоци нема да се користат за идентификација на вашето дете, а ќе ни помогнат околу стабилноста на системот и апликациите и за други подобрувања. Некои збирни податоци ќе им помогнат на апликациите и партнерите на Google, како што се програмерите на Android. Оваа <ph name="BEGIN_LINK1" />поставка<ph name="END_LINK1" /> е наметната од сопственикот. Сопственикот може да избере да испраќа дијагностички и податоци за користењето на овој уред до Google. Ако сте ја вклучиле дополнителната поставка „Активност на интернет и апликации“ за вашето дете, овие податоци може да се зачувуваат во сметката на Google на детето. <ph name="BEGIN_LINK2" />Дознајте повеќе<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Упс!  Системот не успеа да ја вчита политиката за вашиот уред.</translation>
 <translation id="347785443197175480">Продолжи дозволувајќи <ph name="HOST" /> да пристапи до вашата камера и микрофон</translation>
@@ -3592,7 +3591,6 @@
 <translation id="3759933321830434300">Блокирај делови од веб-страници</translation>
 <translation id="3760460896538743390">Страница за проверка на &amp;заднина</translation>
 <translation id="37613671848467444">Отвори во &amp;Инкогнито прозорец</translation>
-<translation id="3761390540041101668">Јасно опишете го проблемот и, по можност, чекори да се репродуцира</translation>
 <translation id="3761556954875533505">Да се дозволи сајтот да изменува датотеки?</translation>
 <translation id="3763433740586298940">Може да ги блокирате сајтовите што не ви се допаѓаат. Chrome автоматски ги брише од списокот и сајтовите што се постари од 30 дена.</translation>
 <translation id="3763549179847864476">Копче за враќање на „Водич за приватност“</translation>
@@ -5905,7 +5903,6 @@
 <translation id="5608580678041221894">Допрете ги следниве копчиња за да го приспособите или преместите подрачјето за сечење</translation>
 <translation id="5609231933459083978">Апликацијата изгледа дека е неважечка.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 0080f02b..b6b6983 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1644,6 +1644,7 @@
 <translation id="2249111429176737533">ടാബ് ചെയ്‌ത വിന്‍ഡോ ആയി തുറക്കുക</translation>
 <translation id="2249605167705922988">ഉദാ. 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">നിങ്ങളെ പരസ്യം കാണിക്കുന്നതിനായി സൈറ്റുകൾ ഉപയോഗിക്കുന്ന വിവരങ്ങൾ ഇഷ്ടാനുസൃതമാക്കുക</translation>
+<translation id="2250624716625396929">ഈ ടാബ് നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കുന്നു</translation>
 <translation id="2251218783371366160">സിസ്റ്റം വ്യൂവർ ഉപയോഗിച്ച് തുറക്കുക</translation>
 <translation id="225163402930830576">നെറ്റ്‌വർക്കുകൾ റീഫ്രഷ് ചെയ്യുക</translation>
 <translation id="2251809247798634662">പുതിയ വേഷ പ്രച്ഛന്ന വിന്‍ഡോ</translation>
@@ -3207,7 +3208,6 @@
 <translation id="3473479545200714844">സ്‌ക്രീൻ മാഗ്‌നിഫയർ</translation>
 <translation id="3474218480460386727">പുതിയ വാക്കുകൾക്ക് പരമാവധി 99 അക്ഷരങ്ങളേ പാടുള്ളൂ</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> ആയി തുടരുക</translation>
-<translation id="3475843873335999118">ക്ഷമിക്കണം, ഇതുവരെ നിങ്ങളുടെ വിരലടയാളം തിരിച്ചറിയാനായില്ല. പാസ്‌വേഡ് നൽകുക.</translation>
 <translation id="3476303763173086583">ഉപയോഗവും പ്രശ്‌നനിർണ്ണയവുമായി ബന്ധപ്പെട്ട ഡാറ്റ അയയ്ക്കുക. പ്രശ്‌നനിർണ്ണയം, ഉപകരണം, ആപ്പ് ഉപയോഗം എന്നിവയുമായി ബന്ധപ്പെട്ട ഡാറ്റ സ്വയമേവ Google-ന് അയച്ച്, കുട്ടിയുടെ Android അനുഭവം മെച്ചപ്പെടുത്താൻ സഹായിക്കുക. കുട്ടിയെ തിരിച്ചറിയാൻ ഇത് ഉപയോഗിക്കില്ല, സിസ്‌റ്റം, ആപ്പ് സ്ഥിരത, മറ്റ് മെച്ചപ്പെടുത്തൽ എന്നിവയ്ക്ക് സഹായിക്കുകയും ചെയ്യും. ചില സംഗ്രഹ ഡാറ്റ, Google ആപ്പുകളെയും Android ഡെവലപ്പർമാരെപ്പോലുള്ള പങ്കാളികളെയും സഹായിക്കുകയും ചെയ്യും. ഈ <ph name="BEGIN_LINK1" />ക്രമീകരണം<ph name="END_LINK1" /> നടപ്പിലാക്കുന്നത് ഉടമയാണ്. ഈ ഉപകരണത്തിലെ പ്രശ്‌നനിർണ്ണയവും ഉപയോഗവുമായി ബന്ധപ്പെട്ട ഡാറ്റ Google-ന് അയയ്ക്കാൻ ഉടമ തീരുമാനിച്ചേക്കാം. കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്‌റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">ക്ഷമിക്കണം! സിസ്‌റ്റത്തിന് നിങ്ങളുടെ ഉപകരണത്തിനുള്ള നയം ലഭ്യമാക്കാനായില്ല.</translation>
 <translation id="347785443197175480">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്‌സസ് ചെയ്യുന്നതിന് <ph name="HOST" /> എന്നതിനെ അനുവദിക്കുന്നത് തുടരുക</translation>
@@ -3574,7 +3574,6 @@
 <translation id="3759933321830434300">വെബ് പേജുകളുടെ ഭാഗങ്ങൾ തടയുക</translation>
 <translation id="3760460896538743390">&amp;പശ്ചാത്തല പേജ് പരിശോധിക്കുക</translation>
 <translation id="37613671848467444">&amp;അദൃശ്യ വിന്‍ഡോയില്‍ തുറക്കുക</translation>
-<translation id="3761390540041101668">പ്രശ്‌നത്തിന്റെ വ്യക്തമായ വിവരണവും പ്രശ്‌നം പുനഃസൃഷ്ടിക്കാനുള്ള നടപടികളും നൽകുക (സാധ്യമെങ്കിൽ)</translation>
 <translation id="3761556954875533505">ഫയലുകൾ എഡിറ്റ് ചെയ്യാൻ സൈറ്റിനെ അനുവദിക്കണോ?</translation>
 <translation id="3763433740586298940">ആവശ്യമില്ലാത്ത സൈറ്റുകൾ നിങ്ങൾക്ക് ബ്ലോക്ക് ചെയ്യാം. 30 ദിവസത്തിലധികം പഴക്കമുള്ള സൈറ്റുകൾ ലിസ്റ്റിൽ നിന്ന് Chrome സ്വയമേവ ഇല്ലാതാക്കുന്നു.</translation>
 <translation id="3763549179847864476">സ്വകാര്യതാ ഗൈഡിലേക്ക് മടങ്ങുക ബട്ടൺ</translation>
@@ -5885,7 +5884,6 @@
 <translation id="5608580678041221894">വലുപ്പം മാറ്റുന്നയിടം ക്രമീകരിക്കാനും നീക്കാനും ചുവടെയുള്ള കീകൾ ടാപ്പുചെയ്യുക</translation>
 <translation id="5609231933459083978">ആപ്പ് അസാധുവായി തോന്നുന്നു.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6621,6 +6619,7 @@
 <translation id="6202304368170870640">ഉപകരണത്തിൽ സൈൻ ഇൻ ചെയ്യാനോ അൺലോക്ക് ചെയ്യാനോ നിങ്ങളുടെ പിൻ ഉപയോഗിക്കാം.</translation>
 <translation id="6203247599828309566">ഈ സൈറ്റിൽ നിങ്ങൾ പാസ്‌വേഡിനായി ഒരു കുറിപ്പ് സംരക്ഷിച്ചു. അത് കാണാൻ കീ ഐക്കണിൽ ക്ലിക്ക് ചെയ്യൂ.</translation>
 <translation id="6205314730813004066">പരസ്യവുമായി ബന്ധപ്പെട്ട സ്വകാര്യത</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - മൈക്രോഫോൺ റെക്കോർഡിംഗ്</translation>
 <translation id="6206199626856438589">തുറന്നിരിക്കുന്ന ടാബുകളിൽ നിന്നുൾപ്പെടെ, കാണിച്ചിരിക്കുന്ന സൈറ്റുകളിൽ നിന്ന് നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യും</translation>
 <translation id="6206311232642889873">ചിത്രം പകർത്തു&amp;ക</translation>
 <translation id="6207200176136643843">ഡിഫോൾട്ട് സൂം ലെവലിലേക്ക് റീസെറ്റ് ചെയ്യുക</translation>
@@ -7172,6 +7171,7 @@
 <translation id="6657585470893396449">പാസ്‌വേഡ്</translation>
 <translation id="6659213950629089752">"<ph name="NAME" />" വിപുലീകരണം ഉപയോഗിച്ച് ഈ പേജ് സൂം ചെയ്‌തു</translation>
 <translation id="6659594942844771486">ബ്രൗസർ ടാബ്</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - ക്യാമറാ റെക്കോർഡിംഗ്</translation>
 <translation id="6660819301598582123">അജവും ആനയും ഐരാവതവും ഗരുഡനും കഠോര സ്വരം പൊഴിക്കെ ഹാരവും ഒഢ്യാണവും ഫാലത്തിൽ മഞ്ഞളും ഈറൻ കേശത്തിൽ ഔഷധ എണ്ണയുമായി ഋതുമതിയും അനഘയും ഭൂനാഥയുമായ ഉമ ദു:ഖഛവിയോടെ ഇടതു പാദം ഏന്തി നിർഝരിയിലെ ചിറ്റലകളെ ഓമനിക്കുമ്പോൾ ബാ‍ലയുടെ കൺകളിൽ നീർ ഊർന്നു വിങ്ങി.</translation>
 <translation id="666099631117081440">പ്രിന്റ് സെർവറുകൾ</translation>
 <translation id="6662931079349804328">എന്റർപ്രൈസ് നയം മാറ്റി. ടൂൾബാറിൽ നിന്ന് "പരീക്ഷണങ്ങൾ" ബട്ടൺ നീക്കം ചെയ്തു.</translation>
@@ -8984,6 +8984,7 @@
 <translation id="8059417245945632445">&amp;ഉപകരണങ്ങൾ പരിശോധിക്കുക</translation>
 <translation id="8059456211585183827">സംരക്ഷിക്കുന്നതിന് പ്രിന്ററുകളൊന്നും ലഭ്യമല്ല.</translation>
 <translation id="8061091456562007989">പഴയതിലേക്ക് മാറ്റുക</translation>
+<translation id="8061244502316511332">ഈ ടാബ് നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു</translation>
 <translation id="8061970399284390013">അക്ഷരപ്പിശകും വ്യാകരണവും പരിശോധിക്കൽ</translation>
 <translation id="8061991877177392872">നിങ്ങൾ ഇതിനകം തന്നെ മറ്റൊരു ഉപകരണത്തിൽ Assistant-നൊപ്പം Voice Match സജ്ജീകരിച്ചിട്ടുണ്ടെന്ന് തോന്നുന്നു. ഈ ഉപകരണത്തിൽ ശബ്‌ദ മോഡൽ തയ്യാറാക്കുന്നതിന് ഈ പഴയ റെക്കോർഡിംഗുകൾ ഉപയോഗിച്ചു.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{ഒരു ഷീറ്റ് പേപ്പർ}other{{COUNT} ഷീറ്റ് പേപ്പർ}}</translation>
@@ -9465,6 +9466,7 @@
 <translation id="844063558976952706">എല്ലായ്പ്പോഴും ഈ സൈറ്റില്‍</translation>
 <translation id="8441313165929432954">ടെതറിംഗ് പ്രവർത്തനക്ഷമമാക്കുക/പ്രവർത്തനരഹിതമാക്കുക</translation>
 <translation id="8443986842926457191">URL-ൽ 2048 പ്രതീകങ്ങളിൽ കൂടുതൽ അടങ്ങിയിരിക്കുന്നു</translation>
+<translation id="8445281870900174108">ഈ ടാബ് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു</translation>
 <translation id="8446884382197647889">കൂടുതലറിയുക</translation>
 <translation id="8447409163267621480">ഒന്നുകിൽ Ctrl അല്ലെങ്കിൽ, Alt ഉൾപ്പെടുത്തുക</translation>
 <translation id="844850004779619592">കമാൻഡുകളൊന്നും കണ്ടെത്തിയില്ല</translation>
@@ -10538,6 +10540,7 @@
 <translation id="981121421437150478">ഓഫ്‌ലൈൻ</translation>
 <translation id="983192555821071799">ടാബെല്ലാം അടയ്‌ക്കൂ</translation>
 <translation id="983511809958454316">ഈ ഫീച്ചർ VR-ൽ പ്രവർത്തിക്കില്ല</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - ക്യാമറാ, മൈക്രോഫോൺ റെക്കോർഡിംഗ്</translation>
 <translation id="984275831282074731">പേയ്‌മെന്റ് രീതികൾ</translation>
 <translation id="984705303330760860">സ്പെൽ ചെക്ക് ഭാഷകൾ ചേർക്കുക</translation>
 <translation id="98515147261107953">ലാന്‍ഡ്‌സ്‌കേപ്പ്</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index d800863..dfb42ae 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1653,6 +1653,7 @@
 <translation id="2249111429176737533">Табтай цонх хэлбэрээр нээх</translation>
 <translation id="2249605167705922988">жишээ нь, 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Танд зар харуулахын тулд сайтуудын ашигладаг мэдээллийг өөрчилнө үү</translation>
+<translation id="2250624716625396929">Энэ таб таны камер болон микрофоныг ашиглаж байна</translation>
 <translation id="2251218783371366160">Системийн харагчаар нээх</translation>
 <translation id="225163402930830576">Сүлжээг дахин сэргээж ачаалах</translation>
 <translation id="2251809247798634662">Шинэ Нууцлалтай цонх</translation>
@@ -3219,7 +3220,6 @@
 <translation id="3473479545200714844">Дэлгэц Томруулах</translation>
 <translation id="3474218480460386727">Шинэ үгэнд 99 эсвэл үүнээс цөөн үсэг ашиглана уу</translation>
 <translation id="3474624961160222204"><ph name="NAME" />-р үргэлжлүүлэх</translation>
-<translation id="3475843873335999118">Уучлаарай, таны хурууны хээг танихгүй байна. Нууц үгээ оруулна уу.</translation>
 <translation id="3476303763173086583">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Зарим хуримтлуулсан өгөгдөл нь Google аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн адил тусална. Энэ <ph name="BEGIN_LINK1" />тохиргоог<ph name="END_LINK1" /> хэрэглэгчийн зүгээс хэрэгжүүлнэ. Энэ төхөөрөмжийн оношилгоо болон ашиглалтын өгөгдлийг Google-д илгээх эсэхийг хэрэглэгч өөрөө сонгож болно. Хэрэв таны хүүхдийн Веб, Аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг тэдний Google бүртгэлд хадгалж болзошгүй. <ph name="BEGIN_LINK2" />Нэмэлт мэдээлэл авах<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Уучлаарай!  Систем таны төхөөрөмжийн удирдамжийг татаж чадсангүй.</translation>
 <translation id="347785443197175480"><ph name="HOST" />-д таны камер болон  микрофон руу нэвтрэхийг үргэлжлүүлэн зөвшөөр</translation>
@@ -3586,7 +3586,6 @@
 <translation id="3759933321830434300">Веб хуудсуудын зарим хэсгийг блокло</translation>
 <translation id="3760460896538743390">Арын дэвсгэр хуудсыг шалгах</translation>
 <translation id="37613671848467444">Нууцлагдсан цонхонд нээх &amp;</translation>
-<translation id="3761390540041101668">Асуудлын тодорхой тайлбар болон асуудлыг хуулбарлах алхмуудыг өгнө үү (хэрэв боломжтой бол)</translation>
 <translation id="3761556954875533505">Сайтад файл засахыг зөвшөөрөх үү?</translation>
 <translation id="3763433740586298940">Та хүсээгүй сайтуудаа блоклох боломжтой. Chrome мөн жагсаалтаас 30 хоногоос дээш удсан сайтуудыг автоматаар устгадаг.</translation>
 <translation id="3763549179847864476">Нууцлалын хөтөч рүү буцах товчлуур</translation>
@@ -5898,7 +5897,6 @@
 <translation id="5608580678041221894">Тайрсан хэсгийг тохируулах эсвэл зөөхийн тулд дараах түлхүүрийг товшино уу</translation>
 <translation id="5609231933459083978">Энэхүү апп нь хүчин төгөлдөр бус апп байж болзошгүй байна.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6632,6 +6630,7 @@
 <translation id="6202304368170870640">Ta төхөөрөмждөө нэвтрэх эсвэл түгжээг нь тайлахын тулд ПИН кодоо ашиглаж болно.</translation>
 <translation id="6203247599828309566">Та энэ сайт дээрх нууц үгэнд тэмдэглэл хадгалсан. Үүнийг харахын тулд түлхүүрийн дүрс тэмдгийг товшино уу.</translation>
 <translation id="6205314730813004066">Зарын нууцлал</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - Микрофоны бичлэг</translation>
 <translation id="6206199626856438589">Таныг үзүүлсэн сайтуудаас гаргах бөгөөд үүнд нээлттэй табуудынх багтана</translation>
 <translation id="6206311232642889873">Зургийг хуулах</translation>
 <translation id="6207200176136643843">Томруулах өгөгдмөл түвшинд тохируулах</translation>
@@ -7183,6 +7182,7 @@
 <translation id="6657585470893396449">Нууц үг</translation>
 <translation id="6659213950629089752">Энэ хуудсыг "<ph name="NAME" />" өргөтгөлөөр татаж харуулсан байна.</translation>
 <translation id="6659594942844771486">Таб</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - Камерын бичлэг</translation>
 <translation id="6660819301598582123">Хурдан бор үнэг залхуу нохойн дээгүүр үсрэв.</translation>
 <translation id="666099631117081440">Хэвлэх серверүүд</translation>
 <translation id="6662931079349804328">Байгууллагын бодлого өөрчлөгдсөн. Туршилтын товчлуурыг самбараас хассан.</translation>
@@ -8992,6 +8992,7 @@
 <translation id="8059417245945632445">&amp; Төхөөрөмжүүдийг хянан, шалгах</translation>
 <translation id="8059456211585183827">Хадгалах боломжтой хэвлэгч байхгүй байна.</translation>
 <translation id="8061091456562007989">Үүнийг буцааж өөрчлөх</translation>
+<translation id="8061244502316511332">Энэ таб таны микрофоныг ашиглаж байна</translation>
 <translation id="8061970399284390013">Зөв бичгийн болон дүрмийн алдаа шалгах</translation>
 <translation id="8061991877177392872">Та өөр төхөөрөмж дээр Voice Match-г аль хэдийн Туслахаараа тохируулсан бололтой. Эдгээр өмнөх бичлэгийг энэ төхөөрөмжид дуу хоолойн загвар үүсгэхэд ашигласан.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 хуудас цаас}other{{COUNT} хуудас цаас}}</translation>
@@ -9473,6 +9474,7 @@
 <translation id="844063558976952706">Үргэлж энэ сайт дээр</translation>
 <translation id="8441313165929432954">Модем болгох явцыг идэвхжүүлэх/идэвхгүй болгох</translation>
 <translation id="8443986842926457191">URL нь 2048-аас дээш тэмдэгттэй байна</translation>
+<translation id="8445281870900174108">Энэ таб таны камерыг ашиглаж байна</translation>
 <translation id="8446884382197647889">Дэлгэрэнгүй мэдээлэл</translation>
 <translation id="8447409163267621480">Ctrl эсвэл Alt-н аль нэгийг агуулдаг</translation>
 <translation id="844850004779619592">Тушаал олдсонгүй</translation>
@@ -10545,6 +10547,7 @@
 <translation id="981121421437150478">Offline</translation>
 <translation id="983192555821071799">Бүх табыг хаах</translation>
 <translation id="983511809958454316">Энэ онцлогийг VR-д дэмжээгүй</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - Камер болон микрофоны бичлэг</translation>
 <translation id="984275831282074731">Төлбөрийн хэрэгсэл</translation>
 <translation id="984705303330760860">Зөв бичгийн алдаа шалгах хэлнүүдийг нэмэх</translation>
 <translation id="98515147261107953">Газрын гадаргуун зураг</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 0cd2f715..d8d62049 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">स्क्रीन भिंग</translation>
 <translation id="3474218480460386727">नवीन शब्दांसाठी ९९ किंवा त्यापेक्षा कमी अक्षरे वापरा</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> म्हणून सुरू ठेवा</translation>
-<translation id="3475843873335999118">सॉरी, तुमचे फिंगरप्रिंट अद्याप ओळखले नाही. कृपया तुमचा पासवर्ड एंटर करा.</translation>
 <translation id="3476303763173086583">वापर आणि निदान डेटा पाठवा. Google ला आपोआप निदान आणि डिव्हाइस आणि अ‍ॅप वापर डेटा पाठवून तुमच्या लहान मुलाचा Android अनुभव सुधारण्यात मदत करा. हे तुमच्या लहान मुलाला ओळखण्यासाठी वापरले जाणार नाही आणि सिस्ट्म आणि अ‍ॅप स्थिरता आणि इतर सुधारणा करण्यात मदत करेल. काही एकत्रित डेटा Google अ‍ॅप्स आणि Android डेव्हलपर सारख्या भागीदारांनादेखील मदत करेल. या <ph name="BEGIN_LINK1" />सेटिंगची<ph name="END_LINK1" /> मालकाद्वारे अंमलबजावणी केली जाते. मालक या डिव्हाइससाठी निदान आणि वापर डेटा Google ला पाठवणे निवडू शकतो. तुमच्या लहान मुलासाठी अतिरिक्त वेब आणि अ‍ॅप अ‍ॅक्टिव्हिटी सुरू केलेली असल्यास, ही माहिती त्याच्या Google खात्यामध्ये स्टोअर केली जाऊ शकते. <ph name="BEGIN_LINK2" />अधिक जाणून घ्या<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">अरेरे! तुमच्या डीव्हाइससाठी धोरण आणण्यात सिस्टम अयशस्वी झाली.</translation>
 <translation id="347785443197175480">तुमचा कॅमेरा आणि मायक्रोफोन ॲक्सेस करण्यासाठी <ph name="HOST" /> ला परवानगी देणे सुरू ठेवा</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">वेब पेजचे भाग ब्लॉक करा</translation>
 <translation id="3760460896538743390">&amp;पार्श्वभूमी पृष्ठाचे निरीक्षण करा</translation>
 <translation id="37613671848467444">&amp;गुप्त विंडोमध्ये उघडा</translation>
-<translation id="3761390540041101668">समस्येचे पुनरुत्पादन करण्यासाठी समस्येचे स्पष्ट वर्णन आणि पायऱ्या द्या (शक्य असल्यास)</translation>
 <translation id="3761556954875533505">साइटला फाइल संपादित करू द्यायच्या?</translation>
 <translation id="3763433740586298940">तुम्हाला नको असलेल्या साइट तुम्ही ब्लॉक करू शकता. Chrome हे ३० दिवसांपेक्षा जुन्या असलेल्या साइटदेखील सूचीमधून ऑटो-डिलीट करते.</translation>
 <translation id="3763549179847864476">गोपनीयता मार्गदर्शक यावर परत जा</translation>
@@ -5901,7 +5899,6 @@
 <translation id="5608580678041221894">क्रॉप करण्‍याचे क्षेत्र समायोजित करण्‍यासाठी किंवा हलविण्‍यासाठी खालील की टॅप करा</translation>
 <translation id="5609231933459083978">ॲप्लिकेशन चुकीचे असल्याचे दिसते.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 1d6d6c2..085754e 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -3224,7 +3224,6 @@
 <translation id="3473479545200714844">Penggadang skrin</translation>
 <translation id="3474218480460386727">Gunakan 99 huruf atau kurang untuk perkataan baharu</translation>
 <translation id="3474624961160222204">Teruskan sebagai <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Maaf, cap jari anda masih tidak dikenali. Sila masukkan kata laluan anda.</translation>
 <translation id="3476303763173086583">Hantar data penggunaan dan diagnostik. Bantu kami meningkatkan pengalaman Android anak anda dengan menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini tidak akan digunakan untuk mengenal pasti anak anda dan akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. <ph name="BEGIN_LINK1" />Tetapan<ph name="END_LINK1" /> ini dikuatkuasakan oleh pemilik. Pemilik mungkin memilih untuk menghantar data diagnostik dan penggunaan bagi peranti ini kepada Google. Jika tetapan Aktiviti Web &amp; Apl tambahan dihidupkan untuk anak anda, data ini mungkin disimpan ke Google Account miliknya. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Op!  Sistem gagal mengambil dasar untuk peranti anda.</translation>
 <translation id="347785443197175480">Teruskan membenarkan <ph name="HOST" /> untuk mengakses kamera dan mikrofon anda</translation>
@@ -3591,7 +3590,6 @@
 <translation id="3759933321830434300">Sekat sebahagian halaman web</translation>
 <translation id="3760460896538743390">Halaman Periksa &amp;Latar Belakang</translation>
 <translation id="37613671848467444">Buka dalam Tetingkap &amp;Inkognito</translation>
-<translation id="3761390540041101668">Sediakan penerangan yang jelas tentang masalah dan langkah untuk menghasilkan semula masalah tersebut (jika boleh)</translation>
 <translation id="3761556954875533505">Benarkan tapak mengedit fail?</translation>
 <translation id="3763433740586298940">Anda boleh menyekat laman yang anda tidak mahu. Chrome juga memadamkan laman yang disimpan melebihi 30 hari daripada senarai secara automatik.</translation>
 <translation id="3763549179847864476">Butang kembali Panduan Privasi</translation>
@@ -5904,7 +5902,6 @@
 <translation id="5608580678041221894">Ketik kekunci berikut untuk melaras atau mengalihkan kawasan pemangkasan</translation>
 <translation id="5609231933459083978">Apl kelihatan tidak sah.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 414f6cb..ef10d78f7 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">မျက်နှာပြင် ပုံချဲ့ပေးသူ</translation>
 <translation id="3474218480460386727">စာလုံးအသစ်များအတွက် အက္ခရာ ၉၉ လုံးနှင့်အောက် အသုံးပြုပါ</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> အဖြစ်​ ရှေ့ဆက်ရန်</translation>
-<translation id="3475843873335999118">ဝမ်းနည်းပါသည်။ သင်၏ လက်ဗွေကို မသိရှိပါ။ စကားဝှက်ကို ထည့်ပါ။</translation>
 <translation id="3476303763173086583">အသုံးပြုမှုနှင့် အမှားရှာဖွေမှုဒေတာ ပို့ပါ။ အမှားရှာဖွေမှု၊ စက်ပစ္စည်းနှင့်အက်ပ် အသုံးပြုမှုဒေတာများကို Google သို့ အလိုအလျောက်ပို့၍ သင့်ကလေး၏ Android အသုံးပြုမှု ပိုမိုကောင်းမွန်လာစေရန် ကူညီပါ။ ၎င်းကို အသုံးပြု၍ သင့်ကလေး မည်သူမည်ဝါဖြစ်ကြောင်း ထုတ်ဖော်သွားမည် မဟုတ်ဘဲ စနစ်နှင့် အက်ပ်တည်ငြိမ်မှု၊ အခြား တိုးတက်ပြင်ဆင်မှုများအတွက် အသုံးပြုသွားပါမည်။ စုစည်းထားသော ဒေတာအချို့က Google အက်ပ်နှင့် Android ဆော့ဖ်ဝဲအင်ဂျင်နီယာများကဲ့သို့ ပါတနာများကို ကူညီပေးပါမည်။ ဤ <ph name="BEGIN_LINK1" />ဆက်တင်<ph name="END_LINK1" /> ကို ပိုင်ရှင်ဖြစ်သူက သတ်မှတ်ထားခြင်းဖြစ်သည်။ ပိုင်ရှင်သည် ဤစက်ပစ္စည်းအတွက် ပြဿနာအဖြေရှာခြင်းနှင့် အသုံးပြုမှုဒေတာများကို Google သို့ ပို့ရန် ရွေးချယ်နိုင်ပါသည်။ သင့်ကလေးအတွက် ထပ်တိုး 'ဝဘ်နှင့် အက်ပ်လုပ်ဆောင်ချက်' ကို ဖွင့်ထားသည့်အခါ ဤဒေတာကို သူ၏ Google အကောင့်သို့ သိမ်းသွားပါမည်။ <ph name="BEGIN_LINK2" />ပိုမိုလေ့လာရန်<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">စနစ်သည် သင့်စက်ပစ္စည်းအတွက် မူဝါဒကို ရယူခြင်း မအောင်မြင်ပါ။</translation>
 <translation id="347785443197175480"><ph name="HOST" />အား သင်၏ ကင်မရာ နှင့် မိုက်ခရိုဖုန်းကို ရယူသုံးမှု ဆက်ခွင့်ပြုရန်</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">ဝဘ်စာမျက်နှာ အစိတ်ပိုင်းများကို အဆက်ဖြတ်မည်</translation>
 <translation id="3760460896538743390">နောက်ခံ &amp;စာမျက်နှာကို စစ်ဆေးရန်</translation>
 <translation id="37613671848467444">ရုပ်ဖျက် ဝင်ဒိုး ထဲမှာ ဖွင့်ရန်</translation>
-<translation id="3761390540041101668">ပြဿနာနှင့် (ဖြစ်နိုင်ပါက) ယင်းကို ပုံတူလုပ်ရန် အဆင့်များအကြောင်း ရှင်းလင်းသောဖော်ပြချက် ပေးပါ</translation>
 <translation id="3761556954875533505">ဝဘ်ဆိုက်ကို ဖိုင်များ တည်းဖြတ်ခွင့်ပြုမလား။</translation>
 <translation id="3763433740586298940">သင်မလိုလားသည့် ဝဘ်ဆိုက်များကို ပိတ်ထားနိုင်သည်။ ရက် ၃၀ ကျော်ပြီဖြစ်သော ဝဘ်ဆိုက်များကိုလည်း Chrome က အလိုအလျောက်ဖျက်သည်။</translation>
 <translation id="3763549179847864476">‘ကိုယ်ရေးအချက်အလက်လုံခြုံမှုလမ်းညွှန်’ နောက်ပြန်ခလုတ်</translation>
@@ -5902,7 +5900,6 @@
 <translation id="5608580678041221894">ဖြတ်ညှိရန်နေရာကို ချိန်ညှိရန် သို့မဟုတ် ရွှေ့ရန် အောက်ပါခလုတ်များကို တို့ပါ</translation>
 <translation id="5609231933459083978">အပလီကေးရှင်း မမှန်ကန်နိုင်ပါ။</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index ed56fa4..25884da 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -3207,7 +3207,6 @@
 <translation id="3473479545200714844">स्क्रिन म्याग्निफायर</translation>
 <translation id="3474218480460386727">नयाँ शब्द लेख्न ९९ वा सोभन्दा कम अक्षर प्रयोग गर्नुहोस्</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> का रूपमा जारी राख्नुहोस्</translation>
-<translation id="3475843873335999118">माफ गर्नुहोस्, तपाईंको फिंगरप्रिन्ट अझै पहिचान भएन। कृपया आफ्नो पासवर्ड प्रविष्टि गर्नुहोस्।</translation>
 <translation id="3476303763173086583">प्रयोग तथा निदानसम्बन्धी डेटा पठाउनुहोस्। निदान, डिभाइस र एपको उपयोगसम्बन्धी डेटा स्वतः Google मा पठाएर आफ्ना बालकको Android सम्बन्धी अनुभवलाई सुधार गर्न मद्दत गर्नुहोस्। यस्तो डेटा तपाईंका बालकको पहिचान गर्ने प्रयोजनका लागि प्रयोग गरिने छैन र यसले सिस्टम तथा एपको स्थिरता र थप कुराहरू सुधार गर्न मद्दत गर्ने छ। केही एकीकृत डेटाले Google का एप तथा Android का विकासकर्ता जस्ता साझेदारहरूलाई पनि मद्दत गर्ने छ। मालिकले यो <ph name="BEGIN_LINK1" />सेटिङ<ph name="END_LINK1" /> लागू गर्नुभएको हो। मालिकले यस यन्त्रको निदान तथा प्रयोगसम्बन्धी डेटा Google मा पठाउने विकल्प छनौट गर्न सक्नुहुन्छ। तपाईंका बालकको खातामा वेब तथा एपसम्बन्धी अतिरिक्त क्रियाकलापको सेटिङ सक्रिय गरिएको छ भने यो डेटा उनको Google खातामा सेभ गरिन सक्छ। <ph name="BEGIN_LINK2" />थप जान्नुहोस्<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">हत्तेरिका! प्रणालीले तपाईंको डिभाइसको नीति प्राप्त गर्न सकेन।</translation>
 <translation id="347785443197175480"><ph name="HOST" /> लाई तपाइँको क्यामेरा र माइक्रोफोन पहुँच गर्न अनुमति दिन जारी राख्नुहोस्</translation>
@@ -3574,7 +3573,6 @@
 <translation id="3759933321830434300">वेब पेजहरूका भागहरू रोक्नुहोस्</translation>
 <translation id="3760460896538743390">&amp;पृष्ठभूमि पृष्ठ निरीक्षण गर्नुहोस्</translation>
 <translation id="37613671848467444">&amp;इनकगनिटो विण्डोमा खोल्नुहोस्</translation>
-<translation id="3761390540041101668">त्रुटिका बारेमा स्पष्ट रूपमा बताउनुहोस्। साथै, त्रुटि पुनः सिर्जना गर्ने प्रक्रियाका चरणहरू (सम्भव भएमा) उपलब्ध गराउनुहोस्</translation>
 <translation id="3761556954875533505">साइटलाई फाइलहरू सम्पादन गर्न दिने हो?</translation>
 <translation id="3763433740586298940">तपाईं आफूले नचाहेका साइटहरू ब्लक गर्न सक्नुहुन्छ। साथै Chrome ले पनि उक्त सूचीमा भएका ३० दिनभन्दा पुराना साइटहरू स्वतः मेटाउँछ।</translation>
 <translation id="3763549179847864476">गोपनीयतासम्बन्धी गाइडमा भएको "पछाडि" बटन</translation>
@@ -5885,7 +5883,6 @@
 <translation id="5608580678041221894">क्रप गर्ने क्षेत्रलाई समायोजन गर्न वा सार्न निम्न कुञ्जीहरूमा ट्याप गर्नुहोस्</translation>
 <translation id="5609231933459083978">एप अवैध जस्तो देखिन्छ।</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -7650,7 +7647,7 @@
 <translation id="7017004637493394352">फेरि "Ok Google" भन्नुहोस्</translation>
 <translation id="7017219178341817193">एउटा नयाँ पृष्ठ थप्नुहोस्</translation>
 <translation id="7017354871202642555">विण्डो कायम भएपछि मोड सेट गर्न सकिँदैन।</translation>
-<translation id="7019546817926942979">तपाईंले आफ्नो डिभाइस बिजुलीको स्रोतमा प्लगइन गर्नु पर्ने हुन्छ। Linux अपग्रेड गर्ने क्रममा अत्याधिक मात्रामा ब्याट्रीको खपत हुन्छ। कृपया आफ्नो डिभाइस चार्जरमा जोड्नुहोस् र फेरि प्रयास गर्नुहोस्।</translation>
+<translation id="7019546817926942979">तपाईंले आफ्नो डिभाइस बिजुलीको स्रोतमा प्लगइन गर्नु पर्ने हुन्छ। Linux अपग्रेड गर्ने क्रममा अत्यधिक मात्रामा ब्याट्रीको खपत हुन्छ। कृपया आफ्नो डिभाइस चार्जरमा जोड्नुहोस् र फेरि प्रयास गर्नुहोस्।</translation>
 <translation id="7019805045859631636">द्रुत</translation>
 <translation id="7021524108486027008">तपाईंको <ph name="DEVICE_TYPE" /> मा तपाईंको इन्टरप्राइजले व्यवस्थापन गर्ने इन्भाइरोन्मेन्टमा टुल, एडिटर तथा IDE हरू रन गर्नुहोस्।</translation>
 <translation id="7022222879220069865">सबै टचप्याड डिस्कनेक्ट गरिएका छन्</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 154fab5..9988ba9 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1645,6 +1645,7 @@
 <translation id="2249111429176737533">Openen als venster met tabbladen</translation>
 <translation id="2249605167705922988">bijv. 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Pas de informatie aan die sites gebruiken om advertenties te laten zien</translation>
+<translation id="2250624716625396929">Dit tabblad gebruikt je camera of microfoon</translation>
 <translation id="2251218783371366160">Openen met systeemviewer</translation>
 <translation id="225163402930830576">Netwerken vernieuwen</translation>
 <translation id="2251809247798634662">Nieuw incognitovenster</translation>
@@ -3208,7 +3209,6 @@
 <translation id="3473479545200714844">Vergrootglas</translation>
 <translation id="3474218480460386727">Gebruik 99 letters of minder voor nieuwe woorden</translation>
 <translation id="3474624961160222204">Doorgaan als <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Je vingerafdruk wordt nog steeds niet herkend. Geef je wachtwoord op.</translation>
 <translation id="3476303763173086583">Stuur gebruiks- en diagnostische gegevens. Verbeter de Android-functionaliteit voor je kind door automatisch diagnostische, apparaat- en app-gebruiksgegevens naar Google te sturen. Deze gegevens worden niet gebruikt om je kind te identificeren en kunnen helpen om de systeem- en app-stabiliteit te verbeteren en andere optimalisaties mogelijk te maken. Daarnaast zijn bepaalde verzamelde gegevens nuttig voor Google-apps en -partners, zoals Android-ontwikkelaars. Deze <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> wordt verplicht door de eigenaar. De eigenaar kan ervoor kiezen diagnostische en gebruiksgegevens voor dit apparaat naar Google te sturen. Als je de instelling voor aanvullende Web- en app-activiteit hebt aangezet voor je kind, kunnen deze gegevens worden opgeslagen in het Google-account van je kind. <ph name="BEGIN_LINK2" />Meer informatie<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Het systeem kan het beleid voor je apparaat niet ophalen.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> toegang blijven geven tot je camera en microfoon</translation>
@@ -3575,7 +3575,6 @@
 <translation id="3759933321830434300">Delen van webpagina's blokkeren</translation>
 <translation id="3760460896538743390">&amp;Achtergrondpagina controleren</translation>
 <translation id="37613671848467444">Openen in &amp;incognitovenster</translation>
-<translation id="3761390540041101668">Geef een duidelijke beschrijving van het probleem en de stappen om het probleem te reproduceren (indien mogelijk)</translation>
 <translation id="3761556954875533505">Toestaan dat site bestanden bewerkt?</translation>
 <translation id="3763433740586298940">Je kunt ongewenste sites blokkeren. Chrome verwijdert sites die ouder zijn dan 30 dagen ook automatisch uit de lijst.</translation>
 <translation id="3763549179847864476">Terugknop voor Privacygids</translation>
@@ -5885,7 +5884,6 @@
 <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="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>
 <translation id="5614947000616625327">iCloud Sleutelhanger</translation>
@@ -6615,6 +6613,7 @@
 <translation id="6202304368170870640">Je kunt je pincode gebruiken om in te loggen of je apparaat te ontgrendelen.</translation>
 <translation id="6203247599828309566">Je hebt een notitie voor een wachtwoord op deze site opgeslagen. Klik op het sleutelicoon om de notitie te bekijken.</translation>
 <translation id="6205314730813004066">Advertentieprivacy</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" />: microfoonopname</translation>
 <translation id="6206199626856438589">Je wordt uitgelogd van de getoonde sites, waaronder in geopende tabbladen</translation>
 <translation id="6206311232642889873">A&amp;fbeelding kopiëren</translation>
 <translation id="6207200176136643843">Standaardzoomniveau resetten</translation>
@@ -7166,6 +7165,7 @@
 <translation id="6657585470893396449">Wachtwoord</translation>
 <translation id="6659213950629089752">Deze pagina is ingezoomd met de extensie '<ph name="NAME" />'</translation>
 <translation id="6659594942844771486">Browsertabblad</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" />: camera-opname</translation>
 <translation id="6660819301598582123">Pa's wijze lynx bezag vroom het fikse aquaduct.</translation>
 <translation id="666099631117081440">Afdrukservers</translation>
 <translation id="6662931079349804328">Bedrijfsbeleid gewijzigd. Knop voor experimenten verwijderd uit werkbalk.</translation>
@@ -8975,6 +8975,7 @@
 <translation id="8059417245945632445">Apparaten &amp;inspecteren</translation>
 <translation id="8059456211585183827">Er kunnen geen printers worden opgeslagen.</translation>
 <translation id="8061091456562007989">Wijziging ongedaan maken</translation>
+<translation id="8061244502316511332">Dit tabblad gebruikt je microfoon</translation>
 <translation id="8061970399284390013">Spelling- en grammaticacontrole</translation>
 <translation id="8061991877177392872">Zoe te zien heb je Voice Match al ingesteld voor de Assistent op een ander apparaat. De eerdere opnamen daarvan zijn gebruikt om een spraakmodel op dit apparaat te maken.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 vel papier}other{{COUNT} vellen papier}}</translation>
@@ -9456,6 +9457,7 @@
 <translation id="844063558976952706">Altijd op deze site</translation>
 <translation id="8441313165929432954">Tethering aan-/uitzetten</translation>
 <translation id="8443986842926457191">De URL is langer dan 2048 tekens</translation>
+<translation id="8445281870900174108">Dit tabblad gebruikt je camera</translation>
 <translation id="8446884382197647889">Meer informatie</translation>
 <translation id="8447409163267621480">Neem Ctrl of Alt op</translation>
 <translation id="844850004779619592">Geen opdrachten gevonden</translation>
@@ -10531,6 +10533,7 @@
 <translation id="981121421437150478">Offline</translation>
 <translation id="983192555821071799">Alle tabbladen sluiten</translation>
 <translation id="983511809958454316">Deze functie wordt niet ondersteund in VR</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" />: camera- en microfoonopname</translation>
 <translation id="984275831282074731">Betaalmethoden</translation>
 <translation id="984705303330760860">Talen voor spellingcontrole toevoegen</translation>
 <translation id="98515147261107953">Liggend</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index d96f640..890ed30 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1652,6 +1652,7 @@
 <translation id="2249111429176737533">Åpne som vindu med faner</translation>
 <translation id="2249605167705922988">f.eks. 1–5, 8, 11–13</translation>
 <translation id="2249635629516220541">Tilpass informasjonen som brukes av nettsteder for å vise deg annonser</translation>
+<translation id="2250624716625396929">Denne fanen bruker kameraet og mikrofonen</translation>
 <translation id="2251218783371366160">Åpne med visningsprogrammet for systemet</translation>
 <translation id="225163402930830576">Oppdater nettverk</translation>
 <translation id="2251809247798634662">Nytt inkognitovindu</translation>
@@ -3218,7 +3219,6 @@
 <translation id="3473479545200714844">Skjermforstørrer</translation>
 <translation id="3474218480460386727">Bruk 99 eller færre bokstaver for nye ord</translation>
 <translation id="3474624961160222204">Fortsett som <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Fingeravtrykket ditt ble fortsatt ikke gjenkjent. Skriv inn passordet ditt.</translation>
 <translation id="3476303763173086583">Send bruks- og diagnostikkdata. Hjelp til med å gjøre Android-opplevelsen bedre for barnet ditt ved å sende diagnostikk-, enhets- og appbruksdata til Google automatisk. Disse dataene brukes ikke til å identifisere barnet ditt, men bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Denne <ph name="BEGIN_LINK1" />innstillingen<ph name="END_LINK1" /> håndheves av eieren. Eieren kan velge å sende diagnostikk- og bruksdata for denne enheten til Google. Hvis du har slått på innstillingen for annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. <ph name="BEGIN_LINK2" />Finn ut mer<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Beklager. Systemet kunne ikke hente reglene for enheten din.</translation>
 <translation id="347785443197175480">Fortsett å gi <ph name="HOST" /> tillatelse til å bruke kameraet og mikrofonen</translation>
@@ -3585,7 +3585,6 @@
 <translation id="3759933321830434300">blokkere deler av nettsider</translation>
 <translation id="3760460896538743390">Inspeksjons- og bakgrunnsside</translation>
 <translation id="37613671848467444">Åpne i &amp;inkognitovindu</translation>
-<translation id="3761390540041101668">Gi en tydelig beskrivelse av problemet og fremgangsmåten for å gjenskape problemet (hvis det er mulig)</translation>
 <translation id="3761556954875533505">Vil du la nettstedet redigere filer?</translation>
 <translation id="3763433740586298940">Du kan blokkere nettsteder du ikke vil ha. Dessuten sletter Chrome automatisk nettsteder som er eldre enn 30 dager, fra listen.</translation>
 <translation id="3763549179847864476">Tilbakeknapp for personvernveiledningen</translation>
@@ -5894,7 +5893,6 @@
 <translation id="5608580678041221894">Trykk på de følgende tastene for å justere eller flytte beskjæringsområdet</translation>
 <translation id="5609231933459083978">Appen ser ut til å være ugyldig.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" /> – <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Passordet ditt kunne fortsatt ikke bekreftes. Merk: Hvis du endret passordet ditt nylig, blir det nye passordet ditt tatt i bruk når du logger deg av. Du må bruke det gamle passordet her.</translation>
 <translation id="5614190747811328134">Brukerinformasjon</translation>
 <translation id="5614553682702429503">Vil du lagre passordet?</translation>
 <translation id="5614947000616625327">iCloud-nøkkelring</translation>
@@ -6628,6 +6626,7 @@
 <translation id="6202304368170870640">Du kan bruke PIN-koden til å logge på eller låse opp enheten.</translation>
 <translation id="6203247599828309566">Du har lagret en merknad for et passord på dette nettstedet. For å se den, klikk på nøkkelikonet.</translation>
 <translation id="6205314730813004066">Annonsepersonvern</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – mikrofonopptak</translation>
 <translation id="6206199626856438589">Du blir logget av nettstedene som vises, også på faner som er åpne</translation>
 <translation id="6206311232642889873">&amp;Kopier bilde</translation>
 <translation id="6207200176136643843">Tilbakestill til standard zoomnivå</translation>
@@ -7179,6 +7178,7 @@
 <translation id="6657585470893396449">Passord</translation>
 <translation id="6659213950629089752">Denne siden ble zoomet inn av utvidelsen «<ph name="NAME" />»</translation>
 <translation id="6659594942844771486">Fane</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – kameraopptak</translation>
 <translation id="6660819301598582123">Høvdingens kjære squaw får litt pizza i Mexico by.</translation>
 <translation id="666099631117081440">Utskriftstjenere</translation>
 <translation id="6662931079349804328">En Enterprise-regel er endret. Eksperimenter-knappen er fjernet fra verktøyraden.</translation>
@@ -8992,6 +8992,7 @@
 <translation id="8059417245945632445">&amp;Inspiser enheter</translation>
 <translation id="8059456211585183827">Det er ingen skrivere tilgjengelig for lagring.</translation>
 <translation id="8061091456562007989">Endre tilbake</translation>
+<translation id="8061244502316511332">Denne fanen bruker mikrofonen din</translation>
 <translation id="8061970399284390013">Stave- og grammatikkontroll</translation>
 <translation id="8061991877177392872">Det ser ut til at du allerede har konfigurert Voice Match med assistenten din på en annen enhet. Disse tidligere opptakene ble brukt til å lage en stemmemodell på denne enheten.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 ark}other{{COUNT} ark}}</translation>
@@ -9473,6 +9474,7 @@
 <translation id="844063558976952706">Alltid på dette nettstedet</translation>
 <translation id="8441313165929432954">Slå internettdeling av/på</translation>
 <translation id="8443986842926457191">Nettadressen er lengre enn 2048 tegn</translation>
+<translation id="8445281870900174108">Denne fanen bruker kameraet ditt</translation>
 <translation id="8446884382197647889">Les mer</translation>
 <translation id="8447409163267621480">Inkluder enten Ctrl eller Alt</translation>
 <translation id="844850004779619592">Fant ingen kommandoer</translation>
@@ -10547,6 +10549,7 @@
 <translation id="981121421437150478">Uten nett</translation>
 <translation id="983192555821071799">Lukk alle faner</translation>
 <translation id="983511809958454316">Denne funksjonen støttes ikke i VR</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – kamera- og mikrofonopptak</translation>
 <translation id="984275831282074731">Betalingsmåter</translation>
 <translation id="984705303330760860">Legg til språk for stavekontroll</translation>
 <translation id="98515147261107953">Liggende</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index 2edfbdf..dfb6177 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -3206,7 +3206,6 @@
 <translation id="3473479545200714844">ସ୍କ୍ରିନ୍ ମ୍ୟାଗ୍ନିଫାୟର୍</translation>
 <translation id="3474218480460386727">ନୂଆ ଶବ୍ଦଗୁଡ଼ିକ ପାଇଁ 99ଟି କିମ୍ବା ତା'ଠାରୁ କମ୍ ଅକ୍ଷର ବ୍ୟବହାର କରନ୍ତୁ</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> ଭାବେ ଜାରି ରଖନ୍ତୁ</translation>
-<translation id="3475843873335999118">କ୍ଷମା କରିବେ,ଏବେ ମଧ୍ୟ ଆପଣଙ୍କର ଟିପଚିହ୍ନ ଚିହ୍ନଟ କରାଯାଇପାରିନାହିଁ। ଦୟାକରି ନିଜର ପାସ୍‌ୱାର୍ଡ ଲେଖନ୍ତୁ।</translation>
 <translation id="3476303763173086583">ବ୍ୟବହାର ଓ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟାକୁ ପଠାନ୍ତୁ। ସ୍ଵଚାଳିତ ଭାବେ ଡାଏଗ୍ନୋଷ୍ଟିକ୍, ଡିଭାଇସ୍ ଓ ଆପ୍ ବ୍ୟବହାର ଡାଟା Googleକୁ ପଠାଇ ଆପଣଙ୍କ ପିଲାର Android ଅନୁଭବକୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ। ଆପଣଙ୍କ ପିଲାକୁ ଚିହ୍ନଟ କରିବାରେ ଏହାକୁ ବ୍ୟବହାର କରାଯିବ ନାହିଁ ଏବଂ ସିଷ୍ଟମ୍ ଓ ଆପ୍‌ର ସ୍ଥିରତା ଏବଂ ଅନ୍ୟାନ୍ୟ ଉନ୍ନତିରେ ସାହାଯ୍ୟ କରିବ। କିଛି ଏକତ୍ରିତ ଡାଟା, Google ଆପ୍ସ ଓ ସହଭାଗୀମାନଙ୍କୁ ମଧ୍ୟ ସାହାଯ୍ୟ କରିବ, ଯେପରି Android ଡେଭଲପର୍। ଏହି <ph name="BEGIN_LINK1" />ସେଟିଂ<ph name="END_LINK1" /> ମାଲିକଙ୍କ ଦ୍ୱାରା ଲାଗୁ କରାଯାଇଛି। ମାଲିକ ଏହି ଡିଭାଇସ୍ ପାଇଁ Googleକୁ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଓ ବ୍ୟବହାର ଡାଟା ପଠାଇବାକୁ ବାଛିପାରନ୍ତି। ଯଦି ଆପଣଙ୍କର ପିଲା ପାଇଁ ଅତିରିକ୍ତ ୱେବ୍ ଏବଂ ଆପ୍ କାର୍ଯ୍ୟକଳାପ ସେଟିଂସ୍ ଚାଲୁ କରାଯାଏ, ତେବେ ଏହି ଡାଟା ସେମାନଙ୍କର Google ଆକାଉଣ୍ଟରେ ସେଭ୍ ହୋଇପାରେ। <ph name="BEGIN_LINK2" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">ଓହୋଃ!  ସିଷ୍ଟମ୍ ଆପଣଙ୍କ ଡିଭାଇସ୍ ପାଇଁ ନୀତି ଆଣିବାକୁ ବିଫଳ ହେଲା।</translation>
 <translation id="347785443197175480"><ph name="HOST" />କୁ ଆପଣଙ୍କର କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ଆକ୍‌ସେସ୍ କରିବାକୁ ଅନୁମତି ଦେବା ଜାରି ରଖନ୍ତୁ</translation>
@@ -3573,7 +3572,6 @@
 <translation id="3759933321830434300">ୱେବ୍‌ ପୃଷ୍ଠାଗୁଡ଼ିକର ଅଂଶଗୁଡ଼ିକୁ ଅବରୋଧ କରନ୍ତୁ</translation>
 <translation id="3760460896538743390">&amp;ପୃଷ୍ଠଭୂମି ପୃଷ୍ଠା ନିରୀକ୍ଷଣ କରନ୍ତୁ</translation>
 <translation id="37613671848467444">&amp;ଇନ୍‌କଗ୍ନିଟୋ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ</translation>
-<translation id="3761390540041101668">ସମସ୍ୟାର ଏକ ସ୍ପଷ୍ଟ ବର୍ଣ୍ଣନା ଏବଂ ସମସ୍ୟାକୁ ପୁଣି ସୃଷ୍ଟି କରିବାର ଷ୍ଟେପଗୁଡ଼ିକ ପ୍ରଦାନ କରନ୍ତୁ (ଯଦି ସମ୍ଭବ)</translation>
 <translation id="3761556954875533505">ସାଇଟକୁ ଫାଇଲଗୁଡ଼ିକ ଏଡିଟ୍ କରିବାକୁ ଦେବେ?</translation>
 <translation id="3763433740586298940">ଆପଣ ଚାହୁଁନଥିବା ସାଇଟଗୁଡ଼ିକୁ ଆପଣ ବ୍ଲକ କରିପାରିବେ। Chrome 30 ଦିନରୁ ଅଧିକ ପୁରୁଣା ସାଇଟଗୁଡ଼ିକୁ ମଧ୍ୟ ତାଲିକାରୁ ସ୍ୱତଃ-ଡିଲିଟ କରେ।</translation>
 <translation id="3763549179847864476">ଗୋପନୀୟତା ଗାଇଡ ପଛକୁ ଫେରନ୍ତୁ ବଟନ</translation>
@@ -5885,7 +5883,6 @@
 <translation id="5608580678041221894">କ୍ରପିଂ ଏରିଆକୁ ଆଡ୍‌ଜଷ୍ଟ କରିବା ପାଇଁ କିମ୍ୱା ଘୁଞ୍ଚାଇବା ପାଇଁ ନିମ୍ନରେ ଥିବା କୀଗୁଡ଼ିକୁ ଟାପ୍ କରନ୍ତୁ</translation>
 <translation id="5609231933459083978">ଆପ୍ଲିକେସନ୍‌ ଅବୈଧ ଥିବା ଜଣାପଡୁଛି।</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>
 <translation id="5614947000616625327">iCloud କୀଚେନ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 5cffdab..a6a513d 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -3225,7 +3225,6 @@
 <translation id="3473479545200714844">ਸਕ੍ਰੀਨ ਵਿਸਤਾਰਕ</translation>
 <translation id="3474218480460386727">ਨਵੇਂ ਸ਼ਬਦਾਂ ਲਈ 99 ਜਾਂ ਘੱਟ ਅੱਖਰ ਵਰਤੋ</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> ਵਜੋਂ ਜਾਰੀ ਰੱਖੋ</translation>
-<translation id="3475843873335999118">ਮਾਫ਼ ਕਰਨਾ, ਤੁਹਾਡੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਅਜੇ ਪਛਾਣ ਨਹੀਂ ਹੋਈ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ।</translation>
 <translation id="3476303763173086583">ਵਰਤੋਂ ਅਤੇ ਤਸ਼ਖੀਸ ਡਾਟਾ ਭੇਜੋ। Google ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਤਸ਼ਖੀਸ, ਡੀਵਾਈਸ ਅਤੇ ਐਪ ਵਰਤੋਂ ਡਾਟਾ ਭੇਜ ਕੇ ਆਪਣੇ ਬੱਚੇ ਦਾ Android ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ। ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਬੱਚੇ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ ਅਤੇ ਸਿਸਟਮ ਅਤੇ ਐਪ ਸਥਿਰਤਾ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਮਿਲੇਗੀ। ਕੁਝ ਏਕੀਕ੍ਰਿਤ ਜਾਣਕਾਰੀ Google ਐਪਾਂ ਅਤੇ ਪਾਰਟਨਰਾਂ, ਜਿਵੇਂ ਕਿ Android ਵਿਕਾਸਕਾਰਾਂ, ਦੀ ਵੀ ਮਦਦ ਕਰੇਗੀ। ਇਹ <ph name="BEGIN_LINK1" />ਸੈਟਿੰਗ<ph name="END_LINK1" /> ਮਾਲਕ ਵੱਲੋਂ ਲਾਗੂ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਮਾਲਕ ਇਸ ਡੀਵਾਈਸ ਦੇ ਤਸ਼ਖੀਸ ਅਤੇ ਵਰਤੋਂ ਡਾਟੇ ਨੂੰ Google ਨੂੰ ਭੇਜਣਾ ਚੁਣ ਸਕਦਾ ਹੈ। ਜੇ ਤੁਹਾਡੇ ਬੱਚੇ ਲਈ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਉਸਦੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। <ph name="BEGIN_LINK2" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">ਓਹੋ! ਸਿਸਟਮ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਲਈ ਨੀਤੀ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ।</translation>
 <translation id="347785443197175480"><ph name="HOST" /> ਨੂੰ ਆਪਣੇ ਕੈਮਰੇ ਅਤੇ ਮਾਈਕ੍ਰੋਫੋਨ ਤੇ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣਾ ਜਾਰੀ ਰੱਖੋ</translation>
@@ -3592,7 +3591,6 @@
 <translation id="3759933321830434300">ਵੈਬ ਸਫ਼ਿਆਂ ਦੇ ਬਲੌਕ ਭਾਗ</translation>
 <translation id="3760460896538743390">&amp;ਪਿਛੋਕੜ ਸਫ਼ਾ ਜਾਂਚੋ</translation>
 <translation id="37613671848467444">&amp;ਗੁਮਨਾਮ window ਵਿੱਚ ਖੋਲ੍ਹੋ</translation>
-<translation id="3761390540041101668">ਸਮੱਸਿਆ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ (ਜੇ ਸੰਭਵ ਹੋਵੇ), ਸਮੱਸਿਆ ਦਾ ਸਪਸ਼ਟ ਵਰਣਨ ਅਤੇ ਉਸਨੂੰ ਠੀਕ ਕਰਨ ਸੰਬੰਧੀ ਪੜਾਵਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦਿਓ</translation>
 <translation id="3761556954875533505">ਕੀ ਸਾਈਟ ਨੂੰ ਫ਼ਾਈਲਾਂ ਦਾ ਸੰਪਾਦਨ ਕਰਨ ਦੇਈਏ?</translation>
 <translation id="3763433740586298940">ਤੁਹਾਨੂੰ ਜੋ ਸਾਈਟਾਂ ਨਹੀਂ ਚਾਹੀਦੀਆਂ, ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ ਬਲਾਕ ਕਰ ਸਕਦੇ ਹੋ। Chrome 30 ਦਿਨਾਂ ਤੋਂ ਵੱਧ ਪੁਰਾਣੀਆਂ ਸਾਈਟਾਂ ਨੂੰ ਵੀ ਸੂਚੀ ਤੋਂ ਸਵੈਚਲਿਤ-ਮਿਟਾਉਂਦਾ ਹੈ।</translation>
 <translation id="3763549179847864476">ਪਰਦੇਦਾਰੀ ਗਾਈਡ 'ਪਿੱਛੇ' ਬਟਨ</translation>
@@ -5905,7 +5903,6 @@
 <translation id="5608580678041221894">ਕਾਂਟ-ਛਾਂਟ ਕਰਨ ਸਬੰਧੀ ਖੇਤਰ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਨ ਜਾਂ ਖਿਸਕਾਉਣ ਲਈ ਅੱਗੇ ਦਿੱਤੀਆਂ ਕੁੰਜੀਆਂ 'ਤੇ ਟੈਪ ਕਰੋ</translation>
 <translation id="5609231933459083978">ਐਪਲੀਕੇਸ਼ਨ ਅਵੈਧ ਜਾਪਦੀ ਹੈ।</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 73fd928e..2a264be 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3191,7 +3191,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">Możesz użyć maksymalnie 99 liter</translation>
 <translation id="3474624961160222204">Nadal używaj konta użytkownika <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Odcisk palca nie został rozpoznany. Podaj hasło.</translation>
 <translation id="3476303763173086583">Wysyłaj dane diagnostyczne oraz informacje o użytkowaniu. Pomóż ulepszyć działanie Androida na urządzeniu dziecka, automatycznie wysyłając do Google dane diagnostyczne oraz informacje o używaniu urządzenia i aplikacji. Nie zostaną one użyte do zidentyfikowania Twojego dziecka. Wykorzystamy je, by poprawić stabilność systemu i aplikacji oraz wprowadzić inne ulepszenia. Niektóre dane zbiorcze pomogą nam też udoskonalić aplikacje Google lub zostaną wykorzystane przez naszych partnerów, na przykład deweloperów aplikacji na Androida. To <ph name="BEGIN_LINK1" />ustawienie<ph name="END_LINK1" /> jest wymuszone przez właściciela. Właściciel może ustawić wysyłanie do Google danych diagnostycznych i informacji o używaniu tego urządzenia. Jeśli na koncie Google dziecka włączysz ustawienie Dodatkowa aktywność w internecie i aplikacjach, te dane mogą być zapisywane na tym koncie. <ph name="BEGIN_LINK2" />Więcej informacji<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ups. System nie mógł pobrać zasad dotyczących Twojego urządzenia.</translation>
 <translation id="347785443197175480">Nadal zezwalaj witrynie <ph name="HOST" /> na dostęp do kamery i mikrofonu</translation>
@@ -3558,7 +3557,6 @@
 <translation id="3759933321830434300">Blokowanie części stron internetowych</translation>
 <translation id="3760460896538743390">Sprawdź &amp;stronę tła</translation>
 <translation id="37613671848467444">Otwórz w oknie &amp;incognito</translation>
-<translation id="3761390540041101668">Opisz jasno problem i czynności prowadzące do jego odtworzenia (jeśli to możliwe)</translation>
 <translation id="3761556954875533505">Zezwolić witrynie na edytowanie plików?</translation>
 <translation id="3763433740586298940">Możesz blokować witryny, które Ci nie odpowiadają. Chrome automatycznie usuwa też z listy witryny odwiedzone ponad 30 dni temu.</translation>
 <translation id="3763549179847864476">Przycisk Wstecz Przewodnika po prywatności</translation>
@@ -5869,7 +5867,6 @@
 <translation id="5608580678041221894">Kliknij te przyciski, by zmienić lub przesunąć obszar przycinania</translation>
 <translation id="5609231933459083978">Wygląda na to, że aplikacja jest nieprawidłowa.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Nadal nie można zweryfikować Twojego hasła. Uwaga: jeśli ostatnio hasło było zmieniane, nowe hasło zostanie zastosowane, gdy się wylogujesz. Tu podaj stare hasło.</translation>
 <translation id="5614190747811328134">Informacje dla użytkownika</translation>
 <translation id="5614553682702429503">Zapisać hasło?</translation>
 <translation id="5614947000616625327">Pęk kluczy iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 4f314ae..ce2b996 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -3224,7 +3224,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">Use 99 letras ou menos para palavras novas</translation>
 <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Sua impressão digital ainda não foi reconhecida. Digite sua senha.</translation>
 <translation id="3476303763173086583">Envie dados de uso e diagnóstico. Ajude a melhorar a experiência do seu filho com o Android enviando automaticamente ao Google dados de diagnóstico, de uso de apps e do dispositivo. Eles não serão usados para identificar seu filho e ajudarão a melhorar o sistema, a estabilidade de apps e muito mais. Alguns dados agregados também ajudarão os apps do Google e os nossos parceiros, como os desenvolvedores Android. Essa <ph name="BEGIN_LINK1" />configuração<ph name="END_LINK1" /> é aplicada pelo proprietário, que pode optar por enviar dados de uso e diagnóstico deste dispositivo para o Google. Se a configuração "Atividade na Web e de apps adicional" estiver ativada para seu filho, esses dados poderão ser salvos na Conta do Google dele. <ph name="BEGIN_LINK2" />Saiba mais<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Falha do sistema ao buscar a política do seu dispositivo.</translation>
 <translation id="347785443197175480">Continuar permitindo que <ph name="HOST" /> acesse sua câmera e seu microfone</translation>
@@ -3591,7 +3590,6 @@
 <translation id="3759933321830434300">Bloquear partes das páginas da Web</translation>
 <translation id="3760460896538743390">Inspecionar página de &amp;fundo</translation>
 <translation id="37613671848467444">Abrir em &amp;janela anônima</translation>
-<translation id="3761390540041101668">Forneça uma descrição clara do problema e as etapas necessárias para reproduzi-lo (se possível)</translation>
 <translation id="3761556954875533505">Permitir que o site edite arquivos?</translation>
 <translation id="3763433740586298940">Você pode bloquear sites indesejados. O Chrome também exclui automaticamente sites que estão na lista há mais de 30 dias.</translation>
 <translation id="3763549179847864476">Botão "Voltar" do Guia de privacidade</translation>
@@ -5904,7 +5902,6 @@
 <translation id="5608580678041221894">Toque nas teclas a seguir para ajustar ou mover a área de corte</translation>
 <translation id="5609231933459083978">Este aplicativo parece ser inválido.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Não foi possível confirmar sua senha. Nota: se você alterou sua senha recentemente, a nova senha será aplicada depois que você sair. Use a senha antiga aqui.</translation>
 <translation id="5614190747811328134">Aviso para o usuário</translation>
 <translation id="5614553682702429503">Salvar senha?</translation>
 <translation id="5614947000616625327">Chaves do iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 414dc30b..a76754b 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -3210,7 +3210,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">Utilize 99 letras ou menos para novas palavras.</translation>
 <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Lamentamos, mas a sua impressão digital ainda não foi reconhecida. Introduza a palavra-passe.</translation>
 <translation id="3476303763173086583">Envie dados de utilização e diagnóstico. Ajude a melhorar a experiência Android da criança ao enviar automaticamente dados de diagnóstico, de utilização de aplicações e do dispositivo para a Google. Estes dados não serão utilizados para identificar a criança e ajudarão a melhorar a estabilidade das aplicações e do sistema, entre outras melhorias. Alguns dados agregados também ajudarão as aplicações e os parceiros Google, como os programadores Android. Esta <ph name="BEGIN_LINK1" />definição<ph name="END_LINK1" /> é aplicada pelo proprietário. O proprietário pode optar por enviar dados de diagnóstico e de utilização deste dispositivo para a Google. Se a definição Atividade da Web e de apps adicional estiver ativada para a criança, estes dados podem ser guardados na respetiva Conta Google. <ph name="BEGIN_LINK2" />Saiba mais<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ups! O sistema não conseguiu obter a política para o seu dispositivo.</translation>
 <translation id="347785443197175480">Continuar a permitir que <ph name="HOST" /> aceda à sua câmara e microfone</translation>
@@ -3577,7 +3576,6 @@
 <translation id="3759933321830434300">Bloquear partes de páginas Web</translation>
 <translation id="3760460896538743390">Inspecionar Página de Fundo</translation>
 <translation id="37613671848467444">Abrir na Janela de &amp;Navegação Anónima</translation>
-<translation id="3761390540041101668">Descreva claramente o problema e os passos para recriá-lo (se possível)</translation>
 <translation id="3761556954875533505">Permitir que o site edite ficheiros?</translation>
 <translation id="3763433740586298940">Pode bloquear sites que não quer. O Chrome também elimina automaticamente os sites da lista com mais de 30 dias.</translation>
 <translation id="3763549179847864476">Botão anterior do Guia de privacidade</translation>
@@ -5889,7 +5887,6 @@
 <translation id="5608580678041221894">Toque nas teclas seguintes para ajustar ou mover a área de recorte</translation>
 <translation id="5609231933459083978">A aplicação parece ser inválida.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Lamentamos, mas não foi possível confirmar a sua palavra-passe. Nota: se alterou a palavra-passe recentemente, a nova palavra-passe será aplicada quando terminar sessão. Utilize a palavra-passe antiga aqui.</translation>
 <translation id="5614190747811328134">Aviso ao utilizador</translation>
 <translation id="5614553682702429503">Guardar a palavra-passe?</translation>
 <translation id="5614947000616625327">Porta-chaves iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 6fe85516..529fbdca 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1646,6 +1646,7 @@
 <translation id="2249111429176737533">Deschide ca fereastră cu file</translation>
 <translation id="2249605167705922988">de ex., 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Personalizează informațiile folosite de site-uri pentru a-ți afișa anunțuri</translation>
+<translation id="2250624716625396929">Această filă folosește camera foto și microfonul</translation>
 <translation id="2251218783371366160">Deschideți cu Utilitarul de vizualizare al sistemului</translation>
 <translation id="225163402930830576">Actualizează rețelele</translation>
 <translation id="2251809247798634662">Fereastră incognito nouă</translation>
@@ -3209,7 +3210,6 @@
 <translation id="3473479545200714844">Lupă de ecran</translation>
 <translation id="3474218480460386727">Folosește maximum 99 de litere pentru cuvintele noi</translation>
 <translation id="3474624961160222204">Continuă ca <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Ne pare rău, amprenta nu este recunoscută. Introdu parola.</translation>
 <translation id="3476303763173086583">Trimite date de utilizare și diagnosticare. Contribuie la îmbunătățirea experienței Android a copilului trimițând automat la Google date de diagnosticare și utilizare a dispozitivului și a aplicațiilor. Acestea nu vor fi folosite la identificarea copilului și vor ajuta la stabilitatea sistemului, a aplicațiilor și altele. Unele date cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android. Această <ph name="BEGIN_LINK1" />setare<ph name="END_LINK1" /> este impusă de proprietar. Proprietarul poate alege să trimită date de diagnosticare și utilizare a dispozitivului la Google. Dacă ai activat setarea Activitatea suplimentară de pe web și din aplicații pentru copilul tău, aceste date pot fi salvate în Contul său Google. <ph name="BEGIN_LINK2" />Află mai multe<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Hopa! Sistemul nu a putut prelua politica pentru dispozitivul tău.</translation>
 <translation id="347785443197175480">Permiteți în continuare accesul <ph name="HOST" /> la camera și microfonul dvs.</translation>
@@ -3576,7 +3576,6 @@
 <translation id="3759933321830434300">Blochează părți din paginile web</translation>
 <translation id="3760460896538743390">Inspectați pagina de fun&amp;dal</translation>
 <translation id="37613671848467444">Deschideți într-o &amp;fereastră incognito</translation>
-<translation id="3761390540041101668">Introdu o descriere clară a problemei și pașii pentru reproducerea problemei (dacă este posibil)</translation>
 <translation id="3761556954875533505">Permiți ca site-ul să editeze fișierele?</translation>
 <translation id="3763433740586298940">Poți să blochezi site-urile pe care nu le dorești. În plus, Chrome șterge automat site-urile din listă mai vechi de 30 de zile.</translation>
 <translation id="3763549179847864476">Butonul Înapoi din Ghidul privind confidențialitatea</translation>
@@ -5888,7 +5887,6 @@
 <translation id="5608580678041221894">Atinge următoarele taste ca să ajustezi sau să muți zona de decupare</translation>
 <translation id="5609231933459083978">Aplicația pare să nu fie validă.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Ne pare rău, parola dvs. tot nu a putut fi confirmată. Notă: dacă v-ați schimbat recent parola, aceasta se va aplica după ce vă deconectați. Vă rugăm să utilizați aici parola veche.</translation>
 <translation id="5614190747811328134">Notificare pentru utilizator</translation>
 <translation id="5614553682702429503">Salvezi parola?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6622,6 +6620,7 @@
 <translation id="6202304368170870640">Poți folosi codul PIN ca să te conectezi la dispozitiv sau să-l deblochezi.</translation>
 <translation id="6203247599828309566">Ai salvat o notă pentru o parolă pe acest site. Ca să o vezi, dă clic pe pictograma cheie.</translation>
 <translation id="6205314730813004066">Confidențialitatea anunțurilor</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – înregistrare cu microfonul</translation>
 <translation id="6206199626856438589">Te vei deconecta de la site-urile afișate, inclusiv din filele deschise</translation>
 <translation id="6206311232642889873">Cop&amp;iază imaginea</translation>
 <translation id="6207200176136643843">Resetează la nivelul de zoom prestabilit</translation>
@@ -7175,6 +7174,7 @@
 <translation id="6657585470893396449">Parolă</translation>
 <translation id="6659213950629089752">Această pagină a fost mărită sau micșorată de extensia „<ph name="NAME" />”</translation>
 <translation id="6659594942844771486">Filă</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – înregistrare cu camera foto</translation>
 <translation id="6660819301598582123">Vând muzică de jazz și haine de bun-gust în New-York și Quebec la preț fix.</translation>
 <translation id="666099631117081440">Servere de imprimare</translation>
 <translation id="6662931079349804328">Politica de companie a fost modificată. Butonul Experimente a fost eliminat din bara de instrumente.</translation>
@@ -8988,6 +8988,7 @@
 <translation id="8059417245945632445">&amp;Inspectați dispozitivele</translation>
 <translation id="8059456211585183827">Nu există imprimante de salvat.</translation>
 <translation id="8061091456562007989">Revino la setările inițiale</translation>
+<translation id="8061244502316511332">Această filă folosește microfonul</translation>
 <translation id="8061970399284390013">Verificarea ortografiei și a gramaticii</translation>
 <translation id="8061991877177392872">Se pare că ai configurat deja Voice Match cu Asistentul pe alt dispozitiv. Aceste înregistrări anterioare au fost folosite pentru a crea un model vocal pe acest dispozitiv.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{O coală de hârtie}few{{COUNT} coli de hârtie}other{{COUNT} de coli de hârtie}}</translation>
@@ -9469,6 +9470,7 @@
 <translation id="844063558976952706">Întotdeauna pe acest site</translation>
 <translation id="8441313165929432954">Activează / dezactivează tetheringul</translation>
 <translation id="8443986842926457191">Adresa URL are peste 2.048 de caractere.</translation>
+<translation id="8445281870900174108">Această filă folosește camera foto</translation>
 <translation id="8446884382197647889">Află mai multe</translation>
 <translation id="8447409163267621480">Include Ctrl sau Alt</translation>
 <translation id="844850004779619592">Nu s-a găsit nicio comandă</translation>
@@ -10544,6 +10546,7 @@
 <translation id="981121421437150478">Offline</translation>
 <translation id="983192555821071799">Închide toate filele</translation>
 <translation id="983511809958454316">Această funcție nu este acceptată în RV</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – înregistrare cu camera foto și microfonul</translation>
 <translation id="984275831282074731">Metode de plată</translation>
 <translation id="984705303330760860">Adaugă limbi pentru verificarea ortografiei</translation>
 <translation id="98515147261107953">Peisaj</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index ff9d05d..ee6b7f4 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3210,7 +3210,6 @@
 <translation id="3473479545200714844">Лупа</translation>
 <translation id="3474218480460386727">В новых словах не должно быть больше 99 букв.</translation>
 <translation id="3474624961160222204">Продолжить как <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Не удалось распознать отпечаток пальца. Введите пароль.</translation>
 <translation id="3476303763173086583">Отправка данных о работе устройства. Помогите сделать Android ещё лучше – разрешите автоматически отправлять в Google диагностическую информацию, данные об использовании приложений и самого устройства. Установить личность ребенка по этим данным нельзя. Они нужны нам, чтобы в будущем повысить стабильность приложений и внести другие улучшения. Некоторые данные в обобщенном виде пригодятся партнерам Google, например разработчикам Android. Эта <ph name="BEGIN_LINK1" />настройка<ph name="END_LINK1" /> принудительно применяется владельцем. Он вправе разрешить автоматическую отправку в Google данных об использовании и диагностике устройства. Если запись дополнительной истории приложений и веб-поиска включена, эта информация может сохраняться в аккаунте ребенка. <ph name="BEGIN_LINK2" />Подробнее…<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Не удалось извлечь правила для вашего устройства.</translation>
 <translation id="347785443197175480">Предоставить сайту <ph name="HOST" /> доступ к камере и микрофону</translation>
@@ -3577,7 +3576,6 @@
 <translation id="3759933321830434300">Блокировка элементов веб-страниц</translation>
 <translation id="3760460896538743390">Исследовать &amp;фоновую страницу</translation>
 <translation id="37613671848467444">Открыть в режиме &amp;инкогнито</translation>
-<translation id="3761390540041101668">Ясно опишите проблему и укажите, как ее воспроизвести (если возможно)</translation>
 <translation id="3761556954875533505">Разрешить сайту изменять файлы?</translation>
 <translation id="3763433740586298940">Вы можете заблокировать ненужные сайты. Chrome также автоматически удаляет из списка сайты, добавленные более 30 дней назад.</translation>
 <translation id="3763549179847864476">Кнопка "Назад" на странице руководства по конфиденциальности</translation>
@@ -5889,7 +5887,6 @@
 <translation id="5608580678041221894">Чтобы двигать рамку кадрирования, нажимайте на следующие кнопки</translation>
 <translation id="5609231933459083978">Неизвестное название приложения</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>
 <translation id="5614947000616625327">Связка ключей iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index 0a14f5b5..bb2d990 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -3212,7 +3212,6 @@
 <translation id="3473479545200714844">තිර විශාලකය</translation>
 <translation id="3474218480460386727">නව වචන සඳහා අකුරු 99ක් හෝ ඊට අඩු ගණනක් භාවිත කරන්න</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> ලෙස කරගෙන යන්න</translation>
-<translation id="3475843873335999118">කනගාටුයි, ඔබේ ඇඟිලි සලකුණ තවම හඳුනා ගෙන නැත. කරුණාකර ඔබගේ මුරපදය ඇතුළු කරන්න.</translation>
 <translation id="3476303763173086583">භාවිත සහ දෝෂ නිර්ණ දත්ත යවන්න. ස්වයංක්‍රියව රෝග විනිශ්චය, උපාංග සහ යෙදුම් භාවිත දත්ත Google වෙත යැවීමෙන් ඔබගේ දරුවාගේ Android අත්දැකීම වැඩි දියුණු කර ගැනීමට උපකාරී වන්න. මෙය ඔබේ දරුවා හඳුනා ගැනීමට භාවිත නොකෙරෙන අතර, පද්ධති සහ යෙදුම් ස්ථායිතාවට සහ අනෙකුත් වැඩිදියුණු කිරීම්වලට උදවු කරයි. සමහර එකතු කළ දත්ත Google යෙදුම්වලට සහ Android සංවර්ධකයින් වැනි හවුල්කරුවන්ට ද උදවු කරති. මෙම <ph name="BEGIN_LINK1" />සැකසීම<ph name="END_LINK1" /> හිමිකරු විසින් බලාත්මක කෙරේ. හිමිකරුට Google වෙත ස්වයංක්‍රියව දෝෂ නිර්ණ සහ භාවිත දත්ත යැවීමට තේරිය හැක. ඔබේ දරුවා සඳහා අමතර වෙබ් සහ යෙදුම් ක්‍රියාකාරකම් සැකසීම සක්‍රීය කර තිබේ නම්, මෙම දත්ත ඔවුන්ගේ Google ගිණුමට සුරැකිය හැක. <ph name="BEGIN_LINK2" />තවත් දැන ගන්න<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">අපොයි! ඔබගේ උපාංගය සඳහා ප්‍රතිපත්තිය ලබා ගැනීමට පද්ධතිය අසමත් විය.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> හට ඔබේ කැමරාවට සහ මයික්‍රෆෝනයට පිවිසීමට අඛණ්ඩව ඉඩ දෙන්න</translation>
@@ -3579,7 +3578,6 @@
 <translation id="3759933321830434300">වෙබ් පිටුවල කොටස් අවහිර කරන්න</translation>
 <translation id="3760460896538743390">පසුබිම් පිටුව විමර්ශනය (&amp;B)</translation>
 <translation id="37613671848467444">&amp;අප්‍රකට කවුළුවක විවෘත කරන්න</translation>
-<translation id="3761390540041101668">ගැටලුව පිළිබඳ පැහැදිලි විස්තරයක් සහ ගැටලුව සිදු වූ ආකාරය නැවත ඇති කිරීමට පියවර සපයන්න (හැකි නම්)</translation>
 <translation id="3761556954875533505">වෙබ් අඩවියට ගොනු සංස්කරණ කිරීමට ඉඩ දෙන්නේද?</translation>
 <translation id="3763433740586298940">ඔබට අවශ්‍ය නොවන අඩවි ඔබට අවහිර කළ හැක. Chrome දින 30කට වඩා පැරණි අඩවි ලැයිස්තුවෙන් ස්වයංව ද මකා දමයි.</translation>
 <translation id="3763549179847864476">පෞද්ගලිකත්ව මාර්ගෝපදේශ ආපසු බොත්තම</translation>
@@ -5892,7 +5890,6 @@
 <translation id="5608580678041221894">කප්පාදු ප්‍රදේශය සීරුමාරු කිරීමට හෝ ගෙන යාමට පහත යතුරු තට්ටු කරන්න</translation>
 <translation id="5609231933459083978">මෙම යෙදුම වලංගු නොවන ලෙසක් පෙනේ.</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>
 <translation id="5614947000616625327">iCloud යතුරු දාමය</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 99950e55..4a849e7 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1647,6 +1647,7 @@
 <translation id="2249111429176737533">Otvoriť ako okno s kartami</translation>
 <translation id="2249605167705922988">napr. 1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">Prispôsobenie informácií, na základe ktorých weby zobrazujú reklamy</translation>
+<translation id="2250624716625396929">Táto karta používa vašu kameru a mikrofón</translation>
 <translation id="2251218783371366160">Otvoriť pomocou systémového zobrazovača</translation>
 <translation id="225163402930830576">Obnoviť siete</translation>
 <translation id="2251809247798634662">Nové okno inkognito</translation>
@@ -3210,7 +3211,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">V prípade nových slov použite maximálne 99 písmen</translation>
 <translation id="3474624961160222204">Pokračovať ako <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Ľutujeme, váš odtlačok sa stále nepodarilo rozpoznať. Zadajte heslo.</translation>
 <translation id="3476303763173086583">Odosielať údaje o využití a diagnostiky. Pomôžte zlepšiť prostredie Androidu svojho dieťaťa automatickým odosielaním diagnostík a údajov o používaní zariadenia a aplikácií do Googlu. Nebudú slúžiť na zistenie totožnosti vášho dieťaťa. Pomôžu zvýšiť stabilitu systému a aplikácií a poskytovať ďalšie vylepšenia. Niektoré súhrnné údaje tiež pomôžu aplikáciám Google a partnerom, ako napríklad vývojárom Androidu. Používanie tohto <ph name="BEGIN_LINK1" />nastavenia<ph name="END_LINK1" /> je presadzované vlastníkom. Vlastník môže odosielať Googlu diagnostiky a údaje o používaní pre toto zariadenie. Ak pre dieťa aktivujete dodatočnú aktivitu na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google. <ph name="BEGIN_LINK2" />Ďalšie informácie<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ojoj! Systému sa nepodarilo načítať pravidlo pre vaše zariadenie.</translation>
 <translation id="347785443197175480">Aj naďalej povoliť stránkam <ph name="HOST" /> prístup ku kamere a mikrofónu</translation>
@@ -3577,7 +3577,6 @@
 <translation id="3759933321830434300">Blokovať časti webových stránok</translation>
 <translation id="3760460896538743390">Skontrolovať &amp;stránku na pozadí</translation>
 <translation id="37613671848467444">Otvoriť v &amp;okne inkognito</translation>
-<translation id="3761390540041101668">Jasne opíšte problém aj kroky, ktorými ho môžeme zreprodukovať (ak je to možné)</translation>
 <translation id="3761556954875533505">Chcete povoliť webu upravovať súbory?</translation>
 <translation id="3763433740586298940">Nechcené weby môžete zablokovať. Chrome okrem toho automaticky odstraňuje zo zoznamu weby, ktoré sú staršie ako 30 dní.</translation>
 <translation id="3763549179847864476">Tlačidlo Späť sprievodcu ochranou súkromia</translation>
@@ -5889,7 +5888,6 @@
 <translation id="5608580678041221894">Oblasť orezania môžete upraviť alebo presunúť klepnutím na nasledujúce klávesy</translation>
 <translation id="5609231933459083978">Aplikácia je pravdepodobne neplatná.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Je nám ľúto, stále sa nedarí overiť vaše heslo. Poznámka: Ak ste nedávno zmenili heslo, vaše nové heslo bude použité až po odhlásení. Použite svoje staré heslo.</translation>
 <translation id="5614190747811328134">Oznámenie pre používateľa</translation>
 <translation id="5614553682702429503">Uložiť heslo?</translation>
 <translation id="5614947000616625327">iCloud Kľúčenka</translation>
@@ -6623,6 +6621,7 @@
 <translation id="6202304368170870640">Pomocou kódu PIN sa môžete prihlásiť do zariadenia alebo ho odomknúť.</translation>
 <translation id="6203247599828309566">Uložili ste poznámku k heslu na tomto webe. Ak ju chcete zobraziť, kliknite na ikonu kľúča.</translation>
 <translation id="6205314730813004066">Ochrana súkromia pri reklamách</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – mikrofón nahráva</translation>
 <translation id="6206199626856438589">Systém vás odhlási zo zobrazených webov (aj v otvorených kartách)</translation>
 <translation id="6206311232642889873">&amp;Kopírovať obrázok</translation>
 <translation id="6207200176136643843">Resetovať na predvolenú úroveň lupy</translation>
@@ -7178,6 +7177,7 @@
 <translation id="6657585470893396449">Heslo</translation>
 <translation id="6659213950629089752">Zobrazenie tejto stránky bolo priblížené rozšírením <ph name="NAME" /></translation>
 <translation id="6659594942844771486">Karta</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – kamera nahráva</translation>
 <translation id="6660819301598582123">Kŕdeľ ďatľov učil koňa žrať kôru.</translation>
 <translation id="666099631117081440">Tlačové servery</translation>
 <translation id="6662931079349804328">Zmenili sa pravidlá pre podniky. Tlačidlo Experimenty bolo odstránené z panela s nástrojmi.</translation>
@@ -8990,6 +8990,7 @@
 <translation id="8059417245945632445">&amp;Preskúmať zariadenia</translation>
 <translation id="8059456211585183827">Nemáte žiadne tlačiarne, ktoré môžete uložiť.</translation>
 <translation id="8061091456562007989">Zmeniť na pôvodné</translation>
+<translation id="8061244502316511332">Táto karta používa váš mikrofón</translation>
 <translation id="8061970399284390013">Kontrola pravopisu a gramatiky</translation>
 <translation id="8061991877177392872">Zdá sa, že ste už funkciu Voice Match nastavili pomocou Asistenta v inom zariadení. Pomocou týchto predchádzajúcich záznamov bol vytvorený hlasový model v tomto zariadení.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 hárok papiera}few{{COUNT} hárky papiera}many{{COUNT} hárka papiera}other{{COUNT} hárkov papiera}}</translation>
@@ -9471,6 +9472,7 @@
 <translation id="844063558976952706">Vždy na týchto stránkach</translation>
 <translation id="8441313165929432954">Povoliť alebo zakázať zdieľanie dátového pripojenia</translation>
 <translation id="8443986842926457191">Webová adresa obsahuje viac ako 2 048 znakov.</translation>
+<translation id="8445281870900174108">Táto karta používa vašu kameru</translation>
 <translation id="8446884382197647889">Ďalšie informácie</translation>
 <translation id="8447409163267621480">Použite buď Ctrl, alebo Alt</translation>
 <translation id="844850004779619592">Neboli nájdené žiadne príkazy</translation>
@@ -10547,6 +10549,7 @@
 <translation id="981121421437150478">Offline</translation>
 <translation id="983192555821071799">Zavrieť všetky karty</translation>
 <translation id="983511809958454316">Táto funkcia nie je v režime VR podporovaná</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" />– kamera a mikrofón nahrávajú</translation>
 <translation id="984275831282074731">Spôsoby platby</translation>
 <translation id="984705303330760860">Pridanie jazykov kontroly pravopisu</translation>
 <translation id="98515147261107953">Na šírku</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index e04e6898..b0f9b5a 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1660,6 +1660,7 @@
 <translation id="2249111429176737533">Odprta kot okno na zavihku</translation>
 <translation id="2249605167705922988">npr. 1–5, 8, 11–13</translation>
 <translation id="2249635629516220541">Prilagajanje podatkov, ki jih spletna mesta uporabljajo za prikazovanje oglasov.</translation>
+<translation id="2250624716625396929">Zavihek uporablja kamero in mikrofon</translation>
 <translation id="2251218783371366160">Odpri s sistemskim pregledovalnikom</translation>
 <translation id="225163402930830576">Osveži omrežja</translation>
 <translation id="2251809247798634662">Novo okno brez beleženja zgodovine</translation>
@@ -3226,7 +3227,6 @@
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3474218480460386727">Za nove besede uporabite 99 črk ali manj</translation>
 <translation id="3474624961160222204">Nadaljuj kot <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Prstni odtis še vedno ni prepoznan. Vnesite geslo.</translation>
 <translation id="3476303763173086583">Pošiljanje podatkov o uporabi in diagnostičnih podatkov. Pomagajte izboljšati otrokovo izkušnjo z Androidom s samodejnim pošiljanjem diagnostičnih podatkov ter podatkov o uporabi naprave in aplikacij Googlu. Teh podatkov ne bomo uporabljali, da bi prepoznali vašega otroka, temveč za izboljšanje stabilnosti sistema in izvajanja aplikacij ter drugega. Nekateri združeni podatki bodo pomagali tudi Googlovim aplikacijam in partnerjem, na primer razvijalcem za Android. To <ph name="BEGIN_LINK1" />nastavitev<ph name="END_LINK1" /> je uveljavil lastnik naprave. Lastnik bo morda izbral, da se za to napravo pošiljajo diagnostični podatki in podatki o uporabi Googlu. Če ste za otroka vklopili dodatno beleženje dejavnosti v spletu in aplikacijah, bodo ti podatki morda shranjeni v njegovem računu za Google. <ph name="BEGIN_LINK2" />Več o tem<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ojoj. Sistemu ni uspelo prenesti pravilnika za napravo.</translation>
 <translation id="347785443197175480">Še naprej omogočaj gostitelju <ph name="HOST" /> dostop do kamere in mikrofona</translation>
@@ -3593,7 +3593,6 @@
 <translation id="3759933321830434300">Blokiraj dele spletnih strani</translation>
 <translation id="3760460896538743390">Preglej stran v ozadju</translation>
 <translation id="37613671848467444">Odpri v oknu &amp;brez beleženja zgodovine</translation>
-<translation id="3761390540041101668">Jasno opišite težavo in korake za njeno poustvaritev (če je mogoče)</translation>
 <translation id="3761556954875533505">Želite spletnemu mestu omogočiti, da ureja datoteke?</translation>
 <translation id="3763433740586298940">Spletna mesta, ki jih ne želite, lahko blokirate. Chrome prav tako s seznama samodejno izbriše spletna mesta, starejša od 30 dni.</translation>
 <translation id="3763549179847864476">Gumb za nazaj v vodniku po zasebnosti</translation>
@@ -5907,7 +5906,6 @@
 <translation id="5608580678041221894">Dotaknite se teh tipk, če želite prilagoditi ali premakniti območje za obrezovanje</translation>
 <translation id="5609231933459083978">Videti je, da je aplikacija neveljavna.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Vašega gesla še ni bilo mogoče preveriti. Opomba: Če ste v zadnjem času spremenili geslo, bo novo geslo začelo veljati, ko se odjavite. Tu uporabite starega.</translation>
 <translation id="5614190747811328134">Uporabniško obvestilo</translation>
 <translation id="5614553682702429503">Želite shraniti geslo?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
@@ -6642,6 +6640,7 @@
 <translation id="6202304368170870640">Kodo PIN lahko uporabite za prijavo ali odklepanje naprave.</translation>
 <translation id="6203247599828309566">Shranili ste opombo za geslo na tem spletnem mestu. Če si ga želite ogledati, kliknite ikono ključa.</translation>
 <translation id="6205314730813004066">Zasebnost pri oglaševanju</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> – snemanje z mikrofonom</translation>
 <translation id="6206199626856438589">Odjavljeni boste s prikazanih spletnih mest, vključno s tistimi na odprtih zavihkih.</translation>
 <translation id="6206311232642889873">Kop&amp;iraj sliko</translation>
 <translation id="6207200176136643843">Ponastavitev na privzeto stopnjo povečave/pomanjšave</translation>
@@ -7199,6 +7198,7 @@
 <translation id="6657585470893396449">Geslo</translation>
 <translation id="6659213950629089752">To stran je povečala razširitev »<ph name="NAME" />«</translation>
 <translation id="6659594942844771486">Zavihek</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> – snemanje s kamero</translation>
 <translation id="6660819301598582123">Hitra rjava lisica je preskočila lenega psa.</translation>
 <translation id="666099631117081440">Strežniki za tiskanje</translation>
 <translation id="6662931079349804328">Pravilnik podjetja se je spremenil. Gumb za preizkuse je bil odstranjen iz orodne vrstice.</translation>
@@ -9012,6 +9012,7 @@
 <translation id="8059417245945632445">&amp;Pregled naprav</translation>
 <translation id="8059456211585183827">Ni tiskalnikov za shranjevanje.</translation>
 <translation id="8061091456562007989">Razveljavi spremembo</translation>
+<translation id="8061244502316511332">Zavihek uporablja mikrofon</translation>
 <translation id="8061970399284390013">Preverjanje črkovanja in slovnice</translation>
 <translation id="8061991877177392872">Videti je, da ste Voice Match s Pomočnikom že nastavili v drugi napravi. Te prejšnje posnetke je mogoče uporabiti za ustvarjanje glasovnega modela v tej napravi.</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 list papirja}one{{COUNT} list papirja}two{{COUNT} lista papirja}few{{COUNT} listi papirja}other{{COUNT} listov papirja}}</translation>
@@ -9311,7 +9312,7 @@
 <translation id="8295450130892483256">Namestitev Microsofta 365</translation>
 <translation id="8297292446125062288">Nastavitve vnosne naprave</translation>
 <translation id="8298429963694909221">Zdaj lahko obvestila iz telefona prejemate v napravi <ph name="DEVICE_TYPE" />. Če obvestila opustite v napravi <ph name="DEVICE_TYPE" />, jih opustite tudi v telefonu. Preverite, ali imate telefon v bližini ter ima vklopljeno povezavo Bluetooth in omrežje Wi-Fi.</translation>
-<translation id="829923460755755423">Dodajanje bližnjice Googlovemu upravitelju gesel</translation>
+<translation id="829923460755755423">Dodajanje bližnjice do Googlovega upravitelja gesel</translation>
 <translation id="8299319456683969623">Trenutno ste brez povezave.</translation>
 <translation id="8299951061833867575">Wi-Fi, prenos podatkov v mobilnem omrežju</translation>
 <translation id="8300011035382349091">Urejanje zaznamka za ta zavihek</translation>
@@ -9493,6 +9494,7 @@
 <translation id="844063558976952706">Vedno na tem mestu</translation>
 <translation id="8441313165929432954">Omogočanje/onemogočanje povezave računalnika z internetom prek mobilnega telefona</translation>
 <translation id="8443986842926457191">URL vsebuje več kot 2048 znakov</translation>
+<translation id="8445281870900174108">Zavihek uporablja kamero</translation>
 <translation id="8446884382197647889">Več o tem</translation>
 <translation id="8447409163267621480">Vključevati morajo ali Ctrl ali Alt</translation>
 <translation id="844850004779619592">Najden ni bil noben ukaz</translation>
@@ -10570,6 +10572,7 @@
 <translation id="981121421437150478">Brez povezave</translation>
 <translation id="983192555821071799">Zapri vse zavihke</translation>
 <translation id="983511809958454316">Ta funkcija ni podprta v navidezni resničnosti</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> – snemanje s kamero in mikrofonom</translation>
 <translation id="984275831282074731">Plačilna sredstva</translation>
 <translation id="984705303330760860">Dodajanje jezikov preverjanja črkovanja</translation>
 <translation id="98515147261107953">Ležeče</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 44bfa91..f3eb562 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -3206,7 +3206,6 @@
 <translation id="3473479545200714844">Zmadhuesi i ekranit</translation>
 <translation id="3474218480460386727">Përdor 99 shkronja ose më pak për fjalët e reja</translation>
 <translation id="3474624961160222204">Vazhdo si <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Na vjen keq, por gjurma e gishtit nuk njihet ende. Fut fjalëkalimin tënd.</translation>
 <translation id="3476303763173086583">Dërgo të dhënat e përdorimit dhe të diagnostikimit. Ndihmo në përmirësimin e përvojës së fëmijës tënd me Android duke dërguar automatikisht te Google të dhënat e diagnostikimit dhe të përdorimit të pajisjes dhe aplikacioneve. Këto nuk do të përdoren për të identifikuar fëmijën tënd dhe do të ndihmojnë për qëndrueshmërinë e sistemit dhe të aplikacioneve dhe për përmirësime të tjera. Disa të dhëna të përmbledhura do të ndihmojnë po ashtu aplikacionet dhe partnerët e Google, si p.sh. zhvilluesit e Android. Ky <ph name="BEGIN_LINK1" />cilësim<ph name="END_LINK1" /> zbatohet nga zotëruesi. Zotëruesi mund të zgjedhë të dërgojë te Google të dhënat e diagnostikimit dhe të përdorimit për këtë pajisje. Nëse cilësimi i "Aktivitetit shtesë të uebit dhe të aplikacioneve" është i aktivizuar për fëmijën tënd, këto të dhëna mund të ruhen në "Llogarinë e Google" të fëmijës. <ph name="BEGIN_LINK2" />Mëso më shumë<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Mos! Sistemi nuk arriti të marrë politikën për pajisjen tënde.</translation>
 <translation id="347785443197175480">Vazhdo të lejosh <ph name="HOST" /> që të qaset te kamera dhe mikrofoni</translation>
@@ -3573,7 +3572,6 @@
 <translation id="3759933321830434300">Blloko pjesët e faqeve të uebit</translation>
 <translation id="3760460896538743390">Inspekto &amp;faqen e sfondit</translation>
 <translation id="37613671848467444">Hape në &amp;dritare "të fshehtë"</translation>
-<translation id="3761390540041101668">Jep një përshkrim të qartë të problemit dhe hapat për ta rikrijuar atë (nëse është e mundur)</translation>
 <translation id="3761556954875533505">Do ta lejosh sajtin të modifikojë skedarët?</translation>
 <translation id="3763433740586298940">Mund t'i bllokosh sajtet që nuk i dëshiron. Gjithashtu, Chrome i fshin automatikisht nga lista sajtet që janë më të vjetra se 30 ditë.</translation>
 <translation id="3763549179847864476">Butoni "Prapa" i "Udhëzuesit të privatësisë"</translation>
@@ -5885,7 +5883,6 @@
 <translation id="5608580678041221894">Trokit te tastet e mëposhtme për të rregulluar ose zhvendosur zonën e prerjes</translation>
 <translation id="5609231933459083978">Aplikacioni duket se është i pavlefshëm.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Na vjen keq, por fjalëkalimi sërish nuk mund të verifikohet. Shënim. Nëse ke ndryshuar fjalëkalimin së fundi, fjalëkalimi i ri do të zbatohet pasi të dalësh nga llogaria, prandaj përdor këtu fjalëkalimin e vjetër.</translation>
 <translation id="5614190747811328134">Njoftimi i përdoruesit</translation>
 <translation id="5614553682702429503">Të ruhet fjalëkalimi?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index d231785b..0b010f9 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -3207,7 +3207,6 @@
 <translation id="3473479545200714844">Lupa ekrana</translation>
 <translation id="3474218480460386727">Koristite 99 slova ili manje za nove reči</translation>
 <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Žao nam je, otisak prsta i dalje nije prepoznat. Unesite lozinku.</translation>
 <translation id="3476303763173086583">Šaljite podatke o korišćenju i dijagnostičke podatke. Pomozite nam da poboljšamo Android doživljaj za dete tako što ćete automatski slati Google-u podatke o dijagnostici i korišćenju uređaja i aplikacija. Te informacije se neće koristiti za identifikaciju deteta i pomoći će u održavanju stabilnosti sistema i aplikacije i drugim podešavanjima. Neki objedinjeni podaci će takođe pomoći Google aplikacijama i partnerima, poput Android programera. To <ph name="BEGIN_LINK1" />podešavanje<ph name="END_LINK1" /> primenjuje vlasnik. Vlasnik može da izabere da se podaci o dijagnostici i korišćenju za ovaj uređaj šalju Google-u. Ako za dete uključite podešavanje dodatne aktivnosti na vebu i u aplikacijama, ti podaci će se možda čuvati na Google nalogu deteta. <ph name="BEGIN_LINK2" />Saznajte više<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Ups! Sistem nije uspeo da preuzme smernice za uređaj.</translation>
 <translation id="347785443197175480">I dalje dozvoljavaj sajtu <ph name="HOST" /> da pristupa kameri i mikrofonu</translation>
@@ -3574,7 +3573,6 @@
 <translation id="3759933321830434300">Blokiranje delova veb-stranica</translation>
 <translation id="3760460896538743390">Proveri stranicu &amp;pozadine</translation>
 <translation id="37613671848467444">Otvori u &amp;prozoru bez arhiviranja</translation>
-<translation id="3761390540041101668">Jasno opišite problem i korake za njegovo reprodukovanje (ako je moguće)</translation>
 <translation id="3761556954875533505">Želite li da dozvolite sajtu da menja datoteke?</translation>
 <translation id="3763433740586298940">Možete da blokirate sajtove koje ne želite. Chrome takođe automatski sa liste briše sajtove koji su stariji od 30 dana.</translation>
 <translation id="3763549179847864476">Dugme Nazad za Vodič za privatnost</translation>
@@ -5885,7 +5883,6 @@
 <translation id="5608580678041221894">Dodirnite sledeće tastere da biste prilagodili ili premestili oblast opsecanja</translation>
 <translation id="5609231933459083978">Izgleda da je aplikacija nevažeća.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Žao nam je, još uvek nije moguće verifikovati lozinku. Napomena: Ako ste nedavno promenili lozinku, nova lozinka biće primenjena kada se odjavite. Ovde koristite staru lozinku.</translation>
 <translation id="5614190747811328134">Obaveštenje o korisniku</translation>
 <translation id="5614553682702429503">Želite li da sačuvate lozinku?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index c7a8f9e..1b5459af 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -3207,7 +3207,6 @@
 <translation id="3473479545200714844">Лупа екрана</translation>
 <translation id="3474218480460386727">Користите 99 слова или мање за нове речи</translation>
 <translation id="3474624961160222204">Настави као <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Жао нам је, отисак прста и даље није препознат. Унесите лозинку.</translation>
 <translation id="3476303763173086583">Шаљите податке о коришћењу и дијагностичке податке. Помозите нам да побољшамо Android доживљај за дете тако што ћете аутоматски слати Google-у податке о дијагностици и коришћењу уређаја и апликација. Те информације се неће користити за идентификацију детета и помоћи ће у одржавању стабилности система и апликације и другим подешавањима. Неки обједињени подаци ће такође помоћи Google апликацијама и партнерима, попут Android програмера. То <ph name="BEGIN_LINK1" />подешавање<ph name="END_LINK1" /> примењује власник. Власник може да изабере да се подаци о дијагностици и коришћењу за овај уређај шаљу Google-у. Ако за дете укључите подешавање додатне активности на вебу и у апликацијама, ти подаци ће се можда чувати на Google налогу детета. <ph name="BEGIN_LINK2" />Сазнајте више<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Упс! Систем није успео да преузме смернице за уређај.</translation>
 <translation id="347785443197175480">И даље дозвољавај сајту <ph name="HOST" /> да приступа камери и микрофону</translation>
@@ -3574,7 +3573,6 @@
 <translation id="3759933321830434300">Блокирање делова веб-страница</translation>
 <translation id="3760460896538743390">Провери страницу &amp;позадине</translation>
 <translation id="37613671848467444">Отвори у &amp;прозору без архивирања</translation>
-<translation id="3761390540041101668">Јасно опишите проблем и кораке за његово репродуковање (ако је могуће)</translation>
 <translation id="3761556954875533505">Желите ли да дозволите сајту да мења датотеке?</translation>
 <translation id="3763433740586298940">Можете да блокирате сајтове које не желите. Chrome такође аутоматски са листе брише сајтове који су старији од 30 дана.</translation>
 <translation id="3763549179847864476">Дугме Назад за Водич за приватност</translation>
@@ -5885,7 +5883,6 @@
 <translation id="5608580678041221894">Додирните следеће тастере да бисте прилагодили или преместили област опсецања</translation>
 <translation id="5609231933459083978">Изгледа да је апликација неважећа.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 2f3a7ee..28e76590 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">Skärmförstorare</translation>
 <translation id="3474218480460386727">Nya ord får inte vara längre än 99 tecken</translation>
 <translation id="3474624961160222204">Fortsätt som <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Fingeravtrycket känns fortfarande inte igen. Ange ditt lösenord.</translation>
 <translation id="3476303763173086583">Skicka diagnostik- och användningsdata. Hjälp till att göra Android bättre för ditt barn genom att skicka diagnostikdata, enhetsdata och data om appanvändning till Google automatiskt. Denna data används till att förbättra systemets och apparnas stabilitet med mera och inte till att identifiera ditt barn. Viss samlad data används även till att förbättra appar från Google och partner, till exempel Android-utvecklare. Ägaren har gjort denna <ph name="BEGIN_LINK1" />inställning<ph name="END_LINK1" /> obligatorisk. Ägaren kan ange att diagnostik- och användningsdata om den här enheten ska skickas till Google. Om ytterligare webb- och appaktivitet har aktiverats för ditt barn kan denna data sparas i Google-kontot. <ph name="BEGIN_LINK2" />Läs mer<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Hoppsan! Det gick inte att hämta enhetsprincipen.</translation>
 <translation id="347785443197175480">Fortsätt tillåta att <ph name="HOST" /> använder kameran och mikrofonen</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">Blockera delar av webbsidor</translation>
 <translation id="3760460896538743390">Kontrollera &amp;bakgrundssida</translation>
 <translation id="37613671848467444">Öppna i &amp;inkognitofönster</translation>
-<translation id="3761390540041101668">Ange en tydlig beskrivning av problemet och åtgärder för att återskapa det (om möjligt)</translation>
 <translation id="3761556954875533505">Vill du låta webbplatsen redigera filer?</translation>
 <translation id="3763433740586298940">Du kan blockera webbplatser som du inte vill ha. Chrome raderar även webbplatser som är äldre än 30 dagar automatiskt.</translation>
 <translation id="3763549179847864476">Bakåtknapp i Integritetsguide</translation>
@@ -5903,7 +5901,6 @@
 <translation id="5608580678041221894">Tryck på följande knappar för att justera eller flytta beskärningsområdet</translation>
 <translation id="5609231933459083978">Appen ser ut att vara ogiltig.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Det gick inte att verifiera lösenordet nu heller. Obs! Om du nyligen har bytt lösenord börjar det nya lösenordet gälla när du loggar ut. Använd det gamla lösenordet här.</translation>
 <translation id="5614190747811328134">Meddelande till användaren</translation>
 <translation id="5614553682702429503">Vill du spara lösenordet?</translation>
 <translation id="5614947000616625327">iCloud-nyckelring</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 68c6f951..12367c7 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -3220,7 +3220,6 @@
 <translation id="3473479545200714844">Kikuza skrini</translation>
 <translation id="3474218480460386727">Tumia herufi 99 au chache kwa maneno mapya</translation>
 <translation id="3474624961160222204">Endelea ukitumia <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Samahani, alama yako ya kidole bado haijatambuliwa. Tafadhali weka nenosiri lako.</translation>
 <translation id="3476303763173086583">Tuma data ya matumizi na uchunguzi. Tusaidie kuboresha jinsi mtoto wako anavyotumia Android kwa kutuma kiotomatiki data ya uchunguzi na matumizi ya kifaa na programu kwa Google. Hatutatumia data hii kumtambulisha mtoto wako na itatusaidia kuboresha uthabiti wa programu na mfumo na maboresho mengine. Baadhi ya maelezo yaliyojumlishwa pia yatasaidia programu za Google na washirika kama vile wasanidi programu za Android. <ph name="BEGIN_LINK1" />Mipangilio<ph name="END_LINK1" /> hii inatekelezwa na mmiliki. Mmiliki anaweza kuamua kutuma data ya uchunguzi na matumizi ya kifaa hiki kwa Google. Ikiwa umewasha mipangilio ya historia ya Shughuli za ziada kwenye Wavuti na Programu kwa ajili ya mtoto wako, data hii inaweza kuhifadhiwa kwenye akaunti yake ya Google. <ph name="BEGIN_LINK2" />Pata maelezo zaidi<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Lo!  Mfumo umeshindwa kuleta sera ya kifaa chako.</translation>
 <translation id="347785443197175480">Endelea kuruhusu <ph name="HOST" /> kufikia kamera na maikrofoni yako</translation>
@@ -3587,7 +3586,6 @@
 <translation id="3759933321830434300">Zuia sehemu za kurasa za mtandao</translation>
 <translation id="3760460896538743390">Kagua Ukurasa wa Mandharinyuma</translation>
 <translation id="37613671848467444">Fungua katika &amp;Dirisha Chini kwa chini</translation>
-<translation id="3761390540041101668">Toa maelezo wazi kuhusu hitilafu na hatua za kuzalisha tena hitilafu (ikiwezekana)</translation>
 <translation id="3761556954875533505">Ungependa kuruhusu tovuti ibadilishe faili?</translation>
 <translation id="3763433740586298940">Unaweza kuzuia tovuti ambazo huzitaki. Chrome pia hufuta kiotomatiki tovuti zilizohifadhiwa kwenye orodha kwa zaidi ya siku 30.</translation>
 <translation id="3763549179847864476">Kitufe cha kurudi nyuma cha Mwongozo wa Faragha</translation>
@@ -5898,7 +5896,6 @@
 <translation id="5608580678041221894">Gusa vitufe vinavyofuata ili urekebishe au usogeze eneo la kupunguzia</translation>
 <translation id="5609231933459083978">Programu inaonekana kuwa batili.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index f96c6d2..dfa156c6 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">திரை உருப்பெருக்கி</translation>
 <translation id="3474218480460386727">புதிய சொற்களில் 99 அல்லது அதற்கும் குறைவான எழுத்துகளைப் பயன்படுத்தவும்</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> கணக்கில் தொடர்க</translation>
-<translation id="3475843873335999118">உங்கள் கைரேகையை இன்னும் அடையாளங்காண முடியவில்லை. கடவுச்சொல்லை உள்ளிடவும்.</translation>
 <translation id="3476303763173086583">உபயோகம் &amp; கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை Googleளுக்குத் தானாக அனுப்புவதன் மூலம் உங்கள் பிள்ளையின் Android அனுபவத்தை மேம்படுத்த உதவுக. இது உங்கள் பிள்ளையை அடையாளம் கண்டறியப் பயன்படுத்தப்படாது, இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உரிமையாளர் இந்த <ph name="BEGIN_LINK1" />அமைப்பைச்<ph name="END_LINK1" /> செயல்படுத்தியுள்ளார். உரிமையாளர் இந்தச் சாதனத்தின் கண்டறிதல் தரவையும் உபயோகத் தரவையும் Googleளுக்கு அனுப்புவதற்குத் தேர்வுசெய்யலாம். உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் &amp; ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவரது Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK2" />மேலும் அறிக<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">அச்சச்சோ!  உங்கள் சாதனத்திற்கான கொள்கையைப் பெற முடியவில்லை.</translation>
 <translation id="347785443197175480">உங்கள் கேமராவையும் மைக்ரோஃபோனையும் அணுக <ph name="HOST" /> ஐத் தொடர்ந்து அனுமதி</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">இணைய பக்கங்களின் பகுதியைத் தடுக்கலாம்</translation>
 <translation id="3760460896538743390">&amp;பின்புலப் பக்கத்தை ஆய்வுசெய்</translation>
 <translation id="37613671848467444">&amp;மறைநிலை சாளரத்தில் திற</translation>
-<translation id="3761390540041101668">சிக்கலுக்கான தெளிவான விளக்கத்தையும், முடிந்தால் அதை மறுஉருவாக்கம் செய்வதற்கான படிகளையும் வழங்கவும்</translation>
 <translation id="3761556954875533505">ஃபைல்களைத் திருத்த வலைதளத்தை அனுமதிக்கவா?</translation>
 <translation id="3763433740586298940">உங்களுக்கு விருப்பமில்லாத தளங்களை நீங்கள் தடுக்கலாம். பட்டியலில் இருந்து 30 நாட்களுக்கு முந்தைய தளங்களை Chrome உலாவியும் தானாகவே நீக்கும்.</translation>
 <translation id="3763549179847864476">தனியுரிமை வழிகாட்டியில் இருந்து பின்செல்லும் பட்டன்</translation>
@@ -5903,7 +5901,6 @@
 <translation id="5608580678041221894">செதுக்கும் பகுதியைச் சரிசெய்ய அல்லது நகர்த்த, பின்வரும் விசைகளைத் தட்டவும்</translation>
 <translation id="5609231933459083978">ஆப்ஸ் தவறானது என்பதுபோல் தெரிகிறது.</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>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index baa8f7b..4670210 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -3222,7 +3222,6 @@
 <translation id="3473479545200714844">స్క్రీన్ మాగ్నిఫైయర్</translation>
 <translation id="3474218480460386727">కొత్త పదాలకు 99 అక్షరాలు లేదా తక్కువ ఉపయోగించండి</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> లాగా కొనసాగించండి</translation>
-<translation id="3475843873335999118">క్షమించండి, మీ వేలిముద్ర ఇప్పటికీ గుర్తించబడలేదు. దయచేసి మీ పాస్‌వర్డ్‌ను నమోదు చేయండి.</translation>
 <translation id="3476303763173086583">వినియోగం &amp; విశ్లేషణల డేటాను పంపండి. సమస్య విశ్లేషణ, పరికరం, యాప్ వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకు పంపడం ద్వారా మీ చిన్నారి Android అనుభవాన్ని మెరుగుపరచడంలో సహాయపడండి. ఇది మీ చిన్నారి గురించి గుర్తించడానికి ఉపయోగించబడదు, ఇది కేవలం సిస్టమ్, యాప్ స్థిరత్వానికి, ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత సముదాయ డేటా కూడా Google యాప్‌లకు, అలాగే Android డెవలపర్‌ల లాంటి భాగస్వాములకు సహాయపడుతుంది. ఈ <ph name="BEGIN_LINK1" />సెట్టింగ్‌<ph name="END_LINK1" />ని యజమాని అమలు చేశారు. ఈ పరికరానికి సంబంధించిన విశ్లేషణ, వినియోగ డేటాను Googleకు పంపేలా యజమాని ఎంచుకోవచ్చు. మీ చిన్నారి కోసం అదనపు వెబ్ &amp; యాప్ యాక్టివిటీ సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు. <ph name="BEGIN_LINK2" />మరింత తెలుసుకోండి<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">అయ్యో! మీ పరికరానికి సంబంధించిన విధానాన్ని పొందడంలో సిస్టమ్ విఫలమైంది.</translation>
 <translation id="347785443197175480">మీ కెమెరా మరియు మైక్రోఫోన్‌ను యాక్సెస్ చేయడానికి <ph name="HOST" />ను అనుమతించడాన్ని కొనసాగించండి</translation>
@@ -3589,7 +3588,6 @@
 <translation id="3759933321830434300">వెబ్ పేజీల్లో భాగాలను బ్లాక్ చేయండి</translation>
 <translation id="3760460896538743390">&amp;నేపథ్య పేజీని పర్యవేక్షించండి</translation>
 <translation id="37613671848467444">&amp;ఒక అజ్ఞాత విండోలో తెరువు</translation>
-<translation id="3761390540041101668">సమస్యను స్పష్టంగా వివరించండి, ఆ సమస్యను ఎలా రీప్రొడ్యూస్ చేయాలో దశలను కూడా వివరించండి (వీలైతే)</translation>
 <translation id="3761556954875533505">ఫైల్స్‌ను ఎడిట్ చేయడానికి సైట్‌ను అనుమతించాలనుకుంటున్నారా?</translation>
 <translation id="3763433740586298940">మీకు అవసరం లేని సైట్‌లను మీరు బ్లాక్ చేయవచ్చు. అంతే కాక, 30 రోజుల కంటే పాతవైన సైట్‌లను Chrome ఆటోమేటిక్‌గా లిస్ట్ నుండి తొలగిస్తుంది.</translation>
 <translation id="3763549179847864476">గోప్యతా గైడ్ 'వెనుక'కు బటన్</translation>
@@ -5902,7 +5900,6 @@
 <translation id="5608580678041221894">కత్తిరింపు ప్రాంతాన్ని సర్దుబాటు చేయడానికి లేదా తరలించడానికి కింది కీలను నొక్కండి</translation>
 <translation id="5609231933459083978">అప్లికేష‌న్‌ చెల్లనిదిగా కనిపిస్తోంది.</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>
 <translation id="5614947000616625327">iCloud కీచైన్</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 66001c25..b7a5281 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -3209,7 +3209,6 @@
 <translation id="3473479545200714844">แว่นขยายหน้าจอ</translation>
 <translation id="3474218480460386727">ใช้ตัวอักษรไม่เกิน 99 ตัวสำหรับคำใหม่</translation>
 <translation id="3474624961160222204">ดำเนินการต่อในชื่อ <ph name="NAME" /></translation>
-<translation id="3475843873335999118">ขออภัย ระบบยังคงไม่รู้จักลายนิ้วมือของคุณ โปรดป้อนรหัสผ่าน</translation>
 <translation id="3476303763173086583">ส่งข้อมูลการใช้งานและการวินิจฉัย ช่วยปรับปรุงประสบการณ์การใช้งาน Android ของบุตรหลานให้ดีขึ้นด้วยการส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ โดยจะไม่มีการใช้ข้อมูลนี้ในการระบุชื่อบุตรหลานของคุณ และจะช่วยให้แอปและระบบมีความเสถียร พร้อมทั้งปรับปรุงด้านอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาแอป Android เจ้าของเป็นผู้บังคับใช้<ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" />นี้ เจ้าของอาจเลือกที่จะส่งข้อมูลการวินิจฉัยและการใช้งานสำหรับอุปกรณ์นี้ไปยัง Google หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน <ph name="BEGIN_LINK2" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">อ๊ะ! ระบบไม่สามารถดึงข้อมูลนโยบายจากอุปกรณ์</translation>
 <translation id="347785443197175480">อนุญาตให้ <ph name="HOST" /> เข้าถึงกล้องถ่ายรูปและไมโครโฟนของคุณต่อไป</translation>
@@ -3576,7 +3575,6 @@
 <translation id="3759933321830434300">บล็อกส่วนต่างๆ ของหน้าเว็บ</translation>
 <translation id="3760460896538743390">ตรวจสอบ&amp;หน้าพื้นหลัง</translation>
 <translation id="37613671848467444">เปิดใน&amp;หน้าต่างที่ไม่ระบุตัวตน</translation>
-<translation id="3761390540041101668">ระบุคำอธิบายปัญหาอย่างชัดเจนและขั้นตอนการสร้างปัญหาซ้ำ (หากเป็นไปได้)</translation>
 <translation id="3761556954875533505">อนุญาตให้เว็บไซต์แก้ไขไฟล์ไหม</translation>
 <translation id="3763433740586298940">คุณบล็อกเว็บไซต์ที่ไม่ต้องการได้ นอกจากนี้ Chrome จะลบข้อมูลเว็บไซต์ที่นานเกิน 30 วันออกจากรายการโดยอัตโนมัติ</translation>
 <translation id="3763549179847864476">ปุ่มย้อนกลับของคู่มือความเป็นส่วนตัว</translation>
@@ -5888,7 +5886,6 @@
 <translation id="5608580678041221894">แตะแป้นต่อไปนี้เพื่อปรับหรือเลื่อนพื้นที่ครอบตัด</translation>
 <translation id="5609231933459083978">ดูเหมือนแอปพลิเคชันไม่ถูกต้อง</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>
 <translation id="5614947000616625327">พวงกุญแจ iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 35b99e92..640e74ef 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -3206,7 +3206,6 @@
 <translation id="3473479545200714844">Ekran büyüteci</translation>
 <translation id="3474218480460386727">Yeni kelimeler için 99 veya daha az harf kullanın</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> olarak devam et</translation>
-<translation id="3475843873335999118">Maalesef parmak iziniz hâlâ tanınamadı. Lütfen şifrenizi girin.</translation>
 <translation id="3476303763173086583">Kullanım ve teşhis verilerini gönder. Teşhis, cihaz ve uygulama kullanımı verilerini otomatik olarak Google'a göndererek çocuğunuzun Android deneyiminin iyileştirilmesine yardımcı olun. Bu veriler, çocuğunuzun kimliğini tespit etmek için kullanılmaz; sistem ve uygulama kararlılığı ile diğer özellikleri iyileştirmeye yardımcı olur. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur. Bu <ph name="BEGIN_LINK1" />ayar<ph name="END_LINK1" />, cihazın sahibi tarafından zorunlu kılınmıştır. Cihazın sahibi bu cihazın teşhis ve kullanım verilerini Google'a göndermeyi seçebilir. Çocuğunuz için ek Web ve Uygulama Etkinliği açıksa bu veriler çocuğunuzun Google hesabına kaydedilebilir. <ph name="BEGIN_LINK2" />Daha Fazla Bilgi<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Hay aksi! Sistem, cihazınıza ait politikayı getiremedi.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> sitesinin kamerama ve mikrofonuma erişmesine izin vermeye devam et</translation>
@@ -3573,7 +3572,6 @@
 <translation id="3759933321830434300">Web sayfalarının parçalarını engelleme</translation>
 <translation id="3760460896538743390">&amp;Arka Plan Sayfasını İncele</translation>
 <translation id="37613671848467444">&amp;Gizli Pencerede Aç</translation>
-<translation id="3761390540041101668">Sorunu ve sorunun yeniden üretilmesi için uygulanacak adımları (mümkünse) net bir şekilde açıklayın</translation>
 <translation id="3761556954875533505">Siteye dosyaları düzenleme izni verilsin mi?</translation>
 <translation id="3763433740586298940">İstemediğiniz siteleri engelleyebilirsiniz. Chrome 30 günden daha uzun süre önce ziyaret edilmiş siteleri de otomatik olarak siler.</translation>
 <translation id="3763549179847864476">Gizlilik Rehberi geri düğmesi</translation>
@@ -5885,7 +5883,6 @@
 <translation id="5608580678041221894">Kırpma alanını ayarlamak veya taşımak için aşağıdaki tuşlara dokunun</translation>
 <translation id="5609231933459083978">Uygulamanın geçersiz olduğu görülüyor.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Maalesef şifreniz hâlâ doğrulanamadı. Not: Şifrenizi yakın zamanda değiştirdiyseniz, yeni şifreniz çıkış yapmanızdan sonra geçerli olacaktır. Lütfen burada eski şifrenizi kullanın.</translation>
 <translation id="5614190747811328134">Kullanıcı Bildirimi</translation>
 <translation id="5614553682702429503">Şifre kaydedilsin mi?</translation>
 <translation id="5614947000616625327">iCloud Anahtar Zinciri</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 515ca4c..00555d3 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -3226,7 +3226,6 @@
 <translation id="3473479545200714844">Лупа</translation>
 <translation id="3474218480460386727">Максимальна кількість літер для нових слів – 99</translation>
 <translation id="3474624961160222204">Продовжити як <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Не вдається розпізнати ваш відбиток пальця. Введіть пароль.</translation>
 <translation id="3476303763173086583">Надсилати дані про використання й діагностику. Допоможіть покращити роботу Android для вашої дитини, автоматично надсилаючи в Google дані про діагностику та використання пристрою і додатків. Ця інформація не використовуватиметься для встановлення особи вашої дитини, а допоможе покращити стабільність системи, додатків тощо. Деякі зведені дані також корисні для додатків і партнерів Google, як-от розробників Android. Це <ph name="BEGIN_LINK1" />налаштування<ph name="END_LINK1" /> застосовує власник. Власник може ввімкнути надсилання в Google даних про діагностику й використання цього пристрою. Якщо ввімкнено додаткову Історію додатків і веб-пошуку, ці дані зберігаються в обліковому записі Google дитини. <ph name="BEGIN_LINK2" />Докладніше<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">На жаль, системі не вдалось отримати правило для вашого пристрою.</translation>
 <translation id="347785443197175480">Продовжити надавати хосту <ph name="HOST" /> доступ до ваших камери та мікрофона</translation>
@@ -3593,7 +3592,6 @@
 <translation id="3759933321830434300">Блокувати частини веб-сторінок</translation>
 <translation id="3760460896538743390">Перевірити &amp;фонову сторінку</translation>
 <translation id="37613671848467444">Відкрити в &amp;анонімному вікні</translation>
-<translation id="3761390540041101668">Докладно опишіть проблему й дії, після яких вона виникала (якщо це можливо)</translation>
 <translation id="3761556954875533505">Дозволити сайту змінювати файли?</translation>
 <translation id="3763433740586298940">Ви можете блокувати непотрібні вам сайти. Chrome також автоматично видаляє їх зі списку через 30 днів.</translation>
 <translation id="3763549179847864476">Кнопка виходу зі сторінки посібника з конфіденційності</translation>
@@ -5906,7 +5904,6 @@
 <translation id="5608580678041221894">Торкніться наведених нижче клавіш, щоб змінити чи перемістити область обрізування</translation>
 <translation id="5609231933459083978">Схоже, додаток недійсний.</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>
 <translation id="5614947000616625327">В’язка iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 0a7963a..da17628 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1646,6 +1646,7 @@
 <translation id="2249111429176737533">ٹیب کردہ ونڈو کے طور پر کھولیں</translation>
 <translation id="2249605167705922988">‏مثلاً ‎1-5, 8, 11-13</translation>
 <translation id="2249635629516220541">سائٹس کے ذریعے استعمال کردہ معلومات کو حسب ضرورت بنائیں تاکہ آپ کو اشتہارات دکھایا جا سکے</translation>
+<translation id="2250624716625396929">یہ ٹیب آپ کا کیمرا اور مائیکروفون استعمال کر رہا ہے</translation>
 <translation id="2251218783371366160">سسٹم ویور کے ساتھ کھولیں</translation>
 <translation id="225163402930830576">نیٹ ورکس کو ریفریش کریں</translation>
 <translation id="2251809247798634662">نئی پوشیدگی ونڈو</translation>
@@ -3210,7 +3211,6 @@
 <translation id="3473479545200714844">اسکرین میگنیفائر</translation>
 <translation id="3474218480460386727">نئے الفاظ کے لیے 99 حروف یا کم استعمال کریں</translation>
 <translation id="3474624961160222204">بطور <ph name="NAME" /> جاری رکھیں</translation>
-<translation id="3475843873335999118">معذرت، آپ کا فنگرپرنٹ ابھی بھی تسلیم شدہ نہیں ہے براہ کرم اپنا پاس ورڈ درج کریں۔</translation>
 <translation id="3476303763173086583">‏استعمال اور ڈائیگناسٹک کا ڈیٹا بھیجیں۔ Google کو خودکار طور پر ڈائیگناسٹک، آلے اور ایپ کے استعمال کا ڈیٹا بھیج کر اپنے بچے کا Android تجربہ بہتر بنانے میں مدد کریں۔ اس کا استعمال آپ کے بچے کی شناخت کیلئے نہیں کیا جائے گا اور اس سے سسٹم اور ایپ کے استحکام اور دیگر بہتریوں میں مدد ملے گی۔ کچھ مجموعی ڈیٹا Google ایپس اور پارٹنرز، جیسے Android ڈیولپرز، کی مدد بھی کرے گا۔ اس <ph name="BEGIN_LINK1" />ترتیب<ph name="END_LINK1" /> کو مالک نافذ کرتا ہے۔ مالک Google کو اس آلہ کیلئے ڈائیگناسٹک اور استعمال کا ڈیٹا بھیجنے کا انتخاب کر سکتا ہے۔ اگر آپ کے بچے کیلئے ویب اور ایپ کی اضافی سرگرمی کی ترتیب آن ہے تو اس ڈیٹا کو اس کے Google اکاؤنٹ میں محفوظ کیا جا سکتا ہے۔ <ph name="BEGIN_LINK2" />مزید جانیں<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">افوہ! سسٹم آپ کے آلہ کیلئے پالیسی بازیافت کرنے میں ناکام ہو گیا۔</translation>
 <translation id="347785443197175480"><ph name="HOST" /> کو اپنے کیمرا اور مائیکروفون تک حاصل کرنے کی اجازت دینا جاری رکھیں</translation>
@@ -3577,7 +3577,6 @@
 <translation id="3759933321830434300">ویب صفحات کے کچھ حصے مسدود کریں</translation>
 <translation id="3760460896538743390">&amp;پس منظر کے صفحہ کا معائنہ کریں</translation>
 <translation id="37613671848467444">&amp;پوشیدگی ونڈو میں کھولیں</translation>
-<translation id="3761390540041101668">مسئلہ کی واضح وضاحت اور مسئلہ کو دوبارہ پیش کرنے کے اقدامات فراہم کریں (اگر ممکن ہو)</translation>
 <translation id="3761556954875533505">سائٹ کو فائلز میں ترمیم کرنے دیں؟</translation>
 <translation id="3763433740586298940">‏آپ جن سائٹس کو نہیں چاہتے ہیں انہیں مسدود کر سکتے ہیں۔ Chrome فہرست کی 30 دن سے زیادہ پرانی سائٹس کو بھی خودکار طور پر حذف کر دیتا ہے۔</translation>
 <translation id="3763549179847864476">رازداری کی گائیڈ پر واپس جانے کا بٹن</translation>
@@ -5888,7 +5887,6 @@
 <translation id="5608580678041221894">تراشنے کے علاقہ کو ایڈجسٹ یا منتقل کرنے کیلئے درج ذیل کلیدوں کو تھپتھپائیں</translation>
 <translation id="5609231933459083978">ایپلیکیشن غلط معلوم پڑتی ہے۔</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>
 <translation id="5614947000616625327">‏iCloud کی چین</translation>
@@ -6622,6 +6620,7 @@
 <translation id="6202304368170870640">‏آپ اپنا آلہ غیر مقفل کرنے یا اس میں سائن ان ہونے کے لیے اپنا PIN استعمال کر سکتے ہیں۔</translation>
 <translation id="6203247599828309566">آپ نے اس سائٹ پر پاس ورڈ کے لیے ایک نوٹ محفوظ کیا ہے۔ اسے دیکھنے کے لیے کلید کے آئیکن پر کلک کریں۔</translation>
 <translation id="6205314730813004066">اشتہارات کی رازداری</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - مائیکروفون ریکارڈنگ</translation>
 <translation id="6206199626856438589">اوپن ٹیبز سمیت، آپ ڈسپلے کردہ سائٹس سے سائن آؤٹ ہو جائیں گے</translation>
 <translation id="6206311232642889873">تصویر &amp;کاپی کریں</translation>
 <translation id="6207200176136643843">ڈیفالٹ زوم سطح پر ری سیٹ کریں</translation>
@@ -7173,6 +7172,7 @@
 <translation id="6657585470893396449">پاس ورڈ</translation>
 <translation id="6659213950629089752">اس صفحہ کو "<ph name="NAME" />" ایکسٹینشن کے ذریعہ زوم کیا گیا تھا۔</translation>
 <translation id="6659594942844771486">براؤزر ٹیب</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - کیمرا ریکارڈنگ</translation>
 <translation id="6660819301598582123">تیز بھوری لومڑی نے سست کتے پر چھلانگ لگائی۔</translation>
 <translation id="666099631117081440">پرنٹ سرورز</translation>
 <translation id="6662931079349804328">انٹرپرائز کی پالیسی تبدیل ہو گئی۔ تجربات بٹن کو ٹول بار سے ہٹا دیا گیا۔</translation>
@@ -8984,6 +8984,7 @@
 <translation id="8059417245945632445">آلات کا &amp;معائنہ کریں</translation>
 <translation id="8059456211585183827">محفوظ کرنے کے لیے کوئی پرنٹر دستیاب نہیں ہے۔</translation>
 <translation id="8061091456562007989">اسے واپس تبدیل کریں</translation>
+<translation id="8061244502316511332">یہ ٹیب آپ کا مائیکروفون استعمال کر رہا ہے</translation>
 <translation id="8061970399284390013">ہجے اور گرامر چیک</translation>
 <translation id="8061991877177392872">‏ایسا لگتا ہے کہ آپ نے پہلے ہی کسی دوسرے آلہ پر اپنی اسسٹنٹ کے ساتھ Voice Match کو ترتیب دے دیا ہے۔ ان گزشتہ ریکارڈنگز کا استعمال اس آلہ پر ایک صوتی ماڈل بنانے کے لیے کیا گیا۔</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{پیپر کی 1 شیٹ}other{پیپر کی {COUNT} شیٹس}}</translation>
@@ -9465,6 +9466,7 @@
 <translation id="844063558976952706">ہمیشہ اس سائٹ پر</translation>
 <translation id="8441313165929432954">ٹیدرنگ کو فعال/غیر فعال کریں</translation>
 <translation id="8443986842926457191">‏URL ‏2048 حروف سے زیادہ ہے</translation>
+<translation id="8445281870900174108">یہ ٹیب آپ کا کیمرا استعمال کر رہا ہے</translation>
 <translation id="8446884382197647889">مزید جانیں</translation>
 <translation id="8447409163267621480">‏Ctrl یا Alt شامل کریں</translation>
 <translation id="844850004779619592">کوئی کمانڈ نہیں ملی</translation>
@@ -10539,6 +10541,7 @@
 <translation id="981121421437150478">آف لائن</translation>
 <translation id="983192555821071799">سبھی ٹیبز بند کریں</translation>
 <translation id="983511809958454316">‏یہ خصوصیت VR میں تعاون یافتہ نہیں ہے</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - کیمرا اور مائیکروفون ریکارڈنگ</translation>
 <translation id="984275831282074731">ادائیگی کے طریقے</translation>
 <translation id="984705303330760860">املے کی جانچ کے لیے زبانیں شامل کریں</translation>
 <translation id="98515147261107953">لینڈ اسکیپ</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index 8741d29..8659c54 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -3210,7 +3210,6 @@
 <translation id="3473479545200714844">Ekran lupasi</translation>
 <translation id="3474218480460386727">Yangi soʻzlar kamida 99 harfdan iborat boʻlsin</translation>
 <translation id="3474624961160222204"><ph name="NAME" /> sifatida davom etish</translation>
-<translation id="3475843873335999118">Barmoq izi aniqlanmadi. Parolingizni kiriting.</translation>
 <translation id="3476303763173086583">Foydalanish va diagnostika axborotini yuborish. Diagnostika hamda qurilma va ilovadan foydalanish statistikasini Google kompaniyasiga avtomatik yuborish orqali Androidni yaxshilashga yordam bering. Ushbu axborotdan farzandingiz shaxsini aniqlash uchun foydalanilmaydi. Ular tizim va ilovalar barqarorligi kabilarni yaxshilash uchun ishlatiladi. Ayrim toʻplangan maʼlumotlar Android dasturchilar kabi hamkorlarimizga ham oʻz ilovalari va mahsulotlarini yanada yaxshilashga yordam beradi. Bu <ph name="BEGIN_LINK1" />parametr<ph name="END_LINK1" /> qurilma egasi tomonidan oʻrnatilgan. Qurilma egasi undagi foydalanish haqidagi va diagnostika axborotini Google serverlariga avtomatik yuborilishini tayinlashi mumkin. Agar farzandingiz uchun Kengaytirilgan veb-qidiruv va ilovalar tarixi yoqilgan boʻlsa, bu maʼlumotlar uning Google hisobiga saqlanadi. <ph name="BEGIN_LINK2" />Batafsil<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Tizim qurilmangiz uchun qoidalarni aniqlay olmadi.</translation>
 <translation id="347785443197175480"><ph name="HOST" /> saytiga kamera va mikrofondan foydalanishga ruxsat berish</translation>
@@ -3577,7 +3576,6 @@
 <translation id="3759933321830434300">Veb-sahifalar elementlarini bloklash</translation>
 <translation id="3760460896538743390">&amp;Orqa fon sahifasini ko‘rib chiqish</translation>
 <translation id="37613671848467444">&amp;Inkognito rejimida ochish</translation>
-<translation id="3761390540041101668">Muammoni hal qilish uchun uning aniq tavsifini va bosqichlarini taqdim eting (imkon boʻlsa)</translation>
 <translation id="3761556954875533505">Saytga fayllarni tahrirlashga ruxsat berilsinmi?</translation>
 <translation id="3763433740586298940">Istalgan saytni bloklash mumkin. Shuningdek, Chrome roʻyxatdagi 30 kundan eskirgan saytlarni avtomatik oʻchiradi.</translation>
 <translation id="3763549179847864476">Maxfiylik qoʻllanmasi sahifasida Orqaga tugmasi</translation>
@@ -5890,7 +5888,6 @@
 <translation id="5608580678041221894">Qirqilayotgan maydonni surish yoki moslash uchun quyidagi tugmalar ustiga bosing</translation>
 <translation id="5609231933459083978">Ilova nomi noto‘g‘ri kiritilganga o‘xshaydi.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Parol noto‘g‘ri kiritildi. Unutmangki: bu parol yaqinda o‘zgartirilgan, lekin tizimdan chiqilmagan, yangi parol qo‘llanishi uchun eski parolingizni kiriting.</translation>
 <translation id="5614190747811328134">Foydalanuvchiga eslatma</translation>
 <translation id="5614553682702429503">Parol saqlansinmi?</translation>
 <translation id="5614947000616625327">iCloud Keychain</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 32f2646..1810a6a 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -3223,7 +3223,6 @@
 <translation id="3473479545200714844">Phóng to màn hình</translation>
 <translation id="3474218480460386727">Sử dụng tối đa 99 chữ cái để thêm từ mới</translation>
 <translation id="3474624961160222204">Tiếp tục với tên <ph name="NAME" /></translation>
-<translation id="3475843873335999118">Rất tiếc, vân tay của bạn vẫn chưa được nhận dạng. Vui lòng nhập mật khẩu của bạn.</translation>
 <translation id="3476303763173086583">Gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng. Giúp cải thiện trải nghiệm Android của con bạn bằng cách tự động gửi dữ liệu chẩn đoán cũng như dữ liệu về mức sử dụng ứng dụng và thiết bị cho Google. Những thông tin này sẽ không dùng để nhận dạng con bạn mà giúp tăng độ ổn định của hệ thống và ứng dụng cũng như cải thiện các mặt khác. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android. Mục <ph name="BEGIN_LINK1" />cài đặt<ph name="END_LINK1" /> này do chủ sở hữu thực thi. Chủ sở hữu có thể chọn gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng của thiết bị này cho Google. Nếu bạn bật chế độ cài đặt bổ sung Hoạt động trên web và ứng dụng cho con mình thì dữ liệu này có thể được lưu vào Tài khoản Google của trẻ. <ph name="BEGIN_LINK2" />Tìm hiểu thêm<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Rất tiếc! Hệ thống không tìm nạp được chính sách cho thiết bị của bạn.</translation>
 <translation id="347785443197175480">Tiếp tục cho phép <ph name="HOST" /> truy cập vào máy ảnh và micrô của bạn</translation>
@@ -3590,7 +3589,6 @@
 <translation id="3759933321830434300">Chặn các phần của trang web</translation>
 <translation id="3760460896538743390">Kiểm tra trang &amp;nền</translation>
 <translation id="37613671848467444">Mở trong &amp;Cửa sổ ẩn danh</translation>
-<translation id="3761390540041101668">Cung cấp thông tin mô tả rõ ràng về vấn đề và các bước giúp tái hiện vấn đề (nếu được)</translation>
 <translation id="3761556954875533505">Cho phép trang web chỉnh sửa các tệp?</translation>
 <translation id="3763433740586298940">Bạn có thể chặn những trang web bạn không muốn. Chrome cũng tự động xoá khỏi danh sách những trang web đã hơn 30 ngày bạn không truy cập.</translation>
 <translation id="3763549179847864476">Nút quay lại trên Hướng dẫn về quyền riêng tư</translation>
@@ -5903,7 +5901,6 @@
 <translation id="5608580678041221894">Nhấn các phím sau để điều chỉnh hoặc di chuyển vùng cắt</translation>
 <translation id="5609231933459083978">Ứng dụng này có vẻ không hợp lệ.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Rất tiếc, mật khẩu của bạn vẫn không thể xác minh được. Lưu ý: nếu gần đây bạn đã thay đổi mật khẩu của bạn, mật khẩu mới của bạn sẽ vẫn được áp dụng khi bạn đăng xuất, vui lòng sử dụng mật khẩu cũ của bạn tại đây.</translation>
 <translation id="5614190747811328134">Thông báo Người dùng</translation>
 <translation id="5614553682702429503">Lưu mật khẩu?</translation>
 <translation id="5614947000616625327">Chuỗi khoá iCloud</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 57b9639..16e3414 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1638,6 +1638,7 @@
 <translation id="2249111429176737533">在标签页窗口中打开</translation>
 <translation id="2249605167705922988">例如:1-5、8、11-13</translation>
 <translation id="2249635629516220541">自定义要让网站使用什么信息向您展示广告</translation>
+<translation id="2250624716625396929">此标签页正在使用摄像头和麦克风</translation>
 <translation id="2251218783371366160">使用系统查看器打开</translation>
 <translation id="225163402930830576">刷新网络</translation>
 <translation id="2251809247798634662">打开新的无痕式窗口</translation>
@@ -3200,7 +3201,6 @@
 <translation id="3473479545200714844">屏幕放大镜</translation>
 <translation id="3474218480460386727">新字词最多只能包含 99 个字母</translation>
 <translation id="3474624961160222204">继续以<ph name="NAME" />的身份使用</translation>
-<translation id="3475843873335999118">抱歉,系统仍无法识别您的指纹。请输入您的密码。</translation>
 <translation id="3476303763173086583">发送使用情况数据和诊断数据。通过自动向 Google 发送诊断数据、设备数据和应用使用情况数据,帮助改善您孩子的 Android 使用体验。这些数据不会被用来辨识您孩子的身份,而是会被用来帮助提高系统和应用的稳定性以及实现其他方面的改进。部分汇总数据也会对 Google 应用和合作伙伴(例如 Android 开发者)有所帮助。这项<ph name="BEGIN_LINK1" />设置<ph name="END_LINK1" />是由此设备的所有者强制指定的。此设备的所有者可以选择向 Google 发送此设备的诊断数据和使用情况数据。如果您已为孩子开启“其他网络与应用活动记录”设置,这些数据可能会被保存到其 Google 账号中。<ph name="BEGIN_LINK2" />了解详情<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">糟糕!系统未能成功抓取您设备的政策。</translation>
 <translation id="347785443197175480">继续允许 <ph name="HOST" /> 使用您的摄像头和麦克风</translation>
@@ -3567,7 +3567,6 @@
 <translation id="3759933321830434300">屏蔽部分网页</translation>
 <translation id="3760460896538743390">检查背景页(&amp;B)</translation>
 <translation id="37613671848467444">在隐身窗口中打开(&amp;I)</translation>
-<translation id="3761390540041101668">请清楚描述问题及其重现步骤(如果可能)</translation>
 <translation id="3761556954875533505">允许此网站修改文件?</translation>
 <translation id="3763433740586298940">您可根据自己的需要屏蔽一些网站。Chrome 还会从列表中自动删除保留时长超过 30 天的网站。</translation>
 <translation id="3763549179847864476">“隐私保护指南”返回按钮</translation>
@@ -5878,7 +5877,6 @@
 <translation id="5608580678041221894">按以下键可调整或移动剪裁区域</translation>
 <translation id="5609231933459083978">该应用似乎无效。</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>
 <translation id="5614947000616625327">iCloud 钥匙串</translation>
@@ -6609,6 +6607,7 @@
 <translation id="6202304368170870640">您可以使用 PIN 码登录或解锁您的设备。</translation>
 <translation id="6203247599828309566">您在这个网站上保存了与密码相关的备注。如需查看该备注,请点击钥匙图标。</translation>
 <translation id="6205314730813004066">广告隐私权设置</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - 麦克风正在录音</translation>
 <translation id="6206199626856438589">您将从显示的网站(包括已打开的标签页中的网站)退出账号</translation>
 <translation id="6206311232642889873">复制图片(&amp;Y)</translation>
 <translation id="6207200176136643843">重置为默认缩放级别</translation>
@@ -7160,6 +7159,7 @@
 <translation id="6657585470893396449">密码</translation>
 <translation id="6659213950629089752">此页面已由“<ph name="NAME" />”扩展程序缩放</translation>
 <translation id="6659594942844771486">标签页</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - 摄像头正在录像</translation>
 <translation id="6660819301598582123">敏捷的棕色狐狸跨过懒狗。</translation>
 <translation id="666099631117081440">打印服务器</translation>
 <translation id="6662931079349804328">企业政策已更改。实验按钮已从工具栏移除。</translation>
@@ -8973,6 +8973,7 @@
 <translation id="8059417245945632445">检查设备(&amp;I)</translation>
 <translation id="8059456211585183827">没有可保存的打印机。</translation>
 <translation id="8061091456562007989">改回原来的设置</translation>
+<translation id="8061244502316511332">此标签页正在使用您的麦克风</translation>
 <translation id="8061970399284390013">拼写和语法检查</translation>
 <translation id="8061991877177392872">您似乎已在另一部设备上为 Google 助理设置了 Voice Match。这些先前的语音录音用来在此设备上创建语音模型。</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 张纸}other{{COUNT} 张纸}}</translation>
@@ -9454,6 +9455,7 @@
 <translation id="844063558976952706">始终在该网站上</translation>
 <translation id="8441313165929432954">启用/停用网络共享</translation>
 <translation id="8443986842926457191">网址长度超出了 2048 个字符(上限)</translation>
+<translation id="8445281870900174108">此标签页正在使用您的摄像头</translation>
 <translation id="8446884382197647889">了解详情</translation>
 <translation id="8447409163267621480">必须以 Ctrl 键或 Alt 键开头</translation>
 <translation id="844850004779619592">找不到任何命令</translation>
@@ -10528,6 +10530,7 @@
 <translation id="981121421437150478">离线</translation>
 <translation id="983192555821071799">关闭所有标签页</translation>
 <translation id="983511809958454316">此功能在虚拟现实中不受支持</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - 摄像头正在录像且麦克风正在录音</translation>
 <translation id="984275831282074731">付款方式</translation>
 <translation id="984705303330760860">添加拼写检查语言</translation>
 <translation id="98515147261107953">横向</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 925119e..7205df1 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1657,6 +1657,7 @@
 <translation id="2249111429176737533">在分頁視窗中開啟</translation>
 <translation id="2249605167705922988">例如:1-5、8、11-13</translation>
 <translation id="2249635629516220541">自訂網站可用來顯示廣告的資料</translation>
+<translation id="2250624716625396929">這個分頁正在使用攝影機和麥克風</translation>
 <translation id="2251218783371366160">使用系統檢視器開啟</translation>
 <translation id="225163402930830576">重新整理網絡</translation>
 <translation id="2251809247798634662">新無痕式視窗</translation>
@@ -3223,7 +3224,6 @@
 <translation id="3473479545200714844">放大鏡</translation>
 <translation id="3474218480460386727">新字詞請保持在 99 個字母內</translation>
 <translation id="3474624961160222204">以「<ph name="NAME" />」的身分繼續</translation>
-<translation id="3475843873335999118">很抱歉,系統仍然無法識別您的指紋,請輸入您的密碼。</translation>
 <translation id="3476303763173086583">傳送使用情況和診斷資料。自動將診斷、裝置及應用程式的使用情況資料傳送至 Google,協助改善您子女的 Android 使用體驗。這些資料不會用來識別您子女的身分,而是用於改善系統和應用程式的穩定性和其他效能。部分彙整資料也會用於協助 Google 應用程式與合作夥伴 (例如 Android 開發人員)。擁有者可強制執行此<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />。擁有者可選擇是否將此裝置的診斷和使用情況資料傳送給 Google。如果已為子女開啟其他「網絡及應用程式活動記錄」設定,系統可能會將此資料儲存至其 Google 帳戶。<ph name="BEGIN_LINK2" />瞭解詳情<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">抱歉!系統無法擷取裝置政策。</translation>
 <translation id="347785443197175480">繼續允許 <ph name="HOST" /> 存取您的相機和麥克風</translation>
@@ -3590,7 +3590,6 @@
 <translation id="3759933321830434300">封鎖網頁部分內容</translation>
 <translation id="3760460896538743390">檢查背景頁面(&amp;B)</translation>
 <translation id="37613671848467444">在無痕式視窗中開啟(&amp;I)</translation>
-<translation id="3761390540041101668">請清楚描述問題,並盡量提供重現問題的步驟</translation>
 <translation id="3761556954875533505">要允許網站編輯檔案嗎?</translation>
 <translation id="3763433740586298940">您可封鎖不想要的網站。Chrome 亦會從清單自動刪除超過 30 日的網站。</translation>
 <translation id="3763549179847864476">私隱權指南返回掣</translation>
@@ -5899,7 +5898,6 @@
 <translation id="5608580678041221894">輕按以下按鍵即可調整或移動裁剪區域</translation>
 <translation id="5609231933459083978">這似乎是無效的應用程式。</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>
 <translation id="5614947000616625327">iCloud 鑰匙圈</translation>
@@ -6631,6 +6629,7 @@
 <translation id="6202304368170870640">您可使用 PIN 登入或解鎖裝置。</translation>
 <translation id="6203247599828309566">你儲存咗呢個網站某個密碼嘅備註。如要查看該備註,請按一下鎖匙圖示。</translation>
 <translation id="6205314730813004066">廣告私隱權</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - 麥克風正在錄音</translation>
 <translation id="6206199626856438589">您將會從已顯示的網站 (包括已開啟的分頁) 中登出</translation>
 <translation id="6206311232642889873">複製圖片(&amp;Y)</translation>
 <translation id="6207200176136643843">重設為預設縮放等級</translation>
@@ -7182,6 +7181,7 @@
 <translation id="6657585470893396449">密碼</translation>
 <translation id="6659213950629089752">「<ph name="NAME" />」擴充功能已調整這個專頁的大小</translation>
 <translation id="6659594942844771486">分頁</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - 攝影機正在錄影</translation>
 <translation id="6660819301598582123">狐狗大鬥法。</translation>
 <translation id="666099631117081440">列印伺服器</translation>
 <translation id="6662931079349804328">企業政策改咗,已經喺工具列度移除咗實驗掣。</translation>
@@ -8994,6 +8994,7 @@
 <translation id="8059417245945632445">檢查裝置 (&amp;I)</translation>
 <translation id="8059456211585183827">冇可以儲存嘅打印機。</translation>
 <translation id="8061091456562007989">還原設定</translation>
+<translation id="8061244502316511332">這個分頁正在使用麥克風</translation>
 <translation id="8061970399284390013">拼字和文法檢查</translation>
 <translation id="8061991877177392872">您似乎已在另一部裝置上透過「Google 助理」設定了 Voice Match 功能。系統已使用先前的錄音在此裝置上建立語音模型。</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 張紙}other{{COUNT} 張紙}}</translation>
@@ -9475,6 +9476,7 @@
 <translation id="844063558976952706">一律在此網站上允許</translation>
 <translation id="8441313165929432954">啟用/停用網絡共享</translation>
 <translation id="8443986842926457191">網址超過 2048 個字元</translation>
+<translation id="8445281870900174108">這個分頁正在使用攝影機</translation>
 <translation id="8446884382197647889">瞭解詳情</translation>
 <translation id="8447409163267621480">必須以 Ctrl 或 Alt 鍵開頭</translation>
 <translation id="844850004779619592">找不到指令</translation>
@@ -10549,6 +10551,7 @@
 <translation id="981121421437150478">離線</translation>
 <translation id="983192555821071799">關閉所有分頁</translation>
 <translation id="983511809958454316">無法在 VR 狀態下使用此功能</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - 攝影機和麥克風正在錄影和錄音</translation>
 <translation id="984275831282074731">付款方法</translation>
 <translation id="984705303330760860">新增拼字檢查語言</translation>
 <translation id="98515147261107953">橫向</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index fb22b54..7d777f8b 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1645,6 +1645,7 @@
 <translation id="2249111429176737533">在分頁視窗中開啟</translation>
 <translation id="2249605167705922988">例如:1-5、8、11-13</translation>
 <translation id="2249635629516220541">自訂網站可用來顯示廣告的資訊</translation>
+<translation id="2250624716625396929">這個分頁正在使用攝影機和麥克風</translation>
 <translation id="2251218783371366160">使用系統檢視器開啟</translation>
 <translation id="225163402930830576">重新整理網路</translation>
 <translation id="2251809247798634662">新增無痕視窗</translation>
@@ -3208,7 +3209,6 @@
 <translation id="3473479545200714844">畫面放大鏡</translation>
 <translation id="3474218480460386727">新字詞請保持在 99 個字母以內</translation>
 <translation id="3474624961160222204">以「<ph name="NAME" />」的身分繼續</translation>
-<translation id="3475843873335999118">很抱歉,系統仍然無法辨識你的指紋。請輸入你的密碼。</translation>
 <translation id="3476303763173086583">傳送使用狀況與診斷資料。讓系統自動將診斷資料以及裝置和應用程式的使用狀況資料傳送給 Google,協助改善你的 Android 使用體驗。這些資料將有助於系統和應用程式提高穩定性及做出其他改善,並不會用於識別貴子女的身分。部分匯總資料還能夠為 Google 應用程式和合作夥伴 (例如 Android 開發人員) 提供幫助。這項<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />是由裝置擁有者執行。擁有者可選擇將這個裝置的診斷資料與使用狀況資料傳送給 Google。如果貴子女的「其他網路和應用程式活動」設定為開啟,系統可能會將這些資料儲存到他們的 Google 帳戶。<ph name="BEGIN_LINK2" />瞭解詳情<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">糟糕!系統無法擷取裝置政策。</translation>
 <translation id="347785443197175480">繼續允許 <ph name="HOST" /> 存取你的攝影機和麥克風</translation>
@@ -3575,7 +3575,6 @@
 <translation id="3759933321830434300">封鎖網頁部分內容</translation>
 <translation id="3760460896538743390">檢查背景頁面(&amp;B)</translation>
 <translation id="37613671848467444">在無痕視窗中開啟(&amp;I)</translation>
-<translation id="3761390540041101668">請清楚說明問題,並盡可能提供重現問題的步驟</translation>
 <translation id="3761556954875533505">要允許網站編輯檔案嗎?</translation>
 <translation id="3763433740586298940">如果不想讓網站儲存造訪資訊,建議你封鎖這些網站。Chrome 也會自動將 30 天前的網站從清單中刪除。</translation>
 <translation id="3763549179847864476">「隱私權指南」返回按鈕</translation>
@@ -5886,7 +5885,6 @@
 <translation id="5608580678041221894">輕觸下列按鍵可調整或移動裁剪區域</translation>
 <translation id="5609231933459083978">這似乎是無效的應用程式。</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>
 <translation id="5614947000616625327">iCloud 鑰匙圈</translation>
@@ -6616,6 +6614,7 @@
 <translation id="6202304368170870640">你可以使用 PIN 碼登入裝置,或將裝置解鎖。</translation>
 <translation id="6203247599828309566">你已儲存這個網站的某個密碼的附註。如要查看該附註,請按一下鑰匙圖示。</translation>
 <translation id="6205314730813004066">廣告隱私權設定</translation>
+<translation id="6205993460077903908"><ph name="WINDOW_TITLE" /> - 麥克風正在錄音</translation>
 <translation id="6206199626856438589">系統會將你登出所顯示的網站,包含已開啟的分頁</translation>
 <translation id="6206311232642889873">複製圖片(&amp;Y)</translation>
 <translation id="6207200176136643843">重設為預設縮放等級</translation>
@@ -7167,6 +7166,7 @@
 <translation id="6657585470893396449">密碼</translation>
 <translation id="6659213950629089752">「<ph name="NAME" />」擴充功能已調整這個頁面的大小</translation>
 <translation id="6659594942844771486">分頁</translation>
+<translation id="6660099350750552197"><ph name="WINDOW_TITLE" /> - 攝影機正在錄影</translation>
 <translation id="6660819301598582123">敏捷的棕色狐狸跳過一條懶狗。</translation>
 <translation id="666099631117081440">印表機伺服器</translation>
 <translation id="6662931079349804328">企業政策已變更,[實驗性功能] 按鈕已從工具列移除。</translation>
@@ -8980,6 +8980,7 @@
 <translation id="8059417245945632445">檢查裝置 (&amp;I)</translation>
 <translation id="8059456211585183827">沒有可供儲存的印表機。</translation>
 <translation id="8061091456562007989">還原設定</translation>
+<translation id="8061244502316511332">這個分頁正在使用麥克風</translation>
 <translation id="8061970399284390013">拼字與文法檢查</translation>
 <translation id="8061991877177392872">你似乎已在其他裝置上設定 Google 助理的 Voice Match 功能。系統已使用先前的錄音檔在這部裝置上建立語音模型。</translation>
 <translation id="8062844841289846053">{COUNT,plural, =1{1 張紙}other{{COUNT} 張紙}}</translation>
@@ -9461,6 +9462,7 @@
 <translation id="844063558976952706">永遠在這個網站上使用</translation>
 <translation id="8441313165929432954">啟用/停用網路共用</translation>
 <translation id="8443986842926457191">網址包含的字元數超過 2048 個</translation>
+<translation id="8445281870900174108">這個分頁正在使用攝影機</translation>
 <translation id="8446884382197647889">瞭解詳情</translation>
 <translation id="8447409163267621480">必須包含 Ctrl 或 Alt 鍵</translation>
 <translation id="844850004779619592">找不到任何指令</translation>
@@ -10535,6 +10537,7 @@
 <translation id="981121421437150478">離線</translation>
 <translation id="983192555821071799">關閉所有分頁</translation>
 <translation id="983511809958454316">無法在 VR 狀態下使用這項功能</translation>
+<translation id="983531994960412650"><ph name="WINDOW_TITLE" /> - 攝影機和麥克風正在錄影和錄音</translation>
 <translation id="984275831282074731">付款方式</translation>
 <translation id="984705303330760860">新增拼字檢查支援的語言</translation>
 <translation id="98515147261107953">橫向</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index c28121bc..b5587be 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -3225,7 +3225,6 @@
 <translation id="3473479545200714844">Isisondezi-skrini</translation>
 <translation id="3474218480460386727">Sebenzisa amaletha angu-99 noma ambalwa kumagama amasha</translation>
 <translation id="3474624961160222204">Qhubeka njengo-<ph name="NAME" /></translation>
-<translation id="3475843873335999118">Uxolo, isigxivizo sakho somunwe asibonakali. Sicela ufake iphasiwedi yakho.</translation>
 <translation id="3476303763173086583">Thumela idatha yokusetshenziswa neyokuxilonga. Siza ukuthuthukisa umuzwa we-Android wengane yakho ngokuthumela ngokuzenzakalela idatha yokuxilonga, yedivayisi, neyokusetshenziswa kohlelo lokusebenza ku-Google. Lokhu ngeke kusetshenziselwe ukukhomba ingane yakho futhi kuzosiza ukuzinza kwesistimu nokohlelo lokusebenza nokunye ukuthuthukiswa. Enye idatha izophinda isize izinhlelo zokusebenza ze-Google nozakwethu, abafana nonjiniyela be-Android. Lesi <ph name="BEGIN_LINK1" />silungiselelo<ph name="END_LINK1" /> siphoqelelwa umnikazi. Umnikazi angakhetha ukuthumela idatha yokuxilonga neyokusetshenziswa yale divayisi ku-Google. Uma isilungiselelo esingeziwe sewebhu nesohlelo lokusebenza sivulelwe ingane yakho, le datha ingalondolozwa ku-akhawunti yakhe ye-Google. <ph name="BEGIN_LINK2" />Funda kabanzi<ph name="END_LINK2" /></translation>
 <translation id="347670947055184738">Eshu!  Isistimu yehlulekile ukulanda inqubomgomo yedivayisi yakho.</translation>
 <translation id="347785443197175480">Qhubeka uvumele i-<ph name="HOST" /> ukuthi ifinyelele kukhamela yakho nemakrofoni</translation>
@@ -3592,7 +3591,6 @@
 <translation id="3759933321830434300">Vimba izingxenye zamakhasi wewebhu</translation>
 <translation id="3760460896538743390">Hlola ikhasi elingemuva</translation>
 <translation id="37613671848467444">Vula ku-&amp;Incognito Window</translation>
-<translation id="3761390540041101668">Nikeza incazelo ecacile yenkinga nezinyathelo zokukhiqiza kabusha inkinga (uma kungenzeka)</translation>
 <translation id="3761556954875533505">Vumela isayithi lihlele amafayela?</translation>
 <translation id="3763433740586298940">Ungavimba amasayithi ongawafuni. I-Chrome iphinda isuse ngokuzenzekela amasayithi ohlwini oludala kunezinsuku ezingama-30.</translation>
 <translation id="3763549179847864476">Inkinobho yasemuva Yomhlahlandlela Wobumfihlo</translation>
@@ -5904,7 +5902,6 @@
 <translation id="5608580678041221894">Thepha okhiye abalandelayo ukuze ulungise noma uhambise indawo yokusika</translation>
 <translation id="5609231933459083978">Uhlelo lokusebenza lubonakala lungavumelekile.</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
-<translation id="5612734644261457353">Uxolo, iphasiwedi yakho namanje ayikwazanga ukuqinisekiswa. Yazi: Uma uguqule iphasiwedi kamuva nje, iphasiwedi yakho entsha izosetshenziswa ngemuva kokuthi uphume ngemvume, sicela usebenzise iphasiwedi endala lapha.</translation>
 <translation id="5614190747811328134">Isaziso somsebenzisi</translation>
 <translation id="5614553682702429503">Londoloza iphasiwedi?</translation>
 <translation id="5614947000616625327">I-iCloud Keychain</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index 4a0f2f0..27df641 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -15,7 +15,7 @@
 <translation id="1194807384646768652">Chromium ने इस डाउनलोड को ब्लॉक किया है, क्योंकि इस तरह की फ़ाइल आम तौर पर डाउनलोड नहीं की जाती और यह खतरनाक हो सकती है</translation>
 <translation id="1203500561924088507">इंस्टॉल करने के लिए धन्यवाद. <ph name="BUNDLE_NAME" /> का इस्तेमाल करने से पहले, ब्राउज़र को रीस्टार्ट करना ज़रूरी है.</translation>
 <translation id="1278833599417554002">&amp;Chrome को अपडेट करने के लिए फिर से लॉन्च करें</translation>
-<translation id="1302523850133262269">कृपया Chrome के द्वारा नवीनतम सिस्टम अपडेट इंस्टॉल करने के दौरान प्रतीक्षा करें.</translation>
+<translation id="1302523850133262269">कृपया Chrome के द्वारा नवीनतम सिस्टम अपडेट इंस्टॉल करने के दौरान इंतज़ार करें.</translation>
 <translation id="1335640173511558774"><ph name="MANAGER" /> के मुताबिक, यह ज़रूरी है कि इस डिवाइस का इस्तेमाल करने से पहले आप सेवा की इन शर्तों को पढ़ें और स्वीकार करें. इन शर्तों से, Google ChromeOS Flex की शर्तों में कोई नई शर्त नहीं जुड़ती, न ही उनमें कोई बदलाव होता है, और न ही उन्हें सीमित किया जाता है.</translation>
 <translation id="1341711321000856656">पासवर्ड देखने के लिए, Chrome की किसी दूसरी प्रोफ़ाइल पर स्विच करें</translation>
 <translation id="1363996462118479832">साइन इन करने के दौरान हुई किसी गड़बड़ी की वजह से, ChromeOS आपके डेटा को सिंक नहीं कर सका.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index f260b1b..d017f09b 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -440,7 +440,7 @@
 <translation id="8270775718612349140">Potrdila, ki jih upravlja Chrome</translation>
 <translation id="8286862437124483331">Google Chrome poskuša prikazati gesla. Če želite omogočiti to, vnesite geslo za Windows.</translation>
 <translation id="8290100596633877290">Opa! Google Chrome se je zrušil. Ga želite znova zagnati?</translation>
-<translation id="829923460755755423">Dodajanje bližnjice Googlovemu upravitelju gesel</translation>
+<translation id="829923460755755423">Dodajanje bližnjice do Googlovega upravitelja gesel</translation>
 <translation id="8336463659890584292">Ko spletno mesto zahteva zasebno vnaprejšnje nalaganje povezav na svoji strani, Chrome uporabi Googlove strežnike. S tem je vaša identiteta skrita pred vnaprej naloženim mestom, vendar Google izve, katera spletna mesta se vnaprej nalagajo.</translation>
 <translation id="8342675569599923794">Ta datoteka je nevarna, zato jo je Chrome blokiral.</translation>
 <translation id="8349795646647783032"><ph name="BEGIN_BOLD" />Kako uporabljamo te podatke:<ph name="END_BOLD" /> Spletna mesta lahko v Chromu shranjujejo podatke o vaših zanimanjih. Če na primer obiščete spletno mesto zaradi nakupa športnih copatov za maraton, bo spletno mesto morda določilo vaše zanimanje kot udeleževanje maratonov. Če pozneje obiščete drugo spletno mesto za registriranje za tek, vam lahko to spletno mesto glede na vaša zanimanja prikaže oglas za tekaško obutev.</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index bb24dd6..a3a1f48 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -216,6 +216,7 @@
 #include "third_party/blink/public/common/switches.h"
 #include "ui/accessibility/accessibility_features.h"
 #include "ui/accessibility/accessibility_switches.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/compositor/compositor_switches.h"
@@ -325,7 +326,6 @@
 #endif
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ui/ozone/buildflags.h"
 #include "ui/ozone/public/ozone_switches.h"
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
 
@@ -477,11 +477,11 @@
     {flag_descriptions::kOzonePlatformHintChoiceDefault, "", ""},
     {flag_descriptions::kOzonePlatformHintChoiceAuto,
      switches::kOzonePlatformHint, "auto"},
-#if BUILDFLAG(OZONE_PLATFORM_X11)
+#if BUILDFLAG(IS_OZONE_X11)
     {flag_descriptions::kOzonePlatformHintChoiceX11,
      switches::kOzonePlatformHint, "x11"},
 #endif
-#if BUILDFLAG(OZONE_PLATFORM_WAYLAND)
+#if BUILDFLAG(IS_OZONE_WAYLAND)
     {flag_descriptions::kOzonePlatformHintChoiceWayland,
      switches::kOzonePlatformHint, "wayland"},
 #endif
@@ -5962,11 +5962,6 @@
      flag_descriptions::kAndroidAppIntegrationDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegration)},
 
-    {"android-app-integration-safesearch",
-     flag_descriptions::kAndroidAppIntegrationSafeSearchName,
-     flag_descriptions::kAndroidAppIntegrationSafeSearchDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegrationSafeSearch)},
-
     {"auxiliary-search-donation",
      flag_descriptions::kAuxiliarySearchDonationName,
      flag_descriptions::kAuxiliarySearchDonationDescription, kOsAndroid,
@@ -6411,10 +6406,6 @@
      flag_descriptions::kEnableRemoveStalePolicyPinnedAppsFromShelfDescription,
      kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kRemoveStalePolicyPinnedAppsFromShelf)},
-    {"handwriting-gesture-editing",
-     flag_descriptions::kHandwritingGestureEditingName,
-     flag_descriptions::kHandwritingGestureEditingDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(ash::features::kHandwritingGestureEditing)},
     {"handwriting-legacy-recognition",
      flag_descriptions::kHandwritingLegacyRecognitionName,
      flag_descriptions::kHandwritingLegacyRecognitionDescription, kOsCrOS,
@@ -9095,12 +9086,6 @@
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
-    {"privacy-guide-android", flag_descriptions::kPrivacyGuideAndroidName,
-     flag_descriptions::kPrivacyGuideAndroidDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(features::kPrivacyGuideAndroid)},
-#endif
-
-#if BUILDFLAG(IS_ANDROID)
     {"privacy-guide-android-3", flag_descriptions::kPrivacyGuideAndroid3Name,
      flag_descriptions::kPrivacyGuideAndroid3Description, kOsAndroid,
      FEATURE_VALUE_TYPE(features::kPrivacyGuideAndroid3)},
@@ -9768,13 +9753,6 @@
 #endif  // BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_ANDROID)
-    {"request-desktop-site-additions",
-     flag_descriptions::kRequestDesktopSiteAdditionsName,
-     flag_descriptions::kRequestDesktopSiteAdditionsDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(features::kRequestDesktopSiteAdditions)},
-#endif  // BUILDFLAG(IS_ANDROID)
-
-#if BUILDFLAG(IS_ANDROID)
     {"request-desktop-site-defaults",
      flag_descriptions::kRequestDesktopSiteDefaultsName,
      flag_descriptions::kRequestDesktopSiteDefaultsDescription, kOsAndroid,
@@ -11087,6 +11065,13 @@
      FEATURE_VALUE_TYPE(syncer::kPassExplicitSyncPassphraseToGmsCore)},
 #endif
 
+#if BUILDFLAG(IS_MAC)
+    {"enable-mac-ime-live-conversion-fix",
+     flag_descriptions::kMacImeLiveConversionFixName,
+     flag_descriptions::kMacImeLiveConversionFixDescription, kOsMac,
+     FEATURE_VALUE_TYPE(features::kMacImeLiveConversionFix)},
+#endif
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
@@ -11188,8 +11173,8 @@
 
 bool ShouldSkipConditionalFeatureEntry(const flags_ui::FlagsStorage* storage,
                                        const FeatureEntry& entry) {
-  version_info::Channel channel = chrome::GetChannel();
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+  version_info::Channel channel = chrome::GetChannel();
   // enable-projector-server-side-speech-recognition is only available if
   // the InternalServerSideSpeechRecognitionControl flag is enabled as well.
   if (!strcmp(kProjectorServerSideSpeechRecognition, entry.internal_name)) {
@@ -11353,14 +11338,6 @@
   }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-  // enable-unsafe-webgpu is only available on Dev/Canary channels.
-  if (!strcmp("enable-unsafe-webgpu", entry.internal_name) &&
-      channel != version_info::Channel::DEV &&
-      channel != version_info::Channel::CANARY &&
-      channel != version_info::Channel::UNKNOWN) {
-    return true;
-  }
-
   if (flags::IsFlagExpired(storage, entry.internal_name)) {
     return true;
   }
diff --git a/chrome/browser/android/auxiliary_search/auxiliary_search_provider.cc b/chrome/browser/android/auxiliary_search/auxiliary_search_provider.cc
index d7e22c9..d69e64f 100644
--- a/chrome/browser/android/auxiliary_search/auxiliary_search_provider.cc
+++ b/chrome/browser/android/auxiliary_search/auxiliary_search_provider.cc
@@ -143,23 +143,6 @@
   return ToJavaByteArray(env, serialized_group);
 }
 
-base::android::ScopedJavaLocalRef<jobjectArray>
-AuxiliarySearchProvider::GetSearchableTabs(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobjectArray>& j_tabs_android) const {
-  std::vector<TabAndroid*> all_tabs = TabAndroid::GetAllNativeTabs(
-      env, base::android::ScopedJavaLocalRef(j_tabs_android));
-  std::vector<base::WeakPtr<TabAndroid>> filtered_tabs =
-      FilterTabsByScheme(all_tabs);
-
-  std::vector<base::android::ScopedJavaLocalRef<jobject>> j_filtered_tabs;
-  j_filtered_tabs.reserve(filtered_tabs.size());
-  for (base::WeakPtr<TabAndroid> tab : filtered_tabs) {
-    j_filtered_tabs.push_back(tab->GetJavaObject());
-  }
-  return base::android::ToJavaArrayOfObjects(env, j_filtered_tabs);
-}
-
 void AuxiliarySearchProvider::GetNonSensitiveTabs(
     JNIEnv* env,
     const base::android::JavaParamRef<jobjectArray>& j_tabs_android,
diff --git a/chrome/browser/android/auxiliary_search/auxiliary_search_provider.h b/chrome/browser/android/auxiliary_search/auxiliary_search_provider.h
index 6364022..747310f 100644
--- a/chrome/browser/android/auxiliary_search/auxiliary_search_provider.h
+++ b/chrome/browser/android/auxiliary_search/auxiliary_search_provider.h
@@ -34,10 +34,6 @@
   base::android::ScopedJavaLocalRef<jbyteArray> GetBookmarksSearchableData(
       JNIEnv* env) const;
 
-  base::android::ScopedJavaLocalRef<jobjectArray> GetSearchableTabs(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobjectArray>& j_tabs_android) const;
-
   void GetNonSensitiveTabs(
       JNIEnv* env,
       const base::android::JavaParamRef<jobjectArray>& j_tabs_android,
diff --git a/chrome/browser/android/chrome_backup_agent.cc b/chrome/browser/android/chrome_backup_agent.cc
index 7c62a506..267b837 100644
--- a/chrome/browser/android/chrome_backup_agent.cc
+++ b/chrome/browser/android/chrome_backup_agent.cc
@@ -9,6 +9,8 @@
 #include <vector>
 
 #include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/json/json_string_value_serializer.h"
 #include "chrome/android/chrome_jni_headers/ChromeBackupAgentImpl_jni.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/prefs/pref_service.h"
@@ -19,7 +21,7 @@
 
 static_assert(47 == syncer::GetNumModelTypes(),
               "If the new type has a corresponding pref, add it here");
-const char* backed_up_preferences_[] = {
+const char* backed_up_bool_preferences_[] = {
     syncer::prefs::internal::kSyncKeepEverythingSynced,
     syncer::prefs::internal::kSyncAutofill,
     syncer::prefs::internal::kSyncBookmarks,
@@ -32,6 +34,9 @@
     syncer::prefs::internal::kSyncTabs,
 };
 
+const char* backed_up_account_settings_preference_ =
+    syncer::prefs::internal::kSelectedTypesPerAccount;
+
 }  // namespace
 
 static base::android::ScopedJavaLocalRef<jobjectArray>
@@ -39,7 +44,7 @@
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& jcaller) {
   return base::android::ToJavaArrayOfStrings(env,
-                                             android::GetBackupPrefNames());
+                                             android::GetBackupBoolPrefNames());
 }
 
 static base::android::ScopedJavaLocalRef<jbooleanArray>
@@ -47,11 +52,11 @@
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& jcaller) {
   PrefService* prefs = ProfileManager::GetLastUsedProfile()->GetPrefs();
-  constexpr int pref_count = std::size(backed_up_preferences_);
+  constexpr int pref_count = std::size(backed_up_bool_preferences_);
   jboolean values[pref_count];
 
   for (int i = 0; i < pref_count; i++) {
-    values[i] = prefs->GetBoolean(backed_up_preferences_[i]);
+    values[i] = prefs->GetBoolean(backed_up_bool_preferences_[i]);
   }
   jbooleanArray array = env->NewBooleanArray(pref_count);
   env->SetBooleanArrayRegion(array, 0, pref_count, values);
@@ -68,7 +73,8 @@
   std::vector<bool> pref_values;
   base::android::JavaBooleanArrayToBoolVector(env, values, &pref_values);
   std::unordered_set<std::string> valid_prefs(
-      std::begin(backed_up_preferences_), std::end(backed_up_preferences_));
+      std::begin(backed_up_bool_preferences_),
+      std::end(backed_up_bool_preferences_));
 
   PrefService* prefs = ProfileManager::GetLastUsedProfile()->GetPrefs();
   for (unsigned int i = 0; i < pref_names.size(); i++) {
@@ -79,11 +85,38 @@
   prefs->CommitPendingWrite();
 }
 
+static base::android::ScopedJavaLocalRef<jstring>
+JNI_ChromeBackupAgentImpl_GetAccountSettingsBackupName(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller) {
+  return base::android::ConvertUTF8ToJavaString(
+      env, backed_up_account_settings_preference_);
+}
+
+static base::android::ScopedJavaLocalRef<jstring>
+JNI_ChromeBackupAgentImpl_GetAccountSettingsBackupValue(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller) {
+  PrefService* prefs = ProfileManager::GetLastUsedProfile()->GetPrefs();
+  const base::Value::Dict& account_settings =
+      prefs->GetDict(backed_up_account_settings_preference_);
+
+  std::string serialized_dict;
+  JSONStringValueSerializer serializer(&serialized_dict);
+  const bool serializer_result = serializer.Serialize(account_settings);
+  CHECK(serializer_result);
+  return base::android::ConvertUTF8ToJavaString(env, serialized_dict);
+}
+
 namespace android {
 
-std::vector<std::string> GetBackupPrefNames() {
-  return std::vector<std::string>(std::begin(backed_up_preferences_),
-                                  std::end(backed_up_preferences_));
+std::vector<std::string> GetBackupBoolPrefNames() {
+  return std::vector<std::string>(std::begin(backed_up_bool_preferences_),
+                                  std::end(backed_up_bool_preferences_));
+}
+
+std::string GetBackupAccountSettingsPrefName() {
+  return backed_up_account_settings_preference_;
 }
 
 base::android::ScopedJavaLocalRef<jobjectArray> GetBoolBackupNamesForTesting(
@@ -106,4 +139,18 @@
   JNI_ChromeBackupAgentImpl_SetBoolBackupPrefs(env, jcaller, names, values);
 }
 
+base::android::ScopedJavaLocalRef<jstring>
+GetAccountSettingsBackupNameForTesting(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller) {
+  return JNI_ChromeBackupAgentImpl_GetAccountSettingsBackupName(env, jcaller);
+}
+
+base::android::ScopedJavaLocalRef<jstring>
+GetAccountSettingsBackupValueForTesting(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller) {
+  return JNI_ChromeBackupAgentImpl_GetAccountSettingsBackupValue(env, jcaller);
+}
+
 }  //  namespace android
diff --git a/chrome/browser/android/chrome_backup_agent.h b/chrome/browser/android/chrome_backup_agent.h
index 5d4d94f0..1a4cd09 100644
--- a/chrome/browser/android/chrome_backup_agent.h
+++ b/chrome/browser/android/chrome_backup_agent.h
@@ -12,7 +12,8 @@
 
 namespace android {
 
-std::vector<std::string> GetBackupPrefNames();
+std::vector<std::string> GetBackupBoolPrefNames();
+std::string GetBackupAccountSettingsPrefName();
 
 // Test interface wrapping the static functions that are only called from Java.
 base::android::ScopedJavaLocalRef<jobjectArray> GetBoolBackupNamesForTesting(
@@ -26,6 +27,14 @@
     const base::android::JavaParamRef<jobject>& jcaller,
     const base::android::JavaParamRef<jobjectArray>& names,
     const base::android::JavaParamRef<jbooleanArray>& values);
+base::android::ScopedJavaLocalRef<jstring>
+GetAccountSettingsBackupNameForTesting(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller);
+base::android::ScopedJavaLocalRef<jstring>
+GetAccountSettingsBackupValueForTesting(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller);
 
 }  //  namespace android
 
diff --git a/chrome/browser/android/chrome_backup_agent_unittest.cc b/chrome/browser/android/chrome_backup_agent_unittest.cc
index 6e8df06..e1bc2c7 100644
--- a/chrome/browser/android/chrome_backup_agent_unittest.cc
+++ b/chrome/browser/android/chrome_backup_agent_unittest.cc
@@ -9,6 +9,8 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/json/json_string_value_serializer.h"
 #include "base/memory/raw_ptr.h"
 #include "base/values.h"
 #include "chrome/browser/android/chrome_backup_agent.h"
@@ -34,7 +36,9 @@
 class ChromeBackupAgentTest : public ::testing::Test {
  protected:
   ChromeBackupAgentTest()
-      : expected_pref_names_(GetBackupPrefNames()),
+      : expected_bool_pref_names_(GetBackupBoolPrefNames()),
+        expected_account_settings_pref_name_(
+            GetBackupAccountSettingsPrefName()),
         testing_profile_manager_(TestingBrowserProcess::GetGlobal()),
         env_(AttachCurrentThread()) {}
 
@@ -49,7 +53,8 @@
   }
 
   content::BrowserTaskEnvironment task_environment_;
-  std::vector<std::string> expected_pref_names_;
+  std::vector<std::string> expected_bool_pref_names_;
+  std::string expected_account_settings_pref_name_;
   TestingProfileManager testing_profile_manager_;
   raw_ptr<TestingProfile> testing_profile_;
   raw_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_;
@@ -63,7 +68,7 @@
   std::vector<std::string> pref_names;
   AppendJavaStringArrayToStringVector(AttachCurrentThread(), result,
                                       &pref_names);
-  EXPECT_EQ(expected_pref_names_, pref_names);
+  EXPECT_EQ(expected_bool_pref_names_, pref_names);
 }
 
 TEST_F(ChromeBackupAgentTest, GetBoolBackupValues_AllDefault) {
@@ -71,13 +76,13 @@
       GetBoolBackupValuesForTesting(env_, JavaParamRef<jobject>(nullptr));
   std::vector<bool> values;
   JavaBooleanArrayToBoolVector(env_, result, &values);
-  ASSERT_EQ(expected_pref_names_.size(), values.size());
+  ASSERT_EQ(expected_bool_pref_names_.size(), values.size());
   for (size_t i = 0; i < values.size(); i++) {
     const base::Value* default_pref_value =
-        pref_service_->GetDefaultPrefValue(expected_pref_names_[i]);
+        pref_service_->GetDefaultPrefValue(expected_bool_pref_names_[i]);
     ASSERT_TRUE(default_pref_value->is_bool());
     EXPECT_EQ(default_pref_value->GetBool(), values[i])
-        << "i = " << i << ", " << expected_pref_names_[i];
+        << "i = " << i << ", " << expected_bool_pref_names_[i];
   }
 }
 
@@ -89,50 +94,119 @@
       GetBoolBackupValuesForTesting(env_, JavaParamRef<jobject>(nullptr));
   std::vector<bool> values;
   JavaBooleanArrayToBoolVector(env_, result, &values);
-  ASSERT_EQ(expected_pref_names_.size(), values.size());
+  ASSERT_EQ(expected_bool_pref_names_.size(), values.size());
   for (size_t i = 0; i < values.size(); i++) {
     const base::Value* default_pref_value =
-        pref_service_->GetDefaultPrefValue(expected_pref_names_[i]);
+        pref_service_->GetDefaultPrefValue(expected_bool_pref_names_[i]);
     ASSERT_TRUE(default_pref_value->is_bool());
     EXPECT_EQ(default_pref_value->GetBool(), values[i])
-        << "i = " << i << ", " << expected_pref_names_[i];
+        << "i = " << i << ", " << expected_bool_pref_names_[i];
   }
 }
 
 TEST_F(ChromeBackupAgentTest, GetBoolBackupValues_RelevantChange) {
   // Change one of the values we care about
-  pref_service_->SetBoolean(expected_pref_names_[3], false);
+  pref_service_->SetBoolean(expected_bool_pref_names_[3], false);
   ScopedJavaLocalRef<jbooleanArray> result =
       GetBoolBackupValuesForTesting(env_, JavaParamRef<jobject>(nullptr));
   std::vector<bool> values;
   JavaBooleanArrayToBoolVector(env_, result, &values);
-  ASSERT_EQ(expected_pref_names_.size(), values.size());
+  ASSERT_EQ(expected_bool_pref_names_.size(), values.size());
   for (size_t i = 0; i < values.size(); i++) {
-    EXPECT_EQ(pref_service_->GetBoolean(expected_pref_names_[i]), values[i])
-        << "i = " << i << ", " << expected_pref_names_[i];
+    EXPECT_EQ(pref_service_->GetBoolean(expected_bool_pref_names_[i]),
+              values[i])
+        << "i = " << i << ", " << expected_bool_pref_names_[i];
   }
 }
 
 TEST_F(ChromeBackupAgentTest, SetBoolBackupValues) {
   ScopedJavaLocalRef<jobjectArray> narray =
-      ToJavaArrayOfStrings(env_, expected_pref_names_);
-  bool* values = new bool[expected_pref_names_.size()];
-  for (size_t i = 0; i < expected_pref_names_.size(); i++) {
+      ToJavaArrayOfStrings(env_, expected_bool_pref_names_);
+  bool* values = new bool[expected_bool_pref_names_.size()];
+  for (size_t i = 0; i < expected_bool_pref_names_.size(); i++) {
     values[i] = false;
   }
   // Set a couple of the values to true.
   values[5] = true;
   values[8] = true;
   ScopedJavaLocalRef<jbooleanArray> varray =
-      ToJavaBooleanArray(env_, values, expected_pref_names_.size());
+      ToJavaBooleanArray(env_, values, expected_bool_pref_names_.size());
   SetBoolBackupPrefsForTesting(env_, JavaParamRef<jobject>(nullptr),
                                JavaParamRef<jobjectArray>(env_, narray.obj()),
                                JavaParamRef<jbooleanArray>(env_, varray.obj()));
-  for (size_t i = 0; i < expected_pref_names_.size(); i++) {
-    EXPECT_EQ(values[i], pref_service_->GetBoolean(expected_pref_names_[i]))
-        << "i = " << i << ", " << expected_pref_names_[i];
+  for (size_t i = 0; i < expected_bool_pref_names_.size(); i++) {
+    EXPECT_EQ(values[i],
+              pref_service_->GetBoolean(expected_bool_pref_names_[i]))
+        << "i = " << i << ", " << expected_bool_pref_names_[i];
   }
   EXPECT_FALSE(pref_service_->GetBoolean("dummy"));
 }
 
+TEST_F(ChromeBackupAgentTest, GetAccountSettingsBackupName) {
+  ScopedJavaLocalRef<jstring> result = GetAccountSettingsBackupNameForTesting(
+      env_, JavaParamRef<jobject>(nullptr));
+  std::string pref_name = base::android::ConvertJavaStringToUTF8(env_, result);
+  EXPECT_EQ(expected_account_settings_pref_name_, pref_name);
+}
+
+TEST_F(ChromeBackupAgentTest, GetAccountSettingsBackupValue_DefaultValue) {
+  const ScopedJavaLocalRef<jstring> result =
+      GetAccountSettingsBackupValueForTesting(env_,
+                                              JavaParamRef<jobject>(nullptr));
+  const std::string serialized_pref_value =
+      base::android::ConvertJavaStringToUTF8(env_, result);
+  const base::Value::Dict& default_pref_value =
+      pref_service_->GetDefaultPrefValue(expected_account_settings_pref_name_)
+          ->GetDict();
+
+  // TODO(crbug.com/1493706): Replace this by the deserialization method.
+  int error_code;
+  std::string error_message;
+  JSONStringValueDeserializer deserializer(serialized_pref_value);
+  const std::unique_ptr<const base::Value> deserialized_pref_value =
+      deserializer.Deserialize(&error_code, &error_message);
+
+  ASSERT_NE(deserialized_pref_value, nullptr) << error_message;
+  ASSERT_TRUE(deserialized_pref_value.get()->is_dict());
+  EXPECT_EQ(default_pref_value, deserialized_pref_value->GetDict())
+      << "Expected dict: \n"
+      << default_pref_value.DebugString() << "Deserialized dict: \n"
+      << deserialized_pref_value->DebugString();
+}
+
+TEST_F(ChromeBackupAgentTest, GetAccountSettingsBackupValue_ChangedValue) {
+  base::Value::Dict new_pref_value = base::Value::Dict()
+                                         .Set("id_1", base::Value::Dict()
+                                                          .Set("bool1", false)
+                                                          .Set("bool2", true)
+                                                          .Set("bool3", false))
+                                         .Set("id_2", base::Value::Dict()
+                                                          .Set("bool1", true)
+                                                          .Set("bool2", false)
+                                                          .Set("bool3", true));
+
+  pref_service_->SetDict(expected_account_settings_pref_name_,
+                         new_pref_value.Clone());
+
+  const ScopedJavaLocalRef<jstring> result =
+      GetAccountSettingsBackupValueForTesting(env_,
+                                              JavaParamRef<jobject>(nullptr));
+  const std::string serialized_pref_value =
+      base::android::ConvertJavaStringToUTF8(env_, result);
+
+  // TODO(crbug.com/1493706): Replace this by the deserialization method.
+  int error_code;
+  std::string error_message;
+  JSONStringValueDeserializer deserializer(serialized_pref_value);
+  const std::unique_ptr<const base::Value> deserialized_pref_value =
+      deserializer.Deserialize(&error_code, &error_message);
+
+  ASSERT_NE(deserialized_pref_value, nullptr) << error_message;
+  ASSERT_TRUE(deserialized_pref_value.get()->is_dict());
+  EXPECT_EQ(new_pref_value, deserialized_pref_value->GetDict())
+      << "Expected dict: \n"
+      << new_pref_value.DebugString() << "Deserialized dict: \n"
+      << deserialized_pref_value->DebugString();
+}
+
 }  //  namespace android
diff --git a/chrome/browser/android/chrome_backup_watcher.cc b/chrome/browser/android/chrome_backup_watcher.cc
index f8fd59f2..ffbaa2f 100644
--- a/chrome/browser/android/chrome_backup_watcher.cc
+++ b/chrome/browser/android/chrome_backup_watcher.cc
@@ -27,9 +27,11 @@
   registrar_.Init(profile->GetPrefs());
   base::RepeatingClosure callback =
       base::BindRepeating(&BackupPrefsChanged, java_watcher_);
-  for (const std::string& pref_name : GetBackupPrefNames()) {
+  for (const std::string& pref_name : GetBackupBoolPrefNames()) {
     registrar_.Add(pref_name, callback);
   }
+
+  registrar_.Add(GetBackupAccountSettingsPrefName(), callback);
 }
 
 ChromeBackupWatcher::~ChromeBackupWatcher() {}
diff --git a/chrome/browser/android/preferences/browser_prefs_android.cc b/chrome/browser/android/preferences/browser_prefs_android.cc
index fd1fcae..114b2395 100644
--- a/chrome/browser/android/preferences/browser_prefs_android.cc
+++ b/chrome/browser/android/preferences/browser_prefs_android.cc
@@ -21,10 +21,6 @@
 
 void RegisterUserProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
   NotificationPlatformBridgeAndroid::RegisterProfilePrefs(registry);
-  registry->RegisterBooleanPref(prefs::kDesktopSitePeripheralSettingEnabled,
-                                false);
-  registry->RegisterBooleanPref(prefs::kDesktopSiteDisplaySettingEnabled,
-                                false);
   registry->RegisterBooleanPref(prefs::kDesktopSiteWindowSettingEnabled, false);
 }
 
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
index 952db251c..bc27c8d 100644
--- a/chrome/browser/android/tab_android.cc
+++ b/chrome/browser/android/tab_android.cc
@@ -18,7 +18,6 @@
 #include "base/trace_event/trace_event.h"
 #include "cc/slim/layer.h"
 #include "chrome/android/chrome_jni_headers/TabImpl_jni.h"
-#include "chrome/android/chrome_jni_headers/TabUtils_jni.h"
 #include "chrome/browser/android/background_tab_manager.h"
 #include "chrome/browser/android/compositor/tab_content_manager.h"
 #include "chrome/browser/android/tab_web_contents_delegate_android.h"
@@ -281,12 +280,6 @@
   return Java_TabImpl_isHidden(env, weak_java_tab_.get(env));
 }
 
-bool TabAndroid::isHardwareKeyboardAvailable(TabAndroid* tab_android) {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  return Java_TabUtils_isHardwareKeyboardAvailable(
-      env, tab_android->GetJavaObject());
-}
-
 void TabAndroid::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
 }
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h
index 6ce62295..4aa91d8b 100644
--- a/chrome/browser/android/tab_android.h
+++ b/chrome/browser/android/tab_android.h
@@ -130,8 +130,6 @@
   bool IsCustomTab();
   bool IsHidden();
 
-  static bool isHardwareKeyboardAvailable(TabAndroid* tab_android);
-
   // Observers -----------------------------------------------------------------
 
   // Adds/Removes an Observer.
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index 6bdb0e1b..7ce88a9 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -5238,6 +5238,7 @@
     "arc/input_overlay/touch_injector_unittest.cc",
     "arc/input_overlay/ui/action_view_unittest.cc",
     "arc/input_overlay/ui/button_options_menu_unittest.cc",
+    "arc/input_overlay/ui/delete_edit_shortcut_unittest.cc",
     "arc/input_overlay/ui/edit_label_unittest.cc",
     "arc/input_overlay/ui/editing_list_unittest.cc",
     "arc/input_overlay/ui/menu_entry_view_unittest.cc",
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action.cc b/chrome/browser/ash/arc/input_overlay/actions/action.cc
index 3609c039..cbfd919 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/action.cc
@@ -117,8 +117,9 @@
 }
 
 void LogTouchEvents(const std::list<ui::TouchEvent>& events) {
-  for (auto& event : events)
+  for (auto& event : events) {
     LogEvent(event);
+  }
 }
 
 std::optional<std::pair<ui::DomCode, int>> ParseKeyboardKey(
@@ -129,7 +130,7 @@
     LOG(ERROR) << "No key-value for {" << key_name << "}.";
     return std::nullopt;
   }
-  auto code = ui::KeycodeConverter::CodeStringToDomCode(*key);
+  const auto code = ui::KeycodeConverter::CodeStringToDomCode(*key);
   if (code == ui::DomCode::NONE) {
     LOG(ERROR)
         << "Invalid key code string. It should be similar to {KeyA}, but got {"
@@ -199,10 +200,8 @@
   }
 
   // Location can be empty for mouse related actions.
-  const base::Value::List* position = value.FindList(kLocation);
-  if (position) {
-    auto parsed_pos = ParseLocation(*position);
-    if (!parsed_pos.empty()) {
+  if (const base::Value::List* position = value.FindList(kLocation)) {
+    if (auto parsed_pos = ParseLocation(*position); !parsed_pos.empty()) {
       original_positions_ = parsed_pos;
       on_left_or_middle_side_ =
           (original_positions_.front().anchor().x() <= kHalf);
@@ -463,7 +462,7 @@
   }
 
   const auto& content_bounds = touch_injector_->content_bounds_f();
-  int min = std::min(content_bounds.width(), content_bounds.height());
+  const int min = std::min(content_bounds.width(), content_bounds.height());
   return std::max(static_cast<int>(*radius_ * min), kMinRadius);
 }
 
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action_move.cc b/chrome/browser/ash/arc/input_overlay/actions/action_move.cc
index 060bcfe..0c3b018 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action_move.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/action_move.cc
@@ -104,7 +104,7 @@
   ~ActionMoveKeyView() override = default;
 
   void SetViewContent(BindingOption binding_option) override {
-    int radius = std::max(kActionMoveMinRadius, action_->GetUIRadius());
+    const int radius = std::max(kActionMoveMinRadius, action_->GetUIRadius());
     auto* action_move = static_cast<ActionMove*>(action_);
     action_move->set_move_distance(radius / 2);
     SetTouchPointCenter(gfx::Point(radius, radius));
@@ -145,8 +145,8 @@
 
     // If there is duplicate key in its own action, take the key away from
     // previous index.
-    const int unassigned_index = input_binding.GetIndexOfKey(code);
-    if (unassigned_index != -1) {
+    if (const int unassigned_index = input_binding.GetIndexOfKey(code);
+        unassigned_index != -1) {
       new_keys[unassigned_index] = ui::DomCode::NONE;
       labels_[unassigned_index]->SetDisplayMode(DisplayMode::kEditedUnbound);
     }
@@ -174,7 +174,7 @@
     }
 
     int label_index = -1;
-    auto* child_label = static_cast<ActionLabel*>(child);
+    const auto* child_label = static_cast<ActionLabel*>(child);
     for (size_t i = 0; i < kActionMoveKeysSize; i++) {
       if (child_label == labels_[i]) {
         label_index = i;
@@ -429,7 +429,7 @@
   }
 
   size_t index = it - keys.begin();
-  DCHECK(index >= 0 && index < kActionMoveKeysSize);
+  DCHECK(index < kActionMoveKeysSize);
 
   if (key_event->type() == ui::ET_KEY_PRESSED) {
     // TODO(b/308486017): "Modifier key + regular key" support is TBD. Currently
@@ -484,7 +484,7 @@
     std::list<ui::TouchEvent>& rewritten_events) {
   DCHECK(mouse_event);
 
-  auto type = mouse_event->type();
+  const auto type = mouse_event->type();
   if (!current_input_->mouse_types().contains(type) ||
       current_input_->mouse_flags() != mouse_event->flags()) {
     return false;
@@ -534,9 +534,9 @@
   DCHECK_LT(direction_index, kActionMoveKeysSize);
   auto new_move = gfx::Vector2dF(kDirection[direction_index][0],
                                  kDirection[direction_index][1]);
-  float display_scale_factor =
+  const float display_scale_factor =
       touch_injector_->window()->GetHost()->device_scale_factor();
-  float scale = display_scale_factor * move_distance_;
+  const float scale = display_scale_factor * move_distance_;
   new_move.Scale(scale, scale);
   if (key_press) {
     move_vector_ += new_move;
@@ -553,8 +553,8 @@
   }
   last_touch_root_location_ = location + move_vector_;
 
-  float x = last_touch_root_location_.x();
-  float y = last_touch_root_location_.y();
+  const float x = last_touch_root_location_.x();
+  const float y = last_touch_root_location_.y();
   last_touch_root_location_.set_x(
       std::clamp(x, content_bounds.x() * display_scale_factor,
                  content_bounds.right() * display_scale_factor));
@@ -573,8 +573,8 @@
     return std::nullopt;
   }
 
-  auto top_left = target_area_[0]->CalculatePosition(content_bounds);
-  auto bottom_right = target_area_[1]->CalculatePosition(content_bounds);
+  const auto top_left = target_area_[0]->CalculatePosition(content_bounds);
+  const auto bottom_right = target_area_[1]->CalculatePosition(content_bounds);
   return std::make_optional<gfx::RectF>(
       top_left.x() + content_bounds.x(), top_left.y() + content_bounds.y(),
       bottom_right.x() - top_left.x(), bottom_right.y() - top_left.y());
@@ -583,9 +583,8 @@
 gfx::PointF ActionMove::TransformLocationInPixels(
     const gfx::RectF& content_bounds,
     const gfx::PointF& root_location) {
-  auto target_area = CalculateApplyArea(content_bounds);
   auto new_pos = gfx::PointF();
-  if (target_area) {
+  if (auto target_area = CalculateApplyArea(content_bounds)) {
     auto orig_point = root_location - content_bounds.origin();
     float ratio = orig_point.x() / content_bounds.width();
     float x = ratio * target_area->width() + target_area->x();
@@ -597,7 +596,8 @@
     new_pos.SetPoint(root_location.x(), root_location.y());
   }
 
-  float scale = touch_injector_->window()->GetHost()->device_scale_factor();
+  const float scale =
+      touch_injector_->window()->GetHost()->device_scale_factor();
   new_pos.Scale(scale);
   return new_pos;
 }
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action_tap.cc b/chrome/browser/ash/arc/input_overlay/actions/action_tap.cc
index 15d1dfe7..b2293e2 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action_tap.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/action_tap.cc
@@ -108,8 +108,8 @@
     if (mouse_action != kPrimaryClick && mouse_action != kSecondaryClick) {
       return;
     }
-    const auto& input_binding = action_->GetCurrentDisplayedInput();
-    if (IsMouseBound(input_binding) &&
+    if (const auto& input_binding = action_->GetCurrentDisplayedInput();
+        IsMouseBound(input_binding) &&
         input_binding.mouse_action() ==
             ConvertToMouseActionEnum(mouse_action)) {
       return;
@@ -248,10 +248,10 @@
   DCHECK_NE(IsKeyboardBound(*current_input_), IsMouseBound(*current_input_));
   LogEvent(origin);
   // Rewrite for key event.
-  auto content_bounds = touch_injector_->content_bounds_f();
+  const auto content_bounds = touch_injector_->content_bounds_f();
   if (IsKeyboardBound(*current_input())) {
     auto* key_event = origin.AsKeyEvent();
-    bool rewritten =
+    const bool rewritten =
         RewriteKeyEvent(key_event, content_bounds, rotation_transform,
                         touch_events, keep_original_event);
     LogTouchEvents(touch_events);
@@ -262,8 +262,8 @@
     return false;
   }
   auto* mouse_event = origin.AsMouseEvent();
-  bool rewritten = RewriteMouseEvent(mouse_event, content_bounds,
-                                     rotation_transform, touch_events);
+  const bool rewritten = RewriteMouseEvent(mouse_event, content_bounds,
+                                           rotation_transform, touch_events);
   LogTouchEvents(touch_events);
   return rewritten;
 }
@@ -350,7 +350,7 @@
                                   std::list<ui::TouchEvent>& rewritten_events) {
   DCHECK(mouse_event);
 
-  auto type = mouse_event->type();
+  const auto type = mouse_event->type();
   if (!current_input_->mouse_types().contains(type) ||
       (current_input_->mouse_flags() & mouse_event->changed_button_flags()) ==
           0) {
@@ -384,13 +384,12 @@
 }
 
 std::unique_ptr<ActionProto> ActionTap::ConvertToProtoIfCustomized() const {
-  auto action_proto = Action::ConvertToProtoIfCustomized();
-  if (!action_proto) {
-    return nullptr;
+  if (auto action_proto = Action::ConvertToProtoIfCustomized()) {
+    action_proto->set_action_type(ActionType::TAP);
+    return action_proto;
   }
 
-  action_proto->set_action_type(ActionType::TAP);
-  return action_proto;
+  return nullptr;
 }
 
 }  // namespace arc::input_overlay
diff --git a/chrome/browser/ash/arc/input_overlay/actions/position.cc b/chrome/browser/ash/arc/input_overlay/actions/position.cc
index 8a5513a..384e78b 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/position.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/position.cc
@@ -35,8 +35,8 @@
                << list->size() << " elements.";
     return std::nullopt;
   }
-  double x = list->front().GetDouble();
-  double y = list->back().GetDouble();
+  const double x = list->front().GetDouble();
+  const double y = list->back().GetDouble();
   if (std::abs(x) > 1 || std::abs(y) > 1) {
     LOG(ERROR) << "Require normalized values for " << key << ". But got x{" << x
                << "}, y{" << y << "}";
@@ -47,8 +47,7 @@
 
 std::optional<int> ParseIntValue(const base::Value::Dict& value,
                                  std::string key) {
-  std::optional<int> val = value.FindInt(key);
-  if (val) {
+  if (std::optional<int> val = value.FindInt(key)) {
     if (*val <= 0) {
       LOG(ERROR) << "Value for {" << key << "} should be positive, but got {"
                  << *val << "}.";
@@ -66,7 +65,7 @@
                          const gfx::RectF& content_bounds) {
   float res;
   if (height_dependent) {
-    float anchor_to_target_y =
+    const float anchor_to_target_y =
         std::abs(anchor_to_target.y()) * content_bounds.height();
     res = anchor.x() * content_bounds.width() +
           (anchor_to_target.x() < 0 ? -1 : 1) * anchor_to_target_y * dependent;
@@ -74,7 +73,7 @@
       res = content_bounds.width() - 1;
     }
   } else {
-    float anchor_to_target_x =
+    const float anchor_to_target_x =
         std::abs(anchor_to_target.x()) * content_bounds.width();
     res = anchor.y() * content_bounds.height() +
           (std::signbit(anchor_to_target.y()) ? -1 : 1) * anchor_to_target_x *
@@ -143,12 +142,11 @@
 
 bool Position::ParseDefaultFromJson(const base::Value::Dict& value) {
   // Parse anchor point if existing, or the anchor point is (0, 0).
-  auto anchor = ParseTwoElementsArray(value, kAnchor, false);
-  if (!anchor) {
-    LOG(WARNING) << "Anchor is assigned to default (0, 0).";
-  } else {
+  if (auto anchor = ParseTwoElementsArray(value, kAnchor, false)) {
     anchor_.set_x(anchor.value().x());
     anchor_.set_y(anchor.value().y());
+  } else {
+    LOG(WARNING) << "Anchor is assigned to default (0, 0).";
   }
   // Parse the vector which starts from anchor point to the target position.
   auto anchor_to_target = ParseTwoElementsArray(value, kAnchorToTarget, true);
@@ -158,8 +156,8 @@
   anchor_to_target_.set_x(anchor_to_target.value().x());
   anchor_to_target_.set_y(anchor_to_target.value().y());
 
-  auto target = anchor_ + anchor_to_target_;
-  if (!gfx::RectF(1.0, 1.0).Contains(target)) {
+  if (const auto target = anchor_ + anchor_to_target_;
+      !gfx::RectF(1.0, 1.0).Contains(target)) {
     LOG(ERROR)
         << "The target position is located at outside of the window. The value "
            "should be within [0, 1]. But got target {"
@@ -225,15 +223,15 @@
 gfx::PointF Position::CalculateDependentPosition(
     const gfx::RectF& content_bounds) const {
   auto res = Position::CalculateDefaultPosition(content_bounds);
-  float cur_aspect_ratio =
-      1. * content_bounds.width() / content_bounds.height();
+  const float cur_aspect_ratio =
+      1.0f * content_bounds.width() / content_bounds.height();
   if (cur_aspect_ratio >= *aspect_ratio_) {
-    float x = CalculateDependent(anchor_, anchor_to_target_, true, *x_on_y_,
-                                 content_bounds);
+    const float x = CalculateDependent(anchor_, anchor_to_target_, true,
+                                       *x_on_y_, content_bounds);
     res.set_x(x);
   } else {
-    float y = CalculateDependent(anchor_, anchor_to_target_, false, *y_on_x_,
-                                 content_bounds);
+    const float y = CalculateDependent(anchor_, anchor_to_target_, false,
+                                       *y_on_x_, content_bounds);
     res.set_y(y);
   }
   return res;
diff --git a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.cc b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.cc
index 28dc2b2..5404b81 100644
--- a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.cc
+++ b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/ash/arc/arc_util.h"
 #include "chrome/browser/ash/arc/input_overlay/display_overlay_controller.h"
 #include "chrome/browser/ash/arc/input_overlay/input_overlay_resources_util.h"
+#include "chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.h"
 #include "chrome/browser/ash/arc/input_overlay/util.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/app_restore/window_properties.h"
@@ -105,14 +106,16 @@
     return nullptr;
   }
 
-  auto* contents_view = bubble_delegate->GetContentsView();
   views::Widget* anchor_widget = nullptr;
-  if (views::AsViewClass<ash::GameDashboardMainMenuView>(contents_view)) {
+  if (const auto* contents_view = bubble_delegate->GetContentsView();
+      views::AsViewClass<ash::GameDashboardMainMenuView>(contents_view)) {
     // `window` has `ash::GameDashboardMainMenuView` as contents view.
     anchor_widget = widget->parent();
     DCHECK(anchor_widget);
-  } else if (views::AsViewClass<ash::AnchoredNudge>(contents_view)) {
-    // `window` has `ash::AnchoredNudge` as contents view.
+  } else if (views::AsViewClass<ash::AnchoredNudge>(contents_view) ||
+             views::AsViewClass<DeleteEditShortcut>(contents_view)) {
+    // `window` has `ash::AnchoredNudge` or `DeleteEditShortcut` as contents
+    // view.
     if (auto* nudge_anchor_view = bubble_delegate->GetAnchorView()) {
       anchor_widget = nudge_anchor_view->GetWidget();
       DCHECK(anchor_widget);
@@ -163,11 +166,9 @@
   if (aura::Env::HasInstance()) {
     env_observation_.Observe(aura::Env::GetInstance());
   }
-  if (ash::Shell::HasInstance()) {
-    if (ash::Shell::GetPrimaryRootWindow()) {
-      aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow())
-          ->AddObserver(this);
-    }
+  if (ash::Shell::HasInstance() && ash::Shell::GetPrimaryRootWindow()) {
+    aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow())
+        ->AddObserver(this);
   }
   task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
       {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
@@ -225,7 +226,8 @@
       IsGhostWindowLoading(window) || loading_data_windows_.contains(window)) {
     return;
   }
-  std::string* package_name = window->GetProperty(ash::kArcPackageNameKey);
+  const std::string* package_name =
+      window->GetProperty(ash::kArcPackageNameKey);
   if (!package_name || package_name->empty()) {
     return;
   }
@@ -279,11 +281,9 @@
 void ArcInputOverlayManager::Shutdown() {
   UnRegisterWindow(registered_top_level_window_);
   window_observations_.RemoveAllObservations();
-  if (ash::Shell::HasInstance()) {
-    if (ash::Shell::GetPrimaryRootWindow()) {
-      aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow())
-          ->RemoveObserver(this);
-    }
+  if (ash::Shell::HasInstance() && ash::Shell::GetPrimaryRootWindow()) {
+    aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow())
+        ->RemoveObserver(this);
   }
   if (aura::Env::HasInstance()) {
     env_observation_.Reset();
@@ -325,12 +325,11 @@
     return;
   }
 
-  auto it = input_overlay_enabled_windows_.find(registered_top_level_window_);
-  if (it == input_overlay_enabled_windows_.end()) {
-    return;
+  if (auto it =
+          input_overlay_enabled_windows_.find(registered_top_level_window_);
+      it != input_overlay_enabled_windows_.end()) {
+    it->second->UpdatePositionsForRegister();
   }
-
-  it->second->UpdatePositionsForRegister();
 }
 
 void ArcInputOverlayManager::OnDisplayTabletStateChanged(
@@ -368,18 +367,19 @@
   DCHECK(touch_injector);
 
   const std::string& package_name = touch_injector->package_name();
-  auto resource_id = GetInputOverlayResourceId(package_name);
+  const auto resource_id = GetInputOverlayResourceId(package_name);
   if (!resource_id) {
     return touch_injector;
   }
 
-  auto json_file = ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
-      resource_id.value());
+  const auto json_file =
+      ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
+          resource_id.value());
   if (json_file.empty()) {
     LOG(WARNING) << "No content for: " << package_name;
     return touch_injector;
   }
-  auto result = base::JSONReader::ReadAndReturnValueWithError(json_file);
+  const auto result = base::JSONReader::ReadAndReturnValueWithError(json_file);
   DCHECK(result.has_value())
       << "Could not load input overlay data file: " << result.error().message;
   if (!result.has_value() || !result->is_dict()) {
@@ -550,7 +550,7 @@
     return;
   }
 
-  std::string package_name = touch_injector->package_name();
+  const std::string package_name = touch_injector->package_name();
   VLOG(2) << "Check if pkg: " << package_name << " is an O4C app.";
 
   instance->IsOptimizedForCrosApp(
@@ -582,8 +582,9 @@
 }
 
 void ArcInputOverlayManager::NotifyTextInputState() {
-  auto it = input_overlay_enabled_windows_.find(registered_top_level_window_);
-  if (it != input_overlay_enabled_windows_.end()) {
+  if (const auto it =
+          input_overlay_enabled_windows_.find(registered_top_level_window_);
+      it != input_overlay_enabled_windows_.end()) {
     it->second->NotifyTextInputState(is_text_input_active_);
   }
 }
@@ -624,7 +625,7 @@
               window);
   }
 
-  auto it = input_overlay_enabled_windows_.find(window);
+  const auto it = input_overlay_enabled_windows_.find(window);
   if (it == input_overlay_enabled_windows_.end()) {
     return;
   }
@@ -646,7 +647,8 @@
   if (!registered_top_level_window_ || registered_top_level_window_ != window) {
     return;
   }
-  auto it = input_overlay_enabled_windows_.find(registered_top_level_window_);
+  const auto it =
+      input_overlay_enabled_windows_.find(registered_top_level_window_);
   DCHECK(it != input_overlay_enabled_windows_.end());
   if (it == input_overlay_enabled_windows_.end()) {
     return;
@@ -662,13 +664,11 @@
 }
 
 void ArcInputOverlayManager::RegisterFocusedWindow() {
-  auto* focused_window = ash::window_util::GetFocusedWindow();
-  // Don't register window if it is in tablet mode.
-  if (display::Screen::GetScreen()->InTabletMode() || !focused_window) {
-    return;
+  // Register window if it is not in tablet mode.
+  if (auto* focused_window = ash::window_util::GetFocusedWindow();
+      focused_window && !display::Screen::GetScreen()->InTabletMode()) {
+    RegisterWindow(GetAnchorWindow(focused_window->GetToplevelWindow()));
   }
-
-  RegisterWindow(GetAnchorWindow(focused_window->GetToplevelWindow()));
 }
 
 void ArcInputOverlayManager::AddDisplayOverlayController(
diff --git a/chrome/browser/ash/arc/input_overlay/db/data_controller.cc b/chrome/browser/ash/arc/input_overlay/db/data_controller.cc
index b1e3fd6..68fd1a9 100644
--- a/chrome/browser/ash/arc/input_overlay/db/data_controller.cc
+++ b/chrome/browser/ash/arc/input_overlay/db/data_controller.cc
@@ -40,12 +40,12 @@
 }
 
 void CreateEmptyFile(const base::FilePath& file_path) {
-  FILE* file = base::OpenFile(file_path, "wb+");
-  if (file == nullptr) {
-    LOG(ERROR) << "Failed to create file: " << file_path.value();
+  if (FILE* file = base::OpenFile(file_path, "wb+")) {
+    base::CloseFile(file);
     return;
   }
-  base::CloseFile(file);
+
+  LOG(ERROR) << "Failed to create file: " << file_path.value();
 }
 
 }  // namespace
@@ -69,8 +69,7 @@
 
 std::unique_ptr<AppDataProto> DataController::ReadProtoFromFile(
     base::FilePath file_path) {
-  auto base_path = CreateOrGetDirectory(file_path.DirName());
-  if (!base_path) {
+  if (auto base_path = CreateOrGetDirectory(file_path.DirName()); !base_path) {
     return nullptr;
   }
 
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
index 2d665cb3..08476ab 100644
--- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
+++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
@@ -55,7 +55,6 @@
 constexpr char kButtonOptionsMenu[] = "GameControlsButtonOptionsMenu";
 constexpr char kEditingList[] = "GameControlsEditingList";
 constexpr char kInputMapping[] = "GameControlsInputMapping";
-constexpr char kDeleteEditShortcut[] = "DeleteEditShortcut";
 constexpr char kActionHighlight[] = "ActionHighlight";
 
 std::unique_ptr<views::Widget> CreateTransientWidget(
@@ -155,9 +154,9 @@
   if (display_mode_ == DisplayMode::kEdit) {
     OnCustomizeCancel();
   }
-  auto* shell_surface_base =
-      exo::GetShellSurfaceBaseForWindow(touch_injector_->window());
-  if (shell_surface_base && shell_surface_base->HasOverlay()) {
+  if (auto* shell_surface_base =
+          exo::GetShellSurfaceBaseForWindow(touch_injector_->window());
+      shell_surface_base && shell_surface_base->HasOverlay()) {
     // Call `RemoveInputMenuView` explicitly to make sure UMA stats is updated.
     RemoveInputMenuView();
 
@@ -234,7 +233,7 @@
 }
 
 bool DisplayOverlayController::IsNudgeEmpty() {
-  return !nudge_view_ && nudge_widgets_.empty();
+  return !nudge_view_;
 }
 
 void DisplayOverlayController::AddMenuEntryView(views::Widget* overlay_widget) {
@@ -381,16 +380,14 @@
 }
 
 views::Widget* DisplayOverlayController::GetOverlayWidget() {
-  auto* shell_surface_base =
-      exo::GetShellSurfaceBaseForWindow(touch_injector_->window());
-  // Shell surface is null for test.
-  if (!shell_surface_base) {
-    return nullptr;
+  if (auto* shell_surface_base =
+          exo::GetShellSurfaceBaseForWindow(touch_injector_->window())) {
+    return static_cast<views::Widget*>(
+        shell_surface_base->GetFocusTraversable());
   }
 
-  return shell_surface_base ? static_cast<views::Widget*>(
-                                  shell_surface_base->GetFocusTraversable())
-                            : nullptr;
+  // Shell surface is null for test.
+  return nullptr;
 }
 
 views::View* DisplayOverlayController::GetOverlayWidgetContentsView() {
@@ -484,7 +481,12 @@
       break;
 
     case DisplayMode::kView: {
+      DCHECK(!rich_nudge_widget_);
+      DCHECK(!target_widget_);
+      DCHECK(!button_options_widget_);
       RemoveActionHighlightWidget();
+      RemoveDeleteEditShortcutWidget();
+      RemoveEditingListWidget();
       if (GetActiveActionsSize() == 0u) {
         // If there is no active action in `kView` mode, it doesn't create
         // `input_mapping_widget_` to save resources. When
@@ -504,8 +506,6 @@
         input_mapping_window->SetEventTargetingPolicy(
             aura::EventTargetingPolicy::kNone);
       }
-      RemoveButtonOptionsMenuWidget();
-      RemoveEditingListWidget();
     } break;
 
     case DisplayMode::kEdit: {
@@ -735,7 +735,7 @@
   }
 
   if (is_visible) {
-    if (auto* menu = GetButtonOptionsMenu()) {
+    if (GetButtonOptionsMenu()) {
       UpdateButtonOptionsMenuWidgetBounds();
     }
     button_options_widget_->ShowInactive();
@@ -746,30 +746,24 @@
 
 void DisplayOverlayController::AddDeleteEditShortcutWidget(
     ActionViewListItem* anchor_view) {
-  if (delete_edit_shortcut_widget_) {
-    if (auto* shortcut = views::AsViewClass<DeleteEditShortcut>(
-            delete_edit_shortcut_widget_->GetContentsView());
-        shortcut->anchor_view() != anchor_view) {
-      shortcut->UpdateAnchorView(anchor_view);
-    }
-    return;
+  if (!delete_edit_shortcut_widget_) {
+    delete_edit_shortcut_widget_ =
+        views::BubbleDialogDelegateView::CreateBubble(
+            std::make_unique<DeleteEditShortcut>(this, anchor_view));
   }
 
-  delete_edit_shortcut_widget_ = CreateTransientWidget(
-      touch_injector_->window(), /*widget_name=*/kDeleteEditShortcut,
-      /*accept_events=*/true, /*is_floating=*/true);
-  delete_edit_shortcut_widget_->SetContentsView(
-      std::make_unique<DeleteEditShortcut>(this, anchor_view));
+  if (auto* shortcut = GetDeleteEditShortcut();
+      shortcut->GetAnchorView() != anchor_view) {
+    shortcut->UpdateAnchorView(anchor_view);
+  }
 
-  auto* window = delete_edit_shortcut_widget_->GetNativeWindow();
-  window->parent()->StackChildAtTop(window);
-  delete_edit_shortcut_widget_->ShowInactive();
+  delete_edit_shortcut_widget_->Show();
 }
 
 void DisplayOverlayController::RemoveDeleteEditShortcutWidget() {
   if (delete_edit_shortcut_widget_) {
     delete_edit_shortcut_widget_->Close();
-    delete_edit_shortcut_widget_.reset();
+    delete_edit_shortcut_widget_ = nullptr;
   }
 }
 
@@ -1000,16 +994,10 @@
 void DisplayOverlayController::ProcessPressedEvent(
     const ui::LocatedEvent& event) {
   if (IsBeta()) {
-    if (nudge_widgets_.empty()) {
-      return;
-    }
-
-    for (auto it = nudge_widgets_.begin(); it != nudge_widgets_.end();) {
-      auto nudge_bounds = it->second->GetNativeWindow()->bounds();
-      if (!nudge_bounds.Contains(event.root_location())) {
-        nudge_widgets_.erase(it);
-      } else {
-        it++;
+    if (auto* delete_edit_view = GetDeleteEditShortcut()) {
+      if (const auto bounds = delete_edit_view->GetBoundsInScreen();
+          !bounds.Contains(event.root_location())) {
+        RemoveDeleteEditShortcutWidget();
       }
     }
   } else {
@@ -1025,18 +1013,13 @@
                       .origin();
     root_location.Offset(origin.x(), origin.y());
 
-    if (message_) {
-      auto bounds = message_->GetBoundsInScreen();
-      if (!bounds.Contains(root_location)) {
-        RemoveEditMessage();
-      }
+    if (message_ && !message_->GetBoundsInScreen().Contains(root_location)) {
+      RemoveEditMessage();
     }
 
-    if (input_menu_view_) {
-      auto bounds = input_menu_view_->GetBoundsInScreen();
-      if (!bounds.Contains(root_location)) {
-        SetDisplayModeAlpha(DisplayMode::kView);
-      }
+    if (input_menu_view_ &&
+        !input_menu_view_->GetBoundsInScreen().Contains(root_location)) {
+      SetDisplayModeAlpha(DisplayMode::kView);
     }
 
     // Dismiss the nudge, regardless where the click was.
@@ -1064,8 +1047,7 @@
   DCHECK(shell_surface_base);
   auto* host_window = shell_surface_base->host_window();
   DCHECK(host_window);
-  const auto& children = host_window->children();
-  if (children.size() > 0u) {
+  if (const auto& children = host_window->children(); children.size() > 0u) {
     // First child is the root ExoSurface window. Focus on the root surface
     // window can bring the task window to the front of the task stack.
     if (!children[0]->HasFocus()) {
@@ -1111,6 +1093,7 @@
 
 void DisplayOverlayController::RemoveAllWidgets() {
   RemoveRichNudge();
+  RemoveDeleteEditShortcutWidget();
   RemoveTargetWidget();
   RemoveButtonOptionsMenuWidget();
   RemoveEditingListWidget();
@@ -1281,6 +1264,15 @@
                             : nullptr;
 }
 
+DeleteEditShortcut* DisplayOverlayController::GetDeleteEditShortcut() const {
+  return delete_edit_shortcut_widget_
+             ? views::AsViewClass<DeleteEditShortcut>(
+                   delete_edit_shortcut_widget_->widget_delegate()
+                       ->AsBubbleDialogDelegate()
+                       ->GetContentsView())
+             : nullptr;
+}
+
 void DisplayOverlayController::UpdateEventRewriteCapability() {
   ash::ArcGameControlsFlag flags =
       touch_injector_->window()->GetProperty(ash::kArcGameControlsFlagsKey);
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
index 0de90645..8ca6ed8 100644
--- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
+++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
@@ -9,7 +9,6 @@
 
 #include "ash/public/cpp/arc_game_controls_flag.h"
 #include "ash/public/cpp/window_properties.h"
-#include "base/containers/flat_map.h"
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/ash/arc/input_overlay/actions/input_element.h"
 #include "ui/aura/window_observer.h"
@@ -30,6 +29,7 @@
 class ActionEditMenu;
 class ActionViewListItem;
 class ButtonOptionsMenu;
+class DeleteEditShortcut;
 class EditFinishView;
 class EditingList;
 class EducationalView;
@@ -257,6 +257,8 @@
   void RemoveRichNudge();
   RichNudge* GetRichNudge() const;
 
+  DeleteEditShortcut* GetDeleteEditShortcut() const;
+
   // `widget` bounds is in screen coordinate. `bounds_in_root_window` is the
   // window bounds in root window. Convert `bounds_in_root_window` in screen
   // coordinates to set `widget` bounds.
@@ -292,13 +294,10 @@
   std::unique_ptr<views::Widget> input_mapping_widget_;
   std::unique_ptr<views::Widget> editing_list_widget_;
   std::unique_ptr<views::Widget> button_options_widget_;
-  std::unique_ptr<views::Widget> delete_edit_shortcut_widget_;
   std::unique_ptr<views::Widget> target_widget_;
   std::unique_ptr<views::Widget> action_highlight_widget_;
+  raw_ptr<views::Widget> delete_edit_shortcut_widget_;
   raw_ptr<views::Widget> rich_nudge_widget_;
-
-  // Each widget can associate with one education nudge widget.
-  base::flat_map<views::Widget*, std::unique_ptr<views::Widget>> nudge_widgets_;
 };
 
 }  // namespace arc::input_overlay
diff --git a/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.cc b/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.cc
index 1884ddb..8ba5659 100644
--- a/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.cc
+++ b/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.cc
@@ -11,6 +11,7 @@
 #include "chrome/browser/ash/arc/input_overlay/ui/action_view.h"
 #include "chrome/browser/ash/arc/input_overlay/ui/action_view_list_item.h"
 #include "chrome/browser/ash/arc/input_overlay/ui/button_options_menu.h"
+#include "chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.h"
 #include "chrome/browser/ash/arc/input_overlay/ui/editing_list.h"
 #include "chrome/browser/ash/arc/input_overlay/ui/input_mapping_view.h"
 #include "chrome/browser/ash/arc/input_overlay/ui/touch_point.h"
@@ -35,14 +36,6 @@
   LeftClickOn(editing_list_->add_button_);
 }
 
-size_t OverlayViewTestBase::GetActionViewSize() {
-  if (!input_mapping_view_) {
-    return 0;
-  }
-
-  return input_mapping_view_->children().size();
-}
-
 ButtonOptionsMenu* OverlayViewTestBase::ShowButtonOptionsMenu(Action* action) {
   action->action_view()->ShowButtonOptionsMenu();
   DCHECK(controller_->button_options_widget_);
@@ -63,10 +56,75 @@
   }
 }
 
+void OverlayViewTestBase::HoverAtActionViewListItem(size_t index) {
+  if (auto* list_item = GetEditingListItem(index)) {
+    GetEventGenerator()->MoveMouseTo(
+        list_item->GetBoundsInScreen().CenterPoint());
+  }
+}
+
+size_t OverlayViewTestBase::GetActionViewSize() const {
+  if (!input_mapping_view_) {
+    return 0;
+  }
+
+  return input_mapping_view_->children().size();
+}
+
+size_t OverlayViewTestBase::GetActionListItemsSize() const {
+  if (auto* list = GetEditingList()) {
+    return list->scroll_content_->children().size();
+  }
+  return 0;
+}
+
+ButtonOptionsMenu* OverlayViewTestBase::GetButtonOptionsMenu() const {
+  DCHECK(controller_);
+  return controller_->GetButtonOptionsMenu();
+}
+
+DeleteEditShortcut* OverlayViewTestBase::GetDeleteEditShortcut() const {
+  DCHECK(controller_);
+  return controller_->GetDeleteEditShortcut();
+}
+
+EditingList* OverlayViewTestBase::GetEditingList() const {
+  DCHECK(controller_);
+  return controller_->GetEditingList();
+}
+
+views::View* OverlayViewTestBase::GetEditingListItem(size_t index) const {
+  if (auto* list = GetEditingList()) {
+    if (auto& children = list->scroll_content_->children();
+        index < children.size()) {
+      return children[index];
+    }
+  }
+  return nullptr;
+}
+
 TargetView* OverlayViewTestBase::GetTargetView() const {
+  DCHECK(controller_);
   return controller_->GetTargetView();
 }
 
+Action* OverlayViewTestBase::GetButtonOptionsMenuAction() const {
+  if (auto* menu = controller_->GetButtonOptionsMenu()) {
+    return menu->action();
+  }
+  return nullptr;
+}
+
+Action* OverlayViewTestBase::GetEditingListItemAction(size_t index) const {
+  if (auto* list_item_view = GetEditingListItem(index)) {
+    if (auto* list_item =
+            views::AsViewClass<ActionViewListItem>(list_item_view)) {
+      return list_item->action();
+    }
+  }
+  return nullptr;
+}
+
 // Create a GIO enabled window with default actions including two action tap and
 // one action move, enable it into edit mode.
 void OverlayViewTestBase::SetUp() {
diff --git a/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h b/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h
index 2962051a..a7dc63ab 100644
--- a/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h
+++ b/chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h
@@ -13,6 +13,7 @@
 class Action;
 class ActionViewListItem;
 class ButtonOptionsMenu;
+class DeleteEditShortcut;
 class EditingList;
 class InputMappingView;
 class TargetView;
@@ -27,14 +28,23 @@
   void EnableEditMode();
   void PressAddButton();
 
-  size_t GetActionViewSize();
-
   ButtonOptionsMenu* ShowButtonOptionsMenu(Action* action);
   void PressDoneButtonOnButtonOptionsMenu();
   void PressDeleteButtonOnButtonOptionsMenu();
+  void HoverAtActionViewListItem(size_t index);
 
+  size_t GetActionViewSize() const;
+  size_t GetActionListItemsSize() const;
+
+  ButtonOptionsMenu* GetButtonOptionsMenu() const;
+  DeleteEditShortcut* GetDeleteEditShortcut() const;
+  EditingList* GetEditingList() const;
+  views::View* GetEditingListItem(size_t index) const;
   TargetView* GetTargetView() const;
 
+  Action* GetButtonOptionsMenuAction() const;
+  Action* GetEditingListItemAction(size_t index) const;
+
   // GameControlsTestBase:
   void SetUp() override;
 
diff --git a/chrome/browser/ash/arc/input_overlay/touch_injector.cc b/chrome/browser/ash/arc/input_overlay/touch_injector.cc
index 969cff0..d031ef2 100644
--- a/chrome/browser/ash/arc/input_overlay/touch_injector.cc
+++ b/chrome/browser/ash/arc/input_overlay/touch_injector.cc
@@ -61,7 +61,7 @@
   auto it = actions.begin();
   while (it != actions.end()) {
     int id = it->get()->id();
-    if (ids.find(id) == ids.end()) {
+    if (!ids.contains(id)) {
       ids.insert(id);
       it++;
     } else {
@@ -79,8 +79,7 @@
   std::vector<std::unique_ptr<Action>> actions;
 
   // Parse tap actions if they exist.
-  const base::Value::List* tap_act_list = root.FindList(kTapAction);
-  if (tap_act_list) {
+  if (const auto* tap_act_list = root.FindList(kTapAction)) {
     for (const auto& val : *tap_act_list) {
       auto* val_dict = val.GetIfDict();
       if (!val_dict) {
@@ -97,8 +96,7 @@
   }
 
   // Parse move actions if they exist.
-  const base::Value::List* move_act_list = root.FindList(kMoveAction);
-  if (move_act_list) {
+  if (const auto* move_act_list = root.FindList(kMoveAction)) {
     for (const auto& val : *move_act_list) {
       auto* val_dict = val.GetIfDict();
       if (!val_dict) {
@@ -194,19 +192,15 @@
 // Create Action by `action_type` without any input bindings.
 std::unique_ptr<Action> CreateRawAction(ActionType type,
                                         TouchInjector* injector) {
-  std::unique_ptr<Action> action;
   switch (type) {
     case ActionType::TAP:
-      action = std::make_unique<ActionTap>(injector);
-      break;
+      return std::make_unique<ActionTap>(injector);
     case ActionType::MOVE:
-      action = std::make_unique<ActionMove>(injector);
-      break;
+      return std::make_unique<ActionMove>(injector);
     default:
       NOTREACHED();
       return nullptr;
   }
-  return action;
 }
 
 }  // namespace
@@ -219,7 +213,7 @@
   DCHECK(widget->non_client_view());
   auto* frame_view = widget->non_client_view()->frame_view();
   DCHECK(frame_view);
-  int height = frame_view->GetBoundsForClientView().y();
+  const int height = frame_view->GetBoundsForClientView().y();
   auto bounds = gfx::RectF(window->bounds());
   bounds.Inset(gfx::InsetsF::TLBR(height, 0, 0, 0));
   return bounds;
@@ -238,8 +232,8 @@
     if (!event.IsKeyEvent()) {
       return false;
     }
-    auto* key_event = event.AsKeyEvent();
-    if (key_ == key_event->code() &&
+    if (auto* key_event = event.AsKeyEvent();
+        key_ == key_event->code() &&
         modifiers_ == (key_event->flags() & kInterestingFlagsMask)) {
       if (key_event->type() == ui::ET_KEY_PRESSED) {
         callback_.Run();
@@ -273,8 +267,8 @@
     ParseMouseLock(root);
   }
 
-  auto parsed_actions = ParseJsonToActions(this, root);
-  if (!parsed_actions.empty()) {
+  if (auto parsed_actions = ParseJsonToActions(this, root);
+      !parsed_actions.empty()) {
     std::move(parsed_actions.begin(), parsed_actions.end(),
               std::back_inserter(actions_));
   }
@@ -317,8 +311,9 @@
   DispatchTouchReleaseEvent();
   observation_.Reset();
   // Need reset pending input bind if it is unregistered in edit mode.
-  for (auto& action : actions_)
+  for (auto& action : actions_) {
     action->ResetPendingBind();
+  }
   OnSaveProtoFile();
 }
 
@@ -352,8 +347,9 @@
 }
 
 void TouchInjector::OnApplyPendingBinding() {
-  for (auto& action : actions_)
+  for (auto& action : actions_) {
     action->BindPending();
+  }
 }
 
 void TouchInjector::OnBindingSave() {
@@ -377,8 +373,9 @@
 }
 
 void TouchInjector::OnBindingRestore() {
-  for (auto& action : actions_)
+  for (auto& action : actions_) {
     action->RestoreToDefault();
+  }
 }
 
 void TouchInjector::OnProtoDataAvailable(AppDataProto& proto) {
@@ -427,8 +424,8 @@
 
 void TouchInjector::SaveMenuEntryLocation(
     gfx::Point menu_entry_location_point) {
-  float width = content_bounds_f_.width();
-  float height = content_bounds_f_.height();
+  const float width = content_bounds_f_.width();
+  const float height = content_bounds_f_.height();
   DCHECK_GT(width, 1);
   DCHECK_GT(height, 1);
   menu_entry_location_ = std::make_optional<gfx::Vector2dF>(
@@ -441,9 +438,10 @@
     rotation_transform_.reset();
   }
 
-  auto display = display::Screen::GetScreen()->GetDisplayNearestWindow(window_);
   // No need to transform if there is no rotation.
-  if (display.panel_rotation() != display::Display::ROTATE_0) {
+  if (auto display =
+          display::Screen::GetScreen()->GetDisplayNearestWindow(window_);
+      display.panel_rotation() != display::Display::ROTATE_0) {
     rotation_transform_ =
         std::make_unique<gfx::Transform>(ash::CreateRotationTransform(
             display::Display::ROTATE_0, display.panel_rotation(),
@@ -454,8 +452,9 @@
 
 void TouchInjector::UpdateForOverlayBoundsChanged(
     const gfx::RectF& new_bounds) {
-  bool should_update_view = content_bounds_f_.width() != new_bounds.width() ||
-                            content_bounds_f_.height() != new_bounds.height();
+  const bool should_update_view =
+      content_bounds_f_.width() != new_bounds.width() ||
+      content_bounds_f_.height() != new_bounds.height();
 
   content_bounds_f_ = new_bounds;
   for (auto& action : actions_) {
@@ -512,9 +511,9 @@
 
   // Release active touch-to-touch events.
   for (auto& touch_info : rewritten_touch_infos_) {
-    auto touch_point_info = touch_info.second;
-    auto managed_touch_id = touch_point_info.rewritten_touch_id;
-    auto root_location = touch_point_info.touch_root_location;
+    const auto touch_point_info = touch_info.second;
+    const auto managed_touch_id = touch_point_info.rewritten_touch_id;
+    const auto root_location = touch_point_info.touch_root_location;
 
     auto touch_to_release = std::make_unique<ui::TouchEvent>(ui::TouchEvent(
         ui::EventType::ET_TOUCH_RELEASED, root_location, root_location,
@@ -575,7 +574,7 @@
     return false;
   }
 
-  auto menu_anchor_bounds =
+  const auto menu_anchor_bounds =
       display_overlay_controller_->GetOverlayMenuEntryBounds();
   if (!menu_anchor_bounds) {
     if (!IsBeta()) {
@@ -595,22 +594,14 @@
     return menu_anchor_bounds->Contains(event_location);
   }
 
-  if (!event.IsMouseEvent() && !event.IsTouchEvent()) {
-    return false;
-  }
-
-  if (event.IsMouseEvent()) {
-    auto* mouse = event.AsMouseEvent();
-    if (mouse->type() == ui::ET_MOUSE_PRESSED &&
-        menu_anchor_bounds->Contains(event_location)) {
-      return true;
-    }
-  } else {
-    auto* touch = event.AsTouchEvent();
-    if (touch->type() == ui::ET_TOUCH_PRESSED &&
-        menu_anchor_bounds->Contains(event_location)) {
-      return true;
-    }
+  if (event.IsMouseEvent() &&
+      event.AsMouseEvent()->type() == ui::ET_MOUSE_PRESSED &&
+      menu_anchor_bounds->Contains(event_location)) {
+    return true;
+  } else if (event.IsTouchEvent() &&
+             event.AsTouchEvent()->type() == ui::ET_TOUCH_PRESSED &&
+             menu_anchor_bounds->Contains(event_location)) {
+    return true;
   }
   return false;
 }
@@ -838,11 +829,9 @@
 std::unique_ptr<AppDataProto> TouchInjector::ConvertToProto() {
   auto app_data_proto = std::make_unique<AppDataProto>();
   for (auto& action : actions_) {
-    auto customized_proto = action->ConvertToProtoIfCustomized();
-    if (customized_proto) {
+    if (auto customized_proto = action->ConvertToProtoIfCustomized()) {
       *app_data_proto->add_actions() = *customized_proto;
     }
-    customized_proto.reset();
   }
   AddMenuStateToProto(*app_data_proto);
   AddMenuEntryToProtoIfCustomized(*app_data_proto);
@@ -918,7 +907,7 @@
 
   std::vector<int> ids;
   for (const auto& action : actions_) {
-    int id = action->id();
+    const int id = action->id();
     if (id > kMaxDefaultActionID) {
       ids.emplace_back(id);
     }
diff --git a/chrome/browser/ash/arc/input_overlay/ui/action_view.cc b/chrome/browser/ash/arc/input_overlay/ui/action_view.cc
index 58ce6455..4673257 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/action_view.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/action_view.cc
@@ -57,8 +57,9 @@
   // Set display mode for ActionLabel first and then other components update the
   // layout according to ActionLabel.
   if (!editing_label) {
-    for (auto* label : labels_)
+    for (auto* label : labels_) {
       label->SetDisplayMode(mode);
+    }
   } else {
     editing_label->SetDisplayMode(mode);
   }
@@ -82,8 +83,10 @@
 void ActionView::SetPositionFromCenterPosition(
     const gfx::PointF& center_position) {
   DCHECK(touch_point_center_);
-  int left = std::max(0, (int)(center_position.x() - touch_point_center_->x()));
-  int top = std::max(0, (int)(center_position.y() - touch_point_center_->y()));
+  const int left =
+      std::max(0, (int)(center_position.x() - touch_point_center_->x()));
+  const int top =
+      std::max(0, (int)(center_position.y() - touch_point_center_->y()));
   // SetPosition function needs the top-left position.
   SetPosition(gfx::Point(left, top));
 }
@@ -126,8 +129,8 @@
 }
 
 void ActionView::OnResetBinding() {
-  const auto& input_binding = action_->GetCurrentDisplayedInput();
-  if (!IsInputBound(input_binding) ||
+  if (const auto& input_binding = action_->GetCurrentDisplayedInput();
+      !IsInputBound(input_binding) ||
       input_binding == *action_->current_input()) {
     return;
   }
diff --git a/chrome/browser/ash/arc/input_overlay/ui/action_view_list_item.cc b/chrome/browser/ash/arc/input_overlay/ui/action_view_list_item.cc
index 2a4c43d..66a1776 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/action_view_list_item.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/action_view_list_item.cc
@@ -31,8 +31,8 @@
 }
 
 void ActionViewListItem::OnMouseEntered(const ui::MouseEvent& event) {
-  controller_->AddDeleteEditShortcutWidget(this);
   controller_->AddActionHighlightWidget(action_);
+  controller_->AddDeleteEditShortcutWidget(this);
 }
 
 void ActionViewListItem::OnMouseExited(const ui::MouseEvent& event) {
diff --git a/chrome/browser/ash/arc/input_overlay/ui/button_options_menu_unittest.cc b/chrome/browser/ash/arc/input_overlay/ui/button_options_menu_unittest.cc
index ed5dc59..5a41f4c2 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/button_options_menu_unittest.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/button_options_menu_unittest.cc
@@ -35,17 +35,6 @@
   ButtonOptionsMenuTest() = default;
   ~ButtonOptionsMenuTest() override = default;
 
-  size_t GetActionListItemsSize() {
-    DCHECK(editing_list_);
-
-    views::View* scroll_content = editing_list_->scroll_content_;
-    DCHECK(scroll_content);
-    if (editing_list_->HasControls()) {
-      return scroll_content->children().size();
-    }
-    return 0;
-  }
-
   // Return -1 if there is no list item for `action`. Otherwise, return the
   // index of list item in `EditingList` for `action`.
   int GetIndexInEditingList(Action* action) {
@@ -56,7 +45,7 @@
     views::View* scroll_content = editing_list_->scroll_content_;
     DCHECK(scroll_content);
     for (size_t i = 0; i < scroll_content->children().size(); i++) {
-      auto* list_item =
+      const auto* list_item =
           static_cast<ActionViewListItem*>(scroll_content->children()[i]);
       if (list_item->action() == action) {
         return i;
diff --git a/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.cc b/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.cc
index d3baecc4..9b53af2bc 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.h"
 
+#include <memory>
+
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/icon_button.h"
 #include "chrome/app/vector_icons/vector_icons.h"
@@ -14,64 +16,36 @@
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/chromeos/styles/cros_tokens_color_mappings.h"
 #include "ui/color/color_provider.h"
-#include "ui/views/background.h"
+#include "ui/gfx/geometry/insets.h"
+#include "ui/views/bubble/bubble_border.h"
 #include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/fill_layout.h"
 #include "ui/views/view_class_properties.h"
+#include "ui/views/view_utils.h"
 
 namespace arc::input_overlay {
 
 namespace {
 
-constexpr int kSpaceFromEditingList = 8;
+constexpr int kSpaceToEditingList = 8;
+constexpr char kDeleteEditShortcut[] = "DeleteEditShortcut";
 
 }  // namespace
 
 DeleteEditShortcut::DeleteEditShortcut(DisplayOverlayController* controller,
                                        ActionViewListItem* anchor_view)
-    : controller_(controller), anchor_view_(anchor_view) {
-  Init();
-  observation_.Observe(anchor_view);
-}
+    : views::BubbleDialogDelegateView(anchor_view,
+                                      views::BubbleBorder::LEFT_CENTER,
+                                      views::BubbleBorder::NO_SHADOW),
+      controller_(controller) {
+  set_margins(gfx::Insets(12));
+  set_corner_radius(20);
+  set_close_on_deactivate(false);
+  set_focus_traversable_from_anchor_view(true);
+  set_internal_name(kDeleteEditShortcut);
+  set_parent_window(anchor_view->GetWidget()->GetNativeWindow());
+  SetButtons(ui::DIALOG_BUTTON_NONE);
 
-DeleteEditShortcut::~DeleteEditShortcut() {
-  observation_.Reset();
-}
-
-void DeleteEditShortcut::UpdateAnchorView(ActionViewListItem* anchor_view) {
-  observation_.Reset();
-  observation_.Observe(anchor_view);
-  anchor_view_ = anchor_view;
-  UpdateWidget();
-}
-
-void DeleteEditShortcut::VisibilityChanged(views::View* starting_from,
-                                           bool is_visible) {
-  if (is_visible) {
-    UpdateWidget();
-  }
-}
-
-void DeleteEditShortcut::OnMouseExited(const ui::MouseEvent& event) {
-  views::View::OnMouseExited(event);
-  if (!IsMouseHovered()) {
-    controller_->RemoveDeleteEditShortcutWidget();
-  }
-}
-
-void DeleteEditShortcut::OnViewRemovedFromWidget(views::View*) {
-  controller_->RemoveDeleteEditShortcutWidget();
-}
-
-void DeleteEditShortcut::OnViewBoundsChanged(views::View*) {
-  controller_->RemoveDeleteEditShortcutWidget();
-}
-
-void DeleteEditShortcut::Init() {
-  SetBorder(views::CreateEmptyBorder(gfx::Insets::VH(12, 12)));
-  SetBackground(views::CreateThemedRoundedRectBackground(
-      cros_tokens::kCrosSysSystemBaseElevatedOpaque,
-      /*radius=*/20,
-      /*for_border_thickness=*/0));
   SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kVertical,
       /*inside_border_insets=*/gfx::Insets(),
@@ -90,28 +64,63 @@
       IDS_APP_LIST_FOLDER_NAME_PLACEHOLDER));
 }
 
+DeleteEditShortcut::~DeleteEditShortcut() = default;
+
+void DeleteEditShortcut::UpdateAnchorView(ActionViewListItem* anchor_view) {
+  SetAnchorView(anchor_view);
+}
+
 void DeleteEditShortcut::OnEditButtonPressed() {
-  controller_->AddButtonOptionsMenuWidget(anchor_view_->action());
-  controller_->RemoveDeleteEditShortcutWidget();
+  if (auto* anchor_view =
+          views::AsViewClass<ActionViewListItem>(GetAnchorView())) {
+    controller_->AddButtonOptionsMenuWidget(anchor_view->action());
+  }
 }
 
 void DeleteEditShortcut::OnDeleteButtonPressed() {
-  controller_->RemoveAction(anchor_view_->action());
+  if (auto* anchor_view =
+          views::AsViewClass<ActionViewListItem>(GetAnchorView())) {
+    controller_->RemoveAction(anchor_view->action());
+    controller_->RemoveDeleteEditShortcutWidget();
+  }
 }
 
-void DeleteEditShortcut::UpdateWidget() {
-  auto* widget = GetWidget();
-  DCHECK(widget);
+std::unique_ptr<views::NonClientFrameView>
+DeleteEditShortcut::CreateNonClientFrameView(views::Widget* widget) {
+  // Create the customized bubble border.
+  auto bubble_border =
+      std::make_unique<views::BubbleBorder>(arrow(), GetShadow());
+  bubble_border->SetColor(color());
+  if (GetParams().round_corners) {
+    bubble_border->SetCornerRadius(GetCornerRadius());
+  }
+  bubble_border->set_avoid_shadow_overlap(true);
+  bubble_border->set_insets(
+      gfx::Insets::VH(0, kSpaceToEditingList + kEditingListInsideBorderInsets));
 
-  auto anchor_point = anchor_view_->GetBoundsInScreen().top_right();
-  auto preferred_size = GetPreferredSize();
-  anchor_point.Offset(kEditingListInsideBorderInsets + kSpaceFromEditingList,
-                      (anchor_view_->height() - preferred_size.height()) / 2);
-  widget->SetBounds(gfx::Rect(anchor_point, preferred_size));
-  widget->StackAtTop();
+  auto frame =
+      views::BubbleDialogDelegateView::CreateNonClientFrameView(widget);
+  static_cast<views::BubbleFrameView*>(frame.get())
+      ->SetBubbleBorder(std::move(bubble_border));
+  return frame;
 }
 
-BEGIN_METADATA(DeleteEditShortcut, views::View)
+void DeleteEditShortcut::OnThemeChanged() {
+  views::BubbleDialogDelegateView::OnThemeChanged();
+  if (auto* color_provider = GetColorProvider()) {
+    set_color(color_provider->GetColor(
+        cros_tokens::kCrosSysSystemBaseElevatedOpaque));
+  }
+}
+
+void DeleteEditShortcut::OnMouseExited(const ui::MouseEvent& event) {
+  if (auto* widget = GetWidget();
+      widget->IsMouseEventsEnabled() && !IsMouseHovered()) {
+    controller_->RemoveDeleteEditShortcutWidget();
+  }
+}
+
+BEGIN_METADATA(DeleteEditShortcut, views::BubbleDialogDelegateView)
 END_METADATA
 
 }  // namespace arc::input_overlay
diff --git a/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.h b/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.h
index 3dfe7a1..6f53426d 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.h
+++ b/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut.h
@@ -5,11 +5,15 @@
 #ifndef CHROME_BROWSER_ASH_ARC_INPUT_OVERLAY_UI_DELETE_EDIT_SHORTCUT_H_
 #define CHROME_BROWSER_ASH_ARC_INPUT_OVERLAY_UI_DELETE_EDIT_SHORTCUT_H_
 
+#include <memory>
+
 #include "base/memory/raw_ptr.h"
-#include "base/scoped_observation.h"
 #include "ui/base/metadata/metadata_header_macros.h"
-#include "ui/views/view.h"
-#include "ui/views/view_observer.h"
+#include "ui/views/bubble/bubble_dialog_delegate_view.h"
+
+namespace views {
+class NonClientFrameView;
+}
 
 namespace arc::input_overlay {
 
@@ -25,7 +29,7 @@
 // |------|
 // ||icon||
 // +------+
-class DeleteEditShortcut : public views::View, public views::ViewObserver {
+class DeleteEditShortcut : public views::BubbleDialogDelegateView {
  public:
   METADATA_HEADER(DeleteEditShortcut);
   DeleteEditShortcut(DisplayOverlayController* controller,
@@ -34,40 +38,25 @@
   DeleteEditShortcut& operator=(const DeleteEditShortcut&) = delete;
   ~DeleteEditShortcut() override;
 
-  ActionViewListItem* anchor_view() { return anchor_view_; }
-
   void UpdateAnchorView(ActionViewListItem* anchor_view);
 
-  // views::View:
-  void VisibilityChanged(views::View* starting_from, bool is_visible) override;
-  void OnMouseExited(const ui::MouseEvent& event) override;
-
-  // views::ViewObserver:
-  void OnViewRemovedFromWidget(views::View*) override;
-  void OnViewBoundsChanged(views::View*) override;
-
  private:
-  friend class EditingListTest;
-
-  class AnchorViewObserver;
-
-  // Build related views.
-  void Init();
+  friend class DeleteEditShortcutTest;
 
   // Handle button functions.
   void OnEditButtonPressed();
   void OnDeleteButtonPressed();
 
-  void UpdateWidget();
+  // views::DialogDelegate:
+  std::unique_ptr<views::NonClientFrameView> CreateNonClientFrameView(
+      views::Widget* widget) override;
+
+  // views::View:
+  void OnMouseExited(const ui::MouseEvent& event) override;
+  void OnThemeChanged() override;
 
   // DisplayOverlayController owns this class, no need to deallocate.
   const raw_ptr<DisplayOverlayController> controller_ = nullptr;
-  raw_ptr<ActionViewListItem> anchor_view_ = nullptr;
-
-  // Watches for the anchor view to be destroyed or removed from its widget.
-  // Prevents the delete edit shortcut from lingering after its anchor is
-  // invalid, which can cause strange behavior.
-  base::ScopedObservation<View, ViewObserver> observation_{this};
 };
 
 }  // namespace arc::input_overlay
diff --git a/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut_unittest.cc b/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut_unittest.cc
new file mode 100644
index 0000000..92899f5f
--- /dev/null
+++ b/chrome/browser/ash/arc/input_overlay/ui/delete_edit_shortcut_unittest.cc
@@ -0,0 +1,112 @@
+// 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/ash/arc/input_overlay/ui/delete_edit_shortcut.h"
+
+#include "chrome/browser/ash/arc/input_overlay/actions/action.h"
+#include "chrome/browser/ash/arc/input_overlay/display_overlay_controller.h"
+#include "chrome/browser/ash/arc/input_overlay/test/overlay_view_test_base.h"
+#include "chrome/browser/ash/arc/input_overlay/ui/action_view_list_item.h"
+#include "ui/views/view_utils.h"
+
+namespace arc::input_overlay {
+
+class DeleteEditShortcutTest : public OverlayViewTestBase {
+ public:
+  DeleteEditShortcutTest() = default;
+  ~DeleteEditShortcutTest() override = default;
+
+  void PressEditButton() {
+    if (auto* delete_edit_view = GetDeleteEditShortcut()) {
+      delete_edit_view->OnEditButtonPressed();
+    }
+  }
+
+  void PressDeleteButton() {
+    if (auto* delete_edit_view = GetDeleteEditShortcut()) {
+      delete_edit_view->OnDeleteButtonPressed();
+    }
+  }
+
+  Action* GetDeleteEditShortcutAnchorAction() const {
+    if (const auto* delete_edit_view = GetDeleteEditShortcut()) {
+      if (const auto* list_item = views::AsViewClass<ActionViewListItem>(
+              delete_edit_view->GetAnchorView())) {
+        return list_item->action();
+      }
+    }
+    return nullptr;
+  }
+
+  bool IsDeleteEditShortcutVisible() const {
+    if (auto* delete_edit_view = GetDeleteEditShortcut()) {
+      return delete_edit_view->GetWidget()->IsVisible();
+    }
+    return false;
+  }
+};
+
+TEST_F(DeleteEditShortcutTest, TestVisibility) {
+  EXPECT_FALSE(IsDeleteEditShortcutVisible());
+  HoverAtActionViewListItem(/*index=*/0u);
+  EXPECT_TRUE(IsDeleteEditShortcutVisible());
+  EXPECT_EQ(GetEditingListItemAction(/*index=*/0u),
+            GetDeleteEditShortcutAnchorAction());
+
+  HoverAtActionViewListItem(/*index=*/1u);
+  EXPECT_TRUE(IsDeleteEditShortcutVisible());
+  EXPECT_EQ(GetEditingListItemAction(/*index=*/1u),
+            GetDeleteEditShortcutAnchorAction());
+
+  // Click and touch on the center of the delete-edit view.
+  auto* delete_edit_view = GetDeleteEditShortcut();
+  DCHECK(delete_edit_view);
+  LeftClickOn(delete_edit_view);
+  EXPECT_TRUE(IsDeleteEditShortcutVisible());
+  GestureTapOn(delete_edit_view);
+  EXPECT_TRUE(IsDeleteEditShortcutVisible());
+
+  // Click outside of the delete-edit view to close it.
+  auto origin = delete_edit_view->GetBoundsInScreen().origin();
+  origin.Offset(-2, -2);
+  auto* event_generator = GetEventGenerator();
+  event_generator->MoveMouseTo(origin);
+  event_generator->ClickLeftButton();
+  EXPECT_FALSE(IsDeleteEditShortcutVisible());
+
+  // Mouse hover on the delete-edit view and then hover out to close it.
+  HoverAtActionViewListItem(/*index=*/1u);
+  EXPECT_TRUE(IsDeleteEditShortcutVisible());
+  const auto view_bounds = GetDeleteEditShortcut()->GetBoundsInScreen();
+  event_generator->MoveMouseTo(view_bounds.CenterPoint());
+  EXPECT_TRUE(IsDeleteEditShortcutVisible());
+  auto point = view_bounds.bottom_right();
+  point.Offset(2, 2);
+  event_generator->MoveMouseTo(point);
+  EXPECT_FALSE(IsDeleteEditShortcutVisible());
+}
+
+TEST_F(DeleteEditShortcutTest, TestFunctions) {
+  // Test edit button.
+  EXPECT_FALSE(IsDeleteEditShortcutVisible());
+  HoverAtActionViewListItem(/*index=*/0u);
+  EXPECT_TRUE(IsDeleteEditShortcutVisible());
+  PressEditButton();
+  EXPECT_FALSE(IsDeleteEditShortcutVisible());
+  EXPECT_TRUE(GetButtonOptionsMenu());
+  EXPECT_EQ(GetEditingListItemAction(/*index=*/0u),
+            GetButtonOptionsMenuAction());
+  PressDoneButtonOnButtonOptionsMenu();
+
+  // Test delete button.
+  const size_t original_size = GetActionListItemsSize();
+  HoverAtActionViewListItem(/*index=*/1u);
+  EXPECT_TRUE(IsDeleteEditShortcutVisible());
+  PressDeleteButton();
+  EXPECT_FALSE(IsDeleteEditShortcutVisible());
+  EXPECT_EQ(original_size - 1, GetActionListItemsSize());
+  EXPECT_EQ(original_size - 1, GetActionViewSize());
+}
+
+}  // namespace arc::input_overlay
diff --git a/chrome/browser/ash/arc/input_overlay/ui/edit_finish_view.cc b/chrome/browser/ash/arc/input_overlay/ui/edit_finish_view.cc
index 2f268e9..68ada38 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/edit_finish_view.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/edit_finish_view.cc
@@ -330,9 +330,8 @@
 }
 
 void EditFinishView::SetCursor(ui::mojom::CursorType cursor_type) {
-  auto* widget = GetWidget();
   // widget is null for test.
-  if (widget) {
+  if (auto* widget = GetWidget()) {
     widget->SetCursor(cursor_type);
   }
 }
diff --git a/chrome/browser/ash/arc/input_overlay/ui/edit_label_unittest.cc b/chrome/browser/ash/arc/input_overlay/ui/edit_label_unittest.cc
index 3b70e31..63d9cbf7 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/edit_label_unittest.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/edit_label_unittest.cc
@@ -145,8 +145,8 @@
       return nullptr;
     }
     for (auto* child : scroll_content->children()) {
-      auto* list_item = static_cast<ActionViewListItem*>(child);
-      if (list_item->action() == action) {
+      if (auto* list_item = static_cast<ActionViewListItem*>(child);
+          list_item->action() == action) {
         return list_item;
       }
     }
diff --git a/chrome/browser/ash/arc/input_overlay/ui/edit_labels.cc b/chrome/browser/ash/arc/input_overlay/ui/edit_labels.cc
index eda3698c..2b7ffdb 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/edit_labels.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/edit_labels.cc
@@ -83,8 +83,7 @@
   // Clicking the edit labels with an already focused edit label causes the next
   // label to gain focus.
   for (size_t i = 0; i < labels_.size(); i++) {
-    auto* label = labels_[i];
-    if (label->HasFocus()) {
+    if (auto* label = labels_[i]; label->HasFocus()) {
       labels_[(i + 1) % labels_.size()]->RequestFocus();
       return;
     }
diff --git a/chrome/browser/ash/arc/input_overlay/ui/editing_list.cc b/chrome/browser/ash/arc/input_overlay/ui/editing_list.cc
index 3d20dc7..36be6fa 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/editing_list.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/editing_list.cc
@@ -408,7 +408,7 @@
   auto* widget = GetWidget();
   DCHECK(widget);
 
-  const auto width = GetPreferredSize().width();
+  const int width = GetPreferredSize().width();
   const auto anchor_bounds = controller_->touch_injector()->content_bounds();
   const auto available_bounds = CalculateAvailableBounds(
       controller_->touch_injector()->window()->GetRootWindow());
diff --git a/chrome/browser/ash/arc/input_overlay/ui/editing_list_unittest.cc b/chrome/browser/ash/arc/input_overlay/ui/editing_list_unittest.cc
index faef237..d2effbc 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/editing_list_unittest.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/editing_list_unittest.cc
@@ -27,6 +27,7 @@
 #include "ui/events/event.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/scroll_view.h"
+#include "ui/views/view_utils.h"
 #include "ui/views/widget/widget.h"
 
 namespace arc::input_overlay {
@@ -36,15 +37,6 @@
   EditingListTest() = default;
   ~EditingListTest() override = default;
 
-  size_t GetActionListItemsSize() {
-    DCHECK(editing_list_->scroll_content_);
-    DCHECK(editing_list_);
-    if (editing_list_->HasControls()) {
-      return editing_list_->scroll_content_->children().size();
-    }
-    return 0;
-  }
-
   size_t GetTouchInjectorActionSize() {
     DCHECK(touch_injector_);
     return touch_injector_->actions().size();
@@ -69,7 +61,8 @@
     }
 
     auto* event_generator = GetEventGenerator();
-    auto view_bounds = scroll_content->children()[index]->GetBoundsInScreen();
+    const auto view_bounds =
+        scroll_content->children()[index]->GetBoundsInScreen();
     // `ButtonOptionsMenu` may cover `EditingList`, so left-click on the left
     // side of the list item to avoid UI overlapping.
     event_generator->MoveMouseTo(view_bounds.x() + view_bounds.width() / 4,
@@ -77,21 +70,6 @@
     event_generator->ClickLeftButton();
   }
 
-  void HoverAtActionViewListItem(int index) {
-    if (!editing_list_ || editing_list_->is_zero_state_ || index < 0) {
-      return;
-    }
-    views::View* scroll_content = editing_list_->scroll_content_;
-    DCHECK(scroll_content);
-    if (index >= static_cast<int>(scroll_content->children().size())) {
-      return;
-    }
-
-    auto* event_generator = GetEventGenerator();
-    auto view_bounds = scroll_content->children()[index]->GetBoundsInScreen();
-    event_generator->MoveMouseTo(view_bounds.CenterPoint());
-  }
-
   void MouseDragEditingListBy(int x, int y) {
     auto* event_generator = GetEventGenerator();
     event_generator->MoveMouseTo(
@@ -106,7 +84,7 @@
   // button.
   void MouseDraggingActionViewBy(Action* action, int x, int y) {
     auto* event_generator = GetEventGenerator();
-    auto* touch_point = action->action_view()->touch_point();
+    const auto* touch_point = action->action_view()->touch_point();
     if (!touch_point) {
       LOG(WARNING) << "Mouse dragging has no valid touch point.";
       return;
@@ -133,7 +111,7 @@
     }
     views::View* scroll_content = editing_list_->scroll_content_;
     DCHECK(scroll_content);
-    int scroll_height = scroll_content->GetPreferredSize().height();
+    const int scroll_height = scroll_content->GetPreferredSize().height();
     editing_list_->scroll_view_->ScrollByOffset(
         gfx::PointF(0, top ? -scroll_height : scroll_height));
   }
@@ -150,24 +128,17 @@
     return controller_->input_mapping_widget_.get();
   }
 
-  bool ButtonOptionsMenuExists() {
-    return !!controller_->button_options_widget_;
-  }
-
-  bool DeleteEditShortcutExists() {
-    return !!controller_->delete_edit_shortcut_widget_;
-  }
-
   bool IsActionHighlightVisible() {
-    if (!controller_->action_highlight_widget_) {
-      return false;
+    DCHECK(controller_);
+    if (const auto* highlight_widget =
+            controller_->action_highlight_widget_.get()) {
+      return highlight_widget->IsVisible();
     }
-    return controller_->action_highlight_widget_->GetContentsView()
-        ->GetVisible();
+    return false;
   }
 
   bool IsButtonOptionsMenuVisible() {
-    auto* menu_widget = controller_->button_options_widget_.get();
+    const auto* menu_widget = controller_->button_options_widget_.get();
     return menu_widget && menu_widget->IsVisible();
   }
 
@@ -192,42 +163,6 @@
     DCHECK(editing_list);
     return editing_list->GetKeyEditNudgeForTesting();
   }
-
-  void PressEditButton() {
-    DCHECK(controller_->delete_edit_shortcut_widget_);
-    static_cast<DeleteEditShortcut*>(
-        controller_->delete_edit_shortcut_widget_->GetContentsView())
-        ->OnEditButtonPressed();
-  }
-
-  void PressDeleteButton() {
-    DCHECK(controller_->delete_edit_shortcut_widget_);
-    static_cast<DeleteEditShortcut*>(
-        controller_->delete_edit_shortcut_widget_->GetContentsView())
-        ->OnDeleteButtonPressed();
-  }
-
-  Action* GetButtonOptionsAction() {
-    auto* menu = controller_->GetButtonOptionsMenu();
-    if (!menu) {
-      return nullptr;
-    }
-    return menu->action();
-  }
-
-  Action* GetDeleteEditShortcutAction() {
-    return static_cast<DeleteEditShortcut*>(
-               controller_->delete_edit_shortcut_widget_->GetContentsView())
-        ->anchor_view()
-        ->action();
-  }
-
-  views::Widget* GetEducationNudge(views::Widget* widget) {
-    DCHECK(controller_);
-    auto& widgets_map = controller_->nudge_widgets_;
-    return widgets_map.contains(widget) ? widgets_map.find(widget)->second.get()
-                                        : nullptr;
-  }
 };
 
 TEST_F(EditingListTest, TestAddNewAction) {
@@ -237,7 +172,7 @@
   EXPECT_EQ(3u, GetActionListItemsSize());
   EXPECT_EQ(3u, GetActionViewSize());
   EXPECT_EQ(3u, GetTouchInjectorActionSize());
-  EXPECT_FALSE(ButtonOptionsMenuExists());
+  EXPECT_FALSE(GetButtonOptionsMenu());
   // Press add button and it enters into the button placement mode.
   PressAddButton();
   auto* target_view = GetTargetView();
@@ -252,7 +187,7 @@
   EXPECT_EQ(4u, GetActionListItemsSize());
   EXPECT_EQ(4u, GetActionViewSize());
   EXPECT_EQ(4u, GetTouchInjectorActionSize());
-  EXPECT_TRUE(ButtonOptionsMenuExists());
+  EXPECT_TRUE(GetButtonOptionsMenu());
 
   // Make sure `Action::touch_down_positions_` is not empty for the new action.
   auto* new_action = touch_injector_->actions()[3].get();
@@ -302,7 +237,7 @@
                /*expect_ids=*/{0, 1, 2});
   AddNewAction();
   EXPECT_TRUE(IsButtonOptionsMenuVisible());
-  auto* action = GetButtonOptionsAction();
+  auto* action = GetButtonOptionsMenuAction();
   EXPECT_TRUE(action->is_new());
   MouseDraggingActionViewBy(action, /*x=*/10, /*y=*/10);
   EXPECT_FALSE(IsButtonOptionsMenuVisible());
@@ -318,44 +253,39 @@
                /*expect_ids=*/{0, 1, 2});
   // Test action view list press.
   AddNewAction();
-  EXPECT_TRUE(ButtonOptionsMenuExists());
-  auto* action_1 = GetButtonOptionsAction();
+  EXPECT_TRUE(GetButtonOptionsMenu());
+  auto* action_1 = GetButtonOptionsMenuAction();
   PressDoneButtonOnButtonOptionsMenu();
   // Scroll back to top to click the first list item.
   ScrollTo(/*top=*/true);
   LeftClickAtActionViewListItem(/*index=*/0);
-  EXPECT_TRUE(ButtonOptionsMenuExists());
-  auto* action_2 = GetButtonOptionsAction();
+  EXPECT_TRUE(GetButtonOptionsMenu());
+  auto* action_2 = GetButtonOptionsMenuAction();
   EXPECT_NE(action_1, action_2);
   PressDoneButtonOnButtonOptionsMenu();
   LeftClickAtActionViewListItem(/*index=*/1);
-  EXPECT_TRUE(ButtonOptionsMenuExists());
-  auto* action_3 = GetButtonOptionsAction();
+  EXPECT_TRUE(GetButtonOptionsMenu());
+  auto* action_3 = GetButtonOptionsMenuAction();
   EXPECT_NE(action_3, action_2);
 }
 
-TEST_F(EditingListTest, TestHoverAtActionViewListItem) {
-  CheckActions(touch_injector_, /*expect_size=*/3u, /*expect_types=*/
-               {ActionType::TAP, ActionType::TAP, ActionType::MOVE},
-               /*expect_ids=*/{0, 1, 2});
-  HoverAtActionViewListItem(/*index=*/0);
-  EXPECT_TRUE(DeleteEditShortcutExists());
-  EXPECT_TRUE(IsActionHighlightVisible());
-  auto* action = GetDeleteEditShortcutAction();
+TEST_F(EditingListTest, TestHoverAtListItem) {
+  EXPECT_FALSE(IsActionHighlightVisible());
 
-  PressEditButton();
-  EXPECT_TRUE(ButtonOptionsMenuExists());
-  EXPECT_FALSE(DeleteEditShortcutExists());
-  EXPECT_EQ(action, GetButtonOptionsAction());
-  PressDoneButtonOnButtonOptionsMenu();
-
-  HoverAtActionViewListItem(/*index=*/0);
-  EXPECT_TRUE(DeleteEditShortcutExists());
+  HoverAtActionViewListItem(/*index=*/0u);
   EXPECT_TRUE(IsActionHighlightVisible());
-  PressDeleteButton();
-  EXPECT_FALSE(DeleteEditShortcutExists());
-  EXPECT_EQ(2u, GetActionListItemsSize());
-  EXPECT_EQ(2u, GetActionViewSize());
+
+  HoverAtActionViewListItem(/*index=*/1u);
+  EXPECT_TRUE(IsActionHighlightVisible());
+
+  // Hover outside of the list item and the view highlight is also removed.
+  auto* list_item = GetEditingListItem(/*index=*/1u);
+  DCHECK(list_item);
+  auto item_origin = list_item->GetBoundsInScreen().origin();
+  item_origin.Offset(-2, -2);
+  auto* event_generator = GetEventGenerator();
+  event_generator->MoveMouseTo(item_origin);
+  EXPECT_FALSE(IsActionHighlightVisible());
 }
 
 TEST_F(EditingListTest, TestReposition) {
diff --git a/chrome/browser/ash/arc/input_overlay/ui/educational_view.cc b/chrome/browser/ash/arc/input_overlay/ui/educational_view.cc
index 7ae80ce2..8041b48 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/educational_view.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/educational_view.cc
@@ -154,7 +154,7 @@
   SetBackground(views::CreateThemedRoundedRectBackground(
       ash::kColorAshDialogBackgroundColor, kDialogCornerRadius));
 
-  bool is_dark = ash::DarkLightModeController::Get()->IsDarkModeEnabled();
+  const bool is_dark = ash::DarkLightModeController::Get()->IsDarkModeEnabled();
   const int parent_width = parent_size.width();
   {
     // UI's banner.
@@ -163,10 +163,10 @@
 
     if (portrait_mode_) {
       // Resize the banner image size proportionally.
-      auto size = banner->CalculatePreferredSize();
-      int width =
+      const auto size = banner->CalculatePreferredSize();
+      const int width =
           GetDialogWidth(parent_width) - GetBorderSides(portrait_mode_) * 2;
-      float ratio = 1.0 * width / size.width();
+      const float ratio = 1.0 * width / size.width();
       banner->SetImageSize(gfx::Size(width, size.height() * ratio));
     }
     banner_ = AddChildView(std::move(banner));
diff --git a/chrome/browser/ash/arc/input_overlay/ui/input_mapping_view.cc b/chrome/browser/ash/arc/input_overlay/ui/input_mapping_view.cc
index a582a9a..4d71bae 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/input_mapping_view.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/input_mapping_view.cc
@@ -14,6 +14,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/views/background.h"
+#include "ui/views/view_utils.h"
 
 namespace arc::input_overlay {
 namespace {
@@ -23,8 +24,8 @@
 // Return true if `v1` is on top than `v2`, or `v1` is on the left side of `v2`
 // when `v1` has the same y position as `v2`.
 bool CompareActionViewPosition(const ActionView* v1, const ActionView* v2) {
-  auto center1 = v1->GetTouchCenterInWindow();
-  auto center2 = v2->GetTouchCenterInWindow();
+  const auto center1 = v1->GetTouchCenterInWindow();
+  const auto center2 = v2->GetTouchCenterInWindow();
 
   if (center1.y() != center2.y()) {
     return center1.y() < center2.y();
@@ -42,8 +43,7 @@
     if (action->IsDeleted()) {
       continue;
     }
-    auto view = action->CreateView(controller_);
-    if (view) {
+    if (auto view = action->CreateView(controller_)) {
       AddChildView(std::move(view));
     }
   }
@@ -89,8 +89,8 @@
       if (!action_label->HasFocus()) {
         continue;
       }
-      auto bounds = action_label->GetBoundsInScreen();
-      if (!bounds.Contains(event_location)) {
+      if (auto bounds = action_label->GetBoundsInScreen();
+          !bounds.Contains(event_location)) {
         action_label->ClearFocus();
         controller_->AddEditMessage(
             l10n_util::GetStringUTF8(IDS_INPUT_OVERLAY_EDIT_INSTRUCTIONS),
@@ -103,7 +103,7 @@
 
 void InputMappingView::SortChildren() {
   std::vector<ActionView*> left, right;
-  float aspect_ratio = (float)width() / height();
+  const float aspect_ratio = (float)width() / height();
   for (auto* child : children()) {
     auto* action_view = static_cast<ActionView*>(child);
     if (aspect_ratio > 1 &&
@@ -129,8 +129,7 @@
   // No add function for pre-beta version.
   DCHECK(IsBeta());
 
-  auto view = action.CreateView(controller_);
-  if (view) {
+  if (auto view = action.CreateView(controller_)) {
     AddChildView(std::move(view))->SetDisplayMode(current_display_mode_);
   }
 }
@@ -163,8 +162,8 @@
   DCHECK(IsBeta());
 
   for (auto* const child : children()) {
-    auto* action_view = static_cast<ActionView*>(child);
-    if (action_view->action() == &action) {
+    if (auto* action_view = views::AsViewClass<ActionView>(child);
+        action_view->action() == &action) {
       RemoveChildViewT(action_view);
       break;
     }
@@ -173,8 +172,8 @@
 
 void InputMappingView::OnActionNewStateRemoved(const Action& action) {
   for (auto* const child : children()) {
-    auto* action_view = static_cast<ActionView*>(child);
-    if (action_view->action() == &action) {
+    if (auto* action_view = views::AsViewClass<ActionView>(child);
+        action_view->action() == &action) {
       action_view->RemoveNewState();
       break;
     }
@@ -195,8 +194,8 @@
   }
 
   for (auto* const child : children()) {
-    auto* action_view = static_cast<ActionView*>(child);
-    if (action_view->action() == &action) {
+    if (auto* action_view = views::AsViewClass<ActionView>(child);
+        action_view->action() == &action) {
       action_view->OnActionInputBindingUpdated();
       break;
     }
diff --git a/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.cc b/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.cc
index c5ed1b76..71ca1c0 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.cc
@@ -461,19 +461,16 @@
 }
 
 void InputMenuView::SetCustomToggleColor(views::ToggleButton* toggle) {
-  auto* color_provider = ash::AshColorProvider::Get();
-  if (!color_provider) {
-    return;
+  if (const auto* color_provider = ash::AshColorProvider::Get()) {
+    toggle->SetThumbOnColor(color_provider->GetContentLayerColor(
+        ash::AshColorProvider::ContentLayerType::kSwitchKnobColorActive));
+    toggle->SetThumbOffColor(color_provider->GetContentLayerColor(
+        ash::AshColorProvider::ContentLayerType::kSwitchKnobColorInactive));
+    toggle->SetTrackOnColor(color_provider->GetContentLayerColor(
+        ash::AshColorProvider::ContentLayerType::kSwitchTrackColorActive));
+    toggle->SetTrackOffColor(color_provider->GetContentLayerColor(
+        ash::AshColorProvider::ContentLayerType::kSwitchTrackColorInactive));
   }
-
-  toggle->SetThumbOnColor(color_provider->GetContentLayerColor(
-      ash::AshColorProvider::ContentLayerType::kSwitchKnobColorActive));
-  toggle->SetThumbOffColor(color_provider->GetContentLayerColor(
-      ash::AshColorProvider::ContentLayerType::kSwitchKnobColorInactive));
-  toggle->SetTrackOnColor(color_provider->GetContentLayerColor(
-      ash::AshColorProvider::ContentLayerType::kSwitchTrackColorActive));
-  toggle->SetTrackOffColor(color_provider->GetContentLayerColor(
-      ash::AshColorProvider::ContentLayerType::kSwitchTrackColorInactive));
 }
 
 BEGIN_METADATA(InputMenuView)
diff --git a/chrome/browser/ash/arc/input_overlay/ui/menu_entry_view.cc b/chrome/browser/ash/arc/input_overlay/ui/menu_entry_view.cc
index 5badd8b..dfb5f77 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/menu_entry_view.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/menu_entry_view.cc
@@ -178,21 +178,20 @@
   focus_ring->SetHaloThickness(kHaloThickness);
   focus_ring->SetColorId(ui::kColorAshInputOverlayFocusRing);
 
-  auto position = CalculatePosition();
+  const auto position = CalculatePosition();
   SetBounds(position.x(), position.y(), kMenuEntrySize, kMenuEntrySize);
 }
 
 gfx::Point MenuEntryView::CalculatePosition() const {
   const auto* touch_injector = display_overlay_controller_->touch_injector();
-  auto normalized_location = touch_injector->menu_entry_location();
-  if (normalized_location) {
-    auto content_bounds = touch_injector->content_bounds_f();
+  if (auto normalized_location = touch_injector->menu_entry_location()) {
+    const auto content_bounds = touch_injector->content_bounds_f();
     return gfx::Point(static_cast<int>(std::round(normalized_location->x() *
                                                   content_bounds.width())),
                       static_cast<int>(std::round(normalized_location->y() *
                                                   content_bounds.height())));
   } else {
-    auto* parent_view =
+    const auto* parent_view =
         display_overlay_controller_->GetOverlayWidgetContentsView();
     if (!parent_view || parent_view->bounds().IsEmpty()) {
       return gfx::Point();
@@ -240,9 +239,8 @@
 }
 
 void MenuEntryView::SetCursor(ui::mojom::CursorType cursor_type) {
-  auto* widget = GetWidget();
   // widget is null for test.
-  if (widget) {
+  if (auto* widget = GetWidget()) {
     widget->SetCursor(cursor_type);
   }
 }
diff --git a/chrome/browser/ash/arc/input_overlay/ui/reposition_controller.cc b/chrome/browser/ash/arc/input_overlay/ui/reposition_controller.cc
index 16a28134..44e8e72 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/reposition_controller.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/reposition_controller.cc
@@ -87,9 +87,8 @@
 }
 
 bool RepositionController::OnKeyPressed(const ui::KeyEvent& event) {
-  auto target_position = host_view_->origin();
-
-  if (OffsetPositionByArrowKey(event.key_code(), target_position)) {
+  if (auto target_position = host_view_->origin();
+      OffsetPositionByArrowKey(event.key_code(), target_position)) {
     ClampPosition(target_position, host_view_->size(),
                   host_view_->parent()->size(), parent_padding_);
     host_view_->SetPosition(target_position);
diff --git a/chrome/browser/ash/arc/input_overlay/ui/touch_point.cc b/chrome/browser/ash/arc/input_overlay/ui/touch_point.cc
index 483f1de..8a1b04d3 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/touch_point.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/touch_point.cc
@@ -411,9 +411,8 @@
 }
 
 bool TouchPoint::OnMouseDragged(const ui::MouseEvent& event) {
-  auto* widget = GetWidget();
   // widget is null for test.
-  if (widget) {
+  if (auto* widget = GetWidget()) {
     widget->SetCursor(ui::mojom::CursorType::kGrabbing);
   }
   SetToDrag();
@@ -422,9 +421,8 @@
 }
 
 void TouchPoint::OnMouseReleased(const ui::MouseEvent& event) {
-  auto* widget = GetWidget();
   // widget is null for test.
-  if (widget) {
+  if (auto* widget = GetWidget()) {
     widget->SetCursor(ui::mojom::CursorType::kGrab);
   }
   SetToHover();
diff --git a/chrome/browser/ash/arc/input_overlay/ui/ui_utils.cc b/chrome/browser/ash/arc/input_overlay/ui/ui_utils.cc
index 71dc70e..6b6d050 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/ui_utils.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/ui_utils.cc
@@ -137,7 +137,8 @@
 gfx::Rect CalculateAvailableBounds(aura::Window* root_window) {
   DCHECK(root_window->IsRootWindow());
 
-  auto* shelf = ash::RootWindowController::ForWindow(root_window)->shelf();
+  const auto* shelf =
+      ash::RootWindowController::ForWindow(root_window)->shelf();
   DCHECK(shelf);
   if (!shelf->IsVisible()) {
     return root_window->bounds();
diff --git a/chrome/browser/ash/arc/input_overlay/util.cc b/chrome/browser/ash/arc/input_overlay/util.cc
index 57c1ee8..271fd6a 100644
--- a/chrome/browser/ash/arc/input_overlay/util.cc
+++ b/chrome/browser/ash/arc/input_overlay/util.cc
@@ -86,11 +86,9 @@
 
 void ResetFocusTo(views::View* view) {
   DCHECK(view);
-  auto* focus_manager = view->GetFocusManager();
-  if (!focus_manager) {
-    return;
+  if (auto* focus_manager = view->GetFocusManager()) {
+    focus_manager->SetFocusedView(view);
   }
-  focus_manager->SetFocusedView(view);
 }
 
 // For the keys that are caught by display overlay, check if they are reserved
diff --git a/chrome/browser/ash/crosapi/document_scan_ash_type_converters.cc b/chrome/browser/ash/crosapi/document_scan_ash_type_converters.cc
index 99b7736..de25eac4 100644
--- a/chrome/browser/ash/crosapi/document_scan_ash_type_converters.cc
+++ b/chrome/browser/ash/crosapi/document_scan_ash_type_converters.cc
@@ -582,15 +582,15 @@
       ConvertTo<crosapi::mojom::ScannerOperationResult>(input.result());
 
   if (output->result == crosapi::mojom::ScannerOperationResult::kSuccess) {
-    output->options.emplace();
-    output->options->reserve(input.config().option_groups_size());
+    output->groups.emplace();
+    output->groups->reserve(input.config().option_groups_size());
     // Grab the OptionGroup from the ScannerConfig.
     for (const lorgnette::OptionGroup& group : input.config().option_groups()) {
       auto output_group = crosapi::mojom::OptionGroup::New();
       output_group->title = group.title();
       output_group->members = std::vector<std::string>(group.members().begin(),
                                                        group.members().end());
-      output->options->emplace_back(std::move(output_group));
+      output->groups->emplace_back(std::move(output_group));
     }
   }
 
diff --git a/chrome/browser/ash/crosapi/document_scan_ash_type_converters_unittest.cc b/chrome/browser/ash/crosapi/document_scan_ash_type_converters_unittest.cc
index 87b7a97..fbe3a26 100644
--- a/chrome/browser/ash/crosapi/document_scan_ash_type_converters_unittest.cc
+++ b/chrome/browser/ash/crosapi/document_scan_ash_type_converters_unittest.cc
@@ -813,7 +813,7 @@
   auto output = crosapi::mojom::GetOptionGroupsResponse::From(input);
   EXPECT_TRUE(output->scanner_handle.empty());
   EXPECT_EQ(output->result, crosapi::mojom::ScannerOperationResult::kUnknown);
-  EXPECT_FALSE(output->options.has_value());
+  EXPECT_FALSE(output->groups.has_value());
 }
 
 TEST(DocumentScanAshTypeConvertersTest, GetOptionGroupsResponse_Success) {
@@ -832,12 +832,12 @@
   auto output = crosapi::mojom::GetOptionGroupsResponse::From(input);
   EXPECT_EQ(output->scanner_handle, "scanner-handle");
   EXPECT_EQ(output->result, crosapi::mojom::ScannerOperationResult::kSuccess);
-  EXPECT_TRUE(output->options.has_value());
-  ASSERT_EQ(output->options.value().size(), 2U);
-  const auto& actual1 = output->options.value()[0];
+  EXPECT_TRUE(output->groups.has_value());
+  ASSERT_EQ(output->groups.value().size(), 2U);
+  const auto& actual1 = output->groups.value()[0];
   EXPECT_EQ(actual1->title, "group1");
   EXPECT_THAT(actual1->members, ElementsAre("group1-val1", "group1-val2"));
-  const auto& actual2 = output->options.value()[1];
+  const auto& actual2 = output->groups.value()[1];
   EXPECT_EQ(actual2->title, "group2");
   EXPECT_THAT(actual2->members, ElementsAre("group2-val1"));
 }
diff --git a/chrome/browser/ash/crosapi/document_scan_ash_unittest.cc b/chrome/browser/ash/crosapi/document_scan_ash_unittest.cc
index 2101965c..eddec44 100644
--- a/chrome/browser/ash/crosapi/document_scan_ash_unittest.cc
+++ b/chrome/browser/ash/crosapi/document_scan_ash_unittest.cc
@@ -553,7 +553,7 @@
             EXPECT_EQ(response->scanner_handle, "scanner-handle");
             EXPECT_EQ(response->result,
                       mojom::ScannerOperationResult::kUnsupported);
-            EXPECT_FALSE(response->options.has_value());
+            EXPECT_FALSE(response->groups.has_value());
           }));
   run_loop.Run();
 }
@@ -569,7 +569,7 @@
             EXPECT_EQ(response->scanner_handle, "scanner-handle");
             EXPECT_EQ(response->result,
                       mojom::ScannerOperationResult::kInternalError);
-            EXPECT_FALSE(response->options.has_value());
+            EXPECT_FALSE(response->groups.has_value());
           }));
   run_loop.Run();
 }
@@ -598,10 +598,10 @@
             EXPECT_EQ(response->scanner_handle, "scanner-handle");
             EXPECT_EQ(response->result,
                       mojom::ScannerOperationResult::kSuccess);
-            EXPECT_TRUE(response->options.has_value());
-            ASSERT_EQ(response->options.value().size(), 1U);
-            EXPECT_EQ(response->options.value()[0]->title, "group-title");
-            EXPECT_THAT(response->options.value()[0]->members,
+            EXPECT_TRUE(response->groups.has_value());
+            ASSERT_EQ(response->groups.value().size(), 1U);
+            EXPECT_EQ(response->groups.value()[0]->title, "group-title");
+            EXPECT_THAT(response->groups.value()[0]->members,
                         ElementsAre("group-member"));
           }));
   run_loop.Run();
diff --git a/chrome/browser/ash/extensions/external_cache_delegate.cc b/chrome/browser/ash/extensions/external_cache_delegate.cc
index 488d2e1..58ab327 100644
--- a/chrome/browser/ash/extensions/external_cache_delegate.cc
+++ b/chrome/browser/ash/extensions/external_cache_delegate.cc
@@ -22,4 +22,12 @@
 void ExternalCacheDelegate::OnCachedExtensionFileDeleted(
     const extensions::ExtensionId& id) {}
 
+bool ExternalCacheDelegate::IsRollbackAllowed() const {
+  return false;
+}
+
+bool ExternalCacheDelegate::CanRollbackNow() const {
+  return false;
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/ash/extensions/external_cache_delegate.h b/chrome/browser/ash/extensions/external_cache_delegate.h
index 9f886e8..5fd9037 100644
--- a/chrome/browser/ash/extensions/external_cache_delegate.h
+++ b/chrome/browser/ash/extensions/external_cache_delegate.h
@@ -31,6 +31,12 @@
   // Called when the cached .crx file for |id| is deleted (e.g. due to failed
   // install / corrupted file).
   virtual void OnCachedExtensionFileDeleted(const extensions::ExtensionId& id);
+
+  // Called to check if extension rollback is allowed by this delegate.
+  virtual bool IsRollbackAllowed() const;
+
+  // Called to check if extension rollback can be performed now.
+  virtual bool CanRollbackNow() const;
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/ash/extensions/external_cache_impl.cc b/chrome/browser/ash/extensions/external_cache_impl.cc
index 55731c8d..7543f85 100644
--- a/chrome/browser/ash/extensions/external_cache_impl.cc
+++ b/chrome/browser/ash/extensions/external_cache_impl.cc
@@ -32,6 +32,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/updater/extension_downloader.h"
+#include "extensions/browser/updater/extension_downloader_delegate.h"
 #include "extensions/browser/updater/extension_downloader_types.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_urls.h"
@@ -372,6 +373,23 @@
   return true;
 }
 
+ExternalCacheImpl::RequestRollbackResult ExternalCacheImpl::RequestRollback(
+    const extensions::ExtensionId& id) {
+  bool is_rollback_allowed = delegate_ && delegate_->IsRollbackAllowed();
+  if (!is_rollback_allowed) {
+    return RequestRollbackResult::kDisallowed;
+  }
+
+  if (delegate_->CanRollbackNow()) {
+    RemoveCachedExtension(id);
+    UpdateExtensionLoader();
+    return RequestRollbackResult::kAllowed;
+  }
+
+  local_cache_.RemoveOnNextInit(id);
+  return RequestRollbackResult::kScheduledForNextRun;
+}
+
 void ExternalCacheImpl::UpdateExtensionLoader() {
   VLOG(1) << "Notify ExternalCacheImpl delegate about cache update";
   if (delegate_)
diff --git a/chrome/browser/ash/extensions/external_cache_impl.h b/chrome/browser/ash/extensions/external_cache_impl.h
index 1ab2dc72..747c33b94 100644
--- a/chrome/browser/ash/extensions/external_cache_impl.h
+++ b/chrome/browser/ash/extensions/external_cache_impl.h
@@ -105,6 +105,8 @@
   bool IsExtensionPending(const extensions::ExtensionId& id) override;
   bool GetExtensionExistingVersion(const extensions::ExtensionId& id,
                                    std::string* version) override;
+  RequestRollbackResult RequestRollback(
+      const extensions::ExtensionId& id) override;
 
   void set_flush_on_put(bool flush_on_put) { flush_on_put_ = flush_on_put; }
 
diff --git a/chrome/browser/ash/extensions/external_cache_impl_unittest.cc b/chrome/browser/ash/extensions/external_cache_impl_unittest.cc
index 28d7576..6fe7428 100644
--- a/chrome/browser/ash/extensions/external_cache_impl_unittest.cc
+++ b/chrome/browser/ash/extensions/external_cache_impl_unittest.cc
@@ -75,6 +75,10 @@
     prefs_ = prefs.Clone();
   }
 
+  bool IsRollbackAllowed() const override { return is_rollback_allowed_; }
+
+  bool CanRollbackNow() const override { return can_rollback_now_; }
+
   void OnCachedExtensionFileDeleted(
       const extensions::ExtensionId& id) override {
     deleted_extension_files_.insert(id);
@@ -129,12 +133,24 @@
     return base::Value(std::move(entry));
   }
 
+  void AllowImmediateRollback() {
+    is_rollback_allowed_ = true;
+    can_rollback_now_ = true;
+  }
+
+  void AllowRollbackOnNextInit() {
+    is_rollback_allowed_ = true;
+    can_rollback_now_ = false;
+  }
+
  private:
   content::BrowserTaskEnvironment task_environment_;
 
   network::TestURLLoaderFactory test_url_loader_factory_;
   scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
 
+  bool is_rollback_allowed_ = false;
+  bool can_rollback_now_ = false;
   base::ScopedTempDir cache_dir_;
   base::ScopedTempDir temp_dir_;
   std::optional<base::Value::Dict> prefs_;
@@ -254,22 +270,22 @@
       base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId4, "4")));
 
   // Damaged file should be removed from disk.
-  EXPECT_EQ(0ul, deleted_extension_files().size());
+  EXPECT_TRUE(deleted_extension_files().empty());
   external_cache.OnDamagedFileDetected(
       GetExtensionFile(cache_dir, kTestExtensionId2, "2"));
   content::RunAllTasksUntilIdle();
   EXPECT_EQ(3ul, provided_prefs()->size());
   EXPECT_FALSE(
       base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId2, "2")));
-  EXPECT_EQ(1ul, deleted_extension_files().size());
-  EXPECT_EQ(1ul, deleted_extension_files().count(kTestExtensionId2));
+  EXPECT_THAT(deleted_extension_files(),
+              testing::ElementsAre(kTestExtensionId2));
 
   // Shutdown with callback OnExtensionListsUpdated that clears prefs.
   external_cache.Shutdown(
       base::BindOnce(&ExternalCacheImplTest::OnExtensionListsUpdated,
                      base::Unretained(this), base::Value::Dict()));
   content::RunAllTasksUntilIdle();
-  EXPECT_EQ(provided_prefs()->size(), 0ul);
+  EXPECT_TRUE(provided_prefs()->empty());
 
   // After Shutdown directory shouldn't be touched.
   external_cache.OnDamagedFileDetected(
@@ -311,4 +327,175 @@
             nullptr);
 }
 
+// Checks that if immediate rollback is allowed, extension cache is removed
+// immediately and a lower version is allowed to be installed.
+TEST_F(ExternalCacheImplTest, ImmediateRollback) {
+  base::FilePath cache_dir(CreateCacheDir(false));
+  ExternalCacheImpl external_cache(
+      cache_dir, url_loader_factory(),
+      base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}), this,
+      true, false, false);
+
+  CreateExtensionFile(cache_dir, kTestExtensionId1, "2");
+  external_cache.UpdateExtensionsList(base::Value::Dict().Set(
+      kTestExtensionId1, CreateEntryWithUpdateUrl(false)));
+  content::RunAllTasksUntilIdle();
+
+  ASSERT_TRUE(provided_prefs());
+  EXPECT_EQ(provided_prefs()->size(), 1ul);
+
+  // Allow rollback by ExternalCacheDelegate and check that rollback request
+  // succeeds.
+  AllowImmediateRollback();
+  EXPECT_EQ(ExternalCacheImpl::RequestRollbackResult::kAllowed,
+            external_cache.RequestRollback(kTestExtensionId1));
+
+  // Check that kTestExtensionId1's entry in the ExtensionCache will be deleted.
+  content::RunAllTasksUntilIdle();
+  EXPECT_THAT(deleted_extension_files(),
+              testing::ElementsAre(kTestExtensionId1));
+  EXPECT_TRUE(provided_prefs()->empty());
+  EXPECT_FALSE(
+      base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId1, "2")));
+
+  // Check that lower version installs correctly.
+  base::FilePath temp_dir(CreateTempDir());
+  base::FilePath temp_file = temp_dir.Append("a.crx");
+  CreateFile(temp_file);
+  {
+    extensions::CRXFileInfo crx_info_v1(temp_file,
+                                        extensions::GetTestVerifierFormat());
+    crx_info_v1.extension_id = kTestExtensionId1;
+    crx_info_v1.expected_version = base::Version("1");
+    external_cache.OnExtensionDownloadFinished(
+        crx_info_v1, true, GURL(),
+        extensions::ExtensionDownloaderDelegate::PingResult(), std::set<int>(),
+        extensions::ExtensionDownloaderDelegate::InstallCallback());
+  }
+
+  content::RunAllTasksUntilIdle();
+  EXPECT_EQ(1ul, provided_prefs()->size());
+  EXPECT_TRUE(
+      base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId1, "1")));
+}
+
+// Checks that if rollback is generally allowed by delegate but cannot be
+// performed immediately, cache invalidation is scheduled for the next run.
+// Checks that cache is deleted on the next run.
+TEST_F(ExternalCacheImplTest, RollbackOnNextInit) {
+  base::FilePath cache_dir(CreateCacheDir(false));
+  ExternalCacheImpl external_cache(
+      cache_dir, url_loader_factory(),
+      base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}), this,
+      true, false, false);
+
+  CreateExtensionFile(cache_dir, kTestExtensionId1, "2");
+  base::Value::Dict prefs;
+  prefs.Set(kTestExtensionId1, CreateEntryWithUpdateUrl(false));
+  external_cache.UpdateExtensionsList(prefs.Clone());
+  content::RunAllTasksUntilIdle();
+
+  ASSERT_TRUE(provided_prefs());
+  EXPECT_EQ(provided_prefs()->size(), 1ul);
+
+  // Allow rollback on the next run by ExternalCacheDelegate and check that
+  // rollback request returns SCHEDULED_FOR_NEXT_RUN value.
+  AllowRollbackOnNextInit();
+  EXPECT_EQ(ExternalCacheImpl::RequestRollbackResult::kScheduledForNextRun,
+            external_cache.RequestRollback(kTestExtensionId1));
+
+  // Check that extension cache is still there.
+  content::RunAllTasksUntilIdle();
+  EXPECT_TRUE(deleted_extension_files().empty());
+  ASSERT_TRUE(provided_prefs());
+  EXPECT_EQ(provided_prefs()->size(), 1ul);
+  EXPECT_TRUE(
+      base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId1, "2")));
+
+  // Shutdown and initialize new cache.
+  base::RunLoop run_loop;
+  external_cache.Shutdown(run_loop.QuitClosure());
+  run_loop.Run();
+  ExternalCacheImpl new_cache(
+      cache_dir, url_loader_factory(),
+      base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}), this,
+      true, false, false);
+
+  new_cache.UpdateExtensionsList(prefs.Clone());
+  content::RunAllTasksUntilIdle();
+
+  // Check that kTestExtensionId1's entry in the ExtensionCache was deleted
+  // after initialization.
+  EXPECT_TRUE(provided_prefs()->empty());
+  EXPECT_FALSE(
+      base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId1, "2")));
+
+  // Check that lower version installs correctly.
+  base::FilePath temp_dir(CreateTempDir());
+  base::FilePath temp_file = temp_dir.Append("a.crx");
+  CreateFile(temp_file);
+  {
+    extensions::CRXFileInfo crx_info_v1(temp_file,
+                                        extensions::GetTestVerifierFormat());
+    crx_info_v1.extension_id = kTestExtensionId1;
+    crx_info_v1.expected_version = base::Version("1");
+    new_cache.OnExtensionDownloadFinished(
+        crx_info_v1, true, GURL(),
+        extensions::ExtensionDownloaderDelegate::PingResult(), std::set<int>(),
+        extensions::ExtensionDownloaderDelegate::InstallCallback());
+  }
+
+  content::RunAllTasksUntilIdle();
+  EXPECT_EQ(1ul, provided_prefs()->size());
+  EXPECT_TRUE(
+      base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId1, "1")));
+}
+
+// Checks that if rollback is disallowed, cache is not invalidated.
+TEST_F(ExternalCacheImplTest, RollbackDisallowed) {
+  base::FilePath cache_dir(CreateCacheDir(false));
+  ExternalCacheImpl external_cache(
+      cache_dir, url_loader_factory(),
+      base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}), this,
+      true, false, false);
+
+  CreateExtensionFile(cache_dir, kTestExtensionId1, "2");
+  base::Value::Dict prefs;
+  prefs.Set(kTestExtensionId1, CreateEntryWithUpdateUrl(false));
+  external_cache.UpdateExtensionsList(prefs.Clone());
+  content::RunAllTasksUntilIdle();
+
+  ASSERT_TRUE(provided_prefs());
+  EXPECT_EQ(provided_prefs()->size(), 1ul);
+
+  // Check that rollback is disallowed.
+  EXPECT_EQ(ExternalCacheImpl::RequestRollbackResult::kDisallowed,
+            external_cache.RequestRollback(kTestExtensionId1));
+
+  // Check that extension cache is still there.
+  content::RunAllTasksUntilIdle();
+  EXPECT_TRUE(deleted_extension_files().empty());
+  ASSERT_TRUE(provided_prefs());
+  EXPECT_EQ(provided_prefs()->size(), 1ul);
+  EXPECT_TRUE(
+      base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId1, "2")));
+
+  // Shutdown and initialize new cache.
+  base::RunLoop run_loop;
+  external_cache.Shutdown(run_loop.QuitClosure());
+  run_loop.Run();
+  ExternalCacheImpl new_cache(
+      cache_dir, url_loader_factory(),
+      base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}), this,
+      true, false, false);
+
+  new_cache.UpdateExtensionsList(prefs.Clone());
+  content::RunAllTasksUntilIdle();
+
+  // Check that extension cache was not deleted on initialization.
+  EXPECT_EQ(provided_prefs()->size(), 1ul);
+  EXPECT_TRUE(
+      base::PathExists(GetExtensionFile(cache_dir, kTestExtensionId1, "2")));
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/ash/extensions/signin_screen_extensions_external_loader.cc b/chrome/browser/ash/extensions/signin_screen_extensions_external_loader.cc
index 723527e..8079348 100644
--- a/chrome/browser/ash/extensions/signin_screen_extensions_external_loader.cc
+++ b/chrome/browser/ash/extensions/signin_screen_extensions_external_loader.cc
@@ -87,6 +87,10 @@
   LoadFinished(prefs.Clone());
 }
 
+bool SigninScreenExtensionsExternalLoader::IsRollbackAllowed() const {
+  return true;
+}
+
 SigninScreenExtensionsExternalLoader::~SigninScreenExtensionsExternalLoader() =
     default;
 
diff --git a/chrome/browser/ash/extensions/signin_screen_extensions_external_loader.h b/chrome/browser/ash/extensions/signin_screen_extensions_external_loader.h
index c8ad4068..9824ec3 100644
--- a/chrome/browser/ash/extensions/signin_screen_extensions_external_loader.h
+++ b/chrome/browser/ash/extensions/signin_screen_extensions_external_loader.h
@@ -42,6 +42,7 @@
 
   // ExternalCacheDelegate:
   void OnExtensionListsUpdated(const base::Value::Dict& prefs) override;
+  bool IsRollbackAllowed() const override;
 
  private:
   friend class base::RefCounted<SigninScreenExtensionsExternalLoader>;
diff --git a/chrome/browser/ash/login/lock/screen_locker.cc b/chrome/browser/ash/login/lock/screen_locker.cc
index 6065a41..ba5b1db 100644
--- a/chrome/browser/ash/login/lock/screen_locker.cc
+++ b/chrome/browser/ash/login/lock/screen_locker.cc
@@ -653,20 +653,6 @@
   screen_locker_ = nullptr;
 }
 
-void ScreenLocker::SaveSyncPasswordHash(
-    std::unique_ptr<UserContext> user_context) {
-  if (!user_context->GetSyncPasswordData().has_value())
-    return;
-
-  const user_manager::User* user =
-      user_manager::UserManager::Get()->FindUser(user_context->GetAccountId());
-  if (!user || !user->is_active())
-    return;
-  auto* profile = ProfileHelper::Get()->GetProfileByUser(user);
-  if (profile)
-    login::SaveSyncPasswordDataToProfile(*user_context, profile);
-}
-
 bool ScreenLocker::IsAuthTemporarilyDisabledForUser(
     const AccountId& account_id) {
   return base::Contains(users_with_temporarily_disabled_auth_, account_id);
diff --git a/chrome/browser/ash/login/lock/screen_locker.h b/chrome/browser/ash/login/lock/screen_locker.h
index 43861bc..1ec4149 100644
--- a/chrome/browser/ash/login/lock/screen_locker.h
+++ b/chrome/browser/ash/login/lock/screen_locker.h
@@ -62,13 +62,6 @@
   // Returns true if the lock UI has been confirmed as displayed.
   bool locked() const { return locked_; }
 
-  // Initialize and show the screen locker.
-  void Init();
-
-  // AuthStatusConsumer:
-  void OnAuthFailure(const AuthFailure& error) override;
-  void OnAuthSuccess(const UserContext& user_context) override;
-
   // Disables authentication for the user with `account_id`. Notifies lock
   // screen UI. `auth_disabled_data` is used to display information in the UI.
   void TemporarilyDisableAuthForUser(
@@ -111,52 +104,17 @@
   // Hide the screen locker.
   static void Hide();
 
-  // If the unlock animation was aborted (for instance, as a result of
-  // pressing the power button during the unlock animatoin), we  reset
-  // the state of UI elements (such as LoginAuthUserView::FingerprintView)
-  // which might have been altered as a result of a successful authentication
-  // attempt.
-  void ResetToLockedState();
-
-  // If the unlock animation was not aborted, changes session state to
-  // active and schedules `ScreenLocker` deletion.
-  static void OnUnlockAnimationFinished(bool aborted);
-
-  // we should probably not call it anymore
-  void RefreshPinAndFingerprintTimeout();
-
-  // Saves sync password hash and salt to user profile prefs based on
-  // `user_context`.
-  void SaveSyncPasswordHash(std::unique_ptr<UserContext> user_context);
-
   // Returns true if authentication is enabled on the lock screen for the given
   // user.
   bool IsAuthTemporarilyDisabledForUser(const AccountId& account_id);
 
-  // Change the authenticators; should only be used by tests.
-  void SetAuthenticatorsForTesting(scoped_refptr<Authenticator> authenticator);
-
   static void SetClocksForTesting(const base::Clock* clock,
                                   const base::TickClock* tick_clock);
 
-  // device::mojom::FingerprintObserver:
-  void OnRestarted() override;
-  void OnStatusChanged(device::mojom::BiometricsManagerStatus status) override;
-  void OnEnrollScanDone(device::mojom::ScanResult scan_result,
-                        bool is_complete,
-                        int32_t percent_complete) override;
-  void OnAuthScanDone(
-      const device::mojom::FingerprintMessagePtr msg,
-      const base::flat_map<std::string, std::vector<std::string>>& matches)
-      override;
-  void OnSessionFailed() override;
-
-  // user_manager::UserManager::UserSessionStateObserver:
-  void ActiveUserChanged(user_manager::User* active_user) override;
-
  private:
   friend class base::DeleteHelper<ScreenLocker>;
   friend class ViewsScreenLocker;
+  friend class ScreenLockerTester;
 
   // Track the type of the authentication that the user used to unlock the lock
   // screen.
@@ -183,6 +141,45 @@
 
   ~ScreenLocker() override;
 
+  // Initialize and show the screen locker.
+  void Init();
+
+  // AuthStatusConsumer:
+  void OnAuthFailure(const AuthFailure& error) override;
+  void OnAuthSuccess(const UserContext& user_context) override;
+
+  // device::mojom::FingerprintObserver:
+  void OnRestarted() override;
+  void OnStatusChanged(device::mojom::BiometricsManagerStatus status) override;
+  void OnEnrollScanDone(device::mojom::ScanResult scan_result,
+                        bool is_complete,
+                        int32_t percent_complete) override;
+  void OnAuthScanDone(
+      const device::mojom::FingerprintMessagePtr msg,
+      const base::flat_map<std::string, std::vector<std::string>>& matches)
+      override;
+  void OnSessionFailed() override;
+
+  // user_manager::UserManager::UserSessionStateObserver:
+  void ActiveUserChanged(user_manager::User* active_user) override;
+
+  // If the unlock animation was aborted (for instance, as a result of
+  // pressing the power button during the unlock animatoin), we  reset
+  // the state of UI elements (such as LoginAuthUserView::FingerprintView)
+  // which might have been altered as a result of a successful authentication
+  // attempt.
+  void ResetToLockedState();
+
+  // If the unlock animation was not aborted, changes session state to
+  // active and schedules `ScreenLocker` deletion.
+  static void OnUnlockAnimationFinished(bool aborted);
+
+  // TODO(b/271261286): we should probably not call it anymore
+  void RefreshPinAndFingerprintTimeout();
+
+  // Change the authenticators; should only be used by tests.
+  void SetAuthenticatorsForTesting(scoped_refptr<Authenticator> authenticator);
+
   void OnFingerprintAuthFailure(const user_manager::User& user);
 
   void StartFingerprintAuthSession(const user_manager::User* primary_user);
diff --git a/chrome/browser/ash/nearby/presence/credential_storage/credential_storage_initializer.cc b/chrome/browser/ash/nearby/presence/credential_storage/credential_storage_initializer.cc
index 2466cc87..027dc54 100644
--- a/chrome/browser/ash/nearby/presence/credential_storage/credential_storage_initializer.cc
+++ b/chrome/browser/ash/nearby/presence/credential_storage/credential_storage_initializer.cc
@@ -21,11 +21,9 @@
                                 ->GetProtoDatabaseProvider();
   base::FilePath profile_path = profile->GetOriginalProfile()->GetPath();
 
-  auto nearby_presence_credential_storage =
+  nearby_presence_credential_storage_ =
       std::make_unique<NearbyPresenceCredentialStorage>(
           std::move(pending_receiver), proto_db_provider, profile_path);
-
-  CredentialStorageInitializer(std::move(nearby_presence_credential_storage));
 }
 
 CredentialStorageInitializer::CredentialStorageInitializer(
diff --git a/chrome/browser/ash/nearby/presence/credential_storage/credential_storage_initializer.h b/chrome/browser/ash/nearby/presence/credential_storage/credential_storage_initializer.h
index 0408944a..2f5d782 100644
--- a/chrome/browser/ash/nearby/presence/credential_storage/credential_storage_initializer.h
+++ b/chrome/browser/ash/nearby/presence/credential_storage/credential_storage_initializer.h
@@ -33,7 +33,8 @@
   void Initialize();
 
  protected:
-  CredentialStorageInitializer(
+  // Test only constructor used to inject a NearbyPresenceCredentialStorageBase.
+  explicit CredentialStorageInitializer(
       std::unique_ptr<NearbyPresenceCredentialStorageBase>
           nearby_presence_credential_storage);
 
diff --git a/chrome/browser/ash/nearby/presence/credential_storage/nearby_presence_credential_storage.cc b/chrome/browser/ash/nearby/presence/credential_storage/nearby_presence_credential_storage.cc
index 67f6a1e8..f5770cd 100644
--- a/chrome/browser/ash/nearby/presence/credential_storage/nearby_presence_credential_storage.cc
+++ b/chrome/browser/ash/nearby/presence/credential_storage/nearby_presence_credential_storage.cc
@@ -41,9 +41,10 @@
     mojo::PendingReceiver<mojom::NearbyPresenceCredentialStorage>
         pending_receiver,
     leveldb_proto::ProtoDatabaseProvider* db_provider,
-    const base::FilePath& profile_filepath) {
+    const base::FilePath& profile_filepath)
+    : pending_receiver_(std::move(pending_receiver)) {
   CHECK(db_provider);
-  CHECK(pending_receiver);
+  CHECK(pending_receiver_);
 
   base::FilePath private_database_path =
       profile_filepath.Append(kPrivateCredentialDatabaseName);
@@ -56,22 +57,17 @@
       base::ThreadPool::CreateSequencedTaskRunner(
           {base::MayBlock(), base::TaskPriority::BEST_EFFORT});
 
-  auto private_db = db_provider->GetDB<::nearby::internal::LocalCredential>(
+  private_db_ = db_provider->GetDB<::nearby::internal::LocalCredential>(
       leveldb_proto::ProtoDbType::NEARBY_PRESENCE_PRIVATE_CREDENTIAL_DATABASE,
       private_database_path, database_task_runner);
-  auto local_public_db =
-      db_provider->GetDB<::nearby::internal::SharedCredential>(
-          leveldb_proto::ProtoDbType::
-              NEARBY_PRESENCE_LOCAL_PUBLIC_CREDENTIAL_DATABASE,
-          local_public_database_path, database_task_runner);
-  auto remote_public_db =
-      db_provider->GetDB<::nearby::internal::SharedCredential>(
-          leveldb_proto::ProtoDbType::
-              NEARBY_PRESENCE_REMOTE_PUBLIC_CREDENTIAL_DATABASE,
-          remote_public_database_path, database_task_runner);
-  NearbyPresenceCredentialStorage(
-      std::move(pending_receiver), std::move(private_db),
-      std::move(local_public_db), std::move(remote_public_db));
+  local_public_db_ = db_provider->GetDB<::nearby::internal::SharedCredential>(
+      leveldb_proto::ProtoDbType::
+          NEARBY_PRESENCE_LOCAL_PUBLIC_CREDENTIAL_DATABASE,
+      local_public_database_path, database_task_runner);
+  remote_public_db_ = db_provider->GetDB<::nearby::internal::SharedCredential>(
+      leveldb_proto::ProtoDbType::
+          NEARBY_PRESENCE_REMOTE_PUBLIC_CREDENTIAL_DATABASE,
+      remote_public_database_path, database_task_runner);
 }
 
 NearbyPresenceCredentialStorage::NearbyPresenceCredentialStorage(
diff --git a/chrome/browser/ash/nearby/presence/credential_storage/nearby_presence_credential_storage.h b/chrome/browser/ash/nearby/presence/credential_storage/nearby_presence_credential_storage.h
index b7b20bb7..d7762d8ef 100644
--- a/chrome/browser/ash/nearby/presence/credential_storage/nearby_presence_credential_storage.h
+++ b/chrome/browser/ash/nearby/presence/credential_storage/nearby_presence_credential_storage.h
@@ -69,6 +69,7 @@
                              UpdateLocalCredentialCallback callback) override;
 
  protected:
+  // Test only constructor used to inject databases without using a profile.
   NearbyPresenceCredentialStorage(
       mojo::PendingReceiver<mojom::NearbyPresenceCredentialStorage>
           pending_receiver,
diff --git a/chrome/browser/ash/policy/core/device_local_account_external_cache.cc b/chrome/browser/ash/policy/core/device_local_account_external_cache.cc
index 8268dd8..7e32f01 100644
--- a/chrome/browser/ash/policy/core/device_local_account_external_cache.cc
+++ b/chrome/browser/ash/policy/core/device_local_account_external_cache.cc
@@ -19,6 +19,8 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.h"
 #include "chrome/browser/extensions/external_loader.h"
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace chromeos {
@@ -81,6 +83,19 @@
   loader_->OnExtensionListsUpdated(prefs);
 }
 
+bool DeviceLocalAccountExternalCache::IsRollbackAllowed() const {
+  return true;
+}
+
+bool DeviceLocalAccountExternalCache::CanRollbackNow() const {
+  // Allow immediate rollback only if current user is not this device local
+  // account.
+  if (auto* user = user_manager::UserManager::Get()->GetPrimaryUser()) {
+    return user_id_ != user->GetAccountId().GetUserEmail();
+  }
+  return true;
+}
+
 scoped_refptr<extensions::ExternalLoader>
 DeviceLocalAccountExternalCache::GetExtensionLoader() {
   return loader_;
diff --git a/chrome/browser/ash/policy/core/device_local_account_external_cache.h b/chrome/browser/ash/policy/core/device_local_account_external_cache.h
index 048d7db..b07656e6 100644
--- a/chrome/browser/ash/policy/core/device_local_account_external_cache.h
+++ b/chrome/browser/ash/policy/core/device_local_account_external_cache.h
@@ -43,6 +43,8 @@
 
   // ExternalCacheDelegate:
   void OnExtensionListsUpdated(const base::Value::Dict& prefs) override;
+  bool IsRollbackAllowed() const override;
+  bool CanRollbackNow() const override;
 
   scoped_refptr<extensions::ExternalLoader> GetExtensionLoader();
 
diff --git a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
index 09bb45cc..9877d20b 100644
--- a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
+++ b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
@@ -334,7 +334,8 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest, AddApp) {
+// TODO: b/316517034 - Enable the test when flakiness issue is resolved.
+IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest, DISABLED_AddApp) {
   AddScreenplayTag();
 
   // Show launcher UI so that app icons are loaded.
diff --git a/chrome/browser/ash/report_controller_initializer.cc b/chrome/browser/ash/report_controller_initializer.cc
index 2422cd69e..71753f1 100644
--- a/chrome/browser/ash/report_controller_initializer.cc
+++ b/chrome/browser/ash/report_controller_initializer.cc
@@ -200,14 +200,12 @@
 void ReportControllerInitializer::OwnershipStatusChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (state_ != State::kWaitingForOwnership) {
-    LOG(ERROR) << "Invalid state - expected to be waiting for ownership.";
     return;
   }
 
   // Device should only get ownership taken at most once on a browser start up.
   if (ash::DeviceSettingsService::Get()->GetOwnershipStatus() !=
       ash::DeviceSettingsService::OwnershipStatus::kOwnershipTaken) {
-    LOG(ERROR) << "Ownership status is not taken yet, returning early.";
     return;
   }
 
@@ -349,7 +347,6 @@
     // until browser restarts. Client does not proceed without signature
     // verification, so retry is not attempted. This status may be caused
     // if the policy proto blob fails the signature check.
-    LOG(ERROR) << "CrosSettings status is not trusted yet.";
     return;
   }
 
diff --git a/chrome/browser/autofill/address_accessory_controller_impl.cc b/chrome/browser/autofill/address_accessory_controller_impl.cc
index 8388b22..c61b9e3 100644
--- a/chrome/browser/autofill/address_accessory_controller_impl.cc
+++ b/chrome/browser/autofill/address_accessory_controller_impl.cc
@@ -29,25 +29,25 @@
 
 // Defines which types to load from the Personal data manager and add as field
 // to the address sheet. Order matters.
-constexpr ServerFieldType kTypesToInclude[] = {
-    ServerFieldType::NAME_FULL,
-    ServerFieldType::COMPANY_NAME,
-    ServerFieldType::ADDRESS_HOME_LINE1,
-    ServerFieldType::ADDRESS_HOME_LINE2,
-    ServerFieldType::ADDRESS_HOME_ZIP,
-    ServerFieldType::ADDRESS_HOME_CITY,
-    ServerFieldType::ADDRESS_HOME_STATE,
-    ServerFieldType::ADDRESS_HOME_COUNTRY,
-    ServerFieldType::PHONE_HOME_WHOLE_NUMBER,
-    ServerFieldType::EMAIL_ADDRESS,
+constexpr FieldType kTypesToInclude[] = {
+    FieldType::NAME_FULL,
+    FieldType::COMPANY_NAME,
+    FieldType::ADDRESS_HOME_LINE1,
+    FieldType::ADDRESS_HOME_LINE2,
+    FieldType::ADDRESS_HOME_ZIP,
+    FieldType::ADDRESS_HOME_CITY,
+    FieldType::ADDRESS_HOME_STATE,
+    FieldType::ADDRESS_HOME_COUNTRY,
+    FieldType::PHONE_HOME_WHOLE_NUMBER,
+    FieldType::EMAIL_ADDRESS,
 };
 
 void AddProfileInfoAsSelectableField(UserInfo* info,
                                      const AutofillProfile* profile,
-                                     ServerFieldType type) {
+                                     FieldType type) {
   std::u16string field = profile->GetRawInfo(type);
-  if (type == ServerFieldType::NAME_MIDDLE && field.empty()) {
-    field = profile->GetRawInfo(ServerFieldType::NAME_MIDDLE_INITIAL);
+  if (type == FieldType::NAME_MIDDLE && field.empty()) {
+    field = profile->GetRawInfo(FieldType::NAME_MIDDLE_INITIAL);
   }
   info->add_field(AccessorySheetField(
       /*display_text=*/field, /*text_to_fill=*/field,
@@ -57,8 +57,8 @@
 
 UserInfo TranslateProfile(const AutofillProfile* profile) {
   UserInfo info;
-  for (ServerFieldType server_field_type : kTypesToInclude) {
-    AddProfileInfoAsSelectableField(&info, profile, server_field_type);
+  for (FieldType field_type : kTypesToInclude) {
+    AddProfileInfoAsSelectableField(&info, profile, field_type);
   }
   return info;
 }
diff --git a/chrome/browser/autofill/address_accessory_controller_impl_unittest.cc b/chrome/browser/autofill/address_accessory_controller_impl_unittest.cc
index 8c2c38d..29a1921 100644
--- a/chrome/browser/autofill/address_accessory_controller_impl_unittest.cc
+++ b/chrome/browser/autofill/address_accessory_controller_impl_unittest.cc
@@ -135,24 +135,18 @@
       result,
       AddressAccessorySheetDataBuilder(std::u16string())
           .AddUserInfo()
-          .AppendSimpleField(canadian.GetRawInfo(ServerFieldType::NAME_FULL))
-          .AppendSimpleField(canadian.GetRawInfo(ServerFieldType::COMPANY_NAME))
+          .AppendSimpleField(canadian.GetRawInfo(FieldType::NAME_FULL))
+          .AppendSimpleField(canadian.GetRawInfo(FieldType::COMPANY_NAME))
+          .AppendSimpleField(canadian.GetRawInfo(FieldType::ADDRESS_HOME_LINE1))
+          .AppendSimpleField(canadian.GetRawInfo(FieldType::ADDRESS_HOME_LINE2))
+          .AppendSimpleField(canadian.GetRawInfo(FieldType::ADDRESS_HOME_ZIP))
+          .AppendSimpleField(canadian.GetRawInfo(FieldType::ADDRESS_HOME_CITY))
+          .AppendSimpleField(canadian.GetRawInfo(FieldType::ADDRESS_HOME_STATE))
           .AppendSimpleField(
-              canadian.GetRawInfo(ServerFieldType::ADDRESS_HOME_LINE1))
+              canadian.GetRawInfo(FieldType::ADDRESS_HOME_COUNTRY))
           .AppendSimpleField(
-              canadian.GetRawInfo(ServerFieldType::ADDRESS_HOME_LINE2))
-          .AppendSimpleField(
-              canadian.GetRawInfo(ServerFieldType::ADDRESS_HOME_ZIP))
-          .AppendSimpleField(
-              canadian.GetRawInfo(ServerFieldType::ADDRESS_HOME_CITY))
-          .AppendSimpleField(
-              canadian.GetRawInfo(ServerFieldType::ADDRESS_HOME_STATE))
-          .AppendSimpleField(
-              canadian.GetRawInfo(ServerFieldType::ADDRESS_HOME_COUNTRY))
-          .AppendSimpleField(
-              canadian.GetRawInfo(ServerFieldType::PHONE_HOME_WHOLE_NUMBER))
-          .AppendSimpleField(
-              canadian.GetRawInfo(ServerFieldType::EMAIL_ADDRESS))
+              canadian.GetRawInfo(FieldType::PHONE_HOME_WHOLE_NUMBER))
+          .AppendSimpleField(canadian.GetRawInfo(FieldType::EMAIL_ADDRESS))
           .Build());
 }
 
@@ -184,28 +178,28 @@
   AutofillProfile email = test::GetIncompleteProfile2();
   personal_data_manager()->AddProfile(email);
   EXPECT_EQ(result, controller()->GetSheetData());
-  EXPECT_EQ(result, AddressAccessorySheetDataBuilder(std::u16string())
-                        .AddUserInfo()
-                        /*name full:*/
-                        .AppendSimpleField(std::u16string())
-                        /*company name:*/
-                        .AppendSimpleField(std::u16string())
-                        /*address line1:*/
-                        .AppendSimpleField(std::u16string())
-                        /*address line2:*/
-                        .AppendSimpleField(std::u16string())
-                        /*address zip:*/
-                        .AppendSimpleField(std::u16string())
-                        /*address city:*/
-                        .AppendSimpleField(std::u16string())
-                        /*address state:*/
-                        .AppendSimpleField(std::u16string())
-                        /*address country:*/
-                        .AppendSimpleField(std::u16string())
-                        /*phone number:*/.AppendSimpleField(std::u16string())
-                        .AppendSimpleField(
-                            email.GetRawInfo(ServerFieldType::EMAIL_ADDRESS))
-                        .Build());
+  EXPECT_EQ(result,
+            AddressAccessorySheetDataBuilder(std::u16string())
+                .AddUserInfo()
+                /*name full:*/
+                .AppendSimpleField(std::u16string())
+                /*company name:*/
+                .AppendSimpleField(std::u16string())
+                /*address line1:*/
+                .AppendSimpleField(std::u16string())
+                /*address line2:*/
+                .AppendSimpleField(std::u16string())
+                /*address zip:*/
+                .AppendSimpleField(std::u16string())
+                /*address city:*/
+                .AppendSimpleField(std::u16string())
+                /*address state:*/
+                .AppendSimpleField(std::u16string())
+                /*address country:*/
+                .AppendSimpleField(std::u16string())
+                /*phone number:*/.AppendSimpleField(std::u16string())
+                .AppendSimpleField(email.GetRawInfo(FieldType::EMAIL_ADDRESS))
+                .Build());
 }
 
 }  // namespace autofill
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc
index 3efbcb2b..848b30a 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -302,7 +302,7 @@
     bool include_country_in_label) {
   // The full name is not included in the label for shipping address. It is
   // added separately instead.
-  static constexpr ServerFieldType kLabelFields[] = {
+  static constexpr FieldType kLabelFields[] = {
       COMPANY_NAME,         ADDRESS_HOME_LINE1,
       ADDRESS_HOME_LINE2,   ADDRESS_HOME_DEPENDENT_LOCALITY,
       ADDRESS_HOME_CITY,    ADDRESS_HOME_STATE,
@@ -629,10 +629,10 @@
     bool include_organization_in_label,
     bool include_country_in_label,
     std::vector<AutofillProfile*> profiles) {
-  ServerFieldTypeSet suggested_fields;
+  FieldTypeSet suggested_fields;
   size_t minimal_fields_shown = 2;
   if (address_only) {
-    suggested_fields = ServerFieldTypeSet();
+    suggested_fields = FieldTypeSet();
     if (include_name_in_label)
       suggested_fields.insert(NAME_FULL);
     if (include_organization_in_label)
@@ -649,8 +649,7 @@
     minimal_fields_shown = suggested_fields.size();
   }
 
-  ServerFieldType excluded_field =
-      include_name_in_label ? UNKNOWN_TYPE : NAME_FULL;
+  FieldType excluded_field = include_name_in_label ? UNKNOWN_TYPE : NAME_FULL;
 
   std::vector<std::u16string> labels;
   // TODO(crbug.com/1487119): Replace by `profiles` when `GetProfilesToSuggest`
diff --git a/chrome/browser/autofill/autofill_across_iframes_browsertest.cc b/chrome/browser/autofill/autofill_across_iframes_browsertest.cc
index 710e132..2c2a6bb 100644
--- a/chrome/browser/autofill/autofill_across_iframes_browsertest.cc
+++ b/chrome/browser/autofill/autofill_across_iframes_browsertest.cc
@@ -183,7 +183,7 @@
 // accepted by Autofill.
 auto IsWithinAutofillLimits() {
   auto frequencies = [](const FormStructure& form) {
-    std::map<ServerFieldType, size_t> counts;
+    std::map<FieldType, size_t> counts;
     for (const auto& field : form)
       ++counts[field->Type().GetStorableType()];
     return counts;
diff --git a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
index b1dc2c3..240d826 100644
--- a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
+++ b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
@@ -159,12 +159,11 @@
       public ::testing::WithParamInterface<CapturedSiteParams> {
  public:
   // TestRecipeReplayChromeFeatureActionExecutor
-  bool AutofillForm(
-      const std::string& focus_element_css_selector,
-      const std::vector<std::string>& iframe_path,
-      const int attempts,
-      content::RenderFrameHost* frame,
-      absl::optional<ServerFieldType> triggered_field_type) override {
+  bool AutofillForm(const std::string& focus_element_css_selector,
+                    const std::vector<std::string>& iframe_path,
+                    const int attempts,
+                    content::RenderFrameHost* frame,
+                    absl::optional<FieldType> triggered_field_type) override {
     content::WebContents* web_contents =
         content::WebContents::FromRenderFrameHost(frame);
     auto& autofill_manager = static_cast<BrowserAutofillManager&>(
diff --git a/chrome/browser/autofill/captured_sites_test_utils.cc b/chrome/browser/autofill/captured_sites_test_utils.cc
index bcecb44..874100a 100644
--- a/chrome/browser/autofill/captured_sites_test_utils.cc
+++ b/chrome/browser/autofill/captured_sites_test_utils.cc
@@ -132,11 +132,10 @@
                                   command_file_path.AsUTF8Unsafe().c_str());
 }
 
-absl::optional<autofill::ServerFieldType> StringToFieldType(
-    const std::string& str) {
+absl::optional<autofill::FieldType> StringToFieldType(const std::string& str) {
   static auto map = []() {
-    std::map<std::string, autofill::ServerFieldType> map;
-    for (autofill::ServerFieldType field_type : autofill::kAllFieldTypes) {
+    std::map<std::string, autofill::FieldType> map;
+    for (autofill::FieldType field_type : autofill::kAllFieldTypes) {
       map[autofill::AutofillType(field_type).ToString()] = field_type;
     }
     for (autofill::HtmlFieldType html_field_type :
@@ -825,8 +824,7 @@
 bool ProfileDataController::AddAutofillProfileInfo(
     const std::string& field_type,
     const std::string& field_value) {
-  absl::optional<autofill::ServerFieldType> type =
-      StringToFieldType(field_type);
+  absl::optional<autofill::FieldType> type = StringToFieldType(field_type);
   if (!type.has_value()) {
     ADD_FAILURE() << "Unable to recognize autofill field type '" << field_type
                   << "'!";
@@ -2387,7 +2385,7 @@
     const std::vector<std::string>& iframe_path,
     const int attempts,
     content::RenderFrameHost* frame,
-    absl::optional<autofill::ServerFieldType> triggered_field_type) {
+    absl::optional<autofill::FieldType> triggered_field_type) {
   ADD_FAILURE() << "TestRecipeReplayChromeFeatureActionExecutor::AutofillForm "
                    "is not implemented!";
   return false;
diff --git a/chrome/browser/autofill/captured_sites_test_utils.h b/chrome/browser/autofill/captured_sites_test_utils.h
index cb2c2d2..9c57de9 100644
--- a/chrome/browser/autofill/captured_sites_test_utils.h
+++ b/chrome/browser/autofill/captured_sites_test_utils.h
@@ -221,7 +221,7 @@
       const std::vector<std::string>& iframe_path,
       const int attempts,
       content::RenderFrameHost* frame,
-      absl::optional<autofill::ServerFieldType> triggered_field_type);
+      absl::optional<autofill::FieldType> triggered_field_type);
   virtual bool AddAutofillProfileInfo(const std::string& field_type,
                                       const std::string& field_value);
   virtual bool SetupAutofillProfile();
diff --git a/chrome/browser/compose/compose_text_usage_logger_unittest.cc b/chrome/browser/compose/compose_text_usage_logger_unittest.cc
index bb21bfe..499eb86 100644
--- a/chrome/browser/compose/compose_text_usage_logger_unittest.cc
+++ b/chrome/browser/compose/compose_text_usage_logger_unittest.cc
@@ -177,8 +177,8 @@
 TEST_F(ComposeTextUsageLoggerTest, SensitiveFieldEntry) {
   FormData form_data = CreateForm();
   auto form_structure = std::make_unique<autofill::FormStructure>(form_data);
-  form_structure->field(0)->SetTypeTo(autofill::AutofillType(
-      autofill::ServerFieldType::CREDIT_CARD_NAME_FIRST));
+  form_structure->field(0)->SetTypeTo(
+      autofill::AutofillType(autofill::FieldType::CREDIT_CARD_NAME_FIRST));
   autofill_manager()->AddSeenFormStructure(std::move(form_structure));
 
   SimulateTyping(form_data.global_id(), form_data.fields[0].global_id(),
@@ -202,7 +202,7 @@
   FormData form_data = CreateForm();
   auto form_structure = std::make_unique<autofill::FormStructure>(form_data);
   form_structure->field(0)->SetTypeTo(
-      autofill::AutofillType(autofill::ServerFieldType::ADDRESS_HOME_ADDRESS));
+      autofill::AutofillType(autofill::FieldType::ADDRESS_HOME_ADDRESS));
   autofill_manager()->AddSeenFormStructure(std::move(form_structure));
 
   SimulateTyping(form_data.global_id(), form_data.fields[0].global_id(),
diff --git a/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.cc b/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.cc
index dc0cdfa..4e55b8e 100644
--- a/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.cc
+++ b/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.cc
@@ -8,7 +8,6 @@
 #include "base/command_line.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/android/tab_model/tab_model.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/content_settings/core/common/content_settings_utils.h"
 #include "components/content_settings/core/common/pref_names.h"
@@ -35,10 +34,8 @@
   host_content_settings_map_ =
       HostContentSettingsMapFactory::GetForProfile(profile);
   if (base::FeatureList::IsEnabled(
-          features::kRequestDesktopSiteWindowSetting) ||
-      base::FeatureList::IsEnabled(features::kRequestDesktopSiteAdditions)) {
+          features::kRequestDesktopSiteWindowSetting)) {
     pref_service_ = profile->GetPrefs();
-    tab_android_ = TabAndroid::FromWebContents(contents);
   }
 }
 
@@ -84,17 +81,6 @@
     }
   }
 
-  // Take secondary settings into account if ContentSetting is global setting.
-  if (!desktop_mode &&
-      base::FeatureList::IsEnabled(features::kRequestDesktopSiteAdditions) &&
-      is_global_setting) {
-    bool desktop_mode_peripheral =
-        pref_service_->GetBoolean(prefs::kDesktopSitePeripheralSettingEnabled);
-    if (desktop_mode_peripheral) {
-      desktop_mode = TabAndroid::isHardwareKeyboardAvailable(tab_android_);
-    }
-  }
-
   // Override UA for renderer initiated navigation only. UA override for browser
   // initiated navigation is handled on Java side. This is to workaround known
   // issues crbug.com/1265751 and crbug.com/1261939.
diff --git a/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.h b/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.h
index 39023b9..3ba47169 100644
--- a/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.h
+++ b/chrome/browser/content_settings/request_desktop_site_web_contents_observer_android.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_CONTENT_SETTINGS_REQUEST_DESKTOP_SITE_WEB_CONTENTS_OBSERVER_ANDROID_H_
 #define CHROME_BROWSER_CONTENT_SETTINGS_REQUEST_DESKTOP_SITE_WEB_CONTENTS_OBSERVER_ANDROID_H_
 
-#include "chrome/browser/android/tab_android.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
@@ -38,7 +37,6 @@
 
   scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
   raw_ptr<PrefService> pref_service_ = nullptr;
-  raw_ptr<TabAndroid> tab_android_ = nullptr;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 };
diff --git a/chrome/browser/download/bubble/download_bubble_ui_controller.cc b/chrome/browser/download/bubble/download_bubble_ui_controller.cc
index be600b7..384502eb6 100644
--- a/chrome/browser/download/bubble/download_bubble_ui_controller.cc
+++ b/chrome/browser/download/bubble/download_bubble_ui_controller.cc
@@ -177,9 +177,6 @@
   bool is_done = item->IsDone() ||
                  (item->GetState() == download::DownloadItem::IN_PROGRESS &&
                   !IsItemInProgress(item));
-  if (model.IsDangerous()) {
-    RecordDangerousDownloadShownToUser();
-  }
   display_controller_->OnUpdatedItem(is_done, may_show_details);
 }
 
@@ -382,13 +379,6 @@
   tracker->NotifyEvent("download_bubble_interaction");
 }
 
-void DownloadBubbleUIController::RecordDangerousDownloadShownToUser() {
-  feature_engagement::Tracker* tracker =
-      feature_engagement::TrackerFactory::GetForBrowserContext(
-          browser_->profile());
-  tracker->NotifyEvent("download_bubble_dangerous_download_detected");
-}
-
 base::WeakPtr<DownloadBubbleUIController>
 DownloadBubbleUIController::GetWeakPtr() {
   return weak_factory_.GetWeakPtr();
diff --git a/chrome/browser/download/bubble/download_bubble_ui_controller.h b/chrome/browser/download/bubble/download_bubble_ui_controller.h
index e5be284..e2a20195 100644
--- a/chrome/browser/download/bubble/download_bubble_ui_controller.h
+++ b/chrome/browser/download/bubble/download_bubble_ui_controller.h
@@ -108,11 +108,6 @@
   // quantitatively to count the number of such interactions.
   void RecordDownloadBubbleInteraction();
 
-  // Records that a dangerous download was shown to the user. This only
-  // records the fact that an interaction occurred, and should not be
-  // used quantitatively to count the number of such interactions.
-  void RecordDangerousDownloadShownToUser();
-
   // Returns the DownloadDisplayController. Should always return a valid
   // controller.
   DownloadDisplayController* GetDownloadDisplayController() {
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index 47431bc..dcb7256 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -4578,6 +4578,13 @@
   bool final_state_seen_;
 };
 
+#if BUILDFLAG(IS_WIN)
+const char kDangerousMockFilePath[] = "/downloads/dangerous/dangerous.exe";
+#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
+// TODO(crbug.com/1264058): Find an actually "dangerous" extension for Fuchsia.
+const char kDangerousMockFilePath[] = "/downloads/dangerous/dangerous.sh";
+#endif
+
 }  // namespace
 
 IN_PROC_BROWSER_TEST_F(DownloadTest,
@@ -4586,8 +4593,7 @@
                                                true);
   embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
   ASSERT_TRUE(embedded_test_server()->Start());
-  GURL download_url =
-      embedded_test_server()->GetURL(DownloadTestBase::kDangerousMockFilePath);
+  GURL download_url = embedded_test_server()->GetURL(kDangerousMockFilePath);
 
   std::unique_ptr<content::DownloadTestObserver> dangerous_observer(
       DangerousDownloadWaiter(
@@ -4623,8 +4629,7 @@
                                                false);
   embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
   ASSERT_TRUE(embedded_test_server()->Start());
-  GURL download_url =
-      embedded_test_server()->GetURL(DownloadTestBase::kDangerousMockFilePath);
+  GURL download_url = embedded_test_server()->GetURL(kDangerousMockFilePath);
 
   std::unique_ptr<content::DownloadTestObserver> dangerous_observer(
       DangerousDownloadWaiter(
@@ -4799,8 +4804,7 @@
   // Make a dangerous file.
   embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
   ASSERT_TRUE(embedded_test_server()->Start());
-  GURL download_url =
-      embedded_test_server()->GetURL(DownloadTestBase::kDangerousMockFilePath);
+  GURL download_url = embedded_test_server()->GetURL(kDangerousMockFilePath);
 
   std::unique_ptr<content::DownloadTestObserver> dangerous_observer(
       DangerousDownloadWaiter(
@@ -4838,8 +4842,7 @@
   // Make a dangerous file.
   embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
   ASSERT_TRUE(embedded_test_server()->Start());
-  GURL download_url =
-      embedded_test_server()->GetURL(DownloadTestBase::kDangerousMockFilePath);
+  GURL download_url = embedded_test_server()->GetURL(kDangerousMockFilePath);
   auto* download_protection_service =
       static_cast<FakeDownloadProtectionService*>(
           g_browser_process->safe_browsing_service()
@@ -4889,8 +4892,7 @@
   // Make a dangerous file.
   embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
   ASSERT_TRUE(embedded_test_server()->Start());
-  GURL download_url =
-      embedded_test_server()->GetURL(DownloadTestBase::kDangerousMockFilePath);
+  GURL download_url = embedded_test_server()->GetURL(kDangerousMockFilePath);
   std::unique_ptr<content::DownloadTestObserver> dangerous_observer(
       DangerousDownloadWaiter(
           browser(), 1,
@@ -4927,8 +4929,7 @@
   // Make a dangerous file.
   embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
   ASSERT_TRUE(embedded_test_server()->Start());
-  GURL download_url =
-      embedded_test_server()->GetURL(DownloadTestBase::kDangerousMockFilePath);
+  GURL download_url = embedded_test_server()->GetURL(kDangerousMockFilePath);
 
   std::unique_ptr<content::DownloadTestObserver> dangerous_observer(
       DangerousDownloadWaiter(
diff --git a/chrome/browser/download/download_browsertest_utils.h b/chrome/browser/download/download_browsertest_utils.h
index 8a7095c..c3d06e1 100644
--- a/chrome/browser/download/download_browsertest_utils.h
+++ b/chrome/browser/download/download_browsertest_utils.h
@@ -97,15 +97,6 @@
   };
 
   static constexpr char kDownloadTest1Path[] = "download-test1.lib";
-#if BUILDFLAG(IS_WIN)
-  static constexpr char kDangerousMockFilePath[] =
-      "/downloads/dangerous/dangerous.exe";
-#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
-  // TODO(crbug.com/1264058): Find an actually "dangerous" extension for
-  // Fuchsia.
-  static constexpr char kDangerousMockFilePath[] =
-      "/downloads/dangerous/dangerous.sh";
-#endif
 
   DownloadTestBase();
   ~DownloadTestBase() override;
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_api.cc b/chrome/browser/extensions/api/document_scan/document_scan_api.cc
index 8250512..4744f1b 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_api.cc
+++ b/chrome/browser/extensions/api/document_scan/document_scan_api.cc
@@ -119,6 +119,30 @@
       ArgumentList(api::document_scan::OpenScanner::Results::Create(response)));
 }
 
+DocumentScanGetOptionGroupsFunction::DocumentScanGetOptionGroupsFunction() =
+    default;
+DocumentScanGetOptionGroupsFunction::~DocumentScanGetOptionGroupsFunction() =
+    default;
+
+ExtensionFunction::ResponseAction DocumentScanGetOptionGroupsFunction::Run() {
+  auto params = api::document_scan::GetOptionGroups::Params::Create(args());
+  EXTENSION_FUNCTION_VALIDATE(params);
+
+  DocumentScanAPIHandler::Get(browser_context())
+      ->GetOptionGroups(
+          extension_, std::move(params->scanner_handle),
+          base::BindOnce(
+              &DocumentScanGetOptionGroupsFunction::OnResponseReceived, this));
+
+  return did_respond() ? AlreadyResponded() : RespondLater();
+}
+
+void DocumentScanGetOptionGroupsFunction::OnResponseReceived(
+    api::document_scan::GetOptionGroupsResponse response) {
+  Respond(ArgumentList(
+      api::document_scan::GetOptionGroups::Results::Create(response)));
+}
+
 DocumentScanCloseScannerFunction::DocumentScanCloseScannerFunction() = default;
 DocumentScanCloseScannerFunction::~DocumentScanCloseScannerFunction() = default;
 
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_api.h b/chrome/browser/extensions/api/document_scan/document_scan_api.h
index f8b8411b..c745235e 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_api.h
+++ b/chrome/browser/extensions/api/document_scan/document_scan_api.h
@@ -72,6 +72,26 @@
                              DOCUMENTSCAN_OPENSCANNER)
 };
 
+class DocumentScanGetOptionGroupsFunction : public ExtensionFunction {
+ public:
+  DocumentScanGetOptionGroupsFunction();
+  DocumentScanGetOptionGroupsFunction(
+      const DocumentScanGetOptionGroupsFunction&) = delete;
+  DocumentScanGetOptionGroupsFunction& operator=(
+      const DocumentScanGetOptionGroupsFunction&) = delete;
+
+ protected:
+  ~DocumentScanGetOptionGroupsFunction() override;
+
+  // ExtensionFunction:
+  ResponseAction Run() override;
+
+ private:
+  void OnResponseReceived(api::document_scan::GetOptionGroupsResponse response);
+  DECLARE_EXTENSION_FUNCTION("documentScan.getOptionGroups",
+                             DOCUMENTSCAN_GETOPTIONGROUPS)
+};
+
 class DocumentScanCloseScannerFunction : public ExtensionFunction {
  public:
   DocumentScanCloseScannerFunction();
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_api_handler.cc b/chrome/browser/extensions/api/document_scan/document_scan_api_handler.cc
index 0c6c2179b..ec251c06 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_api_handler.cc
+++ b/chrome/browser/extensions/api/document_scan/document_scan_api_handler.cc
@@ -322,6 +322,33 @@
   std::move(callback).Run(std::move(response_out));
 }
 
+void DocumentScanAPIHandler::GetOptionGroups(
+    scoped_refptr<const Extension> extension,
+    const std::string& scanner_handle,
+    GetOptionGroupsCallback callback) {
+  // Ensure this scanner is allocated to this extension.
+  ExtensionState& state = extension_state_[extension->id()];
+  if (!base::Contains(state.scanner_handles, scanner_handle)) {
+    auto response = crosapi::mojom::GetOptionGroupsResponse::New();
+    response->scanner_handle = scanner_handle;
+    response->result = crosapi::mojom::ScannerOperationResult::kInvalid;
+    OnGetOptionGroupsResponse(std::move(callback), std::move(response));
+    return;
+  }
+
+  document_scan_->GetOptionGroups(
+      scanner_handle,
+      base::BindOnce(&DocumentScanAPIHandler::OnGetOptionGroupsResponse,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void DocumentScanAPIHandler::OnGetOptionGroupsResponse(
+    GetOptionGroupsCallback callback,
+    crosapi::mojom::GetOptionGroupsResponsePtr response) {
+  std::move(callback).Run(
+      response.To<api::document_scan::GetOptionGroupsResponse>());
+}
+
 void DocumentScanAPIHandler::CloseScanner(
     scoped_refptr<const Extension> extension,
     const std::string& scanner_handle,
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_api_handler.h b/chrome/browser/extensions/api/document_scan/document_scan_api_handler.h
index 1629d4b..882d449 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_api_handler.h
+++ b/chrome/browser/extensions/api/document_scan/document_scan_api_handler.h
@@ -47,6 +47,8 @@
       base::OnceCallback<void(api::document_scan::GetScannerListResponse)>;
   using OpenScannerCallback =
       base::OnceCallback<void(api::document_scan::OpenScannerResponse)>;
+  using GetOptionGroupsCallback =
+      base::OnceCallback<void(api::document_scan::GetOptionGroupsResponse)>;
   using CloseScannerCallback =
       base::OnceCallback<void(api::document_scan::CloseScannerResponse)>;
   using SetOptionsCallback =
@@ -102,6 +104,13 @@
                    const std::string& scanner_id,
                    OpenScannerCallback callback);
 
+  // Given `scanner_handle` previously returned from `OpenScanner`, gets the
+  // group names and member options for that scanner.  The result will be passed
+  // to `callback`.
+  void GetOptionGroups(scoped_refptr<const Extension> extension,
+                       const std::string& scanner_handle,
+                       GetOptionGroupsCallback callback);
+
   // Given `scanner_handle` previously returned from `OpenScanner`, closes the
   // handle.  No further operations on this handle can be performed even if the
   // result code does not indicate success.  The result of closing the handle on
@@ -212,6 +221,9 @@
                              const std::string& scanner_id,
                              OpenScannerCallback callback,
                              crosapi::mojom::OpenScannerResponsePtr response);
+  void OnGetOptionGroupsResponse(
+      GetOptionGroupsCallback callback,
+      crosapi::mojom::GetOptionGroupsResponsePtr response);
   void OnCloseScannerResponse(CloseScannerCallback callback,
                               crosapi::mojom::CloseScannerResponsePtr response);
   void OnSetOptionsResponse(SetOptionsCallback callback,
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_api_handler_unittest.cc b/chrome/browser/extensions/api/document_scan/document_scan_api_handler_unittest.cc
index f387642..910e9ab6 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_api_handler_unittest.cc
+++ b/chrome/browser/extensions/api/document_scan/document_scan_api_handler_unittest.cc
@@ -47,6 +47,8 @@
     base::test::TestFuture<api::document_scan::GetScannerListResponse>;
 using OpenScannerFuture =
     base::test::TestFuture<api::document_scan::OpenScannerResponse>;
+using GetOptionGroupsFuture =
+    base::test::TestFuture<api::document_scan::GetOptionGroupsResponse>;
 using CloseScannerFuture =
     base::test::TestFuture<api::document_scan::CloseScannerResponse>;
 using SetOptionsFuture =
@@ -495,6 +497,31 @@
   EXPECT_FALSE(open_response2.options.has_value());
 }
 
+TEST_F(DocumentScanAPIHandlerTest, GetOptionGroups_NoScanner) {
+  GetOptionGroupsFuture future;
+  document_scan_api_handler_->GetOptionGroups(extension_, "badscanner",
+                                              future.GetCallback());
+  const api::document_scan::GetOptionGroupsResponse& response = future.Get();
+
+  EXPECT_EQ(response.scanner_handle, "badscanner");
+  EXPECT_EQ(response.result, api::document_scan::OperationResult::kInvalid);
+  EXPECT_FALSE(response.groups.has_value());
+}
+
+TEST_F(DocumentScanAPIHandlerTest, GetOptionGroups_ValidScanner) {
+  std::string scanner_handle = OpenScannerForExtension(extension_);
+  EXPECT_FALSE(scanner_handle.empty());
+
+  GetOptionGroupsFuture future;
+  document_scan_api_handler_->GetOptionGroups(extension_, scanner_handle,
+                                              future.GetCallback());
+  const api::document_scan::GetOptionGroupsResponse& response = future.Get();
+
+  EXPECT_EQ(response.scanner_handle, scanner_handle);
+  EXPECT_EQ(response.result, api::document_scan::OperationResult::kSuccess);
+  ASSERT_TRUE(response.groups.has_value());
+}
+
 TEST_F(DocumentScanAPIHandlerTest, CloseScanner_CloseBeforeOpenFails) {
   CloseScannerFuture future;
   document_scan_api_handler_->CloseScanner(extension_, "badscanner",
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_type_converters.cc b/chrome/browser/extensions/api/document_scan/document_scan_type_converters.cc
index 1b27144..bfc2476c 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_type_converters.cc
+++ b/chrome/browser/extensions/api/document_scan/document_scan_type_converters.cc
@@ -425,6 +425,28 @@
   return output;
 }
 
+extensions::api::document_scan::GetOptionGroupsResponse
+TypeConverter<extensions::api::document_scan::GetOptionGroupsResponse,
+              crosapi::mojom::GetOptionGroupsResponsePtr>::
+    Convert(const crosapi::mojom::GetOptionGroupsResponsePtr& input) {
+  document_scan::GetOptionGroupsResponse output;
+  output.scanner_handle = input->scanner_handle;
+  output.result = ConvertTo<document_scan::OperationResult>(input->result);
+  if (!input->groups.has_value()) {
+    return output;
+  }
+
+  output.groups.emplace();
+  output.groups->reserve(input->groups.value().size());
+  for (const mojom::OptionGroupPtr& group_in : input->groups.value()) {
+    document_scan::OptionGroup& group_out = output.groups->emplace_back();
+    group_out.title = group_in->title;
+    group_out.members = std::vector<std::string>(group_in->members.begin(),
+                                                 group_in->members.end());
+  }
+  return output;
+}
+
 extensions::api::document_scan::CloseScannerResponse
 TypeConverter<extensions::api::document_scan::CloseScannerResponse,
               crosapi::mojom::CloseScannerResponsePtr>::
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_type_converters.h b/chrome/browser/extensions/api/document_scan/document_scan_type_converters.h
index e22f9bc..daf7ed0b 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_type_converters.h
+++ b/chrome/browser/extensions/api/document_scan/document_scan_type_converters.h
@@ -40,6 +40,13 @@
 };
 
 template <>
+struct TypeConverter<extensions::api::document_scan::GetOptionGroupsResponse,
+                     crosapi::mojom::GetOptionGroupsResponsePtr> {
+  static extensions::api::document_scan::GetOptionGroupsResponse Convert(
+      const crosapi::mojom::GetOptionGroupsResponsePtr& input);
+};
+
+template <>
 struct TypeConverter<extensions::api::document_scan::CloseScannerResponse,
                      crosapi::mojom::CloseScannerResponsePtr> {
   static extensions::api::document_scan::CloseScannerResponse Convert(
diff --git a/chrome/browser/extensions/api/document_scan/document_scan_type_converters_unittest.cc b/chrome/browser/extensions/api/document_scan/document_scan_type_converters_unittest.cc
index 4302a02e..3da9935 100644
--- a/chrome/browser/extensions/api/document_scan/document_scan_type_converters_unittest.cc
+++ b/chrome/browser/extensions/api/document_scan/document_scan_type_converters_unittest.cc
@@ -486,6 +486,34 @@
   EXPECT_TRUE(base::Contains(output.options->additional_properties, "name2"));
 }
 
+TEST(DocumentScanTypeConvertersTest, GetOptionGroupsResponse_Empty) {
+  auto input = mojom::GetOptionGroupsResponse::New();
+  auto output = input.To<document_scan::GetOptionGroupsResponse>();
+  EXPECT_EQ(output.scanner_handle, "");
+  EXPECT_EQ(output.result, document_scan::OperationResult::kUnknown);
+  EXPECT_FALSE(output.groups.has_value());
+}
+
+TEST(DocumentScanTypeConvertersTest, GetOptionGroupsResponse_NonEmpty) {
+  auto input = mojom::GetOptionGroupsResponse::New();
+  input->scanner_handle = "scanner_handle";
+  input->result = mojom::ScannerOperationResult::kSuccess;
+  input->groups.emplace();
+  auto input_group = mojom::OptionGroup::New();
+  input_group->title = "title";
+  input_group->members.emplace_back("item1");
+  input_group->members.emplace_back("item2");
+  input->groups->emplace_back(std::move(input_group));
+
+  auto output = input.To<document_scan::GetOptionGroupsResponse>();
+  EXPECT_EQ(output.scanner_handle, "scanner_handle");
+  EXPECT_EQ(output.result, document_scan::OperationResult::kSuccess);
+  ASSERT_TRUE(output.groups.has_value());
+  ASSERT_EQ(output.groups->size(), 1U);
+  EXPECT_EQ(output.groups.value()[0].title, "title");
+  EXPECT_THAT(output.groups.value()[0].members, ElementsAre("item1", "item2"));
+}
+
 TEST(DocumentScanTypeConvertersTest, CloseScannerResponse_Empty) {
   auto input = mojom::CloseScannerResponse::New();
   auto output = input.To<document_scan::CloseScannerResponse>();
diff --git a/chrome/browser/extensions/api/document_scan/fake_document_scan_ash.cc b/chrome/browser/extensions/api/document_scan/fake_document_scan_ash.cc
index a90db68b..f80b3f6 100644
--- a/chrome/browser/extensions/api/document_scan/fake_document_scan_ash.cc
+++ b/chrome/browser/extensions/api/document_scan/fake_document_scan_ash.cc
@@ -97,6 +97,30 @@
   std::move(callback).Run(std::move(response));
 }
 
+void FakeDocumentScanAsh::GetOptionGroups(const std::string& scanner_handle,
+                                          GetOptionGroupsCallback callback) {
+  if (!base::Contains(open_scanners_, scanner_handle)) {
+    auto response = crosapi::mojom::GetOptionGroupsResponse::New();
+    response->scanner_handle = scanner_handle;
+    response->result = crosapi::mojom::ScannerOperationResult::kInvalid;
+    std::move(callback).Run(std::move(response));
+    return;
+  }
+
+  // The API handler just passes through responses from this function, so always
+  // returning a hardcoded value shouldn't matter.
+  auto response = crosapi::mojom::GetOptionGroupsResponse::New();
+  response->result = crosapi::mojom::ScannerOperationResult::kSuccess;
+  response->scanner_handle = scanner_handle;
+  response->groups.emplace();
+  auto option_group = crosapi::mojom::OptionGroup::New();
+  option_group->title = "title";
+  option_group->members.emplace_back("item1");
+  option_group->members.emplace_back("item2");
+  response->groups->emplace_back(std::move(option_group));
+  std::move(callback).Run(std::move(response));
+}
+
 void FakeDocumentScanAsh::CloseScanner(const std::string& scanner_handle,
                                        CloseScannerCallback callback) {
   auto response = crosapi::mojom::CloseScannerResponse::New();
@@ -275,12 +299,6 @@
   std::move(callback).Run(std::move(response));
 }
 
-void FakeDocumentScanAsh::GetOptionGroups(const std::string& scanner_handle,
-                                          GetOptionGroupsCallback callback) {
-  // TODO(b/313730106): Implement this when adding the extension handler.
-  NOTIMPLEMENTED();
-}
-
 void FakeDocumentScanAsh::CancelScan(const std::string& job_handle,
                                      CancelScanCallback callback) {
   auto response = crosapi::mojom::CancelScanResponse::New();
diff --git a/chrome/browser/extensions/api/document_scan/fake_document_scan_ash.h b/chrome/browser/extensions/api/document_scan/fake_document_scan_ash.h
index d7499de..8bbd1c4 100644
--- a/chrome/browser/extensions/api/document_scan/fake_document_scan_ash.h
+++ b/chrome/browser/extensions/api/document_scan/fake_document_scan_ash.h
@@ -33,6 +33,8 @@
   void OpenScanner(const std::string& client_id,
                    const std::string& scanner_id,
                    OpenScannerCallback callback) override;
+  void GetOptionGroups(const std::string& scanner_handle,
+                       GetOptionGroupsCallback callback) override;
   void CloseScanner(const std::string& scanner_handle,
                     CloseScannerCallback callback) override;
   void StartPreparedScan(const std::string& scanner_handle,
@@ -43,8 +45,6 @@
   void SetOptions(const std::string& scanner_handle,
                   std::vector<crosapi::mojom::OptionSettingPtr> options,
                   SetOptionsCallback callback) override;
-  void GetOptionGroups(const std::string& scanner_handle,
-                       GetOptionGroupsCallback callback) override;
   void CancelScan(const std::string& job_handle,
                   CancelScanCallback callback) override;
 
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
index 86928ba..8ea70a5 100644
--- a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
+++ b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -498,9 +498,6 @@
   features.Append(GenerateFeatureFlag(
       "handwritinggesture",
       base::FeatureList::IsEnabled(features::kHandwritingGesture)));
-  features.Append(GenerateFeatureFlag(
-      "handwritinggestureediting",
-      base::FeatureList::IsEnabled(ash::features::kHandwritingGestureEditing)));
   features.Append(
       GenerateFeatureFlag("handwritinglegacyrecognition",
                           base::FeatureList::IsEnabled(
diff --git a/chrome/browser/extensions/updater/local_extension_cache.cc b/chrome/browser/extensions/updater/local_extension_cache.cc
index 1bd2f1a..3274005 100644
--- a/chrome/browser/extensions/updater/local_extension_cache.cc
+++ b/chrome/browser/extensions/updater/local_extension_cache.cc
@@ -4,12 +4,17 @@
 
 #include "chrome/browser/extensions/updater/local_extension_cache.h"
 
+#include <string>
+
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
+#include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
+#include "base/strings/string_piece.h"
+#include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/system/sys_info.h"
 #include "base/task/sequenced_task_runner.h"
@@ -28,9 +33,12 @@
 // become ready.
 constexpr base::TimeDelta kCacheStatusPollingDelay = base::Seconds(1);
 
+constexpr std::string_view kExtensionIdDelimiter = "\n";
+
 }  // namespace
 
 const char LocalExtensionCache::kCacheReadyFlagFileName[] = ".initialized";
+const char LocalExtensionCache::kInvalidCacheIdsFileName[] = ".invalid_cache";
 
 LocalExtensionCache::LocalExtensionCache(
     const base::FilePath& cache_dir,
@@ -218,6 +226,23 @@
   return true;
 }
 
+bool LocalExtensionCache::RemoveOnNextInit(const std::string& id) {
+  if (state_ != kReady) {
+    return false;
+  }
+
+  if (base::Contains(invalid_cache_ids_, id)) {
+    return true;
+  }
+
+  backend_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&LocalExtensionCache::BackendMarkCacheInvalid,
+                     weak_ptr_factory_.GetWeakPtr(), cache_dir_, id));
+  invalid_cache_ids_.insert(id);
+  return true;
+}
+
 bool LocalExtensionCache::GetStatistics(uint64_t* cache_size,
                                         size_t* extensions_count) {
   if (state_ != kReady)
@@ -400,6 +425,7 @@
     return;
   }
 
+  std::set<std::string> invalid_cache = BackendGetInvalidCache(cache_dir);
   // Enumerate all the files in the cache |cache_dir|, including directories
   // and symlinks. Each unrecognized file will be erased.
   int types = base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES;
@@ -418,6 +444,10 @@
     // Skip flag file that indicates that cache is ready.
     if (basename == kCacheReadyFlagFileName)
       continue;
+    // Skip file with extension ids of invalidated cache.
+    if (basename == kInvalidCacheIdsFileName) {
+      continue;
+    }
 
     // crx files in the cache are named
     // <extension-id>-<version>[-<expected_hash>].crx.
@@ -458,6 +488,11 @@
       continue;
     }
 
+    if (base::Contains(invalid_cache, id)) {
+      base::DeleteFile(path);
+      continue;
+    }
+
     VLOG(1) << "Found cached version " << version
             << " for extension id " << id;
 
@@ -467,6 +502,14 @@
                       info.GetSize(), path),
         true);
   }
+
+  // Delete the invalid cache file.
+  base::FilePath invalid_cache_file =
+      cache_dir.AppendASCII(kInvalidCacheIdsFileName);
+  if (!base::DeleteFile(invalid_cache_file)) {
+    LOG(WARNING) << "Failed to delete cache invalidation file "
+                 << invalid_cache_file;
+  }
 }
 
 void LocalExtensionCache::OnCacheContentsChecked(
@@ -581,6 +624,57 @@
 }
 
 // static
+void LocalExtensionCache::BackendMarkCacheInvalid(
+    base::WeakPtr<LocalExtensionCache> local_cache,
+    const base::FilePath& cache_dir,
+    const std::string& extension_id) {
+  base::FilePath invalid_cache_file =
+      cache_dir.AppendASCII(kInvalidCacheIdsFileName);
+  std::string contents = base::ToString(extension_id, kExtensionIdDelimiter);
+  bool success = false;
+  if (!base::PathExists(invalid_cache_file)) {
+    success = base::WriteFile(invalid_cache_file, contents);
+  } else {
+    success = base::AppendToFile(invalid_cache_file, contents);
+  }
+
+  if (!success) {
+    static bool already_warned = false;
+    if (!already_warned) {
+      LOG(WARNING) << "Failed writing obsolete cache extension id "
+                   << extension_id << " to file " << invalid_cache_file;
+      already_warned = true;
+    }
+    content::GetUIThreadTaskRunner({})->PostTask(
+        FROM_HERE,
+        base::BindOnce(&LocalExtensionCache::OnMarkCacheInvalidFailed,
+                       local_cache, extension_id));
+    return;
+  }
+}
+
+void LocalExtensionCache::OnMarkCacheInvalidFailed(
+    const std::string& extension_id) {
+  // Erase extension id from invalid ids since it was not marked invalid
+  // successfully.
+  invalid_cache_ids_.erase(extension_id);
+}
+
+// static
+std::set<std::string> LocalExtensionCache::BackendGetInvalidCache(
+    const base::FilePath& cache_dir) {
+  base::FilePath file = cache_dir.AppendASCII(kInvalidCacheIdsFileName);
+  std::string contents;
+  base::ReadFileToString(file, &contents);
+
+  auto extension_ids =
+      base::SplitString(contents, kExtensionIdDelimiter, base::TRIM_WHITESPACE,
+                        base::SPLIT_WANT_NONEMPTY);
+  return {std::make_move_iterator(extension_ids.begin()),
+          std::make_move_iterator(extension_ids.end())};
+}
+
+// static
 bool LocalExtensionCache::CompareCacheItemsAge(const CacheMap::iterator& lhs,
                                                const CacheMap::iterator& rhs) {
   return lhs->second.last_used < rhs->second.last_used;
diff --git a/chrome/browser/extensions/updater/local_extension_cache.h b/chrome/browser/extensions/updater/local_extension_cache.h
index e20f896..fe0846d 100644
--- a/chrome/browser/extensions/updater/local_extension_cache.h
+++ b/chrome/browser/extensions/updater/local_extension_cache.h
@@ -10,6 +10,7 @@
 
 #include <map>
 #include <memory>
+#include <set>
 #include <string>
 
 #include "base/files/file_path.h"
@@ -52,6 +53,8 @@
 
   // Name of flag file that indicates that cache is ready (import finished).
   static const char kCacheReadyFlagFileName[];
+  // Name of the file that lists invalid cache that should be removed.
+  static const char kInvalidCacheIdsFileName[];
 
   // Initialize cache. If |wait_for_cache_initialization| is |true|, the cache
   // contents will not be read until a flag file appears in the cache directory,
@@ -95,6 +98,10 @@
   // empty, all files corresponding to that |id| will be removed.
   bool RemoveExtension(const std::string& id, const std::string& expected_hash);
 
+  // Mark extension with |id| as obsolete and schedule removal for the next
+  // initialization. Returns true if removal was scheduled successfully.
+  bool RemoveOnNextInit(const std::string& id);
+
   // Return cache statistics. Returns |false| if cache is not ready.
   bool GetStatistics(uint64_t* cache_size, size_t* extensions_count);
 
@@ -249,6 +256,20 @@
                                       const std::string& expected_hash,
                                       const std::string& id);
 
+  // Appends the extension id to |kInvalidCacheIdsFileName| file so that it is
+  // deleted on the next startup and a new version is retrieved.
+  static void BackendMarkCacheInvalid(
+      base::WeakPtr<LocalExtensionCache> local_cache,
+      const base::FilePath& cache_dir,
+      const std::string& extension_id);
+
+  // Invoked on the UI thread if BackendMarkCacheInvalid() fails.
+  void OnMarkCacheInvalidFailed(const std::string& extension_id);
+
+  // Gets extension ids from |kInvalidCacheIdsFileName| file.
+  static std::set<std::string> BackendGetInvalidCache(
+      const base::FilePath& cache_dir);
+
   // Compare two cache items returns true if first item is older.
   static bool CompareCacheItemsAge(const CacheMap::iterator& lhs,
                                    const CacheMap::iterator& rhs);
@@ -275,6 +296,10 @@
   // This contains info about all cached extensions.
   CacheMap cached_extensions_;
 
+  // This contains extension ids of invalid cache that should be removed on the
+  // next initialization.
+  std::set<std::string> invalid_cache_ids_;
+
   // Delay between polling cache status.
   base::TimeDelta cache_status_polling_delay_;
 
diff --git a/chrome/browser/extensions/updater/local_extension_cache_unittest.cc b/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
index f07890f..6ed10c4 100644
--- a/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
+++ b/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
@@ -107,6 +107,11 @@
         extensions::LocalExtensionCache::ExtensionFileName(id, version, hash));
   }
 
+  base::FilePath GetInvalidCacheFilePath() {
+    return cache_dir_.GetPath().AppendASCII(
+        LocalExtensionCache::kInvalidCacheIdsFileName);
+  }
+
  private:
   content::BrowserTaskEnvironment task_environment_;
 
@@ -422,4 +427,89 @@
   EXPECT_TRUE(base::DeleteFile(temp7));
 }
 
+// This test checks that scheduling extension cache removal with
+// `RemoveOnNextInit` works correctly: extension cache is deleted for the
+// specified extension right on the next initialization, another extension is
+// not affected.
+TEST_F(LocalExtensionCacheTest, InvalidExtensionRemoval) {
+  base::FilePath cache_dir(CreateCacheDir());
+
+  LocalExtensionCache cache(
+      cache_dir, /*max_cache_size=*/1000, /*max_cache_age=*/base::Days(30),
+      /*backend_task_runner=*/
+      base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}));
+  cache.SetCacheStatusPollingDelayForTests(base::TimeDelta());
+
+  bool initialized = false;
+  cache.Init(true, base::BindOnce(&SimpleCallback, &initialized));
+
+  const base::Time time = base::Time::Now() - base::Days(1);
+  base::FilePath file_1, file_2_1, file_2_2;
+  const std::string hash_1 = CreateSignedExtensionFile(
+      cache_dir, kTestExtensionId1, "1.0", 100, time, &file_1);
+  const std::string hash_2_1 = CreateSignedExtensionFile(
+      cache_dir, kTestExtensionId2, "2.0", 101, time, &file_2_1);
+  const std::string hash_2_2 = CreateSignedExtensionFile(
+      cache_dir, kTestExtensionId2, "2.0", 123, time, &file_2_2);
+  content::RunAllTasksUntilIdle();
+  ASSERT_TRUE(initialized);
+
+  EXPECT_TRUE(base::PathExists(file_1));
+  EXPECT_TRUE(base::PathExists(file_2_1));
+  EXPECT_TRUE(base::PathExists(file_2_2));
+
+  EXPECT_TRUE(cache.GetExtension(kTestExtensionId1, hash_1, nullptr, nullptr));
+  EXPECT_TRUE(cache.GetExtension(kTestExtensionId2, "", nullptr, nullptr));
+
+  // Invalid cache file should be removed on initializion.
+  EXPECT_FALSE(base::PathExists(GetInvalidCacheFilePath()));
+
+  cache.RemoveOnNextInit(kTestExtensionId2);
+  content::RunAllTasksUntilIdle();
+
+  // Extension files should still exist, nothing should be deleted before the
+  // next initialization.
+  EXPECT_TRUE(base::PathExists(file_1));
+  EXPECT_TRUE(base::PathExists(file_2_1));
+  EXPECT_TRUE(base::PathExists(file_2_2));
+
+  EXPECT_TRUE(cache.GetExtension(kTestExtensionId1, hash_1, nullptr, nullptr));
+  EXPECT_TRUE(cache.GetExtension(kTestExtensionId2, "", nullptr, nullptr));
+
+  bool did_shutdown = false;
+  cache.Shutdown(base::BindOnce(&SimpleCallback, &did_shutdown));
+  content::RunAllTasksUntilIdle();
+  ASSERT_TRUE(did_shutdown);
+
+  EXPECT_TRUE(base::PathExists(file_1));
+  EXPECT_TRUE(base::PathExists(file_2_1));
+  EXPECT_TRUE(base::PathExists(file_2_2));
+
+  // Create cache again for the same directory.
+  LocalExtensionCache new_cache(
+      cache_dir, 1000, base::Days(30),
+      base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}));
+  initialized = false;
+  new_cache.Init(true, base::BindOnce(&SimpleCallback, &initialized));
+  content::RunAllTasksUntilIdle();
+  ASSERT_TRUE(initialized);
+
+  // Check that second extension's cache was cleaned up after initialization.
+  EXPECT_TRUE(base::PathExists(file_1));
+  EXPECT_FALSE(base::PathExists(file_2_1));
+  EXPECT_FALSE(base::PathExists(file_2_2));
+
+  EXPECT_TRUE(
+      new_cache.GetExtension(kTestExtensionId1, hash_1, nullptr, nullptr));
+  EXPECT_FALSE(new_cache.GetExtension(kTestExtensionId2, "", nullptr, nullptr));
+
+  // Invalid cache file should be removed on initializion.
+  EXPECT_FALSE(base::PathExists(GetInvalidCacheFilePath()));
+
+  did_shutdown = false;
+  new_cache.Shutdown(base::BindOnce(&SimpleCallback, &did_shutdown));
+  content::RunAllTasksUntilIdle();
+  ASSERT_TRUE(did_shutdown);
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc
index bdc0f4b3..aaad224 100644
--- a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc
+++ b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc
@@ -379,7 +379,7 @@
         autofill::test::CreateTestCreditCardFormData(true, false, true));
     credit_card_form_structure->field(kCreditCardFieldIndexInForm)
         ->set_heuristic_type(autofill::HeuristicSource::kLegacy,
-                             autofill::ServerFieldType::CREDIT_CARD_NUMBER);
+                             autofill::FieldType::CREDIT_CARD_NUMBER);
     return credit_card_form_structure;
   }
 
@@ -388,7 +388,7 @@
         autofill::test::CreateTestAddressFormData());
     address_form_structure->field(kFirstNameFieldIndexInForm)
         ->set_heuristic_type(autofill::HeuristicSource::kLegacy,
-                             autofill::ServerFieldType::NAME_FIRST);
+                             autofill::FieldType::NAME_FIRST);
     return address_form_structure;
   }
 
@@ -1057,8 +1057,7 @@
   autofill::FormStructure* address_form =
       AddFormToAutofillManagerCache(SetUpAddressForm());
   address_form->field(0)->set_heuristic_type(
-      autofill::HeuristicSource::kLegacy,
-      autofill::ServerFieldType::EMAIL_ADDRESS);
+      autofill::HeuristicSource::kLegacy, autofill::FieldType::EMAIL_ADDRESS);
   StartRunAndSelectOptions({address_form->form_signature()});
   std::u16string announcement_text = u"Email filled.";
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 3e7a1939..0935742 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -170,11 +170,6 @@
     "expiry_milestone": 130
   },
   {
-    "name": "android-app-integration-safesearch",
-    "owners": [ "thaothao@chromium.org", "public-content-toast@google.com" ],
-    "expiry_milestone": 130
-  },
-  {
     "name": "android-extended-keyboard-shortcuts",
     "owners": [ "wbjacksonjr@google.com"],
     "expiry_milestone": 119
@@ -3048,6 +3043,11 @@
     "expiry_milestone": -1
   },
   {
+    "name": "enable-mac-ime-live-conversion-fix",
+    "owners": [ "tkent@chromium.org" ],
+    "expiry_milestone": 134
+  },
+  {
     "name": "enable-mac-pwas-notification-attribution",
     "owners": [ "mek@chromium.org", "desktop-pwas-team@google.com" ],
     "expiry_milestone": 126
@@ -4550,11 +4550,6 @@
     "expiry_milestone": 123
   },
   {
-    "name": "handwriting-gesture-editing",
-    "owners": [ "curtismcmullan@chromium.org", "essential-inputs-team@google.com" ],
-    "expiry_milestone": 111
-  },
-  {
     "name": "handwriting-legacy-recognition",
     "owners": [ "curtismcmullan@chromium.org", "essential-inputs-team@google.com" ],
     "expiry_milestone": 118
@@ -6940,11 +6935,6 @@
     "expiry_milestone": 125
   },
   {
-    "name": "request-desktop-site-additions",
-    "owners": [ "shuyng@google.com", "skavuluru@google.com", "twellington@chromium.org", "clank-app-team@google.com" ],
-    "expiry_milestone": 120
-  },
-  {
     "name": "request-desktop-site-defaults",
     "owners": [ "aishwaryarj@google.com", "skavuluru@google.com", "twellington@chromium.org", "clank-app-team@google.com" ],
     "expiry_milestone": 124
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 48cee7ed..5c83a650 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -88,11 +88,6 @@
 const char kAndroidAppIntegrationDescription[] =
     "If enabled, allows Chrome to integrate with the Android App Search.";
 
-const char kAndroidAppIntegrationSafeSearchName[] =
-    "SafeSearch in Android App Search";
-const char kAndroidAppIntegrationSafeSearchDescription[] =
-    "If enabled, allows Chrome to filter out sensitive urls";
-
 const char kAndroidExtendedKeyboardShortcutsName[] =
     "Android Extended Keyboard Shortcuts";
 const char kAndroidExtendedKeyboardShortcutsDescription[] =
@@ -1955,10 +1950,6 @@
     "integration states to DB or execute on the OS integration states before "
     "writing to the DB";
 
-const char kHandwritingGestureEditingName[] = "Handwriting Gestures Editing";
-const char kHandwritingGestureEditingDescription[] =
-    "Enables editing with handwriting gestures within the virtual keyboard.";
-
 const char kHandwritingLegacyRecognitionName[] =
     "Handwriting Legacy Recognition";
 const char kHandwritingLegacyRecognitionDescription[] =
@@ -2889,11 +2880,6 @@
 const char kPriceChangeModuleDescription[] =
     "Show a module with price drops of open tabs on new tab page.";
 
-const char kPrivacyGuideAndroidName[] = "Privacy Guide on Android";
-const char kPrivacyGuideAndroidDescription[] =
-    "Shows a new subpage in Settings that helps the user to review various "
-    "privacy settings.";
-
 const char kPrivacyGuide3Name[] = "Privacy Guide V3";
 const char kPrivacyGuide3Description[] =
     "Enables updates to the Privacy Guide flow.";
@@ -4343,12 +4329,6 @@
     "password saving, no password generation, etc.) until the error "
     "disappears.";
 
-const char kRequestDesktopSiteAdditionsName[] =
-    "Secondary settings for request desktop site on Android.";
-const char kRequestDesktopSiteAdditionsDescription[] =
-    "Secondary options in `Site settings` to request the desktop version of "
-    "websites based on external display or peripheral.";
-
 const char kRequestDesktopSiteDefaultsName[] =
     "Default settings for request desktop site on Android.";
 const char kRequestDesktopSiteDefaultsDescription[] =
@@ -5313,6 +5293,10 @@
 const char kImmersiveFullscreenDescription[] =
     "Automatically hide and show the toolbar in fullscreen.";
 
+const char kMacImeLiveConversionFixName[] = "Mac IME Live Conversion";
+const char kMacImeLiveConversionFixDescription[] =
+    "A fix for the Live Conversion feature of Japanese IME.";
+
 const char kMacLoopbackAudioForCastName[] =
     "Mac System Audio Loopback for Cast";
 const char kMacLoopbackAudioForCastDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index c059ce00..605ddc4a 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -82,9 +82,6 @@
 extern const char kAndroidAppIntegrationName[];
 extern const char kAndroidAppIntegrationDescription[];
 
-extern const char kAndroidAppIntegrationSafeSearchName[];
-extern const char kAndroidAppIntegrationSafeSearchDescription[];
-
 extern const char kAndroidExtendedKeyboardShortcutsName[];
 extern const char kAndroidExtendedKeyboardShortcutsDescription[];
 
@@ -1095,9 +1092,6 @@
 extern const char kGpuRasterizationName[];
 extern const char kGpuRasterizationDescription[];
 
-extern const char kHandwritingGestureEditingName[];
-extern const char kHandwritingGestureEditingDescription[];
-
 extern const char kHandwritingLegacyRecognitionName[];
 extern const char kHandwritingLegacyRecognitionDescription[];
 
@@ -1660,9 +1654,6 @@
 extern const char kPriceChangeModuleName[];
 extern const char kPriceChangeModuleDescription[];
 
-extern const char kPrivacyGuideAndroidName[];
-extern const char kPrivacyGuideAndroidDescription[];
-
 extern const char kPrivacyGuide3Name[];
 extern const char kPrivacyGuide3Description[];
 
@@ -2542,9 +2533,6 @@
 extern const char kRemoveUPMUnenrollmentName[];
 extern const char kRemoveUPMUnenrollmentDescription[];
 
-extern const char kRequestDesktopSiteAdditionsName[];
-extern const char kRequestDesktopSiteAdditionsDescription[];
-
 extern const char kRequestDesktopSiteDefaultsName[];
 extern const char kRequestDesktopSiteDefaultsDescription[];
 
@@ -3059,6 +3047,9 @@
 extern const char kImmersiveFullscreenName[];
 extern const char kImmersiveFullscreenDescription[];
 
+extern const char kMacImeLiveConversionFixName[];
+extern const char kMacImeLiveConversionFixDescription[];
+
 extern const char kMacLoopbackAudioForCastName[];
 extern const char kMacLoopbackAudioForCastDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 4531bea..15e95327 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -114,10 +114,8 @@
     &features::kBoardingPassDetector,
     &features::kNetworkServiceInProcess,
     &features::kElasticOverscroll,
-    &features::kPrivacyGuideAndroid,
     &features::kPrivacyGuideAndroid3,
     &features::kPrivacyGuidePreloadAndroid,
-    &features::kPrivacyGuideAndroidPostMVP,
     &features::kPushMessagingDisallowSenderIDs,
     &features::kPwaUpdateDialogForIcon,
     &features::kQuietNotificationPrompts,
@@ -162,7 +160,6 @@
     &kRedirectExplicitCTAIntentsToExistingActivity,
     &kAllowNewIncognitoTabIntents,
     &kAndroidAppIntegration,
-    &kAndroidAppIntegrationSafeSearch,
     &kAndroidHatsRefactor,
     &kAndroidHub,
     &kAndroidSearchEngineChoiceNotification,
@@ -446,10 +443,6 @@
              "AndroidAppIntegration",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-BASE_FEATURE(kAndroidAppIntegrationSafeSearch,
-             "AndroidAppIntegrationSafeSearch",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 BASE_FEATURE(kAndroidHatsRefactor,
              "AndroidHatsRefactor",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index e70ada3..3db3c848 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -23,7 +23,6 @@
 BASE_DECLARE_FEATURE(kAdvancedPeripheralsSupportTabStrip);
 BASE_DECLARE_FEATURE(kAllowNewIncognitoTabIntents);
 BASE_DECLARE_FEATURE(kAndroidAppIntegration);
-BASE_DECLARE_FEATURE(kAndroidAppIntegrationSafeSearch);
 BASE_DECLARE_FEATURE(kAndroidHatsRefactor);
 BASE_DECLARE_FEATURE(kAndroidHub);
 BASE_DECLARE_FEATURE(kAndroidSearchEngineChoiceNotification);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 4d7d4805..49b66d54 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -116,8 +116,6 @@
             "AdvancedPeripheralsSupportTabStrip";
     public static final String ALLOW_NEW_INCOGNITO_TAB_INTENTS = "AllowNewIncognitoTabIntents";
     public static final String ANDROID_APP_INTEGRATION = "AndroidAppIntegration";
-    public static final String ANDROID_APP_INTEGRATION_SAFE_SEARCH =
-            "AndroidAppIntegrationSafeSearch";
     public static final String ANDROID_HATS_REFACTOR = "AndroidHatsRefactor";
     public static final String ANDROID_HUB = "AndroidHub";
     public static final String ANDROID_SEARCH_ENGINE_CHOICE_NOTIFICATION =
@@ -347,10 +345,8 @@
     public static final String PRERENDER2 = "Prerender2";
     public static final String PRECONNECT_ON_TAB_CREATION = "PreconnectOnTabCreation";
     public static final String PRICE_CHANGE_MODULE = "PriceChangeModule";
-    public static final String PRIVACY_GUIDE = "PrivacyGuideAndroid";
     public static final String PRIVACY_GUIDE_ANDROID_3 = "PrivacyGuideAndroid3";
     public static final String PRIVACY_GUIDE_PRELOAD_ANDROID = "PrivacyGuidePreloadAndroid";
-    public static final String PRIVACY_GUIDE_POST_MVP = "PrivacyGuideAndroidPostMVP";
     public static final String PRIVACY_SANDBOX_ADS_NOTICE_CCT = "PrivacySandboxAdsNoticeCCT";
     public static final String PRIVACY_SANDBOX_FPS_UI = "PrivacySandboxFirstPartySetsUI";
     public static final String PRIVACY_SANDBOX_SETTINGS_4 = "PrivacySandboxSettings4";
@@ -557,8 +553,6 @@
             new CachedFlag(PRIVACY_GUIDE_ANDROID_3, false);
     public static final CachedFlag sPrivacyGuidePreloadAndroid =
             new CachedFlag(PRIVACY_GUIDE_PRELOAD_ANDROID, false);
-    public static final CachedFlag sPrivacyGuidePostMVP =
-            new CachedFlag(PRIVACY_GUIDE_POST_MVP, false);
     public static final CachedFlag sQueryTilesInZPSOnNTP =
             new CachedFlag(QUERY_TILES_IN_ZPS_ON_NTP, false);
     public static final CachedFlag sOmniboxMatchToolbarAndStatusBarColor =
@@ -659,7 +653,6 @@
                     sPriceChangeModule,
                     sPrivacyGuideAndroid3,
                     sPrivacyGuidePreloadAndroid,
-                    sPrivacyGuidePostMVP,
                     sQueryTilesInZPSOnNTP,
                     sOmniboxMatchToolbarAndStatusBarColor,
                     sOmniboxModernizeVisualUpdate,
diff --git a/chrome/browser/google/google_update_settings_posix.cc b/chrome/browser/google/google_update_settings_posix.cc
index 52e11a0..88c3894 100644
--- a/chrome/browser/google/google_update_settings_posix.cc
+++ b/chrome/browser/google/google_update_settings_posix.cc
@@ -55,13 +55,12 @@
 }
 
 // static
-bool GoogleUpdateSettings::GetCollectStatsConsent() {
-  base::FilePath consent_file;
-  base::PathService::Get(chrome::DIR_USER_DATA, &consent_file);
-  consent_file = consent_file.Append(kConsentToSendStats);
-
-  if (!base::DirectoryExists(consent_file.DirName()))
+bool GoogleUpdateSettings::GetCollectStatsConsentFromDir(
+    const base::FilePath& consent_dir) {
+  if (!base::DirectoryExists(consent_dir)) {
     return false;
+  }
+  base::FilePath consent_file = consent_dir.Append(kConsentToSendStats);
 
   std::string tmp_guid;
   bool consented = base::ReadFileToString(consent_file, &tmp_guid);
@@ -75,6 +74,13 @@
 }
 
 // static
+bool GoogleUpdateSettings::GetCollectStatsConsent() {
+  base::FilePath consent_dir;
+  base::PathService::Get(chrome::DIR_USER_DATA, &consent_dir);
+  return GetCollectStatsConsentFromDir(consent_dir);
+}
+
+// static
 bool GoogleUpdateSettings::SetCollectStatsConsent(bool consented) {
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   crash_reporter::SetUploadConsent(consented);
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client_browsertest.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client_browsertest.cc
deleted file mode 100644
index 9747f2b..0000000
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client_browsertest.cc
+++ /dev/null
@@ -1,383 +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.
-
-#include "chrome/browser/k_anonymity_service/k_anonymity_service_client.h"
-
-#include "base/json/json_string_value_serializer.h"
-#include "base/run_loop.h"
-#include "base/test/bind.h"
-#include "base/test/values_test_util.h"
-#include "chrome/browser/k_anonymity_service/k_anonymity_service_urls.h"
-#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/common/chrome_features.h"
-#include "chrome/test/base/fake_gaia_mixin.h"
-#include "chrome/test/base/mixin_based_in_process_browser_test.h"
-#include "components/signin/public/identity_manager/account_capabilities_test_mutator.h"
-#include "content/public/browser/k_anonymity_service_delegate.h"
-#include "content/public/test/browser_test.h"
-#include "net/dns/mock_host_resolver.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "net/third_party/quiche/src/quiche/binary_http/binary_http_message.h"
-#include "services/network/public/cpp/features.h"
-#include "services/network/test/oblivious_http_request_test_helper.h"
-#include "services/network/test/trust_token_request_handler.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-using net::test_server::BasicHttpResponse;
-using net::test_server::HttpRequest;
-using net::test_server::HttpResponse;
-
-std::unique_ptr<HttpResponse> MakeTrustTokenFailureResponse() {
-  // No need to report a failure HTTP code here: returning a vanilla OK should
-  // fail the Trust Tokens operation client-side.
-  auto ret = std::make_unique<net::test_server::BasicHttpResponse>();
-  return ret;
-}
-
-// Constructs and returns an HTTP response bearing the given base64-encoded
-// Trust Tokens issuance or redemption protocol response message.
-std::unique_ptr<net::test_server::HttpResponse> MakeTrustTokenResponse(
-    std::string_view contents) {
-  CHECK([&]() {
-    std::string temp;
-    return base::Base64Decode(contents, &temp);
-  }());
-
-  auto ret = std::make_unique<net::test_server::BasicHttpResponse>();
-  ret->AddCustomHeader("Sec-Private-State-Token", std::string(contents));
-  return ret;
-}
-
-void OnCreateBrowserContextServices(content::BrowserContext* context) {
-  // Sets all required testing factories to have control over identity
-  // environment during test. Effectively, this substitutes the real identity
-  // environment with identity test environment, taking care to fulfill all
-  // required dependencies.
-  IdentityTestEnvironmentProfileAdaptor::
-      SetIdentityTestEnvironmentFactoriesOnBrowserContext(context);
-}
-
-// Uses an embedded test server to act like a fake K-anonymity service for all
-// of the endpoints.
-class TestKAnonymityServiceMixin : public InProcessBrowserTestMixin {
- public:
-  explicit TestKAnonymityServiceMixin(InProcessBrowserTestMixinHost* host)
-      : InProcessBrowserTestMixin(host) {}
-  TestKAnonymityServiceMixin(const TestKAnonymityServiceMixin&) = delete;
-  TestKAnonymityServiceMixin& operator=(const TestKAnonymityServiceMixin&) =
-      delete;
-  ~TestKAnonymityServiceMixin() override = default;
-
-  void SetUp() override {
-    https_server_ = std::make_unique<net::test_server::EmbeddedTestServer>(
-        net::test_server::EmbeddedTestServer::TYPE_HTTPS);
-
-    https_server_->RegisterRequestHandler(base::BindRepeating(
-        &TestKAnonymityServiceMixin::HandleRequest, base::Unretained(this)));
-    ASSERT_TRUE((https_server_handle_ = https_server_->StartAndReturnHandle()));
-
-    GURL ohttp_relay = https_server_->GetURL("/ohttpRelay");
-
-    feature_list_.InitWithFeaturesAndParameters(
-        /*enabled_features=*/{{network::features::kPrivateStateTokens, {}},
-                              {features::kKAnonymityService,
-                               {{"KAnonymityServiceAuthServer",
-                                 https_server_->base_url().spec()},
-                                {"KAnonymityServiceJoinServer",
-                                 https_server_->base_url().spec()},
-                                {"KAnonymityServiceJoinRelayServer",
-                                 ohttp_relay.spec()},
-                                {"KAnonymityServiceQueryServer",
-                                 https_server_->base_url().spec()},
-                                {"KAnonymityServiceQueryRelayServer",
-                                 ohttp_relay.spec()}}}},
-        /*disabled_features=*/{});
-  }
-
-  std::unique_ptr<HttpResponse> HandleGenerateShortIdentifierRequest(
-      const HttpRequest& request) {
-    auto http_response = std::make_unique<BasicHttpResponse>();
-    if (!base::Contains(request.headers, "Authorization")) {
-      http_response->set_code(net::HTTP_UNAUTHORIZED);
-      ADD_FAILURE() << "Missing authorization in Short Identifier request.";
-      return http_response;
-    }
-    http_response->set_code(net::HTTP_OK);
-    http_response->set_content("{\"shortClientIdentifier\": 1}");
-    http_response->set_content_type("application/json");
-    return http_response;
-  }
-
-  std::unique_ptr<HttpResponse> HandleTrustTokenKeyRequest(
-      const HttpRequest& request) {
-    std::string commitment_in = trust_token_handler_.GetKeyCommitmentRecord();
-    // Parse and reformat JSON for the key commitment.
-
-    base::Value::Dict commitment_in_dict =
-        base::test::ParseJsonDict(commitment_in);
-
-    // Commitments are keyed by protocol version, and we don't care which
-    // version we get, so just take the first one.
-    base::Value::Dict* commitment_type_in_dict =
-        commitment_in_dict.begin()->second.GetIfDict();
-    base::Value::Dict commitment_out_dict;
-    commitment_out_dict.Set(
-        "protocolVersion",
-        *commitment_type_in_dict->FindString("protocol_version"));
-    commitment_out_dict.Set("id", *commitment_type_in_dict->FindInt("id"));
-    commitment_out_dict.Set("batchSize",
-                            *commitment_type_in_dict->FindInt("batchsize"));
-
-    base::Value::List keys_out;
-    base::Value::Dict* commitment_keys_in_dict =
-        commitment_type_in_dict->FindDict("keys");
-    for (auto idx : *commitment_keys_in_dict) {
-      base::Value::Dict* idx_dict = idx.second.GetIfDict();
-      base::Value::Dict key_out;
-      int identifier = 0;
-      CHECK(base::StringToInt(idx.first, &identifier));
-      key_out.Set("keyIdentifier", identifier);
-      key_out.Set("keyMaterial", *idx_dict->FindString("Y"));
-      key_out.Set("expirationTimestampUsec", *idx_dict->FindString("expiry"));
-      keys_out.Append(base::Value(std::move(key_out)));
-    }
-    commitment_out_dict.Set("keys", base::Value(std::move(keys_out)));
-
-    std::string commitment_out;
-    JSONStringValueSerializer serializer(&commitment_out);
-    serializer.Serialize(base::Value(std::move(commitment_out_dict)));
-    auto http_response = std::make_unique<BasicHttpResponse>();
-    http_response->set_code(net::HTTP_OK);
-    http_response->set_content(commitment_out);
-    http_response->set_content_type("application/json");
-    return http_response;
-  }
-
-  std::unique_ptr<HttpResponse> HandleIssueRequest(const HttpRequest& request) {
-    if (!base::Contains(request.headers, "Authorization") ||
-        !base::Contains(request.headers, "Sec-Private-State-Token") ||
-        !base::Contains(request.headers,
-                        "Sec-Private-State-Token-Crypto-Version")) {
-      ADD_FAILURE()
-          << "Trust token issue request missing required headers. Got: "
-          << request.all_headers;
-      return MakeTrustTokenFailureResponse();
-    }
-    absl::optional<std::string> operation_result = trust_token_handler_.Issue(
-        request.headers.at("Sec-Private-State-Token"));
-    if (!operation_result) {
-      ADD_FAILURE() << "Trust token issue request operation failed.";
-      return MakeTrustTokenFailureResponse();
-    }
-
-    return MakeTrustTokenResponse(*operation_result);
-  }
-
-  std::unique_ptr<HttpResponse> HandleOHttpKeyRequest(
-      const HttpRequest& request) {
-    auto http_response = std::make_unique<BasicHttpResponse>();
-    http_response->set_code(net::HTTP_OK);
-    http_response->set_content(ohttp_request_handler_.GetPublicKeyConfigs());
-    http_response->set_content_type("application/ohttp-keys");
-    return http_response;
-  }
-
-  quiche::BinaryHttpResponse HandleBhttpQueryRequest(
-      const quiche::BinaryHttpRequest& request) {
-    quiche::BinaryHttpResponse response(net::HTTP_OK);
-    // Request looks like this:
-    // { setsForType: [
-    //  { type: "t1", hashes: ["a", "b", "c"]},
-    //  { type: "t1", hashes: ["d', "e", "f", "f", "c"]},
-    //  { type: "t2"}
-    // ]}
-
-    // Response has the form:
-    // { kAnonymousSets: [
-    //  { type: "t1", hashes: ["c", "f"]}
-    // ]}
-
-    // As a hack we can just replace "setsForType" with "kAnonymousSets".
-    std::string response_body = std::string(request.body());
-    base::ReplaceSubstringsAfterOffset(&response_body, 0, "setsForType",
-                                       "kAnonymousSets");
-    response.AddHeaderField({"Content-Type", "application/json"});
-    response.set_body(response_body);
-
-    return response;
-  }
-
-  quiche::BinaryHttpResponse HandleBhttpJoinRequest(
-      const quiche::BinaryHttpRequest& request) {
-    quiche::BinaryHttpResponse response(net::HTTP_OK);
-
-    std::string path = request.control_data().path;
-    absl::optional<std::string> redemption_result;
-    for (const auto& header : request.GetHeaderFields()) {
-      if (base::EqualsCaseInsensitiveASCII(header.name,
-                                           "Sec-Private-State-Token")) {
-        redemption_result = trust_token_handler_.Redeem(header.value);
-        break;
-      }
-    }
-    if (redemption_result) {
-      response.AddHeaderField({"Sec-Private-State-Token", *redemption_result});
-    }
-
-    {
-      base::AutoLock lock(mutex_);
-      join_called_ = true;
-    }
-
-    response.AddHeaderField({"Content-Type", "application/json"});
-    response.set_body("{}");
-
-    return response;
-  }
-
-  std::unique_ptr<HttpResponse> HandleOhttpRelayRequest(
-      const HttpRequest& request) {
-    auto http_response = std::make_unique<BasicHttpResponse>();
-    http_response->set_code(net::HTTP_OK);
-    http_response->set_content_type("message/ohttp-response");
-
-    std::pair<std::string, quiche::ObliviousHttpRequest::Context>
-        plaintext_request =
-            ohttp_request_handler_.DecryptRequest(request.content);
-    quiche::BinaryHttpRequest bhttp_request =
-        quiche::BinaryHttpRequest::Create(plaintext_request.first).value();
-    std::string path = bhttp_request.control_data().path;
-
-    absl::optional<quiche::BinaryHttpResponse> response;
-    if (path.starts_with("/v1:query?key=")) {
-      response.emplace(HandleBhttpQueryRequest(bhttp_request));
-    } else if (path.starts_with("/v1/types/fledge/sets/")) {
-      response.emplace(HandleBhttpJoinRequest(bhttp_request));
-    }
-    CHECK(response) << path;
-    http_response->set_content(ohttp_request_handler_.EncryptResponse(
-        response->Serialize().value(), /*context=*/plaintext_request.second));
-
-    return http_response;
-  }
-
-  std::unique_ptr<HttpResponse> HandleRequest(const HttpRequest& request) {
-    // Handle all of the URLs in k_anonymity_service_urls.h
-    GURL absolute_url = https_server_->GetURL(request.relative_url);
-    std::string path = absolute_url.path();
-    if (path == "/v1/generateShortIdentifier") {
-      return HandleGenerateShortIdentifierRequest(request);
-    } else if (path.starts_with("/v1/1/fetchKeys")) {
-      return HandleTrustTokenKeyRequest(request);
-    } else if (path.starts_with("/v1/1/issueTrustToken")) {
-      return HandleIssueRequest(request);
-    } else if (path.starts_with("/v1/proxy/keys")) {
-      return HandleOHttpKeyRequest(request);
-    } else if (path.starts_with("/ohttpRelay")) {
-      return HandleOhttpRelayRequest(request);
-    } else {
-      return nullptr;
-    }
-  }
-
-  bool JoinWasCalled() const {
-    base::AutoLock lock(mutex_);
-    return join_called_;
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-
-  network::test::TrustTokenRequestHandler trust_token_handler_;
-  network::test::ObliviousHttpRequestTestHelper ohttp_request_handler_;
-
-  std::unique_ptr<net::test_server::EmbeddedTestServer> https_server_;
-
-  mutable base::Lock mutex_;
-  bool join_called_ GUARDED_BY(mutex_);
-
-  // This handle needs to be last since it will shutdown the server when its
-  // destructor runs. That prevents any of the handlers (which execute on a
-  // separate thread) from accessing internal state that has been destroyed.
-  net::test_server::EmbeddedTestServerHandle https_server_handle_;
-};
-
-class KAnonymityServiceClientBrowserTest
-    : public MixinBasedInProcessBrowserTest {
- public:
-  void SetUpInProcessBrowserTestFixture() override {
-    subscription_ =
-        BrowserContextDependencyManager::GetInstance()
-            ->RegisterCreateServicesCallbackForTesting(
-                base::BindRepeating(&OnCreateBrowserContextServices));
-  }
-
-  void SetUpOnMainThread() override {
-    // Set up all of the Profile, signin, and identity.
-    adaptor_ = std::make_unique<IdentityTestEnvironmentProfileAdaptor>(
-        browser()->profile());
-    fake_gaia_.SetupFakeGaiaForLogin(FakeGaiaMixin::kFakeUserEmail,
-                                     FakeGaiaMixin::kFakeUserGaiaId,
-                                     FakeGaiaMixin::kFakeRefreshToken);
-
-    signin::IdentityTestEnvironment* identity_env =
-        adaptor_->identity_test_env();
-    AccountInfo account_info =
-        identity_env->MakeAccountAvailable(FakeGaiaMixin::kFakeUserEmail);
-
-    AccountCapabilitiesTestMutator mutator(&account_info.capabilities);
-    mutator.set_can_run_chrome_privacy_sandbox_trials(true);
-    identity_env->UpdateAccountInfoForAccount(account_info);
-
-    identity_env->SetPrimaryAccount(FakeGaiaMixin::kFakeUserEmail,
-                                    signin::ConsentLevel::kSignin);
-    identity_env->SetRefreshTokenForPrimaryAccount();
-    identity_env->SetAutomaticIssueOfAccessTokens(true);
-
-    host_resolver()->AddRule("accounts.google.com", "127.0.0.1");
-
-    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
-  }
-
- protected:
-  TestKAnonymityServiceMixin k_anon_service_{&mixin_host_};
-  FakeGaiaMixin fake_gaia_{&mixin_host_};
-
-  std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> adaptor_;
-  base::CallbackListSubscription subscription_;
-};
-
-IN_PROC_BROWSER_TEST_F(KAnonymityServiceClientBrowserTest, TestJoin) {
-  Profile* profile = browser()->profile();
-  content::KAnonymityServiceDelegate* delegate =
-      profile->GetKAnonymityServiceDelegate();
-  ASSERT_TRUE(delegate);
-  base::RunLoop run_loop;
-  delegate->JoinSet("asdf", base::BindLambdaForTesting([&](bool result) {
-                      EXPECT_TRUE(result);
-                      run_loop.Quit();
-                    }));
-  run_loop.Run();
-}
-
-IN_PROC_BROWSER_TEST_F(KAnonymityServiceClientBrowserTest, TestQuery) {
-  Profile* profile = browser()->profile();
-  content::KAnonymityServiceDelegate* delegate =
-      profile->GetKAnonymityServiceDelegate();
-  ASSERT_TRUE(delegate);
-  base::RunLoop run_loop;
-
-  std::vector<std::string> set_ids = {"foo", "bar", "baz"};
-  delegate->QuerySets(
-      set_ids, base::BindLambdaForTesting([&](std::vector<bool> results) {
-        EXPECT_THAT(results, testing::ElementsAre(true, true, true));
-        run_loop.Quit();
-      }));
-  run_loop.Run();
-}
-
-}  // namespace
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
index 4a83f1cc..ec90ad0 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
@@ -20,12 +20,16 @@
 
 namespace {
 ProfileSelections BuildKAnonymityServiceProfileSelections() {
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   if (!base::FeatureList::IsEnabled(features::kKAnonymityService))
     return ProfileSelections::BuildNoProfilesSelected();
   return ProfileSelections::Builder()
       .WithRegular(ProfileSelection::kOwnInstance)
       .WithGuest(ProfileSelection::kOwnInstance)
       .Build();
+#else
+  return ProfileSelections::BuildNoProfilesSelected();
+#endif
 }
 
 }  // namespace
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
index 761259b9..139d318 100644
--- a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
@@ -148,16 +148,6 @@
     ChangeMetricsReportingStateCalledFrom called_from) {
   bool enable_metrics = ash::StatsReportingController::Get()->IsEnabled();
   ChangeMetricsReportingState(enable_metrics, called_from);
-
-  // TODO(crbug.com/1234538): This call ensures that structured metrics' state
-  // is deleted when the reporting state is disabled. Long-term this should
-  // happen via a call to all MetricsProviders eg. OnClientStateCleared. This is
-  // temporarily called here because it is close to the settings UI, and doesn't
-  // greatly affect the logging in crbug.com/1227585.
-  auto* recorder = metrics::structured::Recorder::GetInstance();
-  if (recorder) {
-    recorder->OnReportingStateChanged(enable_metrics);
-  }
 }
 #endif
 
diff --git a/chrome/browser/metrics/structured/test/structured_metrics_mixin.cc b/chrome/browser/metrics/structured/test/structured_metrics_mixin.cc
index 8f68d0d4..5598f05 100644
--- a/chrome/browser/metrics/structured/test/structured_metrics_mixin.cc
+++ b/chrome/browser/metrics/structured/test/structured_metrics_mixin.cc
@@ -113,9 +113,6 @@
     uint64_t project_name_hash,
     uint64_t event_name_hash) {
   std::vector<StructuredEventProto> events_vector;
-  if (!GetRecorder()->CanProvideMetrics()) {
-    return events_vector;
-  }
 
   const EventsProto& events = *GetEventStorage()->events();
   for (const auto& event : events.non_uma_events()) {
diff --git a/chrome/browser/metrics/structured_metrics_service_chromeos_browsertest.cc b/chrome/browser/metrics/structured_metrics_service_chromeos_browsertest.cc
index 7c25b1b8..a9cfc52f 100644
--- a/chrome/browser/metrics/structured_metrics_service_chromeos_browsertest.cc
+++ b/chrome/browser/metrics/structured_metrics_service_chromeos_browsertest.cc
@@ -39,12 +39,18 @@
 // The name hash of "TestProjectFive".
 constexpr uint64_t kProjectFiveHash = UINT64_C(3960582687892677139);
 
+// The name hash of "TestProjectSeven".
+constexpr uint64_t kProjectSevenHash = UINT64_C(10319251808101486833);
+
 // The name hash of "chrome::TestProjectOne::TestEventOne".
 constexpr uint64_t kEventOneHash = UINT64_C(13593049295042080097);
 
 // The name hash of "chrome::TestProjectFive::TestEventSix".
 constexpr uint64_t kEventSixHash = UINT64_C(2873337042686447043);
 
+// The name hash of "chrome::TestProjectSeven::TestEventEight".
+constexpr uint64_t kEventEightHash = UINT64_C(16290206418240617738);
+
 structured::StructuredMetricsService* GetSMService() {
   return g_browser_process->GetMetricsServicesManager()
       ->GetStructuredMetricsService();
@@ -306,4 +312,26 @@
   EXPECT_THAT(sm_service->scheduler_.get(), testing::IsNull());
 }
 
+IN_PROC_BROWSER_TEST_F(TestStructuredMetricsService, PurgeForceRecordedEvents) {
+  // This feature is intended only for events that are recorded before user
+  // consent.
+  auto* sm_service = GetSMService();
+  // Simulates an initial state of disabled metrics.
+  structured_metrics_mixin_.UpdateRecordingState(false);
+  WaitForConsentChanges();
+
+  structured::events::v2::test_project_seven::TestEventEight().Record();
+
+  structured_metrics_mixin_.WaitUntilEventRecorded(kProjectSevenHash,
+                                                   kEventEightHash);
+
+  // Confirms the disabled metrics when consent is not given.
+  structured_metrics_mixin_.UpdateRecordingState(false);
+  WaitForConsentChanges();
+
+  EXPECT_FALSE(HasUnsentLogs());
+  EXPECT_FALSE(HasStagedLog());
+  EXPECT_EQ(sm_service->recorder()->event_storage()->RecordedEventsCount(), 0);
+}
+
 }  // namespace metrics
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index 39bbfeb..5d68d45d 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -1223,10 +1223,10 @@
   // Create server predictions.
   autofill::AutofillType::ServerPrediction username_prediction;
   username_prediction.server_predictions = {
-      CreateFieldPrediction(autofill::ServerFieldType::USERNAME)};
+      CreateFieldPrediction(autofill::FieldType::USERNAME)};
   autofill::AutofillType::ServerPrediction password_prediction;
   password_prediction.server_predictions = {
-      CreateFieldPrediction(autofill::ServerFieldType::PASSWORD)};
+      CreateFieldPrediction(autofill::FieldType::PASSWORD)};
 
   // Navigate to the page
   NavigateToFile("/password/nonplaceholder_username.html");
@@ -1283,13 +1283,11 @@
   // Create server predictions.
   autofill::AutofillType::ServerPrediction username_prediction;
   username_prediction.server_predictions = {
-      autofill::test::CreateFieldPrediction(
-          autofill::ServerFieldType::USERNAME)};
+      autofill::test::CreateFieldPrediction(autofill::FieldType::USERNAME)};
   username_prediction.may_use_prefilled_placeholder = true;
   autofill::AutofillType::ServerPrediction password_prediction;
   password_prediction.server_predictions = {
-      autofill::test::CreateFieldPrediction(
-          autofill::ServerFieldType::PASSWORD)};
+      autofill::test::CreateFieldPrediction(autofill::FieldType::PASSWORD)};
 
   // Navigate to the page
   NavigateToFile("/password/nonplaceholder_username.html");
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc
index d26d27f..297e37c 100644
--- a/chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc
+++ b/chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc
@@ -449,16 +449,6 @@
 }
 #endif  // !BUILDFLAG(IS_ANDROID)
 
-std::vector<url::Origin>
-PictureInPictureWindowManager::GetActiveSessionOrigins() {
-  std::vector<url::Origin> active_origins;
-  if (pip_window_controller_ &&
-      pip_window_controller_->GetOrigin().has_value()) {
-    active_origins.push_back(pip_window_controller_->GetOrigin().value());
-  }
-  return active_origins;
-}
-
 #if !BUILDFLAG(IS_ANDROID)
 void PictureInPictureWindowManager::CreateAutoPipSettingHelperIfNeeded() {
   // Because we have to defer creating this until after the tab helper finds out
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_manager.h b/chrome/browser/picture_in_picture/picture_in_picture_window_manager.h
index ff1ccc4..5b3deb74d 100644
--- a/chrome/browser/picture_in_picture/picture_in_picture_window_manager.h
+++ b/chrome/browser/picture_in_picture/picture_in_picture_window_manager.h
@@ -6,7 +6,6 @@
 #define CHROME_BROWSER_PICTURE_IN_PICTURE_PICTURE_IN_PICTURE_WINDOW_MANAGER_H_
 
 #include <functional>
-#include <vector>
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/singleton.h"
@@ -17,7 +16,6 @@
 #include "third_party/blink/public/mojom/picture_in_picture_window_options/picture_in_picture_window_options.mojom.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/views/bubble/bubble_border.h"
-#include "url/origin.h"
 
 #if !BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/picture_in_picture/auto_pip_setting_overlay_view.h"
@@ -192,14 +190,6 @@
   PictureInPictureOcclusionTracker* GetOcclusionTracker();
 #endif
 
-  // Get the origins for initiators of active Picture-in-Picture sessions.
-  // Always returns an empty vector for Document Picture-in-Picture sessions.
-  // For Video picture-in-picture sessions, the maximum size of the vector
-  // will be 1, because only one window can be present per Chrome instances.
-  // See spec for detailed information:
-  // https://www.w3.org/TR/picture-in-picture/#defines
-  std::vector<url::Origin> GetActiveSessionOrigins();
-
   void set_window_controller_for_testing(
       content::PictureInPictureWindowController* controller) {
     pip_window_controller_ = controller;
diff --git a/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc
index 1c71ba8..b1f5d46 100644
--- a/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc
+++ b/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc
@@ -1259,7 +1259,6 @@
       .WillOnce(testing::Return(nullptr));
   EXPECT_CALL(mock_controller(), Show());
   pip_window_manager->EnterPictureInPictureWithController(&mock_controller());
-  EXPECT_TRUE(pip_window_manager->GetActiveSessionOrigins().empty());
 
   // Now show the WebContents based Picture-in-Picture window controller.
   // This should close the existing window and show the new one.
@@ -1267,14 +1266,6 @@
   LoadTabAndEnterPictureInPicture(
       browser(), base::FilePath(kPictureInPictureWindowSizePage));
 
-  ASSERT_EQ(pip_window_manager->GetActiveSessionOrigins().size(), 1u);
-  const GURL& url = browser()
-                        ->tab_strip_model()
-                        ->GetActiveWebContents()
-                        ->GetLastCommittedURL();
-  EXPECT_TRUE(
-      pip_window_manager->GetActiveSessionOrigins()[0].IsSameOriginWith(url));
-
   ASSERT_TRUE(GetOverlayWindow());
   EXPECT_TRUE(GetOverlayWindow()->IsVisible());
 }
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 207f74c..20b350c 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -951,6 +951,13 @@
 const char kTemplatesRandomOrder[] = "content_creation.notes.random_order";
 #endif
 
+// Deprecated 12/2023.
+#if BUILDFLAG(IS_ANDROID)
+const char kDesktopSitePeripheralSettingEnabled[] =
+    "desktop_site.peripheral_setting";
+const char kDesktopSiteDisplaySettingEnabled[] = "desktop_site.display_setting";
+#endif
+
 // Register local state used only for migration (clearing or moving to a new
 // key).
 void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {
@@ -1334,6 +1341,12 @@
 #if BUILDFLAG(IS_ANDROID)
   registry->RegisterListPref(kTemplatesRandomOrder);
 #endif
+
+// Deprecated 12/2023.
+#if BUILDFLAG(IS_ANDROID)
+  registry->RegisterBooleanPref(kDesktopSitePeripheralSettingEnabled, false);
+  registry->RegisterBooleanPref(kDesktopSiteDisplaySettingEnabled, false);
+#endif
 }
 
 void ClearSyncRequestedPrefAndMaybeMigrate(PrefService* profile_prefs) {
@@ -2547,6 +2560,12 @@
   profile_prefs->ClearPref(kTemplatesRandomOrder);
 #endif
 
+#if BUILDFLAG(IS_ANDROID)
+  // Added 12/2023.
+  profile_prefs->ClearPref(kDesktopSitePeripheralSettingEnabled);
+  profile_prefs->ClearPref(kDesktopSiteDisplaySettingEnabled);
+#endif
+
   // Please don't delete the following line. It is used by PRESUBMIT.py.
   // END_MIGRATE_OBSOLETE_PROFILE_PREFS
 
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragment.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragment.java
index 3f97d6c..a433902 100644
--- a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragment.java
+++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragment.java
@@ -112,7 +112,6 @@
     private ButtonCompat mDoneButton;
     private PrivacyGuideMetricsDelegate mPrivacyGuideMetricsDelegate;
     private NavbarVisibilityDelegate mNavbarVisibilityDelegate;
-    private boolean mEnablePostMVPFixes;
     private Profile mProfile;
 
     @Override
@@ -124,7 +123,6 @@
             mPrivacyGuideMetricsDelegate.restoreState(savedInstanceState);
         }
         mHandleBackPressChangedSupplier = new ObservableSupplierImpl<>();
-        mEnablePostMVPFixes = ChromeFeatureList.sPrivacyGuidePostMVP.isEnabled();
     }
 
     @Nullable
@@ -146,9 +144,7 @@
                                 : ALL_FRAGMENT_TYPE_ORDER);
         mNavbarVisibilityDelegate = new NavbarVisibilityDelegate(mPagerAdapter.getItemCount());
         mViewPager.setAdapter(mPagerAdapter);
-        if (ChromeFeatureList.sPrivacyGuidePostMVP.isEnabled()) {
-            mViewPager.setPageTransformer(new PrivacyGuidePageTransformer());
-        }
+        mViewPager.setPageTransformer(new PrivacyGuidePageTransformer());
         mViewPager.setUserInputEnabled(false);
 
         mTabLayout = mView.findViewById(R.id.tab_layout);
@@ -326,7 +322,7 @@
     }
 
     private boolean shouldHandleBackPress() {
-        return mEnablePostMVPFixes && mViewPager.getCurrentItem() > 0;
+        return mViewPager.getCurrentItem() > 0;
     }
 
     public void setBottomSheetControllerSupplier(
diff --git a/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java b/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java
index 0b654f0e..be11b76 100644
--- a/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java
+++ b/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java
@@ -483,7 +483,6 @@
     @Test
     @LargeTest
     @Feature({"PrivacyGuide"})
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
     public void testForwardNavAllActions() {
         setMSBBState(false);
         setHistorySyncState(false);
@@ -521,7 +520,6 @@
     @LargeTest
     @Feature({"PrivacyGuide"})
     @EnableFeatures({
-        ChromeFeatureList.PRIVACY_GUIDE_POST_MVP,
         ChromeFeatureList.PRIVACY_GUIDE_ANDROID_3,
         ChromeFeatureList.PRIVACY_GUIDE_PRELOAD_ANDROID
     })
@@ -573,7 +571,6 @@
     @Test
     @LargeTest
     @Feature({"PrivacyGuide"})
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
     public void testBackwardNavAllActions() {
         setMSBBState(false);
         setHistorySyncState(false);
@@ -613,7 +610,6 @@
     @LargeTest
     @Feature({"PrivacyGuide"})
     @EnableFeatures({
-        ChromeFeatureList.PRIVACY_GUIDE_POST_MVP,
         ChromeFeatureList.PRIVACY_GUIDE_ANDROID_3,
         ChromeFeatureList.PRIVACY_GUIDE_PRELOAD_ANDROID
     })
@@ -1277,7 +1273,6 @@
     @LargeTest
     @Feature({"PrivacyGuide"})
     @DisableFeatures(ChromeFeatureList.FRIENDLIER_SAFE_BROWSING_SETTINGS_ENHANCED_PROTECTION)
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
     public void testSafeBrowsingCard_enhancedBottomSheetBackButtonBehaviour() {
         launchPrivacyGuide();
         goToCard(FragmentType.SAFE_BROWSING);
@@ -1294,7 +1289,6 @@
     @LargeTest
     @Feature({"PrivacyGuide"})
     @EnableFeatures({
-        ChromeFeatureList.PRIVACY_GUIDE_POST_MVP,
         ChromeFeatureList.FRIENDLIER_SAFE_BROWSING_SETTINGS_ENHANCED_PROTECTION
     })
     public void testSafeBrowsingCard_enhancedFriendlierBottomSheetBackButtonBehaviour() {
@@ -1312,7 +1306,6 @@
     @Test
     @LargeTest
     @Feature({"PrivacyGuide"})
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
     public void testSafeBrowsingCard_standardBottomSheetBackButtonBehaviour() {
         launchPrivacyGuide();
         goToCard(FragmentType.SAFE_BROWSING);
@@ -1724,7 +1717,6 @@
     @LargeTest
     @Feature({"PrivacyGuide"})
     @EnableFeatures({
-        ChromeFeatureList.PRIVACY_GUIDE_POST_MVP,
         ChromeFeatureList.PRIVACY_GUIDE_ANDROID_3,
         ChromeFeatureList.PRIVACY_GUIDE_PRELOAD_ANDROID
     })
@@ -1764,81 +1756,4 @@
         clickOnArrowNextToRadioButtonWithText(R.string.privacy_guide_safe_browsing_enhanced_title);
         onViewWaiting(withId(R.id.sb_enhanced_sheet_updated)).check(matches(isDisplayed()));
     }
-
-    @Test
-    @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
-    @DisableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
-    public void testExitOnBackInWelcomeCard() {
-        launchPrivacySettingsAndOpenPrivacyGuide();
-
-        // Exit the guide when pressing back.
-        pressBack();
-        onView(withText(R.string.privacy_guide_pref_summary)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
-    @DisableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
-    public void testExitOnBackInMSBBCard() {
-        launchPrivacySettingsAndOpenPrivacyGuide();
-        goToCard(FragmentType.MSBB);
-
-        // Exit the guide when pressing back.
-        pressBack();
-        onView(withText(R.string.privacy_guide_pref_summary)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
-    @DisableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
-    public void testExitOnBackInHistorySyncCard() {
-        launchPrivacySettingsAndOpenPrivacyGuide();
-        goToCard(FragmentType.HISTORY_SYNC);
-
-        // Exit the guide when pressing back.
-        pressBack();
-        onView(withText(R.string.privacy_guide_pref_summary)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
-    @DisableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
-    public void testExitOnBackInSBCard() {
-        launchPrivacySettingsAndOpenPrivacyGuide();
-        goToCard(FragmentType.SAFE_BROWSING);
-
-        // Exit the guide when pressing back.
-        pressBack();
-        onView(withText(R.string.privacy_guide_pref_summary)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
-    @DisableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
-    public void testExitOnBackInCookiesCard() {
-        launchPrivacySettingsAndOpenPrivacyGuide();
-        goToCard(FragmentType.COOKIES);
-
-        // Exit the guide when pressing back.
-        pressBack();
-        onView(withText(R.string.privacy_guide_pref_summary)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    @LargeTest
-    @EnableFeatures(ChromeFeatureList.PRIVACY_GUIDE)
-    @DisableFeatures(ChromeFeatureList.PRIVACY_GUIDE_POST_MVP)
-    public void testExitOnBackInCompletionCard() {
-        launchPrivacySettingsAndOpenPrivacyGuide();
-        goToCard(FragmentType.DONE);
-
-        // Exit the guide when pressing back.
-        pressBack();
-        onView(withText(R.string.privacy_guide_pref_summary)).check(matches(isDisplayed()));
-    }
 }
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
index 22af958..53b8708 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -40,12 +40,10 @@
   // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.privacy_sandbox
   enum class PromptType {
     kNone = 0,
-    kNotice = 1,
-    kConsent = 2,
-    kM1Consent = 3,
-    kM1NoticeROW = 4,
-    kM1NoticeEEA = 5,
-    kM1NoticeRestricted = 6,
+    kM1Consent = 1,
+    kM1NoticeROW = 2,
+    kM1NoticeEEA = 3,
+    kM1NoticeRestricted = 4,
     kMaxValue = kM1NoticeRestricted,
   };
 
diff --git a/chrome/browser/profiles/profile_destroyer.cc b/chrome/browser/profiles/profile_destroyer.cc
index 3efe5a1..55abc00 100644
--- a/chrome/browser/profiles/profile_destroyer.cc
+++ b/chrome/browser/profiles/profile_destroyer.cc
@@ -409,8 +409,9 @@
       continue;
 
     // Ignore the spare RenderProcessHost.
-    if (render_process_host->HostHasNotBeenUsed() && !include_spare_rph)
+    if (render_process_host->IsSpare() && !include_spare_rph) {
       continue;
+    }
 
     TRACE_EVENT(
         "shutdown", "ProfileDestroyer::GetHostsForProfile",
diff --git a/chrome/browser/profiles/profile_keyed_service_browsertest.cc b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
index 15236ae..d3c861c 100644
--- a/chrome/browser/profiles/profile_keyed_service_browsertest.cc
+++ b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
@@ -211,9 +211,8 @@
                                   /*expected_active_services_names=*/{});
 }
 
-// TODO(http://crbug.com/1506961): Fix and re-enable.
 IN_PROC_BROWSER_TEST_F(ProfileKeyedServiceBrowserTest,
-                       DISABLED_GuestProfileOTR_NeededServices) {
+                       GuestProfileOTR_NeededServices) {
   // clang-format off
   std::set<std::string> guest_otr_active_services {
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -301,9 +300,8 @@
   TestKeyedProfileServicesActives(guest_profile_otr, guest_otr_active_services);
 }
 
-// TODO(http://crbug.com/1506961): Fix and re-enable.
 IN_PROC_BROWSER_TEST_F(ProfileKeyedServiceBrowserTest,
-                       DISABLED_GuestProfileParent_NeededServices) {
+                       GuestProfileParent_NeededServices) {
   // clang-format off
   std::set<std::string> guest_active_services {
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 94aad10..3601f3b 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -3381,23 +3381,7 @@
 
 #if BUILDFLAG(ENABLE_COMPOSE)
     case IDC_CONTEXT_COMPOSE: {
-      auto* client = GetChromeComposeClient();
-      compose::ComposeManager* compose_manager =
-          client ? &client->GetManager() : nullptr;
-      RenderFrameHost* render_frame_host = GetRenderFrameHost();
-      if (compose_manager && render_frame_host) {
-        auto* content_autofill_driver =
-            autofill::ContentAutofillDriver::GetForRenderFrameHost(
-                render_frame_host);
-        if (content_autofill_driver) {
-          compose_manager->OpenCompose(
-              *content_autofill_driver,
-              autofill::FormRendererId(params_.form_renderer_id),
-              autofill::FieldRendererId(params_.field_renderer_id),
-              compose::ComposeManagerImpl::UiEntryPoint::kContextMenu);
-          new_badge_tracker_.ActionPerformed("compose_menu_item_activated");
-        }
-      }
+      ExecOpenCompose();
       break;
     }
 #endif  // BUILDFLAG(ENABLE_COMPOSE)
@@ -3935,6 +3919,31 @@
       base::BindRepeating(OnBrowserCreated, params_.link_url));
 }
 
+#if BUILDFLAG(ENABLE_COMPOSE)
+void RenderViewContextMenu::ExecOpenCompose() {
+  ChromeComposeClient* client = GetChromeComposeClient();
+  if (!client) {
+    return;
+  }
+  RenderFrameHost* render_frame_host = GetRenderFrameHost();
+  if (!render_frame_host) {
+    return;
+  }
+  if (auto* driver = autofill::ContentAutofillDriver::GetForRenderFrameHost(
+          render_frame_host)) {
+    autofill::LocalFrameToken frame_token = driver->GetFrameToken();
+    client->GetManager().OpenCompose(
+        *driver,
+        autofill::FormGlobalId(
+            frame_token, autofill::FormRendererId(params_.form_renderer_id)),
+        autofill::FieldGlobalId(
+            frame_token, autofill::FieldRendererId(params_.field_renderer_id)),
+        compose::ComposeManagerImpl::UiEntryPoint::kContextMenu);
+    new_badge_tracker_.ActionPerformed("compose_menu_item_activated");
+  }
+}
+#endif
+
 void RenderViewContextMenu::ExecOpenInReadAnything() {
   Browser* browser = GetBrowser();
   if (!browser) {
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.h b/chrome/browser/renderer_context_menu/render_view_context_menu.h
index 450dcac..81c7d37 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.h
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.h
@@ -395,6 +395,9 @@
   void ExecLanguageSettings(int event_flags);
   void ExecProtocolHandlerSettings(int event_flags);
   void ExecPictureInPicture();
+#if BUILDFLAG(ENABLE_COMPOSE)
+  void ExecOpenCompose();
+#endif
   void ExecOpenInReadAnything();
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
   void ExecRunLayoutExtraction();
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.html b/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.html
index d590a8d..51675580 100644
--- a/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.html
+++ b/chrome/browser/resources/ash/settings/os_a11y_page/cursor_and_touchpad_page.html
@@ -74,12 +74,20 @@
       sub-label="$i18n{accessibilityFaceGazeDescription}">
   </settings-toggle-button>
   <iron-collapse opened="[[prefs.settings.a11y.face_gaze.enabled.value]]">
-    <div class="sub-item">
-      <!-- TODO(b/299725221): Open the FaceGaze settings app from here -->
-      <cr-link-row id="faceGazeSettingsButton"
-          class="settings-box"
+    <div>
+      <!-- TODO(b/299725221): Open the FaceGaze cursor control settings -->
+      <cr-link-row id="faceGazeCursorControlButton"
+          class="sub-item"
           label="$i18n{accessibilityFaceGazeSettings}"
-          external>
+          sub-label="$i18n{accessibilityFaceGazeSettingsDescription}">
+      </cr-link-row>
+    </div>
+    <div>
+      <!-- TODO(b/299725221): Open the FaceGaze facial expressions settings -->
+      <cr-link-row id="faceGazeFacialExpressionsButton"
+          class="sub-item"
+          label="$i18n{accessibilityFaceGazeFacialExpressionsSettings}"
+          sub-label="$i18n{accessibilityFaceGazeFacialExpressionsSettingsDescription}">
       </cr-link-row>
     </div>
   </iron-collapse>
diff --git a/chrome/browser/resources/ash/settings/os_people_page/os_people_page.ts b/chrome/browser/resources/ash/settings/os_people_page/os_people_page.ts
index a0c8a52..6f9a3f9 100644
--- a/chrome/browser/resources/ash/settings/os_people_page/os_people_page.ts
+++ b/chrome/browser/resources/ash/settings/os_people_page/os_people_page.ts
@@ -272,6 +272,8 @@
     });
   }
 
+  // TODO(b/302374851) The manual deep linking below can be removed once the
+  // Revamp feature is fully launched.
   override beforeDeepLinkAttempt(settingId: Setting): boolean {
     switch (settingId) {
       // Manually show the deep links for settings nested within elements.
diff --git a/chrome/browser/resources/ash/settings/parental_controls_page/parental_controls_settings_card.html b/chrome/browser/resources/ash/settings/parental_controls_page/parental_controls_settings_card.html
index eff01ed..8f22d5c 100644
--- a/chrome/browser/resources/ash/settings/parental_controls_page/parental_controls_settings_card.html
+++ b/chrome/browser/resources/ash/settings/parental_controls_page/parental_controls_settings_card.html
@@ -34,7 +34,8 @@
       <cr-button id="setupButton" on-click="handleSetupButtonClick_"
           disabled$="[[!online_]]" aria-labelledby="label"
           aria-describedby="subLabel"
-          aria-roledescription="$i18n{parentalControlsSetUpButtonRole}">
+          aria-roledescription="$i18n{parentalControlsSetUpButtonRole}"
+          deep-link-focus-id$="[[Setting.kSetUpParentalControls]]">
         $i18n{parentalControlsSetUpButtonLabel}
       </cr-button>
     </template>
diff --git a/chrome/browser/resources/ash/settings/parental_controls_page/parental_controls_settings_card.ts b/chrome/browser/resources/ash/settings/parental_controls_page/parental_controls_settings_card.ts
index d4d42df..d5c89f6 100644
--- a/chrome/browser/resources/ash/settings/parental_controls_page/parental_controls_settings_card.ts
+++ b/chrome/browser/resources/ash/settings/parental_controls_page/parental_controls_settings_card.ts
@@ -17,12 +17,17 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {castExists} from '../assert_extras.js';
+import {DeepLinkingMixin} from '../common/deep_linking_mixin.js';
 import {isChild} from '../common/load_time_booleans.js';
+import {RouteObserverMixin} from '../common/route_observer_mixin.js';
+import {Setting} from '../mojom-webui/setting.mojom-webui.js';
+import {Route, routes} from '../router.js';
 
 import {ParentalControlsBrowserProxy, ParentalControlsBrowserProxyImpl} from './parental_controls_browser_proxy.js';
 import {getTemplate} from './parental_controls_settings_card.html.js';
 
-const ParentalControlsSettingsCardElementBase = I18nMixin(PolymerElement);
+const ParentalControlsSettingsCardElementBase =
+    DeepLinkingMixin(RouteObserverMixin(I18nMixin(PolymerElement)));
 
 export class ParentalControlsSettingsCardElement extends
     ParentalControlsSettingsCardElementBase {
@@ -36,6 +41,14 @@
 
   static get properties() {
     return {
+      /**
+       * Used by DeepLinkingMixin to focus this page's deep links.
+       */
+      supportedSettingIds: {
+        type: Object,
+        value: () => new Set<Setting>([Setting.kSetUpParentalControls]),
+      },
+
       isChild_: {
         type: Boolean,
         value() {
@@ -70,6 +83,15 @@
     window.addEventListener('online', this.onOnline_.bind(this));
   }
 
+  override currentRouteChanged(newRoute: Route, _oldRoute?: Route): void {
+    // Does not apply to this page.
+    if (newRoute !== routes.OS_PEOPLE) {
+      return;
+    }
+
+    this.attemptDeepLink();
+  }
+
   /**
    * Returns the setup parental controls CrButtonElement.
    */
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_id.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_id.xtb
index 45b0fca..2a0ad87 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_id.xtb
@@ -93,7 +93,7 @@
 <translation id="151784044608172266">Kalimat Berikutnya</translation>
 <translation id="1524531499102321782">Baris Braille selanjutnya</translation>
 <translation id="1542513807034338907">Scroll ke halaman sebelumnya</translation>
-<translation id="1546370775711804143">Bilah gulir</translation>
+<translation id="1546370775711804143">Scroll bar</translation>
 <translation id="1551572888042734032">Musim Panas</translation>
 <translation id="1555130319947370107">Biru</translation>
 <translation id="1559739829547075274">Menavigasi mundur</translation>
diff --git a/chrome/browser/resources/chromeos/emoji_picker/types.ts b/chrome/browser/resources/chromeos/emoji_picker/types.ts
index dda0fb64..8c26238 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/types.ts
+++ b/chrome/browser/resources/chromeos/emoji_picker/types.ts
@@ -5,6 +5,28 @@
 import {Size} from 'chrome://resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js';
 import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 
+// LINT.IfChange
+
+// `DEFAULT` is not defined in tools/emoji_data.py for `Tone` and `Gender`
+// because it is only relevant for frontend persistence.
+
+export enum Tone {
+  DEFAULT = 0,
+  LIGHT = 1,
+  MEDIUM_LIGHT = 2,
+  MEDIUM = 3,
+  MEDIUM_DARK = 4,
+  DARK = 5,
+}
+
+export enum Gender {
+  DEFAULT = 0,
+  WOMAN = 1,
+  MAN = 2,
+}
+
+// LINT.ThenChange(//chromeos/ash/components/emoji/tools/emoji_data.py)
+
 export interface CategoryData {
   name: CategoryEnum;
   icon: string;
@@ -16,16 +38,26 @@
 // visualContent is defined in Emoji only when Emoji is of type GIF.
 // visualContent represents the information needed to display visual content
 // such as GIF (see VisualContent interface below).
+// tone and gender are defined in Emoji only when it's of type Emoji, and only
+// for variants of applicable emojis. They can never have the value DEFAULT
+// because the fields are omitted in this case, but DEFAULT is relevant for
+// persistence.
 export interface Emoji {
   string?: string;
   visualContent?: VisualContent;
   name?: string;
   keywords?: string[];
+  tone?: Tone;
+  gender?: Gender;
 }
 
+// When `groupedTone` is true, all emojis that also have it set to true will
+// update to have the same tone. The same applies to `groupedGender`.
 export interface EmojiVariants {
   base: Emoji;
   alternates: Emoji[];
+  groupedTone?: boolean;
+  groupedGender?: boolean;
 }
 
 export interface EmojiGroup {
diff --git a/chrome/browser/resources/chromeos/login/test_api/test_api.js b/chrome/browser/resources/chromeos/login/test_api/test_api.js
index 45923dd4..e78f5db3 100644
--- a/chrome/browser/resources/chromeos/login/test_api/test_api.js
+++ b/chrome/browser/resources/chromeos/login/test_api/test_api.js
@@ -975,8 +975,6 @@
     this.firstInput = new TextFieldApi(this.passwordInput, '#firstInput');
     this.confirmInput = new TextFieldApi(this.passwordInput, '#confirmInput');
     this.nextButton = new PolymerElementApi(this, '#nextButton');
-    this.doneDialog = new PolymerElementApi(this, '#doneDialog');
-    this.doneButton = new PolymerElementApi(this, '#doneButton');
   }
 
   /** @return {boolean} */
@@ -994,14 +992,29 @@
       });
     });
   }
+}
+
+class PasswordFactorSuccessScreenTester extends ScreenElementApi {
+  constructor() {
+    super('factor-setup-success');
+    this.doneButton = new PolymerElementApi(this, '#doneButton');
+    this.nextButton = new PolymerElementApi(this, '#nextButton');
+  }
 
   /** @return {boolean} */
   isDone() {
-    return this.doneDialog.isVisible();
+    return this.isVisible() &&
+        (this.doneButton.isVisible() || this.nextButton.isVisible());
   }
 
   clickDone() {
-    this.doneButton.click();
+    if (this.doneButton.isVisible()) {
+      this.doneButton.click();
+      return;
+    }
+    if (this.nextButton.isVisible()) {
+      this.nextButton.click();
+    }
   }
 }
 
@@ -1198,6 +1211,7 @@
       SmartPrivacyProtectionScreen: new SmartPrivacyProtectionScreenTester(),
       CryptohomeRecoverySetupScreen: new CryptohomeRecoverySetupScreenTester(),
       LocalPasswordSetupScreen: new LocalPasswordSetupScreenTester(),
+      PasswordFactorSuccessScreen: new PasswordFactorSuccessScreenTester(),
       GaiaInfoScreen: new GaiaInfoScreenTester(),
       ConsumerUpdateScreen: new ConsumerUpdateScreenTester(),
       ChoobeScreen: new ChoobeScreenTester(),
diff --git a/chrome/browser/resources/compose/BUILD.gn b/chrome/browser/resources/compose/BUILD.gn
index f7e8284..3c4bd2b 100644
--- a/chrome/browser/resources/compose/BUILD.gn
+++ b/chrome/browser/resources/compose/BUILD.gn
@@ -11,8 +11,11 @@
     "app.ts",
     "textarea.ts",
   ]
-  non_web_component_files = [ "compose_api_proxy.ts" ]
-  css_files = [ "animations.css" ]
+  non_web_component_files = [
+    "animations/animator.ts",
+    "animations/app_animator.ts",
+    "compose_api_proxy.ts",
+  ]
   icons_html_files = [ "icons.html" ]
   ts_composite = true
   ts_deps = [
diff --git a/chrome/browser/resources/compose/animations.css b/chrome/browser/resources/compose/animations.css
deleted file mode 100644
index a2908f0..0000000
--- a/chrome/browser/resources/compose/animations.css
+++ /dev/null
@@ -1,26 +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. */
-
-/* #css_wrapper_metadata_start
- * #type=style
- * #css_wrapper_metadata_end */
-
-:host {
-  --compose-standard-easing: cubic-bezier(0.2, 0.0, 0, 1.0);
-}
-
-@keyframes fade-in {
-  0% { opacity: 0; }
-  100% { opacity: 1; }
-}
-
-@keyframes slide-in {
-  0% { transform: translateY(var(--compose-slide-in-distance)); }
-  100% { transform: translateY(0); }
-}
-
-@keyframes scale-in {
-  0% { transform: scale(0); }
-  100% { transform: scale(1); }
-}
diff --git a/chrome/browser/resources/compose/animations/animator.ts b/chrome/browser/resources/compose/animations/animator.ts
new file mode 100644
index 0000000..8d0eb0a
--- /dev/null
+++ b/chrome/browser/resources/compose/animations/animator.ts
@@ -0,0 +1,66 @@
+// 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 {assert} from 'chrome://resources/js/assert.js';
+
+const STANDARD_EASING = 'cubic-bezier(0.2, 0.0, 0, 1.0)';
+
+/**
+ * Generic animator class that has common animations and util methods.
+ */
+export class Animator {
+  private root_: HTMLElement;
+  private animationsEnabled_: boolean;
+
+  constructor(root: HTMLElement, animationsEnabled: boolean) {
+    this.root_ = root;
+    this.animationsEnabled_ = animationsEnabled;
+  }
+
+  animate(
+      selector: string, keyframes: Keyframe[],
+      options: KeyframeAnimationOptions): Animation[] {
+    if (!this.animationsEnabled_) {
+      return [];
+    }
+    const elements = Array.from(
+        this.root_.shadowRoot!.querySelectorAll<HTMLElement>(selector));
+    assert(elements.length > 0);
+    return elements.map(element => {
+      return element.animate(keyframes, Object.assign({fill: 'both'}, options));
+    });
+  }
+
+  fadeIn(selector: string, options: KeyframeAnimationOptions): Animation[] {
+    return this.animate(
+        selector,
+        [
+          {opacity: 0},
+          {opacity: 1},
+        ],
+        Object.assign({easing: 'linear', fill: 'both'}, options));
+  }
+
+  scaleIn(selector: string, options: KeyframeAnimationOptions): Animation[] {
+    return this.animate(
+        selector,
+        [
+          {transform: 'scale(0)'},
+          {transform: 'scale(1)'},
+        ],
+        Object.assign({easing: STANDARD_EASING, fill: 'both'}, options));
+  }
+
+  slideIn(
+      selector: string, startDistance: number,
+      options: KeyframeAnimationOptions): Animation[] {
+    return this.animate(
+        selector,
+        [
+          {transform: `translateY(${startDistance}px)`},
+          {transform: `translateY(0)`},
+        ],
+        Object.assign({easing: STANDARD_EASING, fill: 'both'}, options));
+  }
+}
diff --git a/chrome/browser/resources/compose/animations/app_animator.ts b/chrome/browser/resources/compose/animations/app_animator.ts
new file mode 100644
index 0000000..f285174
--- /dev/null
+++ b/chrome/browser/resources/compose/animations/app_animator.ts
@@ -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.
+
+import {Animator} from './animator.js';
+
+export class ComposeAppAnimator extends Animator {
+  transitionToConsent(): Animation[] {
+    const consentScreenText = '#consentHeading h1, #consentContainer';
+    const consentScreenButtons = '#closeButtonConsent, #consentFooter';
+    return [
+      this.scaleIn('#consentIconContainer', {duration: 250}),
+      this.slideIn(consentScreenText, -8, {duration: 250}),
+      this.fadeIn(consentScreenText, {delay: 50, duration: 100}),
+      this.fadeIn(consentScreenButtons, {delay: 100, duration: 100}),
+    ].flat();
+  }
+
+  transitionToInput(): Animation[] {
+    const inputScreenText = '#heading h1, #body, #submitFooter .footer-text';
+    const inputScreenButton = '#submitButton';
+    return [
+      this.slideIn(inputScreenText, 8, {duration: 200}),
+      this.slideIn(inputScreenButton, 48, {duration: 200}),
+      this.fadeIn(inputScreenText, {delay: 100, duration: 100}),
+      this.fadeIn(inputScreenButton, {delay: 100, duration: 100}),
+    ].flat();
+  }
+}
diff --git a/chrome/browser/resources/compose/app.html b/chrome/browser/resources/compose/app.html
index 9b52d68..f22af68 100644
--- a/chrome/browser/resources/compose/app.html
+++ b/chrome/browser/resources/compose/app.html
@@ -1,4 +1,4 @@
-<style include="cr-hidden-style md-select animations">
+<style include="cr-hidden-style md-select">
   :host {
     --gap-between-sections_: 16px;
     --padding_: 20px;
@@ -37,6 +37,7 @@
     display: flex;
     justify-content: center;
     align-items: center;
+    transform-origin: top left;
   }
 
   @media (prefers-color-scheme: dark) {
@@ -71,23 +72,6 @@
     padding: 0 20px;
   }
 
-  :host([enable-animations]) #consentHeading h1,
-  :host([enable-animations]) #consentContainer {
-    --compose-slide-in-distance: -8px;
-    animation: slide-in 250ms var(--compose-standard-easing) both,
-        fade-in 100ms linear 50ms both;
-  }
-
-  :host([enable-animations]) #closeButtonConsent,
-  :host([enable-animations]) #consentFooter {
-    animation: fade-in 100ms linear 100ms both;
-  }
-
-  :host([enable-animations]) #consentIconContainer {
-    animation: scale-in 250ms var(--compose-standard-easing) both;
-    transform-origin: top left;
-  }
-
   #heading {
     display: flex;
     height: 24px;
@@ -128,14 +112,6 @@
     position: relative;
   }
 
-  :host([enable-animations]) #heading h1,
-  :host([enable-animations]) #body,
-  :host([enable-animations]) #submitFooter .footer-text {
-    --compose-slide-in-distance: -8px;
-    animation: fade-in 100ms linear 100ms both,
-        slide-in 200ms var(--compose-standard-easing) both;
-  }
-
   #body {
     --results-background_: rgb(234, 240, 249);
     --scrollbar-width_: 4px;
@@ -316,12 +292,6 @@
     min-height: 141px;
   }
 
-  :host([enable-animations]) #submitButton {
-    --compose-slide-in-distance: 48px;
-    animation: slide-in 200ms var(--compose-standard-easing) both,
-        fade-in 100ms linear 100ms both;
-  }
-
   #editContainer {
     box-sizing: border-box;
     display: flex;
diff --git a/chrome/browser/resources/compose/app.ts b/chrome/browser/resources/compose/app.ts
index a53f12ef..a945318 100644
--- a/chrome/browser/resources/compose/app.ts
+++ b/chrome/browser/resources/compose/app.ts
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import './animations.css.js';
 import './icons.html.js';
 import './strings.m.js';
 import './textarea.js';
@@ -24,6 +23,7 @@
 import {loadTimeData} from '//resources/js/load_time_data.js';
 import {Debouncer, microTask, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {ComposeAppAnimator} from './animations/app_animator.js';
 import {getTemplate} from './app.html.js';
 import {CloseReason, ComposeDialogCallbackRouter, ComposeResponse, ComposeStatus, ConfigurableParams, ConsentState, Length, StyleModifiers, Tone, UserFeedback} from './compose.mojom-webui.js';
 import {ComposeApiProxy, ComposeApiProxyImpl} from './compose_api_proxy.js';
@@ -193,6 +193,7 @@
     ];
   }
 
+  private animator_: ComposeAppAnimator;
   private apiProxy_: ComposeApiProxy = ComposeApiProxyImpl.getInstance();
   enableAnimations: boolean;
   private eventTracker_: EventTracker = new EventTracker();
@@ -219,6 +220,8 @@
   constructor() {
     super();
     ColorChangeUpdater.forDocument().start();
+    this.animator_ = new ComposeAppAnimator(
+        this, loadTimeData.getBoolean('enableAnimations'));
     this.getInitialState_();
     this.router_.responseReceived.addListener((response: ComposeResponse) => {
       this.composeResponseReceived_(response);
@@ -256,6 +259,10 @@
       // state.
       this.showMainAppDialog_ =
           initialState.consentState === ConsentState.kConsented;
+      if (!this.showMainAppDialog_) {
+        this.animator_.transitionToConsent();
+      }
+
       this.showDisclaimerFooter_ =
           initialState.consentState === ConsentState.kExternalConsented;
 
@@ -303,6 +310,7 @@
   private onConsentYesButtonClick_() {
     this.apiProxy_.approveConsent();
     this.showMainAppDialog_ = true;
+    this.animator_.transitionToInput();
   }
 
   private onDisclaimerLetsGoButtonClick_() {
diff --git a/chrome/browser/resources/search_engine_choice/app.html b/chrome/browser/resources/search_engine_choice/app.html
index 7f3f1b86..e40a217c 100644
--- a/chrome/browser/resources/search_engine_choice/app.html
+++ b/chrome/browser/resources/search_engine_choice/app.html
@@ -122,7 +122,6 @@
   }
 
   .choice {
-    align-items: center;
     display: flex;
     flex-direction: row;
     gap: 16px;
@@ -131,6 +130,7 @@
   .choice-text {
     display: flex;
     flex-direction: column;
+    width: 100%;
   }
 
   .choice-icon {
@@ -142,6 +142,7 @@
     width: var(--choice-icon-height);
   }
 
+  .omnibox-text,
   .choice-title {
     font-family: Roboto, Arial;
     font-size: 0.875rem;
@@ -150,8 +151,16 @@
     text-align: start;
   }
 
+  .choice-title {
+    align-items: center;
+    display: flex;
+    flex-direction: row;
+  }
+
   cr-radio-button {
+    --cr-radio-button-label-spacing: 12px;
     --cr-radio-button-size: 20px;
+    align-items: start;
     background-color: var(--google-grey-100);
     border-radius: 2px;
     padding: 16px 24px;
@@ -243,7 +252,7 @@
   cr-expand-button {
     --cr-expand-button-size: 24px;
     --cr-section-vertical-padding: 0px;
-    width: fit-content;
+    margin-inline-start: auto;
   }
 
   .cr-icon {
@@ -254,6 +263,12 @@
     margin: 0;
   }
 
+  .vertical-separator {
+    border-left: 0.5px solid var(--google-grey-300);
+    height: 24px;
+    margin-inline-start: 12px;
+  }
+
   @keyframes fade-in-animation {
     0% {
       opacity: 0;
@@ -415,7 +430,7 @@
     <div id="searchEngineOmnibox">
       <div class="choice-icon"
           style$="background-image: [[fakeOmniboxIconPath_]];"></div>
-      <div class="choice-title">[[fakeOmniboxText_]]</div>
+      <div class="omnibox-text">[[fakeOmniboxText_]]</div>
     </div>
   </div>
   <p class="subtitle">
@@ -433,10 +448,13 @@
             <div class="choice-icon"
                 style$="background-image: [[item.iconPath]];"></div>
             <div class="choice-text">
-              <cr-expand-button expanded="{{item.showMarketingSnippet}}"
-                  no-hover>
-                <div class="choice-title">[[item.name]]</div>
-              </cr-expand-button>
+              <div class="choice-title">
+                [[item.name]]
+                <cr-expand-button expanded="{{item.showMarketingSnippet}}"
+                    no-hover>
+                </cr-expand-button>
+                <div class="vertical-separator"></div>
+              </div>
               <iron-collapse opened="[[item.showMarketingSnippet]]">
                 [[item.marketingSnippet]]
               </iron-collapse>
diff --git a/chrome/browser/resources/search_engine_choice/app.ts b/chrome/browser/resources/search_engine_choice/app.ts
index e2d91ae..4acab20 100644
--- a/chrome/browser/resources/search_engine_choice/app.ts
+++ b/chrome/browser/resources/search_engine_choice/app.ts
@@ -116,6 +116,7 @@
   private hasUserScrolledToTheBottom_: boolean;
   private withForcedScroll_: boolean;
   private actionButtonText_: string;
+  private scrollBehavior_: ScrollBehavior = 'smooth';
 
   constructor() {
     super();
@@ -183,9 +184,11 @@
     if (this.needsScrollToTheBottom_()) {
       if (this.isChoiceListScrollable_()) {
         const choiceList = this.$.choiceList;
-        choiceList.scrollTo({top: choiceList.scrollHeight, behavior: 'smooth'});
+        choiceList.scrollTo(
+            {top: choiceList.scrollHeight, behavior: this.scrollBehavior_});
       } else if (this.isPageScrollable_()) {
-        window.scrollTo({top: document.body.scrollHeight, behavior: 'smooth'});
+        window.scrollTo(
+            {top: document.body.scrollHeight, behavior: this.scrollBehavior_});
       }
       return;
     }
@@ -193,6 +196,11 @@
         parseInt(this.selectedChoice_));
   }
 
+  // Removes the scrolling animation to inscrease test stability.
+  setInstantScrollBehaviorForTest() {
+    this.scrollBehavior_ = 'instant';
+  }
+
   private onInfoDialogButtonClicked_() {
     this.$.infoDialog.close();
   }
diff --git a/chrome/browser/touch_to_fill/autofill/android/touch_to_fill_credit_card_quality_metrics_unittest.cc b/chrome/browser/touch_to_fill/autofill/android/touch_to_fill_credit_card_quality_metrics_unittest.cc
index d649d09..a06806a 100644
--- a/chrome/browser/touch_to_fill/autofill/android/touch_to_fill_credit_card_quality_metrics_unittest.cc
+++ b/chrome/browser/touch_to_fill/autofill/android/touch_to_fill_credit_card_quality_metrics_unittest.cc
@@ -84,16 +84,15 @@
   void SetFieldsAutofilledValues(
       FormData& form,
       const std::vector<bool>& fields_have_autofilled_values,
-      const std::vector<ServerFieldType>& server_field_types) {
+      const std::vector<ServerFieldType>& field_types) {
     ASSERT_EQ(form.fields.size(), fields_have_autofilled_values.size());
-    ASSERT_EQ(form.fields.size(), server_field_types.size());
+    ASSERT_EQ(form.fields.size(), field_types.size());
     for (size_t i = 0; i < fields_have_autofilled_values.size(); i++) {
       form.fields[i].is_autofilled = fields_have_autofilled_values[i];
       CreditCard test_card = test::GetCreditCard();
-      form.fields[i].value =
-          server_field_types[i] != CREDIT_CARD_VERIFICATION_CODE
-              ? test_card.GetRawInfo(server_field_types[i])
-              : u"123";
+      form.fields[i].value = field_types[i] != CREDIT_CARD_VERIFICATION_CODE
+                                 ? test_card.GetRawInfo(field_types[i])
+                                 : u"123";
     }
   }
 
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index acea119..b751b74 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -2923,6 +2923,8 @@
       "views/crostini/crostini_update_filesystem_view.h",
       "views/frame/browser_frame_ash.cc",
       "views/frame/browser_frame_ash.h",
+      "views/frame/browser_view_ash.cc",
+      "views/frame/browser_view_ash.h",
       "views/frame/custom_tab_browser_frame.cc",
       "views/frame/custom_tab_browser_frame.h",
       "views/frame/native_browser_frame_factory_chromeos.cc",
diff --git a/chrome/browser/ui/android/fast_checkout/ui_view_android_utils.cc b/chrome/browser/ui/android/fast_checkout/ui_view_android_utils.cc
index 42f9cc0..8c8fee1 100644
--- a/chrome/browser/ui/android/fast_checkout/ui_view_android_utils.cc
+++ b/chrome/browser/ui/android/fast_checkout/ui_view_android_utils.cc
@@ -23,7 +23,7 @@
 using ::base::android::JavaRef;
 
 void MaybeSetInfo(autofill::AutofillProfile* profile,
-                  autofill::ServerFieldType type,
+                  autofill::FieldType type,
                   const JavaRef<jstring>& value,
                   const std::string& locale) {
   if (value) {
@@ -32,7 +32,7 @@
 }
 
 void MaybeSetRawInfo(autofill::AutofillProfile* profile,
-                     autofill::ServerFieldType type,
+                     autofill::FieldType type,
                      const JavaRef<jstring>& value) {
   if (value) {
     profile->SetRawInfo(type, ConvertJavaStringToUTF16(value));
diff --git a/chrome/browser/ui/android/fast_checkout/ui_view_android_utils_unittest.cc b/chrome/browser/ui/android/fast_checkout/ui_view_android_utils_unittest.cc
index ca0b181..ddda9934 100644
--- a/chrome/browser/ui/android/fast_checkout/ui_view_android_utils_unittest.cc
+++ b/chrome/browser/ui/android/fast_checkout/ui_view_android_utils_unittest.cc
@@ -26,7 +26,7 @@
   EXPECT_EQ(profile.guid(), parsed_profile->guid());
   EXPECT_EQ(profile.language_code(), parsed_profile->language_code());
 
-  const autofill::ServerFieldType types[] = {
+  const autofill::FieldType types[] = {
       autofill::NAME_FULL,
       autofill::NAME_FIRST,
       autofill::NAME_MIDDLE,
@@ -47,7 +47,7 @@
       autofill::PHONE_HOME_WHOLE_NUMBER,
   };
 
-  for (autofill::ServerFieldType type : types) {
+  for (autofill::FieldType type : types) {
     EXPECT_EQ(profile.GetRawInfo(type), parsed_profile->GetRawInfo(type));
   }
 }
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 6f918e6..e44ac48e 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -5853,6 +5853,27 @@
       <message name="IDS_READALOUD_VOICE_PREVIEW_MESSAGE" desc="String to be read aloud when a voice's preview button is clicked as a demonstration of how that voice sounds. It also explains how to select the voice by clicking the menu item.">
         Here are the voices you can pick for reading out your web pages. If you like this voice and want me to keep using it just tap the voice name.
       </message>
+
+      <!-- WebAuthn -->
+      <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_TITLE" desc="The title of a bottomsheet that appears before the user saves passkey in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'.)" formatter_data="android_java">
+        Save passkey outside Incognito?
+      </message>
+      <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_BODY" desc="The body of a bottomsheet that appears before the user saves passkey in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'.)" formatter_data="android_java">
+        This passkey will be saved to your password manager. Anyone with access to it will be able to use this passkey.
+      </message>
+      <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_CONTINUE" desc="The text of a button that the user will click to continue creating a passkey in Incognito mode" formatter_data="android_java">
+        Continue
+      </message>
+
+      <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_DESCRIPTION" desc="Accessibility string that describes a bottomsheet that confirms with the user that they want to create passkey while in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'." formatter_data="android_java">
+        Passkey confirmation sheet
+      </message>
+      <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_OPENED" desc="Accessibility string that describes opening a bottomsheet that confirms with the user that they want to create passkey while in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'." formatter_data="android_java">
+        Passkey confirmation sheet opened
+      </message>
+      <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_CLOSED" desc="Accessibility string that describes closing a bottomsheet that confirms with the user that they want to create passkey while in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'." formatter_data="android_java">
+        Passkey confirmation sheet closed
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_BODY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_BODY.png.sha1
similarity index 100%
rename from components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_BODY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_BODY.png.sha1
diff --git a/components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_CONTINUE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_CONTINUE.png.sha1
similarity index 100%
rename from components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_CONTINUE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_CONTINUE.png.sha1
diff --git a/components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_CLOSED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_CLOSED.png.sha1
similarity index 100%
rename from components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_CLOSED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_CLOSED.png.sha1
diff --git a/components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_DESCRIPTION.png.sha1
similarity index 100%
rename from components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_DESCRIPTION.png.sha1
diff --git a/components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_OPENED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_OPENED.png.sha1
similarity index 100%
rename from components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_OPENED.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_OPENED.png.sha1
diff --git a/components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_TITLE.png.sha1
similarity index 100%
rename from components/webauthn_strings_grdp/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
index 2946a88..a7c4f5213 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -124,7 +124,7 @@
 <translation id="1670399744444387456">Grundlæggende</translation>
 <translation id="1671236975893690980">Download afventer…</translation>
 <translation id="1672586136351118594">Vis ikke igen</translation>
-<translation id="1680919990519905526">Køb med Google Lens <ph name="BEGIN_NEW" />Nyhed<ph name="END_NEW" /></translation>
+<translation id="1680919990519905526">Shop med Google Lens <ph name="BEGIN_NEW" />Nyhed<ph name="END_NEW" /></translation>
 <translation id="1687482373098770139">Du får snart vist indhold fra og om <ph name="SITE_NAME" /> i Følger. De websites og søgninger, du følger, gemmes på din Google-konto. Du kan til enhver tid administrere, hvad du følger, i indstillingerne.</translation>
 <translation id="1696555181932908973">Du kan prøve at fortsætte på <ph name="SITE_ETLD_PLUS_ONE" /> på andre måder.</translation>
 <translation id="1702543251015153180">Vil du ændre dine indstillinger for mørkt tema?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
index 353f13c..7a75931 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -506,7 +506,7 @@
 <translation id="3791957072666773229">{TAB_COUNT,plural, =1{1 टैब}one{# टैब}other{# टैब}}</translation>
 <translation id="3795154175078851242">लिंक के साथ इमेज कॉपी करें</translation>
 <translation id="3810838688059735925">वीडियो</translation>
-<translation id="3810973564298564668">प्रबंधित करें</translation>
+<translation id="3810973564298564668">मैनेज करें</translation>
 <translation id="381861209280417772">पासवर्ड मिटाएं</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> डाउनलोड हटाए गए</translation>
 <translation id="3819183753496523827">आप ऑफ़लाइन हैं. अपने इंटरनेट कनेक्शन की जांच करें और फिर से कोशिश करें.</translation>
@@ -1231,7 +1231,7 @@
 <translation id="749294055653435199">इस डिवाइस पर Google Lens नहीं है</translation>
 <translation id="7493994139787901920"><ph name="VERSION" /> (<ph name="TIME_SINCE_UPDATE" /> अपडेट किया गया)</translation>
 <translation id="7497755084107113646">इस विषय को संभावित विषयों में वापस जोड़ा गया</translation>
-<translation id="7498271377022651285">कृपया प्रतीक्षा करें...</translation>
+<translation id="7498271377022651285">कृपया इंतज़ार करें...</translation>
 <translation id="7502234197872745058">सभी वेबसाइटों पर अपने Google खाते से साइन आउट करने के लिए, <ph name="BEGIN_LINK1" />Chrome से साइन आउट करें<ph name="END_LINK1" />.</translation>
 <translation id="750228856503700085">कोई अपडेट उपलब्ध नहीं है</translation>
 <translation id="7507207699631365376">इस सेवा देने वाले की <ph name="BEGIN_LINK" />निजता नीति<ph name="END_LINK" /> देखें</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
index a4a79fc..40e87e5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -31,7 +31,7 @@
 <translation id="1150263420752757504"><ph name="APP_NAME" /> sẽ mở trong Chrome. Bằng việc tiếp tục, bạn đồng ý với <ph name="BEGIN_LINK1" />Điều khoản dịch vụ của Google<ph name="END_LINK1" /> cũng như <ph name="BEGIN_LINK2" />Điều khoản dịch vụ bổ sung của Google Chrome và ChromeOS<ph name="END_LINK2" />.</translation>
 <translation id="115483310321669804">Sử dụng mật khẩu <ph name="PASSWORD" /></translation>
 <translation id="1173894706177603556">Đổi tên</translation>
-<translation id="1174479719160874822">Chrome sẽ yêu cầu trang web dành cho thiết bị di động khi màn hình bị hẹp</translation>
+<translation id="1174479719160874822">Chrome sẽ yêu cầu trang web dành cho thiết bị di động khi màn hình bị thu hẹp</translation>
 <translation id="1177863135347784049">Tùy chỉnh</translation>
 <translation id="1181037720776840403">Xóa</translation>
 <translation id="1181366777303791449">trên <ph name="MAIN_FRAME_ETLD_PLUS_ONE" /></translation>
diff --git a/chrome/browser/ui/ash/desks/desks_integration_test.cc b/chrome/browser/ui/ash/desks/desks_integration_test.cc
new file mode 100644
index 0000000..1f4f916f
--- /dev/null
+++ b/chrome/browser/ui/ash/desks/desks_integration_test.cc
@@ -0,0 +1,227 @@
+// 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 "ash/ash_element_identifiers.h"
+#include "ash/public/cpp/debug_utils.h"
+#include "ash/root_window_controller.h"
+#include "ash/shell.h"
+#include "ash/style/close_button.h"
+#include "ash/wm/desks/desk_action_view.h"
+#include "ash/wm/desks/desk_bar_view_base.h"
+#include "ash/wm/desks/desk_preview_view.h"
+#include "ash/wm/desks/desk_textfield.h"
+#include "ash/wm/desks/desks_test_api.h"
+#include "ash/wm/window_util.h"
+#include "base/functional/bind.h"
+#include "base/memory/raw_ptr.h"
+#include "base/test/gtest_tags.h"
+#include "base/test/test_switches.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/test/base/chromeos/crosier/interactive_ash_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/env.h"
+#include "ui/base/interaction/element_identifier.h"
+#include "ui/compositor/scoped_animation_duration_scale_mode.h"
+
+namespace ash {
+namespace {
+
+// Observes the expansion state of the overview desk bar.
+class DeskBarExpandedObserver : public ui::test::StateObserver<bool> {
+ public:
+  explicit DeskBarExpandedObserver(DeskBarViewBase* desk_bar) {
+    if (desk_bar->state() == DeskBarViewBase::State::kExpanded) {
+      OnStateObserverStateChanged(true);
+    } else {
+      DesksTestApi::SetDeskBarUiUpdateCallback(
+          desk_bar,
+          base::BindOnce(&DeskBarExpandedObserver::OnStateObserverStateChanged,
+                         weak_ptr_factory_.GetWeakPtr(), true));
+    }
+  }
+  ~DeskBarExpandedObserver() override = default;
+
+ private:
+  base::WeakPtrFactory<DeskBarExpandedObserver> weak_ptr_factory_{this};
+};
+
+DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(DeskBarExpandedObserver,
+                                    kDeskBarExpandedState);
+
+class DesksIntegrationTest : public InteractiveAshTest {
+ public:
+  // This function is used to name the DeskMiniView that is associated with the
+  // desk at `desk_index`. This will find the right view regardless of how the
+  // mini views may be organized as child views.
+  auto NameDeskMiniView(base::StringPiece name, int desk_index) {
+    return NameDescendantView(
+        kOverviewDeskBarElementId, name,
+        base::BindRepeating(
+            [](int desk_index, const views::View* view) {
+              if (const auto* const mini_view =
+                      views::AsViewClass<DeskMiniView>(view)) {
+                if (DesksController::Get()->GetDeskIndex(mini_view->desk()) ==
+                    desk_index) {
+                  return true;
+                }
+              }
+              return false;
+            },
+            desk_index));
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(DesksIntegrationTest, DesksBasic) {
+  base::AddFeatureIdTagToTestResult(
+      "screenplay-c873d6a0-8e97-4a94-bb28-c1b9e6af4a51");
+  SetupContextWidget();
+
+  // Open two browser windows.
+  GURL version_url("chrome://version");
+  ASSERT_TRUE(CreateBrowserWindow(version_url));
+  GURL blank_url("about:blank");
+  ASSERT_TRUE(CreateBrowserWindow(blank_url));
+
+  auto* browser_list = BrowserList::GetInstance();
+  ASSERT_EQ(browser_list->size(), 2u);
+
+  aura::Window* browser1_window =
+      browser_list->get(0)->window()->GetNativeWindow();
+  aura::Window* browser2_window =
+      browser_list->get(1)->window()->GetNativeWindow();
+
+  ASSERT_TRUE(browser1_window);
+  ASSERT_TRUE(browser2_window);
+
+  // This is not ideal. Animations are currently disabled because the test will
+  // otherwise break when reordering desks. This in turn is because the step
+  // that interacts with the desk action buttons won't work until an animation
+  // has completed. In order to run with animations enabled, we would need a way
+  // to observe animations and have the test wait until it has completed.
+  ui::ScopedAnimationDurationScaleMode duration_scale(
+      ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
+
+  constexpr char kMiniView1[] = "desk1-mv";
+  constexpr char kMiniView2[] = "desk2-mv";
+
+  constexpr char kMiniView2Edit[] = "desk2-mv-edit";
+
+  constexpr char kMiniView1Preview[] = "desk1-mv-preview";
+  constexpr char kMiniView2Preview[] = "desk2-mv-preview";
+
+  constexpr char kActionView[] = "action-view";
+  constexpr char kCombineDesksButton[] = "combine-desks";
+
+  // This will eventually hold a pointer to the overview desk bar.
+  DeskBarViewBase* desk_bar_view = nullptr;
+
+  RunTestSequence(
+      Log("Enter overview mode"), Do([] {
+        ui_controls::SendKeyPress(/*window=*/nullptr,
+                                  ui::VKEY_MEDIA_LAUNCH_APP1,
+                                  /*control=*/false, /*shift=*/false,
+                                  /*alt=*/false, /*command=*/false);
+      }),
+
+      // Note: FlushEvents is needed here. Without it, the desk
+      // name text field does not gain focus
+      Log("Wait for the overview desk bar to show"), FlushEvents(),
+      AfterShow(kOverviewDeskBarElementId,
+                [&desk_bar_view](ui::TrackedElement* el) {
+                  desk_bar_view = AsView<DeskBarViewBase>(el);
+                  ASSERT_TRUE(desk_bar_view);
+                }),
+
+      ObserveState(kDeskBarExpandedState, std::ref(desk_bar_view)),
+
+      // Press the new desk button.
+      PressButton(kOverviewDeskBarNewDeskButtonElementId),
+      WaitForState(kDeskBarExpandedState, true), FlushEvents(),
+
+      // We should now have two mini views.
+      CheckView(
+          kOverviewDeskBarElementId,
+          [](DeskBarViewBase* desk_bar) {
+            return desk_bar->mini_views().size();
+          },
+          testing::Eq(2u)),
+
+      NameDeskMiniView(kMiniView1, /*desk_index=*/0),
+      NameDeskMiniView(kMiniView2, /*desk_index=*/1),
+
+      // Verify that the name field of the new desk has focus.
+      NameDescendantViewByType<DeskTextfield>(kMiniView2, kMiniView2Edit),
+      CheckViewProperty(kMiniView2Edit, &views::View::HasFocus, true),
+
+      // Name the new desk and hit enter.
+      EnterText(kMiniView2Edit, u"new desk"),
+      SendAccelerator(kMiniView2Edit, ui::Accelerator(ui::VKEY_RETURN, 0)),
+
+      NameDescendantViewByType<DeskPreviewView>(kMiniView1, kMiniView1Preview),
+      NameDescendantViewByType<DeskPreviewView>(kMiniView2, kMiniView2Preview),
+
+      // Activate the mini view of the created desk. Then swap the two desks via
+      // hotkey.
+      Do([] {
+        ui_controls::SendKeyPress(/*window=*/nullptr, ui::VKEY_TAB,
+                                  /*control=*/false, /*shift=*/true,
+                                  /*alt=*/false, /*command=*/false);
+        ui_controls::SendKeyPress(/*window=*/nullptr, ui::VKEY_LEFT,
+                                  /*control=*/true, /*shift=*/false,
+                                  /*alt=*/false, /*command=*/false);
+      }),
+      FlushEvents(),
+
+      // Verify that the desks have been swapped.
+      CheckResult(
+          [] { return DesksController::Get()->GetDeskAtIndex(0)->name(); },
+          testing::Eq(u"new desk")),
+
+      // Select one of the browser windows and move it to another desk.
+      Do([] {
+        ui_controls::SendKeyPress(/*window=*/nullptr, ui::VKEY_TAB,
+                                  /*control=*/false, /*shift=*/true,
+                                  /*alt=*/false, /*command=*/false);
+        ui_controls::SendKeyPress(/*window=*/nullptr, ui::VKEY_OEM_4,
+                                  /*control=*/false, /*shift=*/true,
+                                  /*alt=*/false, /*command=*/true);
+      }),
+      FlushEvents(),
+
+      // Verify that the two browsers now live on different desks.
+      Check([&] {
+        return browser1_window->parent() != browser2_window->parent();
+      }),
+
+      // Make sure that the cursor is on the preview for the new desk.
+      MoveMouseTo(kMiniView2Preview),
+      NameDescendantViewByType<DeskActionView>(kMiniView2, kActionView),
+
+      // This depends on the ordering in which the button views are added to the
+      // action view.
+      NameDescendantViewByType<CloseButton>(kActionView, kCombineDesksButton,
+                                            /*index=*/0),
+      CheckViewProperty(kCombineDesksButton, &CloseButton::GetVisible, true),
+      // We would like to move the cursor to the location of this button and
+      // press it, but for an unknown reason, the size of the button is 0,0 at
+      // this time.
+      PressButton(kCombineDesksButton),
+
+      // Verify that the two browsers are now on the same desk.
+      Check([&] {
+        return browser1_window->parent() == browser2_window->parent();
+      }),
+
+      Log("Test done"));
+
+  auto* browser_list2 = BrowserList::GetInstance();
+  // Copy the browser list to avoid mutating it during iteration.
+  std::vector<Browser*> browsers(browser_list2->begin(), browser_list2->end());
+  for (Browser* browser : browsers) {
+    CloseBrowserSynchronously(browser);
+  }
+}
+
+}  // namespace
+}  // namespace ash
diff --git a/chrome/browser/ui/autofill/address_editor_controller.cc b/chrome/browser/ui/autofill/address_editor_controller.cc
index acd2f752..0a6488df 100644
--- a/chrome/browser/ui/autofill/address_editor_controller.cc
+++ b/chrome/browser/ui/autofill/address_editor_controller.cc
@@ -103,7 +103,7 @@
       EditorField::ControlType::TEXTFIELD);
 }
 
-void AddressEditorController::SetProfileInfo(ServerFieldType type,
+void AddressEditorController::SetProfileInfo(FieldType type,
                                              const std::u16string& value) {
   // Since the countries combobox contains the country names, not the country
   // codes, and hence we should use `SetInfo()` to make sure they get converted
@@ -121,7 +121,7 @@
       type, value, VerificationStatus::kUserVerified);
 }
 
-std::u16string AddressEditorController::GetProfileInfo(ServerFieldType type) {
+std::u16string AddressEditorController::GetProfileInfo(FieldType type) {
   // TDOD(mamir): Update the implementation to format strings properly.
   return profile_to_edit_.GetInfo(type, locale_);
 }
diff --git a/chrome/browser/ui/autofill/address_editor_controller.h b/chrome/browser/ui/autofill/address_editor_controller.h
index 67952ac..cfe752b 100644
--- a/chrome/browser/ui/autofill/address_editor_controller.h
+++ b/chrome/browser/ui/autofill/address_editor_controller.h
@@ -24,7 +24,7 @@
   enum class LengthHint : int { HINT_LONG, HINT_SHORT };
   enum class ControlType : int { TEXTFIELD, TEXTFIELD_NUMBER, COMBOBOX };
 
-  EditorField(ServerFieldType type,
+  EditorField(FieldType type,
               std::u16string label,
               LengthHint length_hint,
               bool is_required,
@@ -36,7 +36,7 @@
         control_type(control_type) {}
 
   // Data type in the field.
-  ServerFieldType type;
+  FieldType type;
   // Label to be shown alongside the field.
   std::u16string label;
   // Hint about the length of this field's contents.
@@ -69,9 +69,9 @@
   // Updates `editor_fields_` based on the current selected country.
   void UpdateEditorFields(const std::string& country_code);
 
-  void SetProfileInfo(ServerFieldType type, const std::u16string& value);
+  void SetProfileInfo(FieldType type, const std::u16string& value);
 
-  std::u16string GetProfileInfo(ServerFieldType type);
+  std::u16string GetProfileInfo(FieldType type);
 
   const AutofillProfile& GetAddressProfile();
 
diff --git a/chrome/browser/ui/autofill/address_editor_controller_unittest.cc b/chrome/browser/ui/autofill/address_editor_controller_unittest.cc
index fa2b89c8..bad7a48 100644
--- a/chrome/browser/ui/autofill/address_editor_controller_unittest.cc
+++ b/chrome/browser/ui/autofill/address_editor_controller_unittest.cc
@@ -148,7 +148,7 @@
   CreateController(/*is_validatable=*/false);
 
   for (const auto& type_value_pair :
-       std::vector<std::pair<ServerFieldType, std::u16string>>{
+       std::vector<std::pair<FieldType, std::u16string>>{
            {ADDRESS_HOME_COUNTRY, u"Germany"},
            {NAME_FULL, u"John Doe"},
            {ADDRESS_HOME_STREET_ADDRESS, u"Lake St. 123"},
@@ -167,7 +167,7 @@
   CreateController(/*is_validatable=*/false);
   // Country, phone number and email address fields are added unconditionally
   // to the set of editor fields.
-  for (auto type : std::vector<ServerFieldType>{
+  for (auto type : std::vector<FieldType>{
            ADDRESS_HOME_COUNTRY, PHONE_HOME_WHOLE_NUMBER, EMAIL_ADDRESS}) {
     EXPECT_EQ(base::ranges::count_if(
                   controller_->editor_fields(),
diff --git a/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.cc b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.cc
index 25964bd..fe10956c 100644
--- a/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.cc
@@ -236,11 +236,11 @@
   // a fixed set of fields and doesn't depend on libaddressinput.
   if (is_migration_to_account_) {
     static constexpr std::array fields = {
-        ServerFieldType::NAME_FULL_WITH_HONORIFIC_PREFIX,
-        ServerFieldType::ADDRESS_HOME_LINE1, ServerFieldType::EMAIL_ADDRESS,
-        ServerFieldType::PHONE_HOME_WHOLE_NUMBER};
+        FieldType::NAME_FULL_WITH_HONORIFIC_PREFIX,
+        FieldType::ADDRESS_HOME_LINE1, FieldType::EMAIL_ADDRESS,
+        FieldType::PHONE_HOME_WHOLE_NUMBER};
     std::vector<std::u16string> values;
-    for (ServerFieldType field : fields) {
+    for (FieldType field : fields) {
       std::u16string value = address_profile_->GetInfo(field, app_locale_);
       if (!value.empty()) {
         values.push_back(value);
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc
index c2d1964d3..b23f9823 100644
--- a/chrome/browser/ui/chrome_pages.cc
+++ b/chrome/browser/ui/chrome_pages.cc
@@ -570,8 +570,6 @@
 
 void ShowPrivacySandboxAdMeasurementSettings(Browser* browser) {
   base::RecordAction(UserMetricsAction("Options_ShowPrivacySandbox"));
-  CHECK(
-      base::FeatureList::IsEnabled(privacy_sandbox::kPrivacySandboxSettings4));
   ShowSettingsSubPage(browser, kPrivacySandboxMeasurementSubpage);
 }
 
diff --git a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc
index 8b8b459..59f01fe 100644
--- a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc
+++ b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc
@@ -162,10 +162,6 @@
     switch (test_prompt_type_) {
       case PrivacySandboxService::PromptType::kNone:
         [[fallthrough]];
-      case PrivacySandboxService::PromptType::kNotice:
-        [[fallthrough]];
-      case PrivacySandboxService::PromptType::kConsent:
-        NOTREACHED_NORETURN();
       case PrivacySandboxService::PromptType::kM1Consent:
         [[fallthrough]];
       case PrivacySandboxService::PromptType::kM1NoticeROW:
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
index 62b5a00..5d74ae1 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -401,14 +401,12 @@
   bool privacy_sandbox_dialog_required = false;
   if (privacy_sandbox_service) {
     switch (privacy_sandbox_service->GetRequiredPromptType()) {
-      case PrivacySandboxService::PromptType::kConsent:
       case PrivacySandboxService::PromptType::kM1Consent:
       case PrivacySandboxService::PromptType::kM1NoticeEEA:
       case PrivacySandboxService::PromptType::kM1NoticeROW:
       case PrivacySandboxService::PromptType::kM1NoticeRestricted:
         privacy_sandbox_dialog_required = true;
         break;
-      case PrivacySandboxService::PromptType::kNotice:
       case PrivacySandboxService::PromptType::kNone:
         break;
     }
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index 29f9143..62b3d7d 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -426,9 +426,7 @@
     // android tab
     // TODO(crbug.com/1466970): Consider moving check conditions or the
     // registration logic to sensitivity_persisted_tab_data_android.*
-    if (!profile->IsOffTheRecord() &&
-        base::FeatureList::IsEnabled(
-            chrome::android::kAndroidAppIntegrationSafeSearch)) {
+    if (!profile->IsOffTheRecord()) {
       if (auto* tab = TabAndroid::FromWebContents(web_contents);
           (tab && !tab->IsCustomTab())) {
         SensitivityPersistedTabDataAndroid::From(
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc
index b19a297..213540e 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc
@@ -58,6 +58,7 @@
 #include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/base/test/ui_controls.h"
 #include "ui/display/display_switches.h"
 #include "ui/events/keycodes/keyboard_codes.h"
@@ -81,22 +82,10 @@
 #include "ui/aura/window.h"
 #endif
 
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ui/ozone/buildflags.h"
-#endif
-
 #if BUILDFLAG(IS_WIN)
 #include "ui/aura/window_tree_host.h"
 #endif
 
-// The build flag OZONE_PLATFORM_WAYLAND is only available on Linux or ChromeOS,
-// so this simplifies the later ifdefs.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
-#if BUILDFLAG(OZONE_PLATFORM_WAYLAND)
-#define OZONE_PLATFORM_WAYLAND
-#endif  // BUILDFLAG(OZONE_PLATFORM_WAYLAND)
-#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
-
 using base::ASCIIToUTF16;
 using bookmarks::BookmarkModel;
 using bookmarks::BookmarkNode;
@@ -1102,7 +1091,7 @@
 // Something about coordinate transforms is wrong on Wayland -- attempting to
 // hover the scroll buttons sends the mouse to the wrong location, so it never
 // winds up over the button, so the test times out.
-#if defined(OZONE_PLATFORM_WAYLAND)
+#if BUILDFLAG(IS_OZONE_WAYLAND)
 #define MAYBE_ScrollButtonScrolls DISABLED_ScrollButtonScrolls
 #else
 #define MAYBE_ScrollButtonScrolls ScrollButtonScrolls
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_interactive_uitest.cc b/chrome/browser/ui/views/download/bubble/download_bubble_interactive_uitest.cc
index 4381513..5bdeb805 100644
--- a/chrome/browser/ui/views/download/bubble/download_bubble_interactive_uitest.cc
+++ b/chrome/browser/ui/views/download/bubble/download_bubble_interactive_uitest.cc
@@ -6,10 +6,7 @@
 #include "build/buildflag.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/download/bubble/download_bubble_prefs.h"
-#include "chrome/browser/download/chrome_download_manager_delegate.h"
 #include "chrome/browser/download/download_browsertest_utils.h"
-#include "chrome/browser/download/download_core_service.h"
-#include "chrome/browser/download/download_core_service_factory.h"
 #include "chrome/browser/ui/accelerator_utils.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_test.h"
@@ -19,13 +16,12 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/common/chrome_features.h"
-#include "chrome/test/base/ui_test_utils.h"
 #include "chrome/test/interaction/interactive_browser_test.h"
 #include "components/feature_engagement/public/feature_constants.h"
 #include "components/feature_engagement/test/scoped_iph_feature_list.h"
 #include "components/user_education/test/feature_promo_test_util.h"
 #include "content/public/test/browser_test.h"
-#include "content/public/test/download_test_observer.h"
+#include "testing/gtest/include/gtest/gtest.h"
 #include "ui/views/widget/any_widget_observer.h"
 #include "url/gurl.h"
 
@@ -60,51 +56,12 @@
 }
 #endif
 
-// TODO(chlily): Deduplicate this helper class into a test utils file.
-class TestDownloadManagerDelegate : public ChromeDownloadManagerDelegate {
- public:
-  explicit TestDownloadManagerDelegate(Profile* profile)
-      : ChromeDownloadManagerDelegate(profile) {
-    GetDownloadIdReceiverCallback().Run(download::DownloadItem::kInvalidId + 1);
-  }
-  ~TestDownloadManagerDelegate() override {}
-
-  bool DetermineDownloadTarget(
-      download::DownloadItem* item,
-      content::DownloadTargetCallback* callback) override {
-    content::DownloadTargetCallback dangerous_callback = base::BindOnce(
-        &TestDownloadManagerDelegate::SetDangerous, std::move(*callback));
-    bool run = ChromeDownloadManagerDelegate::DetermineDownloadTarget(
-        item, &dangerous_callback);
-    // ChromeDownloadManagerDelegate::DetermineDownloadTarget() needs to run the
-    // |callback|.
-    DCHECK(run);
-    DCHECK(!dangerous_callback);
-    return true;
-  }
-
-  static void SetDangerous(content::DownloadTargetCallback callback,
-                           const base::FilePath& target_path,
-                           download::DownloadItem::TargetDisposition disp,
-                           download::DownloadDangerType danger_type,
-                           download::DownloadItem::InsecureDownloadStatus ids,
-                           const base::FilePath& intermediate_path,
-                           const base::FilePath& display_name,
-                           const std::string& mime_type,
-                           download::DownloadInterruptReason reason) {
-    std::move(callback).Run(target_path, disp,
-                            download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, ids,
-                            intermediate_path, display_name, mime_type, reason);
-  }
-};
-
 class DownloadBubbleInteractiveUiTest : public DownloadTestBase,
                                         public InteractiveBrowserTestApi {
  public:
   DownloadBubbleInteractiveUiTest() {
     test_features_.InitAndEnableFeatures(
-        {feature_engagement::kIPHDownloadEsbPromoFeature,
-         feature_engagement::kIPHDownloadToolbarButtonFeature
+        {feature_engagement::kIPHDownloadToolbarButtonFeature
 #if BUILDFLAG(IS_MAC)
          ,
          features::kImmersiveFullscreen
@@ -167,15 +124,17 @@
         download_toolbar_button(), active);
   }
 
-  auto DownloadBubblePromoIsActive(bool active, const base::Feature& feature) {
+  auto DownloadBubblePromoIsActive(bool active) {
     return base::BindOnce(
         [](DownloadToolbarButtonView* download_toolbar_button, Browser* browser,
-           bool active, const base::Feature& feature) {
-          return active == BrowserView::GetBrowserViewForBrowser(browser)
-                               ->GetFeaturePromoController()
-                               ->IsPromoActive(feature);
+           bool active) {
+          return active ==
+                 BrowserView::GetBrowserViewForBrowser(browser)
+                     ->GetFeaturePromoController()
+                     ->IsPromoActive(
+                         feature_engagement::kIPHDownloadToolbarButtonFeature);
         },
-        download_toolbar_button(), browser(), active, std::cref(feature));
+        download_toolbar_button(), browser(), active);
   }
 
   auto ChangeButtonVisibility(bool visible) {
@@ -209,26 +168,6 @@
         [this, url]() { DownloadAndWait(browser(), url); });
   }
 
-  auto DownloadDangerousTestFile() {
-    // Set up the fake delegate that forces the download to be malicious.
-    std::unique_ptr<TestDownloadManagerDelegate> test_delegate(
-        new TestDownloadManagerDelegate(browser()->profile()));
-    DownloadCoreServiceFactory::GetForBrowserContext(browser()->profile())
-        ->SetDownloadManagerDelegateForTesting(std::move(test_delegate));
-    GURL url = embedded_test_server()->GetURL(
-        DownloadTestBase::kDangerousMockFilePath);
-
-    EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-    return base::BindLambdaForTesting([this]() {
-      std::unique_ptr<content::DownloadTestObserver> waiter{
-          DangerousDownloadWaiter(
-              browser(), /*num_downloads=*/1,
-              content::DownloadTestObserver::DangerousDownloadAction::
-                  ON_DANGEROUS_DOWNLOAD_QUIT)};
-      waiter->WaitForFinished();
-    });
-  }
-
 #if !BUILDFLAG(IS_MAC)
   // Check for whether the exclusive access bubble is shown ("Press Esc to
   // exit fullscreen" or other similar message).
@@ -303,23 +242,21 @@
 
 IN_PROC_BROWSER_TEST_F(DownloadBubbleInteractiveUiTest,
                        DownloadBubbleInteractedWith_NoIPHShown) {
-  RunTestSequence(
-      Do(ChangeButtonVisibility(true)),
-      WaitForShow(kToolbarDownloadButtonElementId),
-      Check(DownloadBubbleIsShowingDetails(false)),
-      // Press the button to register an interaction (which should
-      // suppress the IPH) which opens the main view.
-      PressButton(kToolbarDownloadButtonElementId),
-      // Close the main view.
-      Do(ChangeBubbleVisibility(false)),
-      // Now download a file to show the partial view, if enabled.
-      Do(DownloadTestFile()),
-      Check(DownloadBubbleIsShowingDetails(IsPartialViewEnabled())),
-      // Hide the partial view, if enabled. No IPH is shown.
-      Do(ChangeBubbleVisibility(false)),
-      Check(DownloadBubbleIsShowingDetails(false)),
-      Check(DownloadBubblePromoIsActive(
-          false, feature_engagement::kIPHDownloadToolbarButtonFeature)));
+  RunTestSequence(Do(ChangeButtonVisibility(true)),
+                  WaitForShow(kToolbarDownloadButtonElementId),
+                  Check(DownloadBubbleIsShowingDetails(false)),
+                  // Press the button to register an interaction (which should
+                  // suppress the IPH) which opens the main view.
+                  PressButton(kToolbarDownloadButtonElementId),
+                  // Close the main view.
+                  Do(ChangeBubbleVisibility(false)),
+                  // Now download a file to show the partial view, if enabled.
+                  Do(DownloadTestFile()),
+                  Check(DownloadBubbleIsShowingDetails(IsPartialViewEnabled())),
+                  // Hide the partial view, if enabled. No IPH is shown.
+                  Do(ChangeBubbleVisibility(false)),
+                  Check(DownloadBubbleIsShowingDetails(false)),
+                  Check(DownloadBubblePromoIsActive(false)));
 }
 
 IN_PROC_BROWSER_TEST_F(DownloadBubbleInteractiveUiTest,
@@ -330,41 +267,9 @@
                   // Hide the partial view, if enabled. The IPH should be shown.
                   Do(ChangeBubbleVisibility(false)),
                   Check(DownloadBubbleIsShowingDetails(false)),
-                  Check(DownloadBubblePromoIsActive(
-                      IsPartialViewEnabled(),
-                      feature_engagement::kIPHDownloadToolbarButtonFeature)));
+                  Check(DownloadBubblePromoIsActive(IsPartialViewEnabled())));
 }
 
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-IN_PROC_BROWSER_TEST_F(DownloadBubbleInteractiveUiTest,
-                       DownloadBubbleEsbShownAfterDownload_IPHShown) {
-  RunTestSequence(Do(DownloadDangerousTestFile()),
-                  WaitForShow(kToolbarDownloadButtonElementId),
-                  Check(DownloadBubbleIsShowingDetails(IsPartialViewEnabled())),
-                  // Hide the partial view, if enabled. The IPH should be shown.
-                  Do(ChangeBubbleVisibility(false)),
-                  Check(DownloadBubbleIsShowingDetails(false)),
-                  Check(DownloadBubblePromoIsActive(
-                      IsPartialViewEnabled(),
-                      feature_engagement::kIPHDownloadEsbPromoFeature)));
-}
-
-IN_PROC_BROWSER_TEST_F(
-    DownloadBubbleInteractiveUiTest,
-    DownloadBubbleEsbShownAfterDownloadWithoutSafeBrowsing_NoIPHShown) {
-  browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled,
-                                               false);
-  RunTestSequence(Do(DownloadDangerousTestFile()),
-                  WaitForShow(kToolbarDownloadButtonElementId),
-                  Check(DownloadBubbleIsShowingDetails(IsPartialViewEnabled())),
-                  // Hide the partial view, if enabled. The IPH should be shown.
-                  Do(ChangeBubbleVisibility(false)),
-                  Check(DownloadBubbleIsShowingDetails(false)),
-                  Check(DownloadBubblePromoIsActive(
-                      false, feature_engagement::kIPHDownloadEsbPromoFeature)));
-}
-#endif
-
 // This test is only for ChromeOS and Mac where we have immersive fullscreen.
 #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_MAC)
 IN_PROC_BROWSER_TEST_F(DownloadBubbleInteractiveUiTest,
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
index dfbc53e..21d3794 100644
--- a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
+++ b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
@@ -41,7 +41,6 @@
 #include "chrome/grit/generated_resources.h"
 #include "components/feature_engagement/public/feature_constants.h"
 #include "components/safe_browsing/core/common/features.h"
-#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/user_education/common/user_education_class_properties.h"
 #include "content/public/browser/browser_thread.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -717,17 +716,6 @@
 }
 
 void DownloadToolbarButtonView::OnPartialViewClosed() {
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-  Profile* profile = browser_->profile();
-  if (safe_browsing::GetSafeBrowsingState(*profile->GetPrefs()) ==
-          safe_browsing::SafeBrowsingState::STANDARD_PROTECTION &&
-      !profile->IsOffTheRecord() &&
-      browser_->window()->MaybeShowFeaturePromo(
-          feature_engagement::kIPHDownloadEsbPromoFeature)) {
-    return;
-  }
-#endif
-
   if (download::ShouldSuppressDownloadBubbleIph(
           browser_->profile()->GetOriginalProfile())) {
     return;
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc
index dc6409f..accab54 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc
@@ -20,7 +20,6 @@
 #include "chrome/browser/ui/color/chrome_color_id.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
-#include "chrome/browser/ui/sad_tab_helper.h"
 #include "chrome/browser/ui/views/frame/browser_frame.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
@@ -28,7 +27,6 @@
 #include "chrome/browser/ui/views/frame/tab_strip_region_view.h"
 #include "chrome/browser/ui/views/frame/top_container_view.h"
 #include "chrome/browser/ui/views/profiles/profile_indicator_icon.h"
-#include "chrome/browser/ui/views/sad_tab_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel.h"
 #include "chrome/browser/ui/views/tab_icon_view.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
@@ -1044,7 +1042,6 @@
 }
 
 void BrowserNonClientFrameViewChromeOS::UpdateWindowRoundedCorners() {
-  using DevToolsDockedPlacement = BrowserView::DevToolsDockedPlacement;
   const int corner_radius =
       chromeos::GetFrameCornerRadius(frame()->GetNativeWindow());
 
@@ -1052,83 +1049,8 @@
     frame_header_->SetHeaderCornerRadius(corner_radius);
   }
 
-  if (!chromeos::features::IsRoundedWindowsEnabled()) {
-    return;
-  }
-
-  SidePanel* side_panel = browser_view()->unified_side_panel();
-  const bool right_aligned_side_panel_showing =
-      side_panel->GetVisible() && side_panel->IsRightAligned();
-  const bool left_aligned_side_panel_showing =
-      side_panel->GetVisible() && !side_panel->IsRightAligned();
-
-  // If side panel is visible, round one of the bottom two corners of the side
-  // panel based on its alignment w.r.t to web contents.
-  side_panel->SetBackgroundRadii(gfx::RoundedCornersF(
-      0, 0, right_aligned_side_panel_showing ? corner_radius : 0,
-      left_aligned_side_panel_showing ? corner_radius : 0));
-
-  views::WebView* devtools_webview = browser_view()->devtools_web_view();
-  CHECK(devtools_webview);
-  CHECK(devtools_webview->holder());
-
-  // If devtools are visible, round one of the bottom two corners of the
-  // the devtools context based on the alignment of the side panel. Since
-  // devtools cover the full bounds of the web contents container, if the side
-  // panel is not visible, we have to round the bottom two corners of side panel
-  // irrespective of its docked placement.
-  devtools_webview->holder()->SetCornerRadii(gfx::RoundedCornersF(
-      0, 0, right_aligned_side_panel_showing ? 0 : corner_radius,
-      left_aligned_side_panel_showing ? 0 : corner_radius));
-
-  const DevToolsDockedPlacement devtools_placement =
-      browser_view()->devtools_docked_placement();
-  CHECK_NE(devtools_placement, DevToolsDockedPlacement::kUnknown);
-
-  // Rounded the contents webview.
-  ContentsWebView* contents_webview = browser_view()->contents_web_view();
-  const views::View* contents_container = browser_view()->contents_container();
-
-  const bool devtools_showing =
-      contents_webview->bounds() != contents_container->GetLocalBounds();
-
-  const gfx::RoundedCornersF contents_webview_radii(
-      0, 0,
-      right_aligned_side_panel_showing ||
-              (devtools_showing &&
-               devtools_placement != DevToolsDockedPlacement::kLeft)
-          ? 0
-          : corner_radius,
-      left_aligned_side_panel_showing ||
-              (devtools_showing &&
-               devtools_placement != DevToolsDockedPlacement::kRight)
-          ? 0
-          : corner_radius);
-
-  // SideTabView is shown when the renderer crashes. Initially the SabTabView
-  // gets the same corners as the contents webview it gets attached to but its
-  // radii needs to be updated as it is unaware of the client view layout
-  // changes.
-  bool sad_tab_showing = false;
-  if (contents_webview->web_contents()) {
-    if (auto* sad_tab_helper =
-            SadTabHelper::FromWebContents(contents_webview->web_contents());
-        sad_tab_helper->sad_tab()) {
-      static_cast<SadTabView*>(sad_tab_helper->sad_tab())
-          ->SetBackgroundRadii(contents_webview_radii);
-      sad_tab_showing = true;
-    }
-  }
-
-  CHECK(contents_webview);
-  CHECK(contents_webview->holder());
-
-  contents_webview->SetBackgroundRadii(contents_webview_radii);
-
-  // We do not need to round contents_webview, if SadTabView is shown instead of
-  // contents_webview.
-  if (!sad_tab_showing) {
-    contents_webview->holder()->SetCornerRadii(contents_webview_radii);
+  if (chromeos::features::IsRoundedWindowsEnabled()) {
+    GetWidget()->client_view()->UpdateWindowRoundedCorners();
   }
 }
 
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 9b5c00b..2af30a6 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -432,35 +432,6 @@
   return false;
 }
 
-// Return the DevTools docked placement. It infers the docked placement from
-// the bounds of contents_webview relative to the local bounds of the container
-// that holds both contents_webview and devtools_webview.
-BrowserView::DevToolsDockedPlacement GetDevToolsDockedPlacement(
-    const gfx::Rect& contents_webview_bounds,
-    const gfx::Rect& local_webview_container_bounds) {
-  // If contents_webview has the same bounds as webview_container, it either
-  // means that devtools are not open or devtools are open in a separate
-  // window (not docked).
-  if (contents_webview_bounds == local_webview_container_bounds) {
-    return BrowserView::DevToolsDockedPlacement::kNone;
-  }
-
-  if (contents_webview_bounds.x() > 0 && contents_webview_bounds.y() == 0 &&
-      contents_webview_bounds.x() + contents_webview_bounds.width() ==
-          local_webview_container_bounds.width()) {
-    return BrowserView::DevToolsDockedPlacement::kLeft;
-  } else if (contents_webview_bounds.origin().IsOrigin() &&
-             contents_webview_bounds.height() ==
-                 local_webview_container_bounds.height()) {
-    return BrowserView::DevToolsDockedPlacement::kRight;
-  } else if (contents_webview_bounds.width() ==
-             local_webview_container_bounds.width()) {
-    return BrowserView::DevToolsDockedPlacement::kBottom;
-  }
-
-  return BrowserView::DevToolsDockedPlacement::kUnknown;
-}
-
 bool IsManagedGuestSession() {
 #if BUILDFLAG(IS_CHROMEOS)
   return chromeos::IsManagedGuestSession();
@@ -1594,6 +1565,33 @@
       ThemeProperties::kFrameHeightAboveTabs - browser_view_origin.y());
 }
 
+// static:
+BrowserView::DevToolsDockedPlacement BrowserView::GetDevToolsDockedPlacement(
+    const gfx::Rect& contents_webview_bounds,
+    const gfx::Rect& local_webview_container_bounds) {
+  // If contents_webview has the same bounds as webview_container, it either
+  // means that devtools are not open or devtools are open in a separate
+  // window (not docked).
+  if (contents_webview_bounds == local_webview_container_bounds) {
+    return BrowserView::DevToolsDockedPlacement::kNone;
+  }
+
+  if (contents_webview_bounds.x() > 0 && contents_webview_bounds.y() == 0 &&
+      contents_webview_bounds.x() + contents_webview_bounds.width() ==
+          local_webview_container_bounds.width()) {
+    return BrowserView::DevToolsDockedPlacement::kLeft;
+  } else if (contents_webview_bounds.origin().IsOrigin() &&
+             contents_webview_bounds.height() ==
+                 local_webview_container_bounds.height()) {
+    return BrowserView::DevToolsDockedPlacement::kRight;
+  } else if (contents_webview_bounds.width() ==
+             local_webview_container_bounds.width()) {
+    return BrowserView::DevToolsDockedPlacement::kBottom;
+  }
+
+  return BrowserView::DevToolsDockedPlacement::kUnknown;
+}
+
 bool BrowserView::IsLoadingAnimationRunningForTesting() const {
   return loading_animation_timer_.IsRunning();
 }
@@ -4195,18 +4193,6 @@
       IsToolbarVisible() ? FocusBehavior::ALWAYS : FocusBehavior::NEVER);
   frame()->GetFrameView()->UpdateMinimumSize();
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  // In chromeOS ash we round the bottom two corners of the browser frame by
-  // rounding the respective corners of visible client contents i.e main web
-  // contents, devtools web contents and side panel. When ever there is change
-  // in the layout or visibility of these contents (devtools opened, devtools
-  // docked placement change, side panel open etc), we might need to update
-  // which corners are currently rounded. See
-  // `BrowserNonClientFrameViewChromeOS::UpdateWindowRoundedCorners()` for more
-  // details.
-  frame()->GetFrameView()->UpdateWindowRoundedCorners();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
   // Some of the situations when the BrowserView is laid out are:
   // - Enter/exit immersive fullscreen mode.
   // - Enter/exit tablet mode.
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index b748525..0339944 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -127,17 +127,6 @@
  public:
   METADATA_HEADER(BrowserView);
 
-  // Enumerates where the devtools are docked relative to the browser's main
-  // web contents.
-  enum class DevToolsDockedPlacement {
-    kLeft,
-    kRight,
-    kBottom,
-    // Devtools are not docked.
-    kNone,
-    kUnknown
-  };
-
   explicit BrowserView(std::unique_ptr<Browser> browser);
   BrowserView(const BrowserView&) = delete;
   BrowserView& operator=(const BrowserView&) = delete;
@@ -270,10 +259,6 @@
   ContentsWebView* contents_web_view() { return contents_web_view_; }
   views::WebView* devtools_web_view() { return devtools_web_view_; }
 
-  DevToolsDockedPlacement devtools_docked_placement() const {
-    return current_devtools_docked_placement_;
-  }
-
   base::WeakPtr<BrowserView> GetAsWeakPtr() {
     return weak_ptr_factory_.GetWeakPtr();
   }
@@ -833,6 +818,29 @@
   // TopContainerBackground::PaintThemeCustomImage for details.
   gfx::Point GetThemeOffsetFromBrowserView() const;
 
+ protected:
+  // Enumerates where the devtools are docked relative to the browser's main
+  // web contents.
+  enum class DevToolsDockedPlacement {
+    kLeft,
+    kRight,
+    kBottom,
+    // Devtools are not docked.
+    kNone,
+    kUnknown
+  };
+
+  DevToolsDockedPlacement devtools_docked_placement() const {
+    return current_devtools_docked_placement_;
+  }
+
+  // Return the DevTools docked placement. It infers the docked placement from
+  // the bounds of contents_webview relative to the local bounds of the
+  // container that holds both contents_webview and devtools_webview.
+  static DevToolsDockedPlacement GetDevToolsDockedPlacement(
+      const gfx::Rect& contents_webview_bounds,
+      const gfx::Rect& local_webview_container_bounds);
+
  private:
   // Do not friend BrowserViewLayout. Use the BrowserViewLayoutDelegate
   // interface to keep these two classes decoupled and testable.
diff --git a/chrome/browser/ui/views/frame/browser_view_ash.cc b/chrome/browser/ui/views/frame/browser_view_ash.cc
new file mode 100644
index 0000000..bf3ce7b
--- /dev/null
+++ b/chrome/browser/ui/views/frame/browser_view_ash.cc
@@ -0,0 +1,108 @@
+// 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 <algorithm>
+
+#include "base/check.h"
+#include "chrome/browser/ui/sad_tab_helper.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/frame/browser_view_ash.h"
+#include "chrome/browser/ui/views/sad_tab_view.h"
+#include "chrome/browser/ui/views/side_panel/side_panel.h"
+#include "chromeos/ui/frame/frame_utils.h"
+#include "ui/gfx/geometry/rounded_corners_f.h"
+#include "ui/views/controls/webview/webview.h"
+
+BrowserViewAsh::BrowserViewAsh(std::unique_ptr<Browser> browser)
+    : BrowserView(std::move(browser)) {}
+
+void BrowserViewAsh::Layout() {
+  BrowserView::Layout();
+
+  // In chromeOS ash we round the bottom two corners of the browser frame by
+  // rounding the respective corners of visible client contents i.e main web
+  // contents, devtools web contents and side panel. When ever there is change
+  // in the layout or visibility of these contents (devtools opened, devtools
+  // docked placement change, side panel open etc), we might need to update
+  // which corners are currently rounded. See
+  // `BrowserNonClientFrameViewChromeOS::UpdateWindowRoundedCorners()` for more
+  // details.
+  DCHECK(GetWidget());
+  GetWidget()->non_client_view()->frame_view()->UpdateWindowRoundedCorners();
+}
+
+void BrowserViewAsh::UpdateWindowRoundedCorners() {
+  const int corner_radius =
+      chromeos::GetFrameCornerRadius(frame()->GetNativeWindow());
+
+  SidePanel* side_panel = unified_side_panel();
+  const bool right_aligned_side_panel_showing =
+      side_panel->GetVisible() && side_panel->IsRightAligned();
+  const bool left_aligned_side_panel_showing =
+      side_panel->GetVisible() && !side_panel->IsRightAligned();
+
+  // If side panel is visible, round one of the bottom two corners of the side
+  // panel based on its alignment w.r.t to web contents.
+  side_panel->SetBackgroundRadii(gfx::RoundedCornersF(
+      0, 0, right_aligned_side_panel_showing ? corner_radius : 0,
+      left_aligned_side_panel_showing ? corner_radius : 0));
+
+  views::WebView* devtools_webview = devtools_web_view();
+  CHECK(devtools_webview);
+  CHECK(devtools_webview->holder());
+
+  // If devtools are visible, round one of the bottom two corners of the
+  // the devtools context based on the alignment of the side panel. Since
+  // devtools cover the full bounds of the web contents container, if the side
+  // panel is not visible, we have to round the bottom two corners of side panel
+  // irrespective of its docked placement.
+  devtools_webview->holder()->SetCornerRadii(gfx::RoundedCornersF(
+      0, 0, right_aligned_side_panel_showing ? 0 : corner_radius,
+      left_aligned_side_panel_showing ? 0 : corner_radius));
+
+  const DevToolsDockedPlacement devtools_placement =
+      devtools_docked_placement();
+  CHECK_NE(devtools_placement, DevToolsDockedPlacement::kUnknown);
+
+  // Rounded the contents webview.
+  ContentsWebView* contents_webview = contents_web_view();
+  const views::View* container = contents_container();
+
+  const bool devtools_showing =
+      contents_webview->bounds() != container->GetLocalBounds();
+
+  const gfx::RoundedCornersF contents_webview_radii(
+      0, 0,
+      right_aligned_side_panel_showing ||
+              (devtools_showing &&
+               devtools_placement != DevToolsDockedPlacement::kLeft)
+          ? 0
+          : corner_radius,
+      left_aligned_side_panel_showing ||
+              (devtools_showing &&
+               devtools_placement != DevToolsDockedPlacement::kRight)
+          ? 0
+          : corner_radius);
+
+  CHECK(contents_webview);
+  CHECK(contents_webview->holder());
+
+  if (contents_webview->web_contents()) {
+    // SideTabView is shown when the renderer crashes. Initially the SabTabView
+    // gets the same corners as the contents webview it gets attached to but its
+    // radii needs to be updated as it is unaware of the client view layout
+    // changes.
+    if (auto* sad_tab_helper =
+            SadTabHelper::FromWebContents(contents_webview->web_contents());
+        sad_tab_helper->sad_tab()) {
+      static_cast<SadTabView*>(sad_tab_helper->sad_tab())
+          ->SetBackgroundRadii(contents_webview_radii);
+    } else {
+      // We only round contents_webview, if SadTabView is not showing.
+      contents_webview->holder()->SetCornerRadii(contents_webview_radii);
+    }
+  }
+
+  contents_webview->SetBackgroundRadii(contents_webview_radii);
+}
diff --git a/chrome/browser/ui/views/frame/browser_view_ash.h b/chrome/browser/ui/views/frame/browser_view_ash.h
new file mode 100644
index 0000000..45b5276
--- /dev/null
+++ b/chrome/browser/ui/views/frame/browser_view_ash.h
@@ -0,0 +1,32 @@
+// 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_UI_VIEWS_FRAME_BROWSER_VIEW_ASH_H_
+#define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_ASH_H_
+
+#include <memory>
+
+#include "chrome/browser/ui/views/frame/browser_view.h"
+
+class Browser;
+
+// BrowserViewAsh provides the ClientView for Chrome browser windows on Chrome
+// OS under classic ash.
+class BrowserViewAsh : public BrowserView {
+ public:
+  explicit BrowserViewAsh(std::unique_ptr<Browser> browser);
+
+  BrowserViewAsh(const BrowserViewAsh&) = delete;
+  BrowserViewAsh& operator=(const BrowserViewAsh&) = delete;
+
+  ~BrowserViewAsh() override = default;
+
+  // views::View:
+  void Layout() override;
+
+  // views::ClientView:
+  void UpdateWindowRoundedCorners() override;
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_VIEW_ASH_H_
diff --git a/chrome/browser/ui/views/frame/browser_window_factory.cc b/chrome/browser/ui/views/frame/browser_window_factory.cc
index b1caa1bd..f6ac455 100644
--- a/chrome/browser/ui/views/frame/browser_window_factory.cc
+++ b/chrome/browser/ui/views/frame/browser_window_factory.cc
@@ -25,6 +25,7 @@
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ui/views/frame/browser_view_ash.h"
 #include "chrome/browser/ui/views/frame/custom_tab_browser_frame.h"
 #endif
 
@@ -50,11 +51,14 @@
 #endif
   // Create the view and the frame. The frame will attach itself via the view
   // so we don't need to do anything with the pointer.
-  BrowserView* view = new BrowserView(std::move(browser));
+  BrowserView* view = nullptr;
   BrowserFrame* browser_frame = nullptr;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+  view = new BrowserViewAsh(std::move(browser));
   if (view->browser()->is_type_custom_tab())
     browser_frame = new CustomTabBrowserFrame(view);
+#else
+  view = new BrowserView(std::move(browser));
 #endif
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
   browser_frame = new BrowserFrameLacros(view);
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
index 98d7631b..101f8b9 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
@@ -27,10 +27,8 @@
 
 namespace {
 
-constexpr int kDialogWidth = 512;
 constexpr int kM1DialogWidth = 600;
-constexpr int kDefaultConsentDialogHeight = 569;
-constexpr int kDefaultNoticeDialogHeight = 494;
+constexpr int kDefaultDialogHeight = 494;
 constexpr int kMinRequiredDialogHeight = 100;
 constexpr int kMinRequiredDialogWidth = 400;
 
@@ -39,9 +37,6 @@
   GURL combined_dialog_url =
       base_url.Resolve(chrome::kChromeUIPrivacySandboxDialogCombinedPath);
   switch (prompt_type) {
-    case PrivacySandboxService::PromptType::kConsent:
-    case PrivacySandboxService::PromptType::kNotice:
-      return base_url;
     case PrivacySandboxService::PromptType::kM1Consent:
       return combined_dialog_url;
     case PrivacySandboxService::PromptType::kM1NoticeROW:
@@ -58,9 +53,6 @@
 
 int GetDialogWidth(PrivacySandboxService::PromptType prompt_type) {
   switch (prompt_type) {
-    case PrivacySandboxService::PromptType::kConsent:
-    case PrivacySandboxService::PromptType::kNotice:
-      return kDialogWidth;
     case PrivacySandboxService::PromptType::kM1Consent:
     case PrivacySandboxService::PromptType::kM1NoticeROW:
     case PrivacySandboxService::PromptType::kM1NoticeEEA:
@@ -161,10 +153,8 @@
                             .width();
   const int width = views::LayoutProvider::Get()->GetSnappedDialogWidth(
       GetDialogWidth(prompt_type));
-  const int height = prompt_type == PrivacySandboxService::PromptType::kConsent
-                         ? kDefaultConsentDialogHeight
-                         : kDefaultNoticeDialogHeight;
-  web_view_->SetPreferredSize(gfx::Size(std::min(width, max_width), height));
+  web_view_->SetPreferredSize(
+      gfx::Size(std::min(width, max_width), kDefaultDialogHeight));
 
   PrivacySandboxDialogUI* web_ui = web_view_->GetWebContents()
                                        ->GetWebUI()
@@ -224,5 +214,10 @@
   chrome::ShowPrivacySandboxAdMeasurementSettings(browser_);
 }
 
+content::WebContents* PrivacySandboxDialogView::GetWebContentsForTesting() {
+  CHECK(web_view_);
+  return web_view_->GetWebContents();
+}
+
 BEGIN_METADATA(PrivacySandboxDialogView, views::View)
 END_METADATA
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h
index 426e2bfb..148170d 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h
@@ -12,6 +12,10 @@
 
 class Browser;
 
+namespace content {
+class WebContents;
+}
+
 namespace views {
 class WebView;
 }
@@ -31,6 +35,8 @@
   void ShowNativeView();
   void OpenPrivacySandboxSettings();
   void OpenPrivacySandboxAdMeasurementSettings();
+  friend class PrivacySandboxDialogViewBrowserTest;
+  content::WebContents* GetWebContentsForTesting();
 
   raw_ptr<views::WebView> web_view_;
   raw_ptr<Browser> browser_;
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
deleted file mode 100644
index a83eb1c..0000000
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "build/build_config.h"
-#include "chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h"
-#include "chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/test/test_browser_dialog.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/test/browser_test.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "ui/views/widget/any_widget_observer.h"
-#include "ui/views/widget/widget.h"
-
-namespace {
-
-constexpr int kAverageBrowserWidth = 800;
-constexpr int kAverageBrowserHeight = 700;
-
-}  // namespace
-
-class PrivacySandboxDialogViewBrowserTest : public DialogBrowserTest {
- public:
-  void SetUpOnMainThread() override {
-    mock_service_ = static_cast<MockPrivacySandboxService*>(
-        PrivacySandboxServiceFactory::GetInstance()->SetTestingFactoryAndUse(
-            browser()->profile(),
-            base::BindRepeating(&BuildMockPrivacySandboxService)));
-  }
-
-  // DialogBrowserTest:
-  void ShowUi(const std::string& name) override {
-    PrivacySandboxService::PromptType prompt_type =
-        PrivacySandboxService::PromptType::kNone;
-    if (name == "Consent") {
-      prompt_type = PrivacySandboxService::PromptType::kConsent;
-    }
-    if (name == "Notice") {
-      prompt_type = PrivacySandboxService::PromptType::kNotice;
-    }
-    if (name == "RestrictedNotice") {
-      prompt_type = PrivacySandboxService::PromptType::kM1NoticeRestricted;
-    }
-    ASSERT_NE(prompt_type, PrivacySandboxService::PromptType::kNone);
-
-    // Resize the browser window to guarantee enough space for the dialog.
-    BrowserView::GetBrowserViewForBrowser(browser())->GetWidget()->SetBounds(
-        {0, 0, kAverageBrowserWidth, kAverageBrowserHeight});
-
-    views::NamedWidgetShownWaiter waiter(
-        views::test::AnyWidgetTestPasskey{},
-        PrivacySandboxDialogView::kViewClassName);
-    ShowPrivacySandboxDialog(browser(), prompt_type);
-    waiter.WaitIfNeededAndGet();
-
-    base::RunLoop().RunUntilIdle();
-  }
-
-  MockPrivacySandboxService* mock_service() { return mock_service_; }
-
- private:
-  raw_ptr<MockPrivacySandboxService, DanglingUntriaged> mock_service_;
-};
-
-// TODO(crbug.com/1511488): Re-enable once the flakiness is fixed.
-IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewBrowserTest,
-                       DISABLED_InvokeUi_Consent) {
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(PrivacySandboxService::PromptAction::kConsentShown));
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(
-          PrivacySandboxService::PromptAction::kConsentClosedNoDecision));
-  ShowAndVerifyUi();
-}
-
-IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewBrowserTest, InvokeUi_Notice) {
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(PrivacySandboxService::PromptAction::kNoticeShown));
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(
-          PrivacySandboxService::PromptAction::kNoticeClosedNoInteraction));
-  ShowAndVerifyUi();
-}
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc
index 9bf0923..ef3a793 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc
@@ -20,93 +20,9 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "ui/base/ozone_buildflags.h"
 #include "ui/views/widget/any_widget_observer.h"
 #include "ui/views/widget/widget.h"
 
-class PrivacySandboxDialogViewInteractiveUiTest : public InProcessBrowserTest {
- public:
-  void SetUpOnMainThread() override {
-    mock_service_ = static_cast<MockPrivacySandboxService*>(
-        PrivacySandboxServiceFactory::GetInstance()->SetTestingFactoryAndUse(
-            browser()->profile(),
-            base::BindRepeating(&BuildMockPrivacySandboxService)));
-  }
-
-  MockPrivacySandboxService* mock_service() { return mock_service_; }
-
- private:
-  raw_ptr<MockPrivacySandboxService, DanglingUntriaged> mock_service_;
-};
-
-// TODO(crbug.com/1315979): Flaky on most release builds.
-// TODO(crbug.com/1430490): Broken on macOS
-#if defined(NDEBUG) || BUILDFLAG(IS_CHROMEOS_ASH) || \
-    BUILDFLAG(IS_OZONE_WAYLAND) || BUILDFLAG(IS_MAC)
-#define MAYBE_EscapeClosesNotice DISABLED_EscapeClosesNotice
-#else
-#define MAYBE_EscapeClosesNotice EscapeClosesNotice
-#endif
-IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewInteractiveUiTest,
-                       MAYBE_EscapeClosesNotice) {
-  // Check that when the escape key is pressed, the notice is closed.
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(PrivacySandboxService::PromptAction::kNoticeShown));
-  EXPECT_CALL(*mock_service(),
-              PromptActionOccurred(
-                  PrivacySandboxService::PromptAction::kNoticeDismiss));
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(
-          PrivacySandboxService::PromptAction::kNoticeClosedNoInteraction))
-      .Times(0);
-  views::NamedWidgetShownWaiter waiter(
-      views::test::AnyWidgetTestPasskey{},
-      PrivacySandboxDialogView::kViewClassName);
-  ShowPrivacySandboxPrompt(browser(),
-                           PrivacySandboxService::PromptType::kNotice);
-  auto* dialog = waiter.WaitIfNeededAndGet();
-  EXPECT_TRUE(dialog);
-  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false,
-                                              false, false, false));
-  // The dialog can be in the deletion process at this stage, so don't check
-  // if the dialog is closed. Instead, rely on the actions logged from the
-  // service.
-  base::RunLoop().RunUntilIdle();
-
-  // Shutting down the browser test will naturally shut the dialog, verify
-  // expectations before that happens.
-  testing::Mock::VerifyAndClearExpectations(mock_service());
-}
-
-IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewInteractiveUiTest,
-                       EscapeDoesntCloseConsent) {
-  // Check that when the escape key is pressed, the consent is not closed.
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(PrivacySandboxService::PromptAction::kConsentShown));
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(
-          PrivacySandboxService::PromptAction::kConsentClosedNoDecision))
-      .Times(0);
-  views::NamedWidgetShownWaiter waiter(
-      views::test::AnyWidgetTestPasskey{},
-      PrivacySandboxDialogView::kViewClassName);
-  ShowPrivacySandboxDialog(browser(),
-                           PrivacySandboxService::PromptType::kConsent);
-  auto* dialog = waiter.WaitIfNeededAndGet();
-  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false,
-                                              false, false, false));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(dialog->IsClosed());
-
-  // Shutting down the browser test will naturally shut the dialog, verify
-  // expectations before that happens.
-  testing::Mock::VerifyAndClearExpectations(mock_service());
-}
-
 class PrivacySandboxDialogViewInteractiveUiTestM1
     : public InProcessBrowserTest {
  public:
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
index 9b57c58..bb7d584 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -352,52 +352,16 @@
 void AvatarToolbarButton::HideSignInText() {
   delegate_->HideSignInText();
 }
-
-void AvatarToolbarButton::DisabledStateHelper::Init(
-    bool previous_enable_state,
-    SkColor previous_disabled_text_color) {
-  CHECK(!init_);
-
-  previous_enable_state_ = previous_enable_state;
-  previous_disabled_text_color_ = previous_disabled_text_color;
-
-  init_ = true;
-}
-
-bool AvatarToolbarButton::DisabledStateHelper::GetPreviousEnableState() const {
-  CHECK(init_);
-  return previous_enable_state_;
-}
-
-SkColor AvatarToolbarButton::DisabledStateHelper::GetPreviousDisabledTextColor()
-    const {
-  CHECK(init_);
-  return previous_disabled_text_color_;
-}
-
-void AvatarToolbarButton::DisableActionButton() {
-  SkColor active_text_color = GetCurrentTextColor();
-
-  // Disable the button and remember the disabled text color/state.
-  bool previous_enable_state = GetEnabled();
-  SetEnabled(false);
-  disabled_state_helper_.Init(previous_enable_state, GetCurrentTextColor());
-
-  // Override the disable state color with the active text color.
-  SetTextColor(ButtonState::STATE_DISABLED, active_text_color);
-}
-
-void AvatarToolbarButton::ResetActionButton() {
-  SetEnabled(disabled_state_helper_.GetPreviousEnableState());
-  SetTextColor(ButtonState::STATE_DISABLED,
-               disabled_state_helper_.GetPreviousDisabledTextColor());
-
-  // Reset the helper instance.
-  disabled_state_helper_ = {};
-}
-
 #endif
 
+void AvatarToolbarButton::SetButtonActionDisabled(bool disabled) {
+  button_action_disabled_ = disabled;
+}
+
+bool AvatarToolbarButton::IsButtonActionDisabled() const {
+  return button_action_disabled_;
+}
+
 void AvatarToolbarButton::AddObserver(Observer* observer) {
   observer_list_.AddObserver(observer);
 }
@@ -464,6 +428,10 @@
 }
 
 void AvatarToolbarButton::ButtonPressed() {
+  if (button_action_disabled_) {
+    return;
+  }
+
   browser_->window()->ShowAvatarBubbleFromAvatarButton(
       /*is_source_accelerator=*/false);
 }
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
index 6b7e6a3..1dbffe78 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
@@ -60,11 +60,15 @@
   void ShowSignInText();
   // Contracts the pill so that no text is shown.
   void HideSignInText();
-
-  void DisableActionButton();
-  void ResetActionButton();
 #endif
 
+  // Control whether the button action is active or not.
+  // One reason to disable the action; when a bubble is shown from this button
+  // (and not the profile menu), we want to disable the button action, however
+  // the button should remain in an "active" state from a UI perspective.
+  void SetButtonActionDisabled(bool disabled);
+  bool IsButtonActionDisabled() const;
+
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
@@ -97,21 +101,6 @@
   FRIEND_TEST_ALL_PREFIXES(AvatarToolbarButtonTest,
                            HighlightMeetsMinimumContrast);
 
-  // Struct to store the button state before overriding the disabled state.
-  class DisabledStateHelper {
-   public:
-    void Init(bool previous_enable_state, SkColor previous_disabled_text_color);
-
-    bool GetPreviousEnableState() const;
-    SkColor GetPreviousDisabledTextColor() const;
-
-   private:
-    bool init_ = false;
-
-    bool previous_enable_state_ = true;
-    SkColor previous_disabled_text_color_;
-  };
-
   // ui::PropertyHandler:
   void AfterPropertyChange(const void* key, int64_t old_value) override;
 
@@ -137,7 +126,10 @@
   // separate animation.
   static base::TimeDelta g_iph_min_delay_after_creation;
 
-  DisabledStateHelper disabled_state_helper_;
+  // Controls the action of the button, on press.
+  // Setting this to true will stop the button reaction but the button will
+  // remain in active state, not affecting it's UI in any way.
+  bool button_action_disabled_ = false;
 
   base::ObserverList<Observer>::Unchecked observer_list_;
 
diff --git a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc
index f014a89..cd2e841 100644
--- a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc
+++ b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc
@@ -144,7 +144,7 @@
   if (bubble_parameters.interception_type ==
       WebSigninInterceptor::SigninInterceptionType::kChromeSignin) {
     AvatarToolbarButton* button = GetAvatarToolbarButton(*browser);
-    button->DisableActionButton();
+    button->SetButtonActionDisabled(true);
     button->ShowSignInText();
   }
 
@@ -296,7 +296,7 @@
   if (bubble_parameters_.interception_type ==
       WebSigninInterceptor::SigninInterceptionType::kChromeSignin) {
     AvatarToolbarButton* button = GetAvatarToolbarButton(*browser_);
-    button->ResetActionButton();
+    button->SetButtonActionDisabled(false);
     button->HideSignInText();
   }
   std::move(callback_).Run(result);
diff --git a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view_browsertest.cc b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view_browsertest.cc
index 1d39623..c5616c5 100644
--- a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view_browsertest.cc
@@ -169,9 +169,9 @@
 
 // Returns the avatar button, which is the anchor view for the interception
 // bubble.
-views::View* GetAvatarButton(Browser* browser) {
+AvatarToolbarButton* GetAvatarButton(Browser* browser) {
   BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
-  views::View* avatar_button =
+  AvatarToolbarButton* avatar_button =
       browser_view->toolbar_button_provider()->GetAvatarToolbarButton();
   DCHECK(avatar_button);
   return avatar_button;
@@ -313,7 +313,9 @@
  public:
   DiceWebSigninInterceptionBubbleBrowserTest() = default;
 
-  views::View* GetAvatarButton() { return ::GetAvatarButton(browser()); }
+  AvatarToolbarButton* GetAvatarButton() {
+    return ::GetAvatarButton(browser());
+  }
 
   // Completion callback for the interception bubble.
   void OnInterceptionComplete(SigninInterceptionResult result) {
@@ -561,7 +563,7 @@
   base::HistogramTester histogram_tester;
   base::UserActionTester user_action_tester;
 
-  ASSERT_TRUE(GetAvatarButton()->GetEnabled());
+  ASSERT_FALSE(GetAvatarButton()->IsButtonActionDisabled());
   // Creating the bubble through the static function.
   std::unique_ptr<ScopedWebSigninInterceptionBubbleHandle> handle =
       DiceWebSigninInterceptionBubbleView::CreateBubble(
@@ -579,7 +581,7 @@
   // Equivalent to `kInterceptionBubbleBaseHeight` default.
   bubble->SetHeightAndShowWidget(/*height=*/500);
   EXPECT_FALSE(callback_result_.has_value());
-  EXPECT_FALSE(GetAvatarButton()->GetEnabled());
+  EXPECT_TRUE(GetAvatarButton()->IsButtonActionDisabled());
 
   // Take a handle on the bubble, to close it later.
   bubble_handle_ = bubble->GetHandle();
@@ -591,7 +593,7 @@
   ASSERT_TRUE(callback_result_.has_value());
   EXPECT_EQ(callback_result_, SigninInterceptionResult::kAccepted);
   EXPECT_TRUE(bubble->GetAccepted());
-  EXPECT_TRUE(GetAvatarButton()->GetEnabled());
+  EXPECT_FALSE(GetAvatarButton()->IsButtonActionDisabled());
 
   // Widget was not closed yet - the delegate then takes care of it through the
   // handle.
@@ -640,7 +642,7 @@
   // Equivalent to `kInterceptionBubbleBaseHeight` default.
   bubble->SetHeightAndShowWidget(/*height=*/500);
   EXPECT_FALSE(callback_result_.has_value());
-  EXPECT_FALSE(GetAvatarButton()->GetEnabled());
+  EXPECT_TRUE(GetAvatarButton()->IsButtonActionDisabled());
 
   views::test::WidgetDestroyedWaiter closing_observer(widget);
   EXPECT_FALSE(bubble->GetAccepted());
@@ -649,7 +651,7 @@
   ASSERT_TRUE(callback_result_.has_value());
   EXPECT_EQ(callback_result_, SigninInterceptionResult::kDeclined);
   EXPECT_FALSE(bubble->GetAccepted());
-  EXPECT_TRUE(GetAvatarButton()->GetEnabled());
+  EXPECT_FALSE(GetAvatarButton()->IsButtonActionDisabled());
 
   EXPECT_TRUE(widget->IsClosed());
   // Widget will close now.
diff --git a/chrome/browser/ui/views/profiles/profile_menu_coordinator.cc b/chrome/browser/ui/views/profiles/profile_menu_coordinator.cc
index 9945ca59..38e38d6e 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_coordinator.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_coordinator.cc
@@ -35,10 +35,10 @@
           ->toolbar_button_provider()
           ->GetAvatarToolbarButton();
 
-  // Do not show avatar bubble if there is no avatar menu button, the button is
-  // disabled or the bubble is already showing.
-  if (!avatar_toolbar_button || !avatar_toolbar_button->GetEnabled() ||
-      IsShowing()) {
+  // Do not show avatar bubble if there is no avatar menu button, the button
+  // action is disabled or the bubble is already showing.
+  if (!avatar_toolbar_button ||
+      avatar_toolbar_button->IsButtonActionDisabled() || IsShowing()) {
     return;
   }
 
diff --git a/chrome/browser/ui/views/profiles/profiles_pixel_test_utils.h b/chrome/browser/ui/views/profiles/profiles_pixel_test_utils.h
index 8e83602e..97b3a41 100644
--- a/chrome/browser/ui/views/profiles/profiles_pixel_test_utils.h
+++ b/chrome/browser/ui/views/profiles/profiles_pixel_test_utils.h
@@ -73,9 +73,7 @@
 //   constructor, removing the need to call `SetUpPixelTestCommandLine()` and
 //   `InitPixelTestFeatures()`.
 // - providing helpers to set up the account, see `SignInWithAccount()`.
-template <typename T,
-          typename =
-              std::enable_if_t<std::is_base_of_v<InProcessBrowserTest, T>>>
+template <typename T>
 class ProfilesPixelTestBaseT : public SigninBrowserTestBaseT<T> {
  public:
   template <typename... Args>
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
index 7d64486..6018a8dd 100644
--- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc
+++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -36,7 +36,6 @@
 #include "chrome/grit/branded_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/feature_engagement/public/feature_constants.h"
-#include "components/safe_browsing/core/common/safebrowsing_referral_methods.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/user_education/common/feature_promo_handle.h"
 #include "components/user_education/common/feature_promo_registry.h"
@@ -684,31 +683,6 @@
         kToolbarSidePanelButtonElementId, IDS_PRICE_TRACKING_SIDE_PANEL_IPH));
   }
 
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-  // kIPHDownloadEsbPromoFeature:
-  registry.RegisterFeature(std::move(
-      FeaturePromoSpecification::CreateForCustomAction(
-          feature_engagement::kIPHDownloadEsbPromoFeature,
-          kToolbarDownloadButtonElementId, IDS_DOWNLOAD_BUBBLE_ESB_PROMO,
-          IDS_DOWNLOAD_BUBBLE_ESB_PROMO_CUSTOM_ACTION,
-          base::BindRepeating(
-              [](ui::ElementContext ctx,
-                 user_education::FeaturePromoHandle promo_handle) {
-                auto* browser = chrome::FindBrowserWithUiElementContext(ctx);
-                if (!browser) {
-                  return;
-                }
-                chrome::ShowSafeBrowsingEnhancedProtectionWithIph(
-                    browser, safe_browsing::SafeBrowsingSettingReferralMethod::
-                                 kDownloadButtonIphPromo);
-              }))
-          .SetCustomActionIsDefault(true)
-          .SetBubbleArrow(HelpBubbleArrow::kTopRight)
-          .SetBubbleTitleText(IDS_DOWNLOAD_BUBBLE_ESB_PROMO_TITLE)
-          .SetCustomActionDismissText(IDS_DOWNLOAD_BUBBLE_ESB_PROMO_DISMISS)
-          .SetBubbleIcon(&vector_icons::kGshieldIcon)));
-#endif
-
   // kIPHDownloadToolbarButtonFeature:
   registry.RegisterFeature(
       std::move(FeaturePromoSpecification::CreateForToastPromo(
diff --git a/chrome/browser/ui/webui/ash/settings/pages/a11y/accessibility_section.cc b/chrome/browser/ui/webui/ash/settings/pages/a11y/accessibility_section.cc
index d279f08..afc73f0 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/a11y/accessibility_section.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/a11y/accessibility_section.cc
@@ -559,11 +559,17 @@
       {"accessibleImageLabelsSubtitle",
        IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_SUBTITLE},
       {"accessibilityFaceGazeLabel",
-       IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_LABEL},
+       IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_LABEL},
       {"accessibilityFaceGazeDescription",
-       IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_DESCRIPTION},
+       IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_DESCRIPTION},
+      {"accessibilityFaceGazeFacialExpressionsSettings",
+       IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_LABEL},
+      {"accessibilityFaceGazeFacialExpressionsSettingsDescription",
+       IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_GESTURE_SETTINGS_DESCRIPTION},
       {"accessibilityFaceGazeSettings",
-       IDS_OS_SETTINGS_ACCESSIBILITY_FACE_TRACKING_SETTINGS},
+       IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_LABEL},
+      {"accessibilityFaceGazeSettingsDescription",
+       IDS_OS_SETTINGS_ACCESSIBILITY_FACEGAZE_CURSOR_SETTINGS_DESCRIPTION},
       {"accessibleImageLabelsTitle",
        IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_TITLE},
       {"additionalFeaturesTitle",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/reset/reset_section.cc b/chrome/browser/ui/webui/ash/settings/pages/reset/reset_section.cc
index ed3a6028..ddd3845 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/reset/reset_section.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/reset/reset_section.cc
@@ -29,6 +29,34 @@
 using ::chromeos::settings::mojom::Subpage;
 }  // namespace mojom
 
+namespace {
+const std::vector<SearchConcept>& GetResetSearchConcept() {
+  static const base::NoDestructor<std::vector<SearchConcept>> tags({
+      {IDS_OS_SETTINGS_TAG_RESET,
+       mojom::kResetSectionPath,
+       mojom::SearchResultIcon::kReset,
+       mojom::SearchResultDefaultRank::kMedium,
+       mojom::SearchResultType::kSection,
+       {.section = mojom::Section::kReset}},
+  });
+
+  return *tags;
+}
+
+const std::vector<SearchConcept>& GetRevampResetSearchConcept() {
+  static const base::NoDestructor<std::vector<SearchConcept>> tags({
+      {IDS_OS_SETTINGS_TAG_RESET,
+       mojom::kSystemPreferencesSectionPath,
+       mojom::SearchResultIcon::kReset,
+       mojom::SearchResultDefaultRank::kMedium,
+       mojom::SearchResultType::kSetting,
+       {.setting = mojom::Setting::kPowerwash}},
+  });
+
+  return *tags;
+}
+}  // namespace
+
 ResetSection::ResetSection(Profile* profile,
                            SearchTagRegistry* search_tag_registry)
     : OsSettingsSection(profile, search_tag_registry),
@@ -36,7 +64,13 @@
           ash::features::IsOsSettingsRevampWayfindingEnabled()) {
   SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
   if (IsPowerwashAllowed()) {
-    updater.AddSearchTags(GetSearchConcepts());
+    if (isRevampWayfindingEnabled_) {
+      updater.AddSearchTags(GetRevampResetSearchConcept());
+    } else {
+      updater.AddSearchTags(GetResetSearchConcept());
+    }
+
+    updater.AddSearchTags(GetPowerwashSearchConcept());
   }
 }
 
@@ -118,17 +152,10 @@
   generator->RegisterTopLevelSetting(mojom::Setting::kPowerwash);
 }
 
-const std::vector<SearchConcept>& ResetSection::GetSearchConcepts() {
-  const mojom::Section section = GetSection();
+const std::vector<SearchConcept>& ResetSection::GetPowerwashSearchConcept() {
   const char* section_path = GetSectionPath();
 
   static const base::NoDestructor<std::vector<SearchConcept>> tags({
-      {IDS_OS_SETTINGS_TAG_RESET,
-       section_path,
-       mojom::SearchResultIcon::kReset,
-       mojom::SearchResultDefaultRank::kMedium,
-       mojom::SearchResultType::kSection,
-       {.section = section}},
       {IDS_OS_SETTINGS_TAG_RESET_POWERWASH,
        section_path,
        mojom::SearchResultIcon::kReset,
diff --git a/chrome/browser/ui/webui/ash/settings/pages/reset/reset_section.h b/chrome/browser/ui/webui/ash/settings/pages/reset/reset_section.h
index 2cabbb2..6746ddf 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/reset/reset_section.h
+++ b/chrome/browser/ui/webui/ash/settings/pages/reset/reset_section.h
@@ -38,7 +38,7 @@
 
  private:
   const bool isRevampWayfindingEnabled_;
-  const std::vector<SearchConcept>& GetSearchConcepts();
+  const std::vector<SearchConcept>& GetPowerwashSearchConcept();
 };
 
 }  // namespace ash::settings
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
index 3ea0880..b73613d 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
@@ -11,8 +11,7 @@
 namespace {
 
 bool IsConsent(PrivacySandboxService::PromptType prompt_type) {
-  return prompt_type == PrivacySandboxService::PromptType::kConsent ||
-         prompt_type == PrivacySandboxService::PromptType::kM1Consent;
+  return prompt_type == PrivacySandboxService::PromptType::kM1Consent;
 }
 
 bool IsRestrictedNotice(PrivacySandboxService::PromptType prompt_type) {
@@ -114,11 +113,7 @@
     }
     case PrivacySandboxService::PromptAction::kConsentAccepted:
     case PrivacySandboxService::PromptAction::kConsentDeclined: {
-      // Close the dialog after consent was resolved only for trials consent
-      // (kConsent). In case of kM1Consent, a notice step will be shown after
-      // the consent decision.
-      if (prompt_type_ == PrivacySandboxService::PromptType::kConsent)
-        CloseDialog();
+      did_user_make_decision_ = true;
       break;
     }
     default:
@@ -144,18 +139,6 @@
     const base::Value::List& args) {
   AllowJavascript();
 
-  // Notify the service that the DOM was loaded and the dialog was shown to
-  // user. Only for trials prompt types, other prompt types are handled in web
-  // UI.
-  if (prompt_type_ == PrivacySandboxService::PromptType::kConsent) {
-    NotifyServiceAboutPromptAction(
-        PrivacySandboxService::PromptAction::kConsentShown);
-  }
-  if (prompt_type_ == PrivacySandboxService::PromptType::kNotice) {
-    NotifyServiceAboutPromptAction(
-        PrivacySandboxService::PromptAction::kNoticeShown);
-  }
-
   DCHECK(show_dialog_callback_);
   std::move(show_dialog_callback_).Run();
 }
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
index 9ed15b7..7c6beda 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
@@ -46,6 +46,7 @@
     web_ui_->set_web_contents(web_contents_.get());
     handler_ = CreateHandler();
     handler_->set_web_ui(web_ui());
+    handler_->RegisterMessages();
     handler_->AllowJavascript();
     web_ui_->ClearTrackedCalls();
   }
@@ -71,6 +72,10 @@
     EXPECT_CALL(*mock_privacy_sandbox_service(),
                 PromptActionOccurred(expected_action));
     ShowDialog();
+    base::Value::List args;
+    args.Append(/*value=*/static_cast<int>(expected_action));
+    web_ui()->ProcessWebUIMessage(GURL(), "promptActionOccurred",
+                                  std::move(args));
   }
 
   void IdempotentPromptActionOccurred(const base::Value::List& args) {
@@ -122,7 +127,7 @@
         base::BindOnce(&MockPrivacySandboxDialogView::
                            OpenPrivacySandboxAdMeasurementSettings,
                        base::Unretained(dialog_mock())),
-        PrivacySandboxService::PromptType::kConsent);
+        PrivacySandboxService::PromptType::kM1Consent);
   }
 };
 
@@ -186,7 +191,7 @@
 
 TEST_F(PrivacySandboxConsentDialogHandlerTest, HandleConsentAccepted) {
   ShowDialog(PrivacySandboxService::PromptAction::kConsentShown);
-  EXPECT_CALL(*dialog_mock(), Close());
+  EXPECT_CALL(*dialog_mock(), Close()).Times(0);
   EXPECT_CALL(*mock_privacy_sandbox_service(),
               PromptActionOccurred(
                   PrivacySandboxService::PromptAction::kConsentAccepted));
@@ -199,14 +204,14 @@
   base::Value::List args;
   args.Append(
       static_cast<int>(PrivacySandboxService::PromptAction::kConsentAccepted));
-  IdempotentPromptActionOccurred(args);
+  handler()->HandlePromptActionOccurred(args);
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
 
 TEST_F(PrivacySandboxConsentDialogHandlerTest, HandleConsentDeclined) {
   ShowDialog(PrivacySandboxService::PromptAction::kConsentShown);
-  EXPECT_CALL(*dialog_mock(), Close());
+  EXPECT_CALL(*dialog_mock(), Close()).Times(0);
   EXPECT_CALL(*mock_privacy_sandbox_service(),
               PromptActionOccurred(
                   PrivacySandboxService::PromptAction::kConsentDeclined));
@@ -219,7 +224,7 @@
   base::Value::List args;
   args.Append(
       static_cast<int>(PrivacySandboxService::PromptAction::kConsentDeclined));
-  IdempotentPromptActionOccurred(args);
+  handler()->HandlePromptActionOccurred(args);
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
@@ -259,7 +264,7 @@
         base::BindOnce(&MockPrivacySandboxDialogView::
                            OpenPrivacySandboxAdMeasurementSettings,
                        base::Unretained(dialog_mock())),
-        PrivacySandboxService::PromptType::kNotice);
+        PrivacySandboxService::PromptType::kM1NoticeROW);
   }
 };
 
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
index c780aba..cba33e3 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
@@ -207,8 +207,6 @@
     base::OnceClosure open_measurement_settings_callback,
     PrivacySandboxService::PromptType prompt_type) {
   base::Value::Dict update;
-  update.Set("isConsent",
-             prompt_type == PrivacySandboxService::PromptType::kConsent);
   content::WebUIDataSource::Update(
       profile, chrome::kChromeUIPrivacySandboxDialogHost, std::move(update));
   auto handler = std::make_unique<PrivacySandboxDialogHandler>(
diff --git a/chrome/browser/webauthn/android/BUILD.gn b/chrome/browser/webauthn/android/BUILD.gn
index f22c861d..5387c2d 100644
--- a/chrome/browser/webauthn/android/BUILD.gn
+++ b/chrome/browser/webauthn/android/BUILD.gn
@@ -8,7 +8,9 @@
 android_library("java") {
   srcjar_deps = [ ":jni_headers" ]
   sources = [
+    "java/src/org/chromium/chrome/browser/webauthn/AuthenticatorIncognitoConfirmationBottomsheet.java",
     "java/src/org/chromium/chrome/browser/webauthn/CableAuthenticatorModuleProvider.java",
+    "java/src/org/chromium/chrome/browser/webauthn/ChromeAuthenticatorConfirmationFactory.java",
     "java/src/org/chromium/chrome/browser/webauthn/PrivacySettingsFragment.java",
   ]
   deps = [
@@ -21,10 +23,12 @@
     "//chrome/android/modules/cablev2_authenticator/public:java",
     "//chrome/browser/enterprise/util:java",
     "//chrome/browser/notifications:java",
+    "//components/browser_ui/bottomsheet/android:java",
     "//components/browser_ui/notifications/android:java",
     "//components/externalauth/android:java",
     "//components/module_installer/android:module_installer_java",
     "//components/webauthn/android:java",
+    "//content/public/android:content_java",
     "//content/public/android:content_main_dex_java",
     "//services/device/public/java:device_feature_list_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
@@ -69,11 +73,13 @@
     "java/res/drawable/circle_loader_animation.xml",
     "java/res/drawable/error_icon.xml",
     "java/res/drawable/ic_lock_googblue_48dp.xml",
+    "java/res/drawable/webauthn_incognito_confirmation_icon.xml",
     "java/res/layout-sw600dp/cablev2_error.xml",
     "java/res/layout-sw600dp/cablev2_spinner.xml",
     "java/res/layout/cablev2_error.xml",
     "java/res/layout/cablev2_settings.xml",
     "java/res/layout/cablev2_spinner.xml",
+    "java/res/layout/webauthn_incognito_confirmation.xml",
   ]
   deps = [ "//chrome/android:chrome_app_java_resources" ]
 }
diff --git a/components/webauthn/android/java/res/drawable/webauthn_incognito_confirmation_icon.xml b/chrome/browser/webauthn/android/java/res/drawable/webauthn_incognito_confirmation_icon.xml
similarity index 100%
rename from components/webauthn/android/java/res/drawable/webauthn_incognito_confirmation_icon.xml
rename to chrome/browser/webauthn/android/java/res/drawable/webauthn_incognito_confirmation_icon.xml
diff --git a/components/webauthn/android/java/res/layout/webauthn_incognito_confirmation.xml b/chrome/browser/webauthn/android/java/res/layout/webauthn_incognito_confirmation.xml
similarity index 100%
rename from components/webauthn/android/java/res/layout/webauthn_incognito_confirmation.xml
rename to chrome/browser/webauthn/android/java/res/layout/webauthn_incognito_confirmation.xml
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorIncognitoConfirmationBottomsheet.java b/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/AuthenticatorIncognitoConfirmationBottomsheet.java
similarity index 93%
rename from components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorIncognitoConfirmationBottomsheet.java
rename to chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/AuthenticatorIncognitoConfirmationBottomsheet.java
index 8fd02c6eb..760dcf5 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorIncognitoConfirmationBottomsheet.java
+++ b/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/AuthenticatorIncognitoConfirmationBottomsheet.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.components.webauthn;
+package org.chromium.chrome.browser.webauthn;
 
 import android.content.Context;
 import android.view.LayoutInflater;
@@ -24,12 +24,12 @@
 /**
  * Bottomsheet to confirm credential creation in Incognito mode.
  *
- * This class shows a bottomsheet on Android that warns the user that they are
- * about to create a WebAuthn credential in Incognito mode (because the
- * credential will outlive the Incognito session.)
+ * <p>This class shows a bottomsheet on Android that warns the user that they are about to create a
+ * WebAuthn credential in Incognito mode (because the credential will outlive the Incognito
+ * session.)
  *
- * If the user clicks "Continue" the `positiveCallback` is run. If the user
- * closes the bottomsheet in any other way, the `negativeCallback` is run.
+ * <p>If the user clicks "Continue" the `positiveCallback` is run. If the user closes the
+ * bottomsheet in any other way, the `negativeCallback` is run.
  */
 class AuthenticatorIncognitoConfirmationBottomsheet {
     private final WebContents mWebContents;
diff --git a/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/ChromeAuthenticatorConfirmationFactory.java b/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/ChromeAuthenticatorConfirmationFactory.java
new file mode 100644
index 0000000..37146438
--- /dev/null
+++ b/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/ChromeAuthenticatorConfirmationFactory.java
@@ -0,0 +1,32 @@
+// 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.chrome.browser.webauthn;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.components.webauthn.CreateConfirmationUiDelegate;
+import org.chromium.content_public.browser.WebContents;
+import org.chromium.device.DeviceFeatureList;
+import org.chromium.device.DeviceFeatureMap;
+
+/**
+ * A factory class to create a {@link CreateConfirmationUiDelegate} using {@link
+ * AuthenticatorIncognitoConfirmationBottomsheet}
+ */
+public class ChromeAuthenticatorConfirmationFactory
+        implements CreateConfirmationUiDelegate.Factory {
+    @Override
+    public @Nullable CreateConfirmationUiDelegate create(WebContents webContents) {
+        if (webContents.isIncognito()
+                && DeviceFeatureMap.isEnabled(
+                        DeviceFeatureList.WEBAUTHN_ANDROID_INCOGNITO_CONFIRMATION)) {
+            return (accept, reject) -> {
+                var sheet = new AuthenticatorIncognitoConfirmationBottomsheet(webContents);
+                return sheet.show(accept, reject);
+            };
+        }
+        return null;
+    }
+}
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index a98b99b..9c12839 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -1104,16 +1104,6 @@
              base::FEATURE_ENABLED_BY_DEFAULT);
 #endif
 
-#if BUILDFLAG(IS_ANDROID)
-BASE_FEATURE(kPrivacyGuideAndroid,
-             "PrivacyGuideAndroid",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
-BASE_FEATURE(kPrivacyGuideAndroidPostMVP,
-             "PrivacyGuideAndroidPostMVP",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-#endif
-
 // Enables or disables push subscriptions keeping Chrome running in the
 // background when closed.
 BASE_FEATURE(kPushMessagingBackgroundMode,
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 6881034..ccd7af0 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -650,13 +650,6 @@
 BASE_DECLARE_FEATURE(kLocalPrinterObserving);
 #endif
 
-COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kPrivacyGuideAndroid);
-
-#if BUILDFLAG(IS_ANDROID)
-COMPONENT_EXPORT(CHROME_FEATURES)
-BASE_DECLARE_FEATURE(kPrivacyGuideAndroidPostMVP);
-#endif
-
 #if BUILDFLAG(IS_ANDROID)
 COMPONENT_EXPORT(CHROME_FEATURES)
 BASE_DECLARE_FEATURE(kPrivacyGuideAndroid3);
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json
index 5c34186..8cc2e2a 100644
--- a/chrome/common/extensions/api/_api_features.json
+++ b/chrome/common/extensions/api/_api_features.json
@@ -365,6 +365,9 @@
   "documentScan.openScanner": {
     "channel": "dev"
   },
+  "documentScan.getOptionGroups": {
+    "channel": "dev"
+  },
   "documentScan.closeScanner": {
     "channel": "dev"
   },
diff --git a/chrome/common/extensions/api/document_scan.idl b/chrome/common/extensions/api/document_scan.idl
index ac49bc77..7a16037 100644
--- a/chrome/common/extensions/api/document_scan.idl
+++ b/chrome/common/extensions/api/document_scan.idl
@@ -287,6 +287,19 @@
     boolean? secure;
   };
 
+  // OptionGroup is a group containing a list of option names.  The groups and
+  // their contents are determined by the backend and do not have any defined
+  // semantics or consistent membership.  This structure is primarily intended
+  // for UI layout assistance; it does not affect the individual option
+  // behaviors.
+  [nodoc] dictionary OptionGroup {
+    // Printable title, e.g. "Geometry options".
+    DOMString title;
+
+    // Names of contained options, in backend-provided order.
+    DOMString[] members;
+  };
+
   // The response from <code>getScannerList()</code>.
   [nodoc] dictionary GetScannerListResponse {
     // The backend's enumeration result.  Note that partial results could be
@@ -315,6 +328,19 @@
     object? options;
   };
 
+  // The response from <code>getOptionGroups()</code>.
+  [nodoc] dictionary GetOptionGroupsResponse {
+    // Same scanner handle passed to <code>getOptionGroups()</code>.
+    DOMString scannerHandle;
+
+    // The backend's result of getting the option groups.
+    OperationResult result;
+
+    // If <code>result</code> is <code>OperationResult.SUCCESS</code>, a list of
+    // option groups in the order supplied by the backend.
+    OptionGroup[]? groups;
+  };
+
   // The response from <code>closeScanner()</code>.
   [nodoc] dictionary CloseScannerResponse {
     // Same scanner handle passed to <code>closeScanner()</code>.
@@ -437,6 +463,12 @@
   // Otherwise will return null and set runtime.lastError.
   [nodoc] callback OpenScannerCallback = void (OpenScannerResponse response);
 
+  // Callback from the <code>getOptionGroups</code> method.
+  // |response| The response from getting the option groups, if the call was
+  // valid.  Otherwise will return null and set runtime.lastError.
+  [nodoc] callback GetOptionGroupsCallback =
+      void (GetOptionGroupsResponse response);
+
   // Callback from the <code>closeScanner</code> method.
   // |response| The response from closing the scanner, if the call was valid.
   // Otherwise will return null and set runtime.lastError.
@@ -487,6 +519,14 @@
     [nodoc, supportsPromises] static void openScanner(
         DOMString scannerId, OpenScannerCallback callback);
 
+    // Gets the group names and member options from a scanner handle previously
+    // opened by <code>openScanner</code>.
+    // |scannerHandle| : Open scanner handle previously returned from
+    // <code>openScanner</code>.
+    // |callback| : Called with the result.
+    [nodoc, supportsPromises] static void getOptionGroups(
+        DOMString scannerHandle, GetOptionGroupsCallback callback);
+
     // Closes a previously opened scanner handle.  A response indicating the
     // outcome will be sent to the callback.  Even if the response is not a
     // success, the supplied handle will become invalid and should not be used
diff --git a/chrome/installer/util/google_update_settings.h b/chrome/installer/util/google_update_settings.h
index 2457208..278edf4 100644
--- a/chrome/installer/util/google_update_settings.h
+++ b/chrome/installer/util/google_update_settings.h
@@ -85,6 +85,13 @@
   // synchronously on first run, startup, etc.).
   static base::SequencedTaskRunner* CollectStatsConsentTaskRunner();
 
+#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
+  // Returns whether the user has given consent to collect UMA data and send
+  // crash dumps to Google. This method reads the information from a custom
+  // directory.
+  static bool GetCollectStatsConsentFromDir(const base::FilePath& consent_dir);
+#endif  // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
+
   // Returns whether the user has given consent to collect UMA data and send
   // crash dumps to Google. This information is collected by the web server
   // used to download the chrome installer.
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index e3b5c40..e939aef 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -708,21 +708,13 @@
 #endif
 
   // Owned by |render_frame|.
-  page_load_metrics::MetricsRenderFrameObserver* metrics_render_frame_observer =
-      new page_load_metrics::MetricsRenderFrameObserver(render_frame);
+  new page_load_metrics::MetricsRenderFrameObserver(render_frame);
   // There is no render thread, thus no UnverifiedRulesetDealer in
   // ChromeRenderViewTests.
   if (subresource_filter_ruleset_dealer_) {
-    // Create AdResourceTracker to tracker ad resource loads at the chrome
-    // layer.
-    auto ad_resource_tracker =
-        std::make_unique<subresource_filter::AdResourceTracker>();
-    metrics_render_frame_observer->SetAdResourceTracker(
-        ad_resource_tracker.get());
     auto* subresource_filter_agent =
         new subresource_filter::SubresourceFilterAgent(
-            render_frame, subresource_filter_ruleset_dealer_.get(),
-            std::move(ad_resource_tracker));
+            render_frame, subresource_filter_ruleset_dealer_.get());
     subresource_filter_agent->Initialize();
   }
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index d30ed46f..0761533e 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1128,6 +1128,7 @@
         "../browser/ash/system_web_apps/apps/terminal_integration_test.cc",
         "../browser/ash/web_handwriting_integration_test.cc",
         "../browser/ui/ash/app_list/app_list_integration_test.cc",
+        "../browser/ui/ash/desks/desks_integration_test.cc",
         "../browser/ui/ash/quick_settings_integration_test.cc",
         "../browser/ui/ash/shelf/shelf_integration_test.cc",
         "base/chromeos/crosier/helper/test_sudo_helper_client_test.cc",
@@ -2316,7 +2317,6 @@
       "../browser/interest_group/interest_group_permissions_browsertest.cc",
       "../browser/invalidation/profile_invalidation_provider_factory_browsertest.cc",
       "../browser/ip_protection/ip_protection_config_provider_browsertest.cc",
-      "../browser/k_anonymity_service/k_anonymity_service_client_browsertest.cc",
       "../browser/l10n_util_browsertest.cc",
       "../browser/launch_time_navigation_signal/launch_time_navigation_signal_browsertest.cc",
       "../browser/lifetime/browser_close_manager_browsertest.cc",
@@ -2761,7 +2761,6 @@
       "../browser/ui/views/incognito_clear_browsing_data_dialog_browsertest.cc",
       "../browser/ui/views/intent_picker_dialog_browsertest.cc",
       "../browser/ui/views/plus_addresses/plus_address_creation_dialog_browsertest.cc",
-      "../browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc",
       "../browser/ui/views/reader_mode/reader_mode_icon_view_browsertest.cc",
       "../browser/ui/views/sad_tab_view_browsertest.cc",
       "../browser/ui/views/sharing/remote_copy_browsertest.cc",
@@ -3375,7 +3374,6 @@
       deps += [
         "//ash/webui/color_internals:browser_tests_js",
         "//ash/webui/eche_app_ui:browser_tests_js",
-        "//ash/webui/help_app_ui:browser_tests_js",
         "//ash/webui/system_apps:browser_tests",
         "//ash/webui/system_extensions_internals_ui:browser_tests_js",
         "//chrome/test/data/webui/chromeos:browser_tests_js_mojo_lite_webui",
@@ -4976,6 +4974,7 @@
         "//ash/webui/file_manager/resources:file_manager_swa_resources_grit",
         "//ash/webui/firmware_update_ui",
         "//ash/webui/help_app_ui",
+        "//ash/webui/help_app_ui:browser_test_support",
         "//ash/webui/help_app_ui:buildflags",
         "//ash/webui/help_app_ui/search:mojo_bindings",
         "//ash/webui/media_app_ui",
@@ -11163,6 +11162,7 @@
           "../browser/ash/bluetooth/bluetooth_integration_test.cc",
           "../browser/ash/file_manager/file_manager_interactive_uitest.cc",
           "../browser/ui/ash/app_list/app_list_integration_test.cc",
+          "../browser/ui/ash/desks/desks_integration_test.cc",
           "../browser/ui/ash/quick_settings_integration_test.cc",
           "../browser/ui/ash/user_education/welcome_tour/welcome_tour_interactive_uitest.cc",
           "../browser/ui/web_applications/test/system_web_app_interactive_uitest.cc",
diff --git a/chrome/test/chromedriver/chrome/devtools_client.h b/chrome/test/chromedriver/chrome/devtools_client.h
index 5715d34..48a6963 100644
--- a/chrome/test/chromedriver/chrome/devtools_client.h
+++ b/chrome/test/chromedriver/chrome/devtools_client.h
@@ -39,7 +39,8 @@
   // Precondition: IsMainPage()
   // Precondition: IsConnected()
   // Precondition: BiDi tunnel for CDP traffic is not set.
-  virtual Status StartBidiServer(std::string bidi_mapper_script) = 0;
+  virtual Status StartBidiServer(std::string bidi_mapper_script,
+                                 const base::Value::Dict& mapper_options) = 0;
 
   virtual bool WasCrashed() = 0;
 
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.cc b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
index 01d2228e..e62d191 100644
--- a/chrome/test/chromedriver/chrome/devtools_client_impl.cc
+++ b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
@@ -243,17 +243,22 @@
   return Status{kOk};
 }
 
-Status DevToolsClientImpl::StartBidiServer(std::string bidi_mapper_script) {
+Status DevToolsClientImpl::StartBidiServer(
+    std::string bidi_mapper_script,
+    const base::Value::Dict& mapper_options) {
   // Give BiDiMapper generous amount of time to start.
   // If the wait times out then we likely have a bug in BiDiMapper.
   // There is no need to make this timeout user configurable.
   // We use the default page load timeout (the biggest in the standard).
   Timeout timeout = Timeout(base::Seconds(300));
-  return StartBidiServer(std::move(bidi_mapper_script), timeout);
+  return StartBidiServer(std::move(bidi_mapper_script), mapper_options,
+                         timeout);
 }
 
-Status DevToolsClientImpl::StartBidiServer(std::string bidi_mapper_script,
-                                           const Timeout& timeout) {
+Status DevToolsClientImpl::StartBidiServer(
+    std::string bidi_mapper_script,
+    const base::Value::Dict& mapper_options,
+    const Timeout& timeout) {
   if (!is_main_page_) {
     // Later we might want to start the BiDiMapper an another type of targets
     // however for the moment being we support pages only.
@@ -319,7 +324,17 @@
     if (status.IsError()) {
       return status;
     }
-    params.Set("expression", "window.runMapperInstance(" + window_id + ")");
+
+    std::string mapper_options_str;
+    status = SerializeAsJson(mapper_options, &mapper_options_str);
+    if (status.IsError()) {
+      return status;
+    }
+
+    params.Set(
+        "expression",
+        base::StringPrintf("window.runMapperInstance(%s, %s)",
+                           window_id.c_str(), mapper_options_str.c_str()));
     status = SendCommandAndGetResultWithTimeout(
         "Runtime.evaluate", std::move(params), &timeout, &result);
     if (result.contains("exceptionDetails")) {
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.h b/chrome/test/chromedriver/chrome/devtools_client_impl.h
index a9a2e8d..913fd45 100644
--- a/chrome/test/chromedriver/chrome/devtools_client_impl.h
+++ b/chrome/test/chromedriver/chrome/devtools_client_impl.h
@@ -111,8 +111,10 @@
   // Precondition: IsMainPage()
   // Precondition: IsConnected()
   // Precondition: BiDi tunnel for CDP traffic is not set.
-  Status StartBidiServer(std::string bidi_mapper_script) override;
   Status StartBidiServer(std::string bidi_mapper_script,
+                         const base::Value::Dict& mapper_options) override;
+  Status StartBidiServer(std::string bidi_mapper_script,
+                         const base::Value::Dict& mapper_options,
                          const Timeout& timeout);
   // If the object IsNull then it cannot be connected to the remote end.
   // Such an object needs to be attached to some !IsNull() parent first.
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc b/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc
index 933f22b0..2bd59d9 100644
--- a/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc
+++ b/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
+#include "base/strings/pattern.h"
 #include "base/strings/stringprintf.h"
 #include "base/time/time.h"
 #include "base/values.h"
@@ -36,6 +37,7 @@
 using testing::Pointee;
 
 const char kTestMapperScript[] = "Lorem ipsum dolor sit amet";
+const base::Value::Dict empty_mapper_options;
 
 testing::AssertionResult StatusOk(const Status& status) {
   if (status.IsOk()) {
@@ -2853,6 +2855,7 @@
   bool mapper_is_initiated = false;
   bool mapper_instance_is_running = false;
   bool subscribed_to_cdp = false;
+  bool mapper_is_started_with_options = false;
 };
 class BidiServerMockSyncWebSocket : public BidiMockSyncWebSocket {
  public:
@@ -2890,11 +2893,20 @@
         if (mapper_state_->fail_on_mapper_init) {
           return false;
         }
-      } else if (*expression == "window.runMapperInstance(\"mapper_client\")") {
+      } else if (*expression ==
+                 "window.runMapperInstance(\"mapper_client\", {})") {
         mapper_state_->mapper_instance_is_running = true;
         if (mapper_state_->fail_on_mapper_run_instnace) {
           return false;
         }
+      } else if (base::MatchPattern(
+                     *expression,
+                     "window\\.runMapperInstance(\"mapper_client\", {?*})")) {
+        mapper_state_->mapper_instance_is_running = true;
+        mapper_state_->mapper_is_started_with_options = true;
+        if (mapper_state_->fail_on_mapper_run_instnace) {
+          return false;
+        }
       }
     }
     base::Value::Dict response;
@@ -2938,12 +2950,14 @@
   mapper_client.SetMainPage(true);
   ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
 
-  EXPECT_TRUE(StatusOk(mapper_client.StartBidiServer(kTestMapperScript)));
+  EXPECT_TRUE(StatusOk(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)));
   EXPECT_TRUE(mapper_state.devtools_exposed);
   EXPECT_TRUE(mapper_state.mapper_is_initiated);
   EXPECT_TRUE(mapper_state.mapper_instance_is_running);
   EXPECT_TRUE(mapper_state.send_bidi_response_binding_added);
   EXPECT_TRUE(mapper_state.subscribed_to_cdp);
+  EXPECT_FALSE(mapper_state.mapper_is_started_with_options);
 }
 
 TEST_F(DevToolsClientImplTest, StartBidiServerNotConnected) {
@@ -2955,7 +2969,9 @@
   mapper_client.SetMainPage(true);
   ASSERT_TRUE(mapper_client.AttachTo(&root_client).IsError());
 
-  EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError());
+  EXPECT_TRUE(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)
+          .IsError());
 }
 
 TEST_F(DevToolsClientImplTest, StartBidiServerNotAPageClient) {
@@ -2968,7 +2984,9 @@
   mapper_client.EnableEventTunnelingForTesting();
   ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
 
-  EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError());
+  EXPECT_TRUE(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)
+          .IsError());
 }
 
 TEST_F(DevToolsClientImplTest, StartBidiServerTunnelIsAlreadySet) {
@@ -2985,7 +3003,9 @@
   ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
   mapper_client.SetTunnelSessionId(pink_client.SessionId());
 
-  EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError());
+  EXPECT_TRUE(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)
+          .IsError());
 }
 
 TEST_F(DevToolsClientImplTest, StartBidiServerFailOnAddBidiResponseBinding) {
@@ -3000,7 +3020,9 @@
   mapper_client.SetMainPage(true);
   ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
 
-  EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError());
+  EXPECT_TRUE(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)
+          .IsError());
 }
 
 TEST_F(DevToolsClientImplTest, StartBidiServerFailOnRunMapperInstnace) {
@@ -3015,7 +3037,9 @@
   mapper_client.SetMainPage(true);
   ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
 
-  EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError());
+  EXPECT_TRUE(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)
+          .IsError());
 }
 
 TEST_F(DevToolsClientImplTest, StartBidiServerFailOnExposeDevTools) {
@@ -3030,7 +3054,9 @@
   mapper_client.SetMainPage(true);
   ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
 
-  EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError());
+  EXPECT_TRUE(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)
+          .IsError());
 }
 
 TEST_F(DevToolsClientImplTest, StartBidiServerFailOnMapperInit) {
@@ -3045,7 +3071,9 @@
   mapper_client.SetMainPage(true);
   ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
 
-  EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError());
+  EXPECT_TRUE(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)
+          .IsError());
 }
 
 TEST_F(DevToolsClientImplTest, StartBidiServerFailOnSubscribeToCdp) {
@@ -3060,5 +3088,30 @@
   mapper_client.SetMainPage(true);
   ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
 
-  EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError());
+  EXPECT_TRUE(
+      mapper_client.StartBidiServer(kTestMapperScript, empty_mapper_options)
+          .IsError());
+}
+
+TEST_F(DevToolsClientImplTest, StartBidiServerWithOptions) {
+  BidiMapperState mapper_state;
+  SocketHolder<BidiServerMockSyncWebSocket> socket_holder{&mapper_state};
+  DevToolsClientImpl root_client("root", "root_session");
+  ASSERT_TRUE(socket_holder.ConnectSocket());
+  ASSERT_TRUE(StatusOk(root_client.SetSocket(socket_holder.Wrapper())));
+  DevToolsClientImpl mapper_client("mapper_client", "mapper_session");
+  mapper_client.EnableEventTunnelingForTesting();
+  mapper_client.SetMainPage(true);
+  ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client)));
+
+  base::Value::Dict mapper_options;
+  mapper_options.Set("divide_by_zero", true);
+  EXPECT_TRUE(StatusOk(
+      mapper_client.StartBidiServer(kTestMapperScript, mapper_options)));
+  EXPECT_TRUE(mapper_state.devtools_exposed);
+  EXPECT_TRUE(mapper_state.mapper_is_initiated);
+  EXPECT_TRUE(mapper_state.mapper_instance_is_running);
+  EXPECT_TRUE(mapper_state.send_bidi_response_binding_added);
+  EXPECT_TRUE(mapper_state.subscribed_to_cdp);
+  EXPECT_TRUE(mapper_state.mapper_is_started_with_options);
 }
diff --git a/chrome/test/chromedriver/chrome/stub_devtools_client.cc b/chrome/test/chromedriver/chrome/stub_devtools_client.cc
index 98329e7..dc1f073 100644
--- a/chrome/test/chromedriver/chrome/stub_devtools_client.cc
+++ b/chrome/test/chromedriver/chrome/stub_devtools_client.cc
@@ -32,7 +32,9 @@
   return Status{kOk};
 }
 
-Status StubDevToolsClient::StartBidiServer(std::string bidi_mapper_script) {
+Status StubDevToolsClient::StartBidiServer(
+    std::string bidi_mapper_script,
+    const base::Value::Dict& mapper_options) {
   return Status{kOk};
 }
 
diff --git a/chrome/test/chromedriver/chrome/stub_devtools_client.h b/chrome/test/chromedriver/chrome/stub_devtools_client.h
index 97a20c4..1fd62033 100644
--- a/chrome/test/chromedriver/chrome/stub_devtools_client.h
+++ b/chrome/test/chromedriver/chrome/stub_devtools_client.h
@@ -24,7 +24,8 @@
   const std::string& SessionId() const override;
   const std::string& TunnelSessionId() const override;
   Status SetTunnelSessionId(std::string session_id) override;
-  Status StartBidiServer(std::string bidi_mapper_script) override;
+  Status StartBidiServer(std::string bidi_mapper_script,
+                         const base::Value::Dict& mapper_options) override;
   bool IsNull() const override;
   bool WasCrashed() override;
   bool IsConnected() const override;
diff --git a/chrome/test/chromedriver/chrome/stub_web_view.cc b/chrome/test/chromedriver/chrome/stub_web_view.cc
index a7928ff8..1b8604b4 100644
--- a/chrome/test/chromedriver/chrome/stub_web_view.cc
+++ b/chrome/test/chromedriver/chrome/stub_web_view.cc
@@ -53,7 +53,8 @@
   return Status(kOk);
 }
 
-Status StubWebView::StartBidiServer(std::string bidi_mapper_script) {
+Status StubWebView::StartBidiServer(std::string bidi_mapper_script,
+                                    const base::Value::Dict& mapper_options) {
   return Status{kOk};
 }
 
diff --git a/chrome/test/chromedriver/chrome/stub_web_view.h b/chrome/test/chromedriver/chrome/stub_web_view.h
index 16f0ff4e..81432e97 100644
--- a/chrome/test/chromedriver/chrome/stub_web_view.h
+++ b/chrome/test/chromedriver/chrome/stub_web_view.h
@@ -27,7 +27,8 @@
   Status Reload(const Timeout* timeout) override;
   Status Freeze(const Timeout* timeout) override;
   Status Resume(const Timeout* timeout) override;
-  Status StartBidiServer(std::string bidi_mapper_script) override;
+  Status StartBidiServer(std::string bidi_mapper_script,
+                         const base::Value::Dict& mapper_options) override;
   Status PostBidiCommand(base::Value::Dict command) override;
   Status SendCommand(const std::string& cmd,
                      const base::Value::Dict& params) override;
diff --git a/chrome/test/chromedriver/chrome/web_view.h b/chrome/test/chromedriver/chrome/web_view.h
index 19b3e91..2ef826e 100644
--- a/chrome/test/chromedriver/chrome/web_view.h
+++ b/chrome/test/chromedriver/chrome/web_view.h
@@ -19,14 +19,14 @@
 
 class FedCmTracker;
 class FrameTracker;
-struct Geoposition;
 class JavaScriptDialogManager;
-struct KeyEvent;
 class MobileEmulationOverrideManager;
-struct MouseEvent;
-struct NetworkConditions;
 class Status;
 class Timeout;
+struct Geoposition;
+struct KeyEvent;
+struct MouseEvent;
+struct NetworkConditions;
 struct TouchEvent;
 
 class WebView {
@@ -70,7 +70,8 @@
   // Resume the current page.
   virtual Status Resume(const Timeout* timeout) = 0;
 
-  virtual Status StartBidiServer(std::string bidi_mapper_string) = 0;
+  virtual Status StartBidiServer(std::string bidi_mapper_string,
+                                 const base::Value::Dict& mapper_options) = 0;
 
   // Send the BiDi command to the BiDiMapper
   virtual Status PostBidiCommand(base::Value::Dict command) = 0;
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.cc b/chrome/test/chromedriver/chrome/web_view_impl.cc
index 1da047f..cced3c28 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl.cc
+++ b/chrome/test/chromedriver/chrome/web_view_impl.cc
@@ -529,8 +529,10 @@
                                          timeout);
 }
 
-Status WebViewImpl::StartBidiServer(std::string bidi_mapper_script) {
-  return client_->StartBidiServer(std::move(bidi_mapper_script));
+Status WebViewImpl::StartBidiServer(std::string bidi_mapper_script,
+                                    const base::Value::Dict& mapper_options) {
+  return client_->StartBidiServer(std::move(bidi_mapper_script),
+                                  mapper_options);
 }
 
 Status WebViewImpl::PostBidiCommand(base::Value::Dict command) {
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.h b/chrome/test/chromedriver/chrome/web_view_impl.h
index 4ee9bfe5..a32c09f 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl.h
+++ b/chrome/test/chromedriver/chrome/web_view_impl.h
@@ -62,7 +62,8 @@
   Status Reload(const Timeout* timeout) override;
   Status Freeze(const Timeout* timeout) override;
   Status Resume(const Timeout* timeout) override;
-  Status StartBidiServer(std::string bidi_mapper_script) override;
+  Status StartBidiServer(std::string bidi_mapper_script,
+                         const base::Value::Dict& mapper_options) override;
   Status PostBidiCommand(base::Value::Dict command) override;
   Status SendCommand(const std::string& cmd,
                      const base::Value::Dict& params) override;
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index 7610b48..e6ace8b4 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -381,7 +381,10 @@
       }
     }
 
-    status = web_view->StartBidiServer(mapper_script);
+    base::Value::Dict mapper_options;
+    mapper_options.Set("acceptInsecureCerts",
+                       capabilities.accept_insecure_certs);
+    status = web_view->StartBidiServer(mapper_script, mapper_options);
     if (status.IsError()) {
       return status;
     }
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 69028a42..799dba7 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -6886,6 +6886,11 @@
       command['id'] = id
     return conn.PostCommand(command)
 
+  @staticmethod
+  def GetHttpsUrlForFile(file_path, host=None):
+    return ChromeDriverSecureContextTest._https_server.GetUrl(
+        host) + file_path
+
   def testCreateContext(self):
     conn = self.createWebSocketConnection()
     old_handles = self._driver.GetWindowHandles()
@@ -7143,19 +7148,25 @@
       command['channel'] = channel
     return conn.SendCommand(command, channel=channel)
 
-  def navigateSomewhere(self, conn, context_id=None, channel=None):
+  def navigateTo(self, conn, url, context_id=None, channel=None):
     if context_id is None:
       context_id = self.getContextId(conn, 0)
     command = {
         'method': 'browsingContext.navigate',
         'params': {
-            'url': 'data:text/html,navigated',
+            'url': url,
             'wait': 'complete',
             'context': context_id}}
     if channel is not None:
       command['channel'] = channel
     return conn.SendCommand(command, channel=channel)
 
+  def navigateSomewhere(self, conn, context_id=None, channel=None):
+    return self.navigateTo(conn,
+                           'data:text/html,navigated',
+                           context_id=context_id,
+                           channel=channel)
+
   def testEvent(self):
     conn = self.createWebSocketConnection()
     context_id = self.getContextId(conn, 0)
@@ -7369,6 +7380,32 @@
     expected_titles = [''] + ['iframes' for _ in range(0, 10)]
     self.assertListEqual(expected_titles, sorted(titles))
 
+  def testInsecureSertificatesNotAllowed(self):
+    driver = self.CreateDriver(
+        web_socket_url=True,
+        accept_insecure_certs=False)
+    conn = self.createWebSocketConnection(driver)
+    page_name = self.id()
+    self._https_server.SetDataForPath('/%s.html' % page_name,
+       bytes('<head><<title>%s</title></head>' % page_name,
+             'utf-8'))
+    with self.assertRaisesRegex(chromedriver.ChromeDriverException,
+                                'net::ERR_CERT_AUTHORITY_INVALID'):
+      self.navigateTo(conn, self.GetHttpsUrlForFile('/%s.html' % page_name))
+
+  def testInsecureSertificatesAllowed(self):
+    driver = self.CreateDriver(
+        web_socket_url=True,
+        accept_insecure_certs=True)
+    conn = self.createWebSocketConnection(driver)
+    page_name = self.id()
+    self._https_server.SetDataForPath('/%s.html' % page_name,
+       bytes('<head><<title>%s</title></head>' % page_name,
+             'utf-8'))
+    self.navigateTo(conn, self.GetHttpsUrlForFile('/%s.html' % page_name))
+    title = driver.GetTitle()
+    self.assertEqual(title, page_name)
+
 
 class CustomBidiMapperTest(ChromeDriverBaseTest):
   """Base class for testing chromedriver with a custom bidi mapper path."""
diff --git a/chrome/test/data/extensions/api_test/document_scan/load_permissions.js b/chrome/test/data/extensions/api_test/document_scan/load_permissions.js
index 8475a9a..88082b4 100644
--- a/chrome/test/data/extensions/api_test/document_scan/load_permissions.js
+++ b/chrome/test/data/extensions/api_test/document_scan/load_permissions.js
@@ -8,6 +8,7 @@
     chrome.test.assertTrue(!!chrome.documentScan.scan);
     chrome.test.assertTrue(!!chrome.documentScan.getScannerList);
     chrome.test.assertTrue(!!chrome.documentScan.openScanner);
+    chrome.test.assertTrue(!!chrome.documentScan.getOptionGroups);
     chrome.test.assertTrue(!!chrome.documentScan.closeScanner);
     chrome.test.assertTrue(!!chrome.documentScan.setOptions);
     chrome.test.assertTrue(!!chrome.documentScan.startScan);
diff --git a/chrome/test/data/extensions/api_test/document_scan/perform_scan.js b/chrome/test/data/extensions/api_test/document_scan/perform_scan.js
index 2e70651..43b530b 100644
--- a/chrome/test/data/extensions/api_test/document_scan/perform_scan.js
+++ b/chrome/test/data/extensions/api_test/document_scan/perform_scan.js
@@ -41,6 +41,31 @@
     chrome.test.succeed();
   },
 
+  async function getOptionGroupsInvalidHandleFails() {
+    const response = await getOptionGroups('invalid-handle');
+    chrome.test.assertEq(chrome.documentScan.OperationResult.INVALID,
+                         response.result);
+    chrome.test.assertEq('invalid-handle', response.scannerHandle);
+    chrome.test.assertEq(null, response.groups);
+    chrome.test.succeed();
+  },
+
+  async function getOptionGroupsSuccess() {
+    const scannerHandle = await getScannerHandle();
+    chrome.test.assertNe(null, scannerHandle);
+    const response = await getOptionGroups(scannerHandle);
+    chrome.test.assertEq(chrome.documentScan.OperationResult.SUCCESS,
+                         response.result);
+    chrome.test.assertEq(scannerHandle, response.scannerHandle);
+    chrome.test.assertNe(null, response.groups);
+    chrome.test.assertEq(1, response.groups.length);
+    chrome.test.assertEq('title', response.groups[0].title);
+    chrome.test.assertEq(2, response.groups[0].members.length);
+    chrome.test.assertEq('item1', response.groups[0].members[0]);
+    chrome.test.assertEq('item2', response.groups[0].members[1]);
+    chrome.test.succeed();
+  },
+
   async function closeBeforeOpenFails() {
     let response = await closeScanner('scanner');
     chrome.test.assertEq('scanner', response.scannerHandle);
diff --git a/chrome/test/data/extensions/api_test/document_scan/scan_utils.js b/chrome/test/data/extensions/api_test/document_scan/scan_utils.js
index 652c503e..c9e7c2f 100644
--- a/chrome/test/data/extensions/api_test/document_scan/scan_utils.js
+++ b/chrome/test/data/extensions/api_test/document_scan/scan_utils.js
@@ -17,6 +17,12 @@
   });
 }
 
+async function getOptionGroups(scannerHandle) {
+ return new Promise(resolve => {
+    chrome.documentScan.getOptionGroups(scannerHandle, resolve);
+  });
+}
+
 async function closeScanner(scannerHandle) {
   return new Promise(resolve => {
     chrome.documentScan.closeScanner(scannerHandle, resolve);
diff --git a/chrome/test/data/webui/compose/BUILD.gn b/chrome/test/data/webui/compose/BUILD.gn
index e2512966..8375e22f 100644
--- a/chrome/test/data/webui/compose/BUILD.gn
+++ b/chrome/test/data/webui/compose/BUILD.gn
@@ -6,6 +6,7 @@
 
 build_webui_tests("build") {
   files = [
+    "compose_animator_test.ts",
     "compose_app_test.ts",
     "compose_textarea_test.ts",
   ]
diff --git a/chrome/test/data/webui/compose/compose_animator_test.ts b/chrome/test/data/webui/compose/compose_animator_test.ts
new file mode 100644
index 0000000..30479d809
--- /dev/null
+++ b/chrome/test/data/webui/compose/compose_animator_test.ts
@@ -0,0 +1,93 @@
+// 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 'chrome://compose/animations/animator.js';
+
+import {Animator} from 'chrome://compose/animations/animator.js';
+import {getTrustedHTML} from 'chrome://resources/js/static_types.js';
+import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+
+suite('ComposeAnimator', () => {
+  let animator: Animator;
+  let mockRoot: HTMLElement;
+
+  function animationsAsPromises(animations: Animation[]) {
+    return Promise.all(animations.map(animation => animation.finished));
+  }
+
+  setup(() => {
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    mockRoot = document.createElement('custom-element');
+    const shadowRoot = mockRoot.attachShadow({mode: 'open'});
+    shadowRoot.innerHTML = getTrustedHTML`
+      <div class="child" id="child1"></div>
+      <div class="child" id="child2"></div>
+    `;
+    document.body.appendChild(mockRoot);
+    animator = new Animator(mockRoot, /* animationsEnabled= */ true);
+  });
+
+  test('Animates', async () => {
+    const animations = animator.animate(
+        '.child',
+        [
+          {width: '50px'},
+          {width: '100px'},
+        ],
+        {delay: 10, duration: 50, easing: 'ease-in'});
+    assertEquals(2, animations.length);
+    await animationsAsPromises(animations);
+    animations.forEach((animation) => {
+      const effect = animation.effect as KeyframeEffect;
+      const timing = effect.getTiming();
+      assertEquals(10, timing.delay);
+      assertEquals(50, timing.duration);
+      assertEquals('ease-in', timing.easing);
+      assertEquals(100, (effect.target as HTMLElement).offsetWidth);
+    });
+  });
+
+  test('FadesIn', async () => {
+    const animations = animator.fadeIn('#child1', {duration: 5});
+    assertEquals(1, animations.length);
+    const child = mockRoot.shadowRoot!.querySelector('#child1')!;
+    assertEquals('0', window.getComputedStyle(child).opacity);
+    await animationsAsPromises(animations);
+    assertEquals('1', window.getComputedStyle(child).opacity);
+  });
+
+  test('ScalesIn', async () => {
+    const animations = animator.scaleIn('#child1', {duration: 5});
+    assertEquals(1, animations.length);
+    const child = mockRoot.shadowRoot!.querySelector('#child1')!;
+    assertEquals(
+        'matrix(0, 0, 0, 0, 0, 0)', window.getComputedStyle(child).transform);
+    await animationsAsPromises(animations);
+    assertEquals(
+        'matrix(1, 0, 0, 1, 0, 0)', window.getComputedStyle(child).transform);
+  });
+
+  test('SlidesIn', async () => {
+    const animations = animator.slideIn('#child1', 83, {duration: 5});
+    assertEquals(1, animations.length);
+    const child = mockRoot.shadowRoot!.querySelector('#child1')!;
+    assertEquals(
+        'matrix(1, 0, 0, 1, 0, 83)', window.getComputedStyle(child).transform);
+    await animationsAsPromises(animations);
+    assertEquals(
+        'matrix(1, 0, 0, 1, 0, 0)', window.getComputedStyle(child).transform);
+  });
+
+  test('DisablesAnimations', () => {
+    const disabledAnimator = new Animator(mockRoot, false);
+    const animations = disabledAnimator.animate(
+        '.child',
+        [
+          {width: '50px'},
+          {width: '100px'},
+        ],
+        {delay: 10, duration: 50, easing: 'ease-in'});
+    assertEquals(0, animations.length);
+  });
+});
diff --git a/chrome/test/data/webui/compose/compose_browsertest.cc b/chrome/test/data/webui/compose/compose_browsertest.cc
index 99624b21..a30f58f2 100644
--- a/chrome/test/data/webui/compose/compose_browsertest.cc
+++ b/chrome/test/data/webui/compose/compose_browsertest.cc
@@ -23,3 +23,7 @@
 IN_PROC_BROWSER_TEST_F(ComposeTest, Textarea) {
   RunTest("compose/compose_textarea_test.js", "mocha.run()");
 }
+
+IN_PROC_BROWSER_TEST_F(ComposeTest, Animator) {
+  RunTest("compose/compose_animator_test.js", "mocha.run()");
+}
diff --git a/chrome/test/data/webui/search_engine_choice/search_engine_choice_js_browsertest.cc b/chrome/test/data/webui/search_engine_choice/search_engine_choice_js_browsertest.cc
index 8ca2107b..fd03d1250 100644
--- a/chrome/test/data/webui/search_engine_choice/search_engine_choice_js_browsertest.cc
+++ b/chrome/test/data/webui/search_engine_choice/search_engine_choice_js_browsertest.cc
@@ -29,8 +29,7 @@
           /*force_chrome_build=*/true);
 };
 
-// TODO(crbug.com/1509119) Fix test flakes and re-enable it.
 IN_PROC_BROWSER_TEST_F(SearchEngineChoiceJsBrowserTest,
-                       DISABLED_SearchEngineChoiceTest) {
+                       SearchEngineChoiceTest) {
   RunTest("search_engine_choice/search_engine_choice_test.js", "mocha.run()");
 }
diff --git a/chrome/test/data/webui/search_engine_choice/search_engine_choice_test.ts b/chrome/test/data/webui/search_engine_choice/search_engine_choice_test.ts
index 01d2cacf..5962e3e 100644
--- a/chrome/test/data/webui/search_engine_choice/search_engine_choice_test.ts
+++ b/chrome/test/data/webui/search_engine_choice/search_engine_choice_test.ts
@@ -15,19 +15,7 @@
   let testElement: SearchEngineChoiceAppElement;
   let handler: TestMock<PageHandlerRemote>&PageHandlerRemote;
 
-  /**
-   * Async spin until predicate() returns true.
-   */
-  function waitFor(predicate: () => boolean): Promise<void> {
-    if (predicate()) {
-      return Promise.resolve();
-    }
-    return new Promise(resolve => setTimeout(() => {
-                         resolve(waitFor(predicate));
-                       }, 0));
-  }
-
-  setup(function() {
+  setup(async function() {
     document.body.innerHTML = window.trustedTypes!.emptyHTML;
     handler = TestMock.fromClass(PageHandlerRemote);
     SearchEngineChoiceBrowserProxy.setInstance(
@@ -35,7 +23,8 @@
 
     testElement = document.createElement('search-engine-choice-app');
     document.body.appendChild(testElement);
-    return waitBeforeNextRender(testElement);
+    await waitBeforeNextRender(testElement);
+    testElement.setInstantScrollBehaviorForTest();
   });
 
   teardown(function() {
@@ -65,9 +54,9 @@
     // The action button text should become "Set as default" after being clicked
     // but still be disabled because we haven't yet made a choice.
     actionButton.click();
-    await waitFor(
-        () => actionButton.textContent!.trim() ===
-            testElement.i18n('submitButtonText'));
+    await waitBeforeNextRender(actionButton);
+    assertEquals(
+        actionButton.textContent!.trim(), testElement.i18n('submitButtonText'));
     assertTrue(actionButton.disabled);
 
     // The action button should be enabled after making a choice.
diff --git a/chrome/test/data/webui/settings/chromeos/os_a11y_page/cursor_and_touchpad_page_test.ts b/chrome/test/data/webui/settings/chromeos/os_a11y_page/cursor_and_touchpad_page_test.ts
index 62327a08..5c85d3d 100644
--- a/chrome/test/data/webui/settings/chromeos/os_a11y_page/cursor_and_touchpad_page_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_a11y_page/cursor_and_touchpad_page_test.ts
@@ -402,10 +402,15 @@
         assert(faceGazeToggle);
         assertTrue(isVisible(faceGazeToggle));
 
-        const faceGazeSettingsButton =
-            page.shadowRoot!.querySelector('#faceGazeSettingsButton');
-        assert(faceGazeSettingsButton);
-        assertFalse(isVisible(faceGazeSettingsButton));
+        const faceGazeCursorControlButton =
+            page.shadowRoot!.querySelector('#faceGazeCursorControlButton');
+        assert(faceGazeCursorControlButton);
+        assertFalse(isVisible(faceGazeCursorControlButton));
+
+        const faceGazeFacialExpressionsButton =
+            page.shadowRoot!.querySelector('#faceGazeFacialExpressionsButton');
+        assert(faceGazeFacialExpressionsButton);
+        assertFalse(isVisible(faceGazeFacialExpressionsButton));
 
         assertFalse(faceGazeToggle.checked);
         assertFalse(page.prefs.settings.a11y.face_gaze.enabled.value);
@@ -415,6 +420,7 @@
         flush();
         assertTrue(faceGazeToggle.checked);
         assertTrue(page.prefs.settings.a11y.face_gaze.enabled.value);
-        assertTrue(isVisible(faceGazeSettingsButton));
+        assertTrue(isVisible(faceGazeCursorControlButton));
+        assertTrue(isVisible(faceGazeFacialExpressionsButton));
       });
 });
diff --git a/chrome/test/data/webui/settings/chromeos/os_apps_page/os_apps_page_test.ts b/chrome/test/data/webui/settings/chromeos/os_apps_page/os_apps_page_test.ts
index c455f636..98f5b49 100644
--- a/chrome/test/data/webui/settings/chromeos/os_apps_page/os_apps_page_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_apps_page/os_apps_page_test.ts
@@ -24,6 +24,8 @@
 type App = appNotificationHandlerMojom.App;
 type ReadinessType = appNotificationHandlerMojom.Readiness;
 
+const isRevampWayfindingEnabled =
+    loadTimeData.getBoolean('isRevampWayfindingEnabled');
 let appsPage: OsSettingsAppsPageElement;
 let androidAppsBrowserProxy: TestAndroidAppsBrowserProxy;
 
@@ -36,7 +38,7 @@
   return {
     arc: {
       enabled: {
-        key: 'arc.enabledd',
+        key: 'arc.enabled',
         type: chrome.settingsPrivate.PrefType.BOOLEAN,
         value: false,
       },
@@ -55,7 +57,7 @@
   return {
     arc: {
       enabled: {
-        key: 'arc.enabledd',
+        key: 'arc.enabled',
         type: chrome.settingsPrivate.PrefType.BOOLEAN,
         value: false,
       },
@@ -145,18 +147,30 @@
     assertNull(queryAppsOnStartupRow());
   });
 
-  test('Android Apps, On Startup, and App Management are shown', () => {
-    loadTimeData.overrideValues({
-      shouldShowStartup: true,
-      androidAppsVisible: true,
-    });
-    initPage();
+  if (isRevampWayfindingEnabled) {
+    test('On startup row does not exist in this page', () => {
+      loadTimeData.overrideValues({
+        shouldShowStartup: true,
+        androidAppsVisible: true,
+      });
+      initPage();
 
-    assertTrue(!!queryAppManagementRow());
-    assertTrue(!!queryAndroidAppsRow());
-    assertTrue(!!queryAppsOnStartupRow());
-    assertEquals(3, appsPage.get('onStartupOptions_').length);
-  });
+      assertFalse(isVisible(queryAppsOnStartupRow()));
+    });
+  } else {
+    test('Android Apps, On Startup, and App Management are shown', () => {
+      loadTimeData.overrideValues({
+        shouldShowStartup: true,
+        androidAppsVisible: true,
+      });
+      initPage();
+
+      assertTrue(!!queryAppManagementRow());
+      assertTrue(!!queryAndroidAppsRow());
+      assertTrue(!!queryAppsOnStartupRow());
+      assertEquals(3, appsPage.get('onStartupOptions_').length);
+    });
+  }
 });
 
 suite('<os-apps-page> Subpage trigger focusing', () => {
@@ -278,35 +292,46 @@
       flush();
     });
 
-    test('App notification row', async () => {
-      const rowLink = appsPage.shadowRoot!.querySelector<CrLinkRowElement>(
-          '#appNotificationsRow');
-      assertTrue(!!rowLink);
-      // Test default is to have 0 apps.
-      assertEquals('0 apps', rowLink.subLabel);
+    if (isRevampWayfindingEnabled) {
+      test('App notification row displays helpful description', async () => {
+        const rowLink = appsPage.shadowRoot!.querySelector<CrLinkRowElement>(
+            '#appNotificationsRow');
+        assertTrue(!!rowLink);
+        assertEquals(
+            'Manage app notifications, Do not disturb, and app badging',
+            rowLink.subLabel);
+      });
+    } else {
+      test('App notification row displays number of apps', async () => {
+        const rowLink = appsPage.shadowRoot!.querySelector<CrLinkRowElement>(
+            '#appNotificationsRow');
+        assertTrue(!!rowLink);
+        // Test default is to have 0 apps.
+        assertEquals('0 apps', rowLink.subLabel);
 
-      const permission1 = createBoolPermission(
-          /**id=*/ 1,
-          /**value=*/ false, /**is_managed=*/ false);
-      const permission2 = createBoolPermission(
-          /**id=*/ 2,
-          /**value=*/ true, /**is_managed=*/ false);
-      const app1 = createApp('1', 'App1', permission1);
-      const app2 = createApp('2', 'App2', permission2);
+        const permission1 = createBoolPermission(
+            /**id=*/ 1,
+            /**value=*/ false, /**is_managed=*/ false);
+        const permission2 = createBoolPermission(
+            /**id=*/ 2,
+            /**value=*/ true, /**is_managed=*/ false);
+        const app1 = createApp('1', 'App1', permission1);
+        const app2 = createApp('2', 'App2', permission2);
 
-      simulateNotificationAppChanged(app1);
-      simulateNotificationAppChanged(app2);
-      await flushTasks();
+        simulateNotificationAppChanged(app1);
+        simulateNotificationAppChanged(app2);
+        await flushTasks();
 
-      assertEquals('2 apps', rowLink.subLabel);
+        assertEquals('2 apps', rowLink.subLabel);
 
-      // Simulate an uninstalled app.
-      const app3 =
-          createApp('2', 'App2', permission2, Readiness.kUninstalledByUser);
-      simulateNotificationAppChanged(app3);
-      await flushTasks();
-      assertEquals('1 apps', rowLink.subLabel);
-    });
+        // Simulate an uninstalled app.
+        const app3 =
+            createApp('2', 'App2', permission2, Readiness.kUninstalledByUser);
+        simulateNotificationAppChanged(app3);
+        await flushTasks();
+        assertEquals('1 apps', rowLink.subLabel);
+      });
+    }
 
     test('Manage isolated web apps row', () => {
       const rowLink =
@@ -332,48 +357,52 @@
       assertTrue(!!appsPage.shadowRoot!.querySelector('.subpage-arrow'));
     });
 
-    test('On startup dropdown menu', () => {
-      const getPref = () => {
+    // On startup row does not exist in the apps page under the revamp.
+    if (!isRevampWayfindingEnabled) {
+      test('On startup dropdown menu', () => {
+        const getPref = () => {
+          const element =
+              appsPage.shadowRoot!.querySelector<SettingsDropdownMenuElement>(
+                  '#onStartupDropdown');
+          assertTrue(!!element);
+          const pref = element.pref;
+          assertTrue(!!pref);
+          return pref;
+        };
+
+        appsPage.prefs = setPrefs(1);
+        flush();
+        assertEquals(1, getPref().value);
+
+        appsPage.prefs = setPrefs(2);
+        flush();
+        assertEquals(2, getPref().value);
+
+        appsPage.prefs = setPrefs(3);
+        flush();
+        assertEquals(3, getPref().value);
+      });
+
+      test('Deep link to On startup dropdown menu', async () => {
+        const SETTING_ID_703 =
+            settingMojom.Setting.kRestoreAppsAndPages.toString();
+        const params = new URLSearchParams();
+        params.append('settingId', SETTING_ID_703);
+        Router.getInstance().navigateTo(routes.APPS, params);
+
         const element =
-            appsPage.shadowRoot!.querySelector<SettingsDropdownMenuElement>(
-                '#onStartupDropdown');
+            appsPage.shadowRoot!.querySelector('#onStartupDropdown');
         assertTrue(!!element);
-        const pref = element.pref;
-        assertTrue(!!pref);
-        return pref;
-      };
-
-      appsPage.prefs = setPrefs(1);
-      flush();
-      assertEquals(1, getPref().value);
-
-      appsPage.prefs = setPrefs(2);
-      flush();
-      assertEquals(2, getPref().value);
-
-      appsPage.prefs = setPrefs(3);
-      flush();
-      assertEquals(3, getPref().value);
-    });
-
-    test('Deep link to On startup dropdown menu', async () => {
-      const SETTING_ID_703 =
-          settingMojom.Setting.kRestoreAppsAndPages.toString();
-      const params = new URLSearchParams();
-      params.append('settingId', SETTING_ID_703);
-      Router.getInstance().navigateTo(routes.APPS, params);
-
-      const element = appsPage.shadowRoot!.querySelector('#onStartupDropdown');
-      assertTrue(!!element);
-      const deepLinkElement =
-          element.shadowRoot!.querySelector<HTMLElement>('#dropdownMenu');
-      assertTrue(!!deepLinkElement);
-      await waitAfterNextRender(deepLinkElement);
-      assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          `On startup dropdown menu should be focused for settingId=${
-              SETTING_ID_703}.`);
-    });
+        const deepLinkElement =
+            element.shadowRoot!.querySelector<HTMLElement>('#dropdownMenu');
+        assertTrue(!!deepLinkElement);
+        await waitAfterNextRender(deepLinkElement);
+        assertEquals(
+            deepLinkElement, getDeepActiveElement(),
+            `On startup dropdown menu should be focused for settingId=${
+                SETTING_ID_703}.`);
+      });
+    }
 
     test('Deep link to manage android prefs', async () => {
       // Simulate showing manage apps link
@@ -595,67 +624,25 @@
       assertTrue(
           !!subpage.shadowRoot!.querySelector('#manageArcvmShareUsbDevices'));
     });
-  });
 
-  suite('with OsSettingsRevampWayfinding feature enabled', () => {
-    let subpage: SettingsAndroidAppsSubpageElement;
+    if (isRevampWayfindingEnabled) {
+      test(
+          'Open Google Play link row appears and once clicked, ' +
+              'opens the play store app',
+          async () => {
+            const row = subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+                '#openGooglePlayRow');
+            assertTrue(!!row);
 
-    setup(() => {
-      const loadTimeDataOverrides = {
-        isRevampWayfindingEnabled: true,
-      };
-
-      preliminarySetupForAndroidAppsSubpage(loadTimeDataOverrides);
-
-      subpage = document.createElement('settings-android-apps-subpage');
-      document.body.appendChild(subpage);
-
-      flush();
-    });
-
-    teardown(() => {
-      document.body.innerHTML = window.trustedTypes!.emptyHTML;
-      subpage.remove();
-    });
-
-    test(
-        'Open Google Play link row appears and once clicked, ' +
-            'opens the play store app',
-        async () => {
-          const row = subpage.shadowRoot!.querySelector<HTMLButtonElement>(
-              '#openGooglePlayRow');
-          assertTrue(!!row);
-
-          row.click();
-          flush();
-          await androidAppsBrowserProxy.whenCalled('showPlayStoreApps');
-        });
-  });
-
-  suite('with OsSettingsRevampWayfinding feature disabled', () => {
-    let subpage: SettingsAndroidAppsSubpageElement;
-
-    setup(() => {
-      const loadTimeDataOverrides = {
-        isRevampWayfindingEnabled: false,
-      };
-
-      preliminarySetupForAndroidAppsSubpage(loadTimeDataOverrides);
-
-      subpage = document.createElement('settings-android-apps-subpage');
-      document.body.appendChild(subpage);
-
-      flush();
-    });
-
-    teardown(() => {
-      document.body.innerHTML = window.trustedTypes!.emptyHTML;
-      subpage.remove();
-    });
-
-    test('Open Google Play link row does not appear.', () => {
-      const row = subpage.shadowRoot!.querySelector('#openGooglePlayRow');
-      assertFalse(isVisible(row));
-    });
+            row.click();
+            flush();
+            await androidAppsBrowserProxy.whenCalled('showPlayStoreApps');
+          });
+    } else {
+      test('Open Google Play link row does not appear.', () => {
+        const row = subpage.shadowRoot!.querySelector('#openGooglePlayRow');
+        assertFalse(isVisible(row));
+      });
+    }
   });
 });
diff --git a/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts b/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts
index d3ac95a..3b7cc0a5 100644
--- a/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts
@@ -26,6 +26,8 @@
 }
 
 suite('<os-settings-people-page>', () => {
+  const isRevampWayfindingEnabled =
+      loadTimeData.getBoolean('isRevampWayfindingEnabled');
   let peoplePage: OsSettingsPeoplePageElement;
   let browserProxy: ProfileInfoBrowserProxy&TestProfileInfoBrowserProxy;
   let syncBrowserProxy: SyncBrowserProxy&TestSyncBrowserProxy;
@@ -57,11 +59,7 @@
     Router.getInstance().resetRouteForTesting();
   });
 
-  suite('with isRevampWayfindingEnabled disabled', () => {
-    setup(() => {
-      loadTimeData.overrideValues({isRevampWayfindingEnabled: false});
-    });
-
+  if (!isRevampWayfindingEnabled) {
     test('Profile name and picture, account manager disabled', async () => {
       loadTimeData.overrideValues({
         isAccountManagerEnabled: false,
@@ -342,13 +340,7 @@
                 `${triggerSelector} should be focused.`);
           });
     });
-  });
-
-  suite('with isRevampWayfindingEnabled enabled', () => {
-    setup(() => {
-      loadTimeData.overrideValues({isRevampWayfindingEnabled: true});
-    });
-
+  } else {
     test('account manager settings card is visible', async () => {
       createPage();
 
@@ -417,5 +409,5 @@
 
           assertNull(parentalControlsSettingsCard);
         });
-  });
+  }
 });
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index 479c5266..f399132 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -821,6 +821,16 @@
    'os_a11y_page/tts_voice_subpage_test.js',
  ],
  [
+   'OsAppsPage',
+   'os_apps_page/os_apps_page_test.js',
+   {disabled: ['ash::features::kOsSettingsRevampWayfinding']},
+ ],
+ [
+   'OsAppsPageRevamp',
+   'os_apps_page/os_apps_page_test.js',
+   {enabled: ['ash::features::kOsSettingsRevampWayfinding']},
+ ],
+ [
    'OsAppsPageAppManagementPageAppDetailsItem',
    'os_apps_page/app_management_page/app_details_item_test.js',
    {enabled: ['features::kAppManagementAppDetails']},
@@ -895,7 +905,6 @@
    'os_apps_page/app_notifications_page/app_notifications_subpage_test.js',
    {disabled: ['ash::features::kOsSettingsRevampWayfinding']},
  ],
- ['OsAppsPage', 'os_apps_page/os_apps_page_test.js'],
  [
    'OsAppsPageAppNotificationsPageAppNotificationsManagerSubpage',
    'os_apps_page/app_notifications_page/app_notifications_manager_subpage_test.js',
@@ -982,7 +991,16 @@
    'os_page_availability_test.js',
    {enabled: ['ash::features::kOsSettingsRevampWayfinding']},
  ],
- ['OsPeoplePage', 'os_people_page/os_people_page_test.js'],
+ [
+   'OsPeoplePage',
+   'os_people_page/os_people_page_test.js',
+   {disabled: ['ash::features::kOsSettingsRevampWayfinding']},
+ ],
+ [
+   'OsPeoplePageRevamp',
+   'os_people_page/os_people_page_test.js',
+   {enabled: ['ash::features::kOsSettingsRevampWayfinding']},
+ ],
  ['OsPeoplePageAddUserDialog', 'os_people_page/add_user_dialog_test.js'],
  [
    'OsPeoplePageFingerprintListSubpage',
@@ -1168,6 +1186,7 @@
  [
    'OsSettingsUiScrollRestoration',
    'os_settings_ui/scroll_restoration_test.js',
+   {disabled: ['ash::features::kOsSettingsRevampWayfinding']},
  ],
  [
    'OsSettingsUiToolbar',
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/scroll_restoration_test.ts b/chrome/test/data/webui/settings/chromeos/os_settings_ui/scroll_restoration_test.ts
index c0a86470..bc67110b 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_ui/scroll_restoration_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/scroll_restoration_test.ts
@@ -11,8 +11,7 @@
 
 import {CrSettingsPrefs, OsSettingsUiElement, Router, routes} from 'chrome://os-settings/os_settings.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
-import {assert} from 'chrome://resources/js/assert.js';
-import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {FakeNetworkConfig} from 'chrome://webui-test/chromeos/fake_network_config_mojom.js';
 import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
@@ -45,9 +44,9 @@
   });
 
   teardown(() => {
+    ui.remove();
     Router.getInstance().resetRouteForTesting();
     mojoRemote.resetForTest();
-    ui.remove();
   });
 
   test(
@@ -56,7 +55,7 @@
       async () => {
         const containerEl =
             ui.shadowRoot!.querySelector<HTMLElement>('#container');
-        assert(containerEl);
+        assertTrue(!!containerEl);
 
         // Scroll to bottom of the scrollable container
         const expectedScrollValue =
diff --git a/chrome/test/data/webui/settings/chromeos/parental_controls_page/parental_controls_settings_card_test.ts b/chrome/test/data/webui/settings/chromeos/parental_controls_page/parental_controls_settings_card_test.ts
index 8de1cd1..0c2c3b87 100644
--- a/chrome/test/data/webui/settings/chromeos/parental_controls_page/parental_controls_settings_card_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/parental_controls_page/parental_controls_settings_card_test.ts
@@ -4,11 +4,12 @@
 
 import 'chrome://os-settings/os_settings.js';
 
-import {CrButtonElement, CrLinkRowElement, ParentalControlsBrowserProxyImpl, ParentalControlsSettingsCardElement} from 'chrome://os-settings/os_settings.js';
+import {CrButtonElement, CrLinkRowElement, ParentalControlsBrowserProxyImpl, ParentalControlsSettingsCardElement, Router, routes, settingMojom} from 'chrome://os-settings/os_settings.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
 
 import {TestParentalControlsBrowserProxy} from './test_parental_controls_browser_proxy.js';
 
@@ -20,6 +21,7 @@
     loadTimeData.overrideValues({
       // Simulate parental controls.
       showParentalControls: true,
+      isChild: false,
     });
   });
 
@@ -89,6 +91,23 @@
     assertFalse(setupButton.disabled);
   });
 
+  test('Deep link to parental controls setup button', async () => {
+    const params = new URLSearchParams();
+    const settingId = settingMojom.Setting.kSetUpParentalControls.toString();
+    params.append('settingId', settingId);
+    Router.getInstance().navigateTo(routes.OS_PEOPLE, params);
+    flush();
+
+    const deepLinkElement =
+        parentalControlsSettingsCard.shadowRoot!.querySelector<HTMLElement>(
+            '#setupButton');
+    assertTrue(!!deepLinkElement);
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, parentalControlsSettingsCard.shadowRoot!.activeElement,
+        `Setup button should be focused for settingId=${settingId}.`);
+  });
+
   suite('Chrome OS parental controls page child account tests', () => {
     suiteSetup(() => {
       loadTimeData.overrideValues({
diff --git a/chromeos/ash/components/audio/cras_audio_handler.h b/chromeos/ash/components/audio/cras_audio_handler.h
index 419154f..d81f489 100644
--- a/chromeos/ash/components/audio/cras_audio_handler.h
+++ b/chromeos/ash/components/audio/cras_audio_handler.h
@@ -711,9 +711,6 @@
 
   AudioDevice ConvertAudioNodeWithModifiedPriority(const AudioNode& node);
 
-  static const AudioDevice* GetDeviceFromStableDeviceId(
-      const AudioDeviceMap& devices,
-      uint64_t stable_device_id);
   const AudioDevice* GetKeyboardMic() const;
 
   const AudioDevice* GetHotwordDevice() const;
@@ -887,9 +884,6 @@
   // Calling dbus to get system AEC supported flag.
   void GetSystemAecSupported();
 
-  // Calling dbus to get system AEC supported flag on main thread.
-  void GetSystemAecSupportedOnMainThread();
-
   // Handle dbus callback for GetSystemNoiseCancellationSupported.
   void HandleGetNoiseCancellationSupported(
       OnNoiseCancellationSupportedCallback callback,
@@ -899,37 +893,24 @@
   void HandleGetHfpMicSrSupported(OnHfpMicSrSupportedCallback callback,
                                   std::optional<bool> hfp_mic_sr_supported);
 
-  // Handle dbus callback for GetSpeakOnMuteDetectionEnabled.
-  void HandleGetSpeakOnMuteDetectionEnabled(
-      std::optional<bool> speak_on_mute_detection_enabled);
-
   // Handle dbus callback for GetSystemAecSupported.
   void HandleGetSystemAecSupported(std::optional<bool> system_aec_supported);
 
   // Calling dbus to get the system AEC group id if available.
   void GetSystemAecGroupId();
 
-  // Calling dbus to get any available system AEC group id on main thread.
-  void GetSystemAecGroupIdOnMainThread();
-
   // Handle dbus callback for GetSystemAecGroupId.
   void HandleGetSystemAecGroupId(std::optional<int32_t> system_aec_group_id);
 
   // Calling dbus to get system NS supported flag.
   void GetSystemNsSupported();
 
-  // Calling dbus to get system NS supported flag on main thread.
-  void GetSystemNsSupportedOnMainThread();
-
   // Handle dbus callback for GetSystemNsSupported.
   void HandleGetSystemNsSupported(std::optional<bool> system_ns_supported);
 
   // Calling dbus to get system AGC supported flag.
   void GetSystemAgcSupported();
 
-  // Calling dbus to get system AGC supported flag on main thread.
-  void GetSystemAgcSupportedOnMainThread();
-
   // Handle dbus callback for GetSystemAgcSupported.
   void HandleGetSystemAgcSupported(std::optional<bool> system_agc_supported);
 
diff --git a/chromeos/ash/components/emoji/tools/emoji_data.py b/chromeos/ash/components/emoji/tools/emoji_data.py
index bf9d3407..904a72f 100755
--- a/chromeos/ash/components/emoji/tools/emoji_data.py
+++ b/chromeos/ash/components/emoji/tools/emoji_data.py
@@ -9,6 +9,7 @@
 import argparse
 import json
 import xml.etree.ElementTree
+import enum
 
 _SCRIPT_DIR = os.path.realpath(os.path.dirname(__file__))
 _CHROME_SOURCE = os.path.realpath(
@@ -19,6 +20,42 @@
 import action_helpers
 
 
+# LINT.IfChange
+
+# `MULTI_TONE` is not defined in ../types.ts because this script removes any
+# multi-tone values before being outputted.
+class Tone(enum.IntEnum):
+  LIGHT = 1
+  MEDIUM_LIGHT = 2
+  MEDIUM = 3
+  MEDIUM_DARK = 4
+  DARK = 5
+  MULTI_TONE = 6
+
+
+class Gender(enum.IntEnum):
+  WOMAN = 1
+  MAN = 2
+
+# LINT.ThenChange(//chrome/browser/resources/chromeos/emoji_picker/types.ts)
+
+
+# Codepoints for the range of skin tone modifiers from lightest to darkest.
+TONE_MODIFIERS = {
+  ord('🏻'): Tone.LIGHT,
+  ord('🏼'): Tone.MEDIUM_LIGHT,
+  ord('🏽'): Tone.MEDIUM,
+  ord('🏾'): Tone.MEDIUM_DARK,
+  ord('🏿'): Tone.DARK,
+}
+
+# Codepoints for the woman and man gender modifiers.
+GENDER_MODIFIERS = {
+  ord('♀'): Gender.WOMAN,
+  ord('♂'): Gender.MAN,
+}
+
+
 def parse_emoji_annotations(keyword_file):
     names = {}
     keywords = {}
@@ -44,6 +81,29 @@
         return json.load(file)
 
 
+def get_tone(codepoints):
+  tone_matches = [
+    codepoint
+    for codepoint in codepoints
+    if codepoint in TONE_MODIFIERS
+  ]
+
+  if len(tone_matches) == 0:
+    return None
+  elif len(tone_matches) == 1:
+    return TONE_MODIFIERS[tone_matches[0]]
+  else:
+    return Tone.MULTI_TONE
+
+
+def get_gender(codepoints):
+  for codepoint in codepoints:
+    if codepoint in GENDER_MODIFIERS:
+      return GENDER_MODIFIERS[codepoint]
+
+  return None
+
+
 def transform_emoji_data(metadata, names, keywords, first_only):
     def transform(codepoints, is_variant, emoticons = None, shortcodes = None):
         if emoticons is None:
@@ -88,9 +148,31 @@
                 ),
             }
             if emoji['alternates']:
-              newobj['alternates'] = [
-                  transform(e, True) for e in emoji['alternates']
-              ]
+              newobj['alternates'] = []
+
+              has_multi_tone = any(
+                get_tone(codepoints) == Tone.MULTI_TONE
+                for codepoints in emoji['alternates']
+              )
+
+              for codepoints in emoji['alternates']:
+                variant = transform(codepoints, True)
+
+                # Multi-tone preferences are individual, so all tones are
+                # ignored if any variant is multi-tone.
+                tone = get_tone(codepoints) if not has_multi_tone else None
+                gender = get_gender(codepoints)
+
+                if tone:
+                  variant['tone'] = tone
+                  newobj['groupedTone'] = True
+
+                if gender:
+                  variant['gender'] = gender
+                  newobj['groupedGender'] = True
+
+                newobj['alternates'].append(variant)
+
             newGroup.append(newobj)
         out.append({'emoji': newGroup})
     return out
diff --git a/chromeos/crosapi/mojom/document_scan.mojom b/chromeos/crosapi/mojom/document_scan.mojom
index fa83eb4..9a0d274b 100644
--- a/chromeos/crosapi/mojom/document_scan.mojom
+++ b/chromeos/crosapi/mojom/document_scan.mojom
@@ -461,7 +461,7 @@
   ScannerOperationResult result@1;
 
   // If result is kSuccess, a list of the option groups.
-  array<OptionGroup>? options@2;
+  array<OptionGroup>? groups@2;
 };
 
 // The response from calling `CancelScan`.
diff --git a/chromeos/profiles/arm-exp.afdo.newest.txt b/chromeos/profiles/arm-exp.afdo.newest.txt
index b2730bf..3440e79a 100644
--- a/chromeos/profiles/arm-exp.afdo.newest.txt
+++ b/chromeos/profiles/arm-exp.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-exp-121-6167.9-1702295304-benchmark-122.0.6177.0-r1-redacted.afdo.xz
+chromeos-chrome-arm-exp-121-6167.9-1702295304-benchmark-122.0.6184.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/arm.afdo.newest.txt b/chromeos/profiles/arm.afdo.newest.txt
index 85cba38..294f41cf 100644
--- a/chromeos/profiles/arm.afdo.newest.txt
+++ b/chromeos/profiles/arm.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-none-121-6154.0-1702299075-benchmark-122.0.6179.0-r1-redacted.afdo.xz
+chromeos-chrome-arm-none-121-6154.0-1702299075-benchmark-122.0.6184.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index e02d5ede..2a801e6 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-121-6167.9-1702295304-benchmark-122.0.6183.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-121-6167.9-1702295304-benchmark-122.0.6184.0-r1-redacted.afdo.xz
diff --git a/chromeos/startup/browser_params_proxy.cc b/chromeos/startup/browser_params_proxy.cc
index e3629b96..08d241cf 100644
--- a/chromeos/startup/browser_params_proxy.cc
+++ b/chromeos/startup/browser_params_proxy.cc
@@ -21,6 +21,11 @@
   BrowserPostLoginParams::WaitForLogin();
 }
 
+// static
+bool BrowserParamsProxy::IsLoggedIn() {
+  return BrowserPostLoginParams::IsLoggedIn();
+}
+
 bool BrowserParamsProxy::IsCrosapiDisabledForTesting() const {
   return BrowserInitParams::is_crosapi_disabled_for_testing();
 }
diff --git a/chromeos/startup/browser_params_proxy.h b/chromeos/startup/browser_params_proxy.h
index 0d5fd7f..d488763 100644
--- a/chromeos/startup/browser_params_proxy.h
+++ b/chromeos/startup/browser_params_proxy.h
@@ -22,6 +22,9 @@
   // before any threads are created in the browser process.
   static void WaitForLogin();
 
+  // Returns true if the user has logged in, false if not.
+  static bool IsLoggedIn();
+
   // Init and post-login parameters' accessors are listed starting from here.
   bool IsCrosapiDisabledForTesting() const;
 
diff --git a/chromeos/startup/browser_postlogin_params.cc b/chromeos/startup/browser_postlogin_params.cc
index 6b412ea5..a660e80 100644
--- a/chromeos/startup/browser_postlogin_params.cc
+++ b/chromeos/startup/browser_postlogin_params.cc
@@ -55,6 +55,14 @@
     // SetPostLoginParamsForTests.
     CHECK_IS_TEST();
   }
+
+  // Signal that the user has logged in.
+  instance->logged_in_ = true;
+}
+
+// static
+bool BrowserPostLoginParams::IsLoggedIn() {
+  return GetInstanceInternal()->logged_in_;
 }
 
 // static
diff --git a/chromeos/startup/browser_postlogin_params.h b/chromeos/startup/browser_postlogin_params.h
index dee5627..169f433 100644
--- a/chromeos/startup/browser_postlogin_params.h
+++ b/chromeos/startup/browser_postlogin_params.h
@@ -24,6 +24,9 @@
   // before any threads are created in the browser process.
   static void WaitForLogin();
 
+  // Returns true if the user has logged in, false if not.
+  static bool IsLoggedIn();
+
   // Sets `postlogin_params_` to the provided value.
   // Useful for tests that cannot setup a full Lacros test environment with a
   // working Mojo connection to Ash.
@@ -55,6 +58,9 @@
 
   // Parameters passed from ash-chrome.
   crosapi::mojom::BrowserPostLoginParamsPtr postlogin_params_;
+
+  // Whether the user has logged in.
+  bool logged_in_ = false;
 };
 
 }  // namespace chromeos
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb
index f2152aca..cb89a7f 100644
--- a/chromeos/strings/chromeos_strings_ne.xtb
+++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -305,7 +305,7 @@
 <translation id="3294437725009624529">पाहुना</translation>
 <translation id="3303855915957856445">खोजका परिणाम फेला परेनन्</translation>
 <translation id="3305294846493618482">थप</translation>
-<translation id="3310640316857623290">DNS को विलम्बता तोकिएको समयसीमाभन्दा अत्याधिक मात्रामा बढी छ</translation>
+<translation id="3310640316857623290">DNS को विलम्बता तोकिएको समयसीमाभन्दा अत्यधिक मात्रामा बढी छ</translation>
 <translation id="3328783797891415197">परीक्षण चलिरहेको छ</translation>
 <translation id="3340011300870565703">यो डिभाइसको दायाँपट्टिको बडमा <ph name="BATTERY_PERCENTAGE" />% ब्याट्री बाँकी छ।</translation>
 <translation id="3340978935015468852">सेटिङहरू</translation>
diff --git a/components/OWNERS b/components/OWNERS
index 049b553b..09599df 100644
--- a/components/OWNERS
+++ b/components/OWNERS
@@ -58,7 +58,6 @@
 per-file undo_strings.grdp=file://components/undo/OWNERS
 per-file user_education_strings.grdp=file://components/user_education/OWNERS
 per-file version_ui_strings.grdp=file://components/version_ui/OWNERS
-per-file webauthn_strings.grdp=file://components/webauthn/OWNERS
 per-file web_contents_delegate_android_strings.grdp=file://components/embedder_support/android/delegate/OWNERS
 per-file webxr_strings.grdp=file://components/webxr/OWNERS
 
diff --git a/components/android_autofill/browser/test_support/autofill_provider_test_helper.cc b/components/android_autofill/browser/test_support/autofill_provider_test_helper.cc
index 7d97380..5459e7c 100644
--- a/components/android_autofill/browser/test_support/autofill_provider_test_helper.cc
+++ b/components/android_autofill/browser/test_support/autofill_provider_test_helper.cc
@@ -63,8 +63,8 @@
   std::vector<std::u16string> field_ids;
   base::android::AppendJavaStringArrayToStringVector(env, jfield_ids,
                                                      &field_ids);
-  std::vector<int> field_types;
-  base::android::JavaIntArrayToIntVector(env, jfield_types, &field_types);
+  std::vector<int> raw_field_types;
+  base::android::JavaIntArrayToIntVector(env, jfield_types, &raw_field_types);
 
   AutofillManager* autofill_manager = ToMainFrameAutofillManager(jweb_contents);
   const std::map<FormGlobalId, std::unique_ptr<FormStructure>>&
@@ -85,7 +85,7 @@
         if (form_field_data.id_attribute == field_ids[i]) {
           autofill::test::AddFieldPredictionToForm(
               form_field_data,
-              static_cast<autofill::ServerFieldType>(field_types[i]),
+              static_cast<autofill::FieldType>(raw_field_types[i]),
               form_suggestion);
           found_fields_count++;
           break;
@@ -117,9 +117,9 @@
   std::vector<std::u16string> field_ids;
   base::android::AppendJavaStringArrayToStringVector(env, jfield_ids,
                                                      &field_ids);
-  std::vector<std::vector<int>> field_types;
+  std::vector<std::vector<int>> raw_field_types;
   base::android::JavaArrayOfIntArrayToIntVector(env, jfield_types,
-                                                &field_types);
+                                                &raw_field_types);
 
   AutofillManager* autofill_manager = ToMainFrameAutofillManager(jweb_contents);
   const std::map<FormGlobalId, std::unique_ptr<FormStructure>>&
@@ -138,15 +138,13 @@
     for (size_t i = 0; i < field_ids.size(); ++i) {
       for (auto form_field_data : formData.fields) {
         if (form_field_data.id_attribute == field_ids[i]) {
-          std::vector<ServerFieldType> server_field_types;
-          server_field_types.reserve(field_types[i].size());
-          base::ranges::transform(field_types[i],
-                                  std::back_inserter(server_field_types),
-                                  [](int type) -> ServerFieldType {
-                                    return ServerFieldType(type);
-                                  });
+          std::vector<FieldType> field_types;
+          field_types.reserve(raw_field_types[i].size());
+          base::ranges::transform(
+              raw_field_types[i], std::back_inserter(field_types),
+              [](int type) -> FieldType { return FieldType(type); });
           autofill::test::AddFieldPredictionsToForm(
-              form_field_data, server_field_types, form_suggestion);
+              form_field_data, field_types, form_suggestion);
           found_fields_count++;
           break;
         }
diff --git a/components/autofill/core/browser/autofill_address_util.cc b/components/autofill/core/browser/autofill_address_util.cc
index 7ebbaf7..248c1bb 100644
--- a/components/autofill/core/browser/autofill_address_util.cc
+++ b/components/autofill/core/browser/autofill_address_util.cc
@@ -273,8 +273,7 @@
   base::flat_map<ServerFieldType, std::pair<std::u16string, std::u16string>>
       differences = AutofillProfileComparator::GetProfileDifferenceMap(
           first_profile, second_profile,
-          ServerFieldTypeSet(std::begin(kTypeToCompare),
-                             std::end(kTypeToCompare)),
+          FieldTypeSet(std::begin(kTypeToCompare), std::end(kTypeToCompare)),
           app_locale);
 
   std::u16string first_address = GetEnvelopeStyleAddress(
diff --git a/components/autofill/core/browser/autofill_compose_delegate.h b/components/autofill/core/browser/autofill_compose_delegate.h
index a3035931..bfa3215 100644
--- a/components/autofill/core/browser/autofill_compose_delegate.h
+++ b/components/autofill/core/browser/autofill_compose_delegate.h
@@ -5,14 +5,11 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_COMPOSE_DELEGATE_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_COMPOSE_DELEGATE_H_
 
-#include <optional>
-#include <string>
-
-#include "base/functional/callback.h"
-#include "components/autofill/core/browser/autofill_client.h"
+#include "components/autofill/core/common/unique_ids.h"
 
 namespace autofill {
 
+class AutofillDriver;
 struct FormFieldData;
 
 // The interface for communication from //components/autofill to
@@ -26,10 +23,6 @@
 // this interface exists and is injected via `AutofillClient`.
 class AutofillComposeDelegate {
  public:
-  // The callback to Autofill. When run, it fills the passed string into the
-  // form field on which it was triggered.
-  using ComposeCallback = base::OnceCallback<void(const std::u16string&)>;
-
   virtual ~AutofillComposeDelegate() = default;
 
   // Ui entry points for the compose offer.
@@ -46,10 +39,10 @@
   virtual bool HasSavedState(const FieldGlobalId& trigger_field_id) = 0;
 
   // Opens the Compose UI from the `ui_entry_point` given the 'driver',
-  // 'form_renderer_id', and 'field_renderer_id'.
-  virtual void OpenCompose(autofill::AutofillDriver& driver,
-                           autofill::FormRendererId form_renderer_id,
-                           autofill::FieldRendererId field_renderer_id,
+  // 'form_id', and 'field_id'.
+  virtual void OpenCompose(AutofillDriver& driver,
+                           FormGlobalId form_id,
+                           FieldGlobalId field_id,
                            UiEntryPoint ui_entry_point) = 0;
 };
 
diff --git a/components/autofill/core/browser/autofill_data_util.cc b/components/autofill/core/browser/autofill_data_util.cc
index c5ff2b3f..824286b 100644
--- a/components/autofill/core/browser/autofill_data_util.cc
+++ b/components/autofill/core/browser/autofill_data_util.cc
@@ -319,7 +319,7 @@
   return group_bitmask;
 }
 
-uint32_t DetermineGroups(const ServerFieldTypeSet& types) {
+uint32_t DetermineGroups(const FieldTypeSet& types) {
   uint32_t group_bitmask = 0;
   for (const ServerFieldType type : types) {
     AddGroupToBitmask(&group_bitmask, type);
diff --git a/components/autofill/core/browser/autofill_data_util.h b/components/autofill/core/browser/autofill_data_util.h
index 2b61846..dcdeec2 100644
--- a/components/autofill/core/browser/autofill_data_util.h
+++ b/components/autofill/core/browser/autofill_data_util.h
@@ -57,7 +57,7 @@
 // phone number FieldTypeGroups are associated with the given |form|'s storable
 // types or |types|, respectively.
 uint32_t DetermineGroups(const FormStructure& form);
-uint32_t DetermineGroups(const ServerFieldTypeSet& types);
+uint32_t DetermineGroups(const FieldTypeSet& types);
 
 // Returns true if a form has address fields or has least two supported
 // non-address fields.
diff --git a/components/autofill/core/browser/autofill_data_util_unittest.cc b/components/autofill/core/browser/autofill_data_util_unittest.cc
index 6276de4..89fc3da 100644
--- a/components/autofill/core/browser/autofill_data_util_unittest.cc
+++ b/components/autofill/core/browser/autofill_data_util_unittest.cc
@@ -19,21 +19,21 @@
 using data_util::bit_field_type_groups::kPhone;
 
 TEST(AutofillDataUtilTest, DetermineGroupsForHomeNameAndAddress) {
-  const ServerFieldTypeSet field_types{NAME_HONORIFIC_PREFIX,
-                                       NAME_FULL,
-                                       NAME_FIRST,
-                                       NAME_MIDDLE,
-                                       NAME_MIDDLE_INITIAL,
-                                       NAME_LAST,
-                                       NAME_LAST_FIRST,
-                                       NAME_LAST_CONJUNCTION,
-                                       NAME_LAST_SECOND,
-                                       NAME_FIRST,
-                                       NAME_LAST,
-                                       ADDRESS_HOME_LINE1,
-                                       ADDRESS_HOME_CITY,
-                                       ADDRESS_HOME_STATE,
-                                       ADDRESS_HOME_ZIP};
+  const FieldTypeSet field_types{NAME_HONORIFIC_PREFIX,
+                                 NAME_FULL,
+                                 NAME_FIRST,
+                                 NAME_MIDDLE,
+                                 NAME_MIDDLE_INITIAL,
+                                 NAME_LAST,
+                                 NAME_LAST_FIRST,
+                                 NAME_LAST_CONJUNCTION,
+                                 NAME_LAST_SECOND,
+                                 NAME_FIRST,
+                                 NAME_LAST,
+                                 ADDRESS_HOME_LINE1,
+                                 ADDRESS_HOME_CITY,
+                                 ADDRESS_HOME_STATE,
+                                 ADDRESS_HOME_ZIP};
 
   const uint32_t expected_group_bitmask = kName | kAddress;
   const uint32_t group_bitmask = data_util::DetermineGroups(field_types);
@@ -41,8 +41,8 @@
 }
 
 TEST(AutofillDataUtilTest, DetermineGroupsForHomeNamePhoneAndEmail) {
-  const ServerFieldTypeSet field_types{NAME_FULL, PHONE_HOME_CITY_AND_NUMBER,
-                                       EMAIL_ADDRESS};
+  const FieldTypeSet field_types{NAME_FULL, PHONE_HOME_CITY_AND_NUMBER,
+                                 EMAIL_ADDRESS};
 
   const uint32_t expected_group_bitmask = kName | kPhone | kEmail;
   const uint32_t group_bitmask = data_util::DetermineGroups(field_types);
@@ -50,8 +50,7 @@
 }
 
 TEST(AutofillDataUtilTest, DetermineGroupsForUnknownServerFieldType) {
-  const ServerFieldTypeSet field_types{UNKNOWN_TYPE, NAME_FULL,
-                                       ADDRESS_HOME_ZIP};
+  const FieldTypeSet field_types{UNKNOWN_TYPE, NAME_FULL, ADDRESS_HOME_ZIP};
 
   const uint32_t expected_group_bitmask = kName | kAddress;
   const uint32_t group_bitmask = data_util::DetermineGroups(field_types);
@@ -59,7 +58,7 @@
 }
 
 TEST(AutofillDataUtilTest, DetermineGroupsForNoServerFieldTypes) {
-  const ServerFieldTypeSet field_types;
+  const FieldTypeSet field_types;
   const uint32_t expected_group_bitmask = 0;
   const uint32_t group_bitmask = data_util::DetermineGroups(field_types);
   EXPECT_EQ(expected_group_bitmask, group_bitmask);
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc
index 64db3af..b71fd2bc 100644
--- a/components/autofill/core/browser/autofill_external_delegate.cc
+++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -323,7 +323,7 @@
   }
 }
 
-absl::optional<ServerFieldTypeSet>
+absl::optional<FieldTypeSet>
 AutofillExternalDelegate::GetLastFieldTypesToFillForSection(
     const Section& section) const {
   if (auto it =
@@ -667,8 +667,8 @@
       if (AutofillComposeDelegate* delegate =
               manager_->client().GetComposeDelegate()) {
         delegate->OpenCompose(
-            manager_->driver(), query_form_.unique_renderer_id,
-            query_field_.unique_renderer_id,
+            manager_->driver(), query_form_.global_id(),
+            query_field_.global_id(),
             autofill::AutofillComposeDelegate::UiEntryPoint::kAutofillPopup);
       }
       break;
diff --git a/components/autofill/core/browser/autofill_external_delegate.h b/components/autofill/core/browser/autofill_external_delegate.h
index cde5b84..14846e1 100644
--- a/components/autofill/core/browser/autofill_external_delegate.h
+++ b/components/autofill/core/browser/autofill_external_delegate.h
@@ -105,7 +105,7 @@
   // will store these fields so that in a next iteration, when the user clicks,
   // say a name field only fields that are of group name are filled, therefore
   // staying at a group filling level.
-  absl::optional<ServerFieldTypeSet> GetLastFieldTypesToFillForSection(
+  absl::optional<FieldTypeSet> GetLastFieldTypesToFillForSection(
       const Section& section) const;
 
   // Returns true if there is a screen reader installed on the machine.
@@ -242,7 +242,7 @@
   // Stores the last `AutofillTriggerDetails::field_types_to_fill`.
   // We key this information by form section to guarantee granular filling
   // side effects are specific are not "leaked" to other forms.
-  base::flat_map<Section, ServerFieldTypeSet>
+  base::flat_map<Section, FieldTypeSet>
       last_field_types_to_fill_for_address_form_section_;
 
   bool should_show_scan_credit_card_ = false;
diff --git a/components/autofill/core/browser/autofill_external_delegate_unittest.cc b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
index c80d88ea..2446750 100644
--- a/components/autofill/core/browser/autofill_external_delegate_unittest.cc
+++ b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
@@ -1268,7 +1268,7 @@
 // Test parameter data for asserting that group filling suggestions
 // forward the expected fields to the manager.
 struct GroupFillingTestParams {
-  const ServerFieldTypeSet field_types_to_fill;
+  const FieldTypeSet field_types_to_fill;
   const PopupItemId popup_item_id;
   const std::string test_name;
 };
@@ -1518,7 +1518,7 @@
 // Test parameter data for asserting that the expected set of field types
 // is stored in the delegate.
 struct GetLastServerTypesToFillForSectionTestParams {
-  const absl::optional<ServerFieldTypeSet>
+  const absl::optional<FieldTypeSet>
       expected_last_field_types_to_fill_for_section;
   const PopupItemId popup_item_id;
   const absl::optional<Section> section;
@@ -1545,7 +1545,7 @@
         // only, this way the next time the user interacts
         // with the form, they are kept at the same filling granularity.
         {.expected_last_field_types_to_fill_for_section =
-             absl::optional<ServerFieldTypeSet>({NAME_FIRST}),
+             absl::optional<FieldTypeSet>({NAME_FIRST}),
          .popup_item_id = PopupItemId::kAddressFieldByFieldFilling,
          .test_name = "_SingleField"},
         // Tests that when `GetLastFieldTypesToFillForSection` is called for
@@ -1725,8 +1725,8 @@
   // Simulate accepting a Compose suggestion.
   EXPECT_CALL(
       compose_delegate,
-      OpenCompose(_, queried_form_.unique_renderer_id,
-                  queried_form_triggering_field_id_.renderer_id,
+      OpenCompose(_, queried_form_.global_id(),
+                  queried_form_triggering_field_id_,
                   AutofillComposeDelegate::UiEntryPoint::kAutofillPopup));
   EXPECT_CALL(client(),
               HideAutofillPopup(PopupHidingReason::kAcceptSuggestion));
diff --git a/components/autofill/core/browser/autofill_field.h b/components/autofill/core/browser/autofill_field.h
index ccfb165..fe13770 100644
--- a/components/autofill/core/browser/autofill_field.h
+++ b/components/autofill/core/browser/autofill_field.h
@@ -91,7 +91,7 @@
   }
   HtmlFieldType html_type() const { return html_type_; }
   HtmlFieldMode html_mode() const { return html_mode_; }
-  const ServerFieldTypeSet& possible_types() const { return possible_types_; }
+  const FieldTypeSet& possible_types() const { return possible_types_; }
   const ServerFieldTypeValidityStatesMap& possible_types_validities() const {
     return possible_types_validities_;
   }
@@ -112,7 +112,7 @@
       std::optional<bool> may_use_prefilled_placeholder) {
     may_use_prefilled_placeholder_ = may_use_prefilled_placeholder;
   }
-  void set_possible_types(const ServerFieldTypeSet& possible_types) {
+  void set_possible_types(const FieldTypeSet& possible_types) {
     possible_types_ = possible_types;
   }
   void set_possible_types_validities(
@@ -407,7 +407,7 @@
   HtmlFieldMode html_mode_ = HtmlFieldMode::kNone;
 
   // The set of possible types for this field.
-  ServerFieldTypeSet possible_types_;
+  FieldTypeSet possible_types_;
 
   // The set of possible types and their validity for this field.
   ServerFieldTypeValidityStatesMap possible_types_validities_;
diff --git a/components/autofill/core/browser/autofill_granular_filling_utils.cc b/components/autofill/core/browser/autofill_granular_filling_utils.cc
index da62643..e577809d 100644
--- a/components/autofill/core/browser/autofill_granular_filling_utils.cc
+++ b/components/autofill/core/browser/autofill_granular_filling_utils.cc
@@ -11,7 +11,7 @@
 
 namespace {
 
-ServerFieldTypeSet GetServerFieldsForFieldGroup(FieldTypeGroup group) {
+FieldTypeSet GetServerFieldsForFieldGroup(FieldTypeGroup group) {
   switch (group) {
     case FieldTypeGroup::kName:
       return GetFieldTypesOfGroup(FieldTypeGroup::kName);
@@ -40,7 +40,7 @@
 }  // namespace
 
 AutofillFillingMethod GetFillingMethodFromTargetedFields(
-    const ServerFieldTypeSet& targeted_field_types) {
+    const FieldTypeSet& targeted_field_types) {
   if (targeted_field_types == kAllFieldTypes) {
     return AutofillFillingMethod::kFullForm;
   }
@@ -53,21 +53,21 @@
   return AutofillFillingMethod::kNone;
 }
 
-ServerFieldTypeSet GetAddressFieldsForGroupFilling() {
-  ServerFieldTypeSet fields = GetFieldTypesOfGroup(FieldTypeGroup::kAddress);
+FieldTypeSet GetAddressFieldsForGroupFilling() {
+  FieldTypeSet fields = GetFieldTypesOfGroup(FieldTypeGroup::kAddress);
   fields.insert_all(GetFieldTypesOfGroup(FieldTypeGroup::kCompany));
   return fields;
 }
 
-bool AreFieldsGranularFillingGroup(const ServerFieldTypeSet& field_types) {
+bool AreFieldsGranularFillingGroup(const FieldTypeSet& field_types) {
   return field_types == GetAddressFieldsForGroupFilling() ||
          field_types == GetFieldTypesOfGroup(FieldTypeGroup::kName) ||
          field_types == GetFieldTypesOfGroup(FieldTypeGroup::kEmail) ||
          field_types == GetFieldTypesOfGroup(FieldTypeGroup::kPhone);
 }
 
-ServerFieldTypeSet GetTargetServerFieldsForTypeAndLastTargetedFields(
-    const ServerFieldTypeSet& last_targeted_field_types,
+FieldTypeSet GetTargetServerFieldsForTypeAndLastTargetedFields(
+    const FieldTypeSet& last_targeted_field_types,
     ServerFieldType triggering_field_type) {
   switch (GetFillingMethodFromTargetedFields(last_targeted_field_types)) {
     case AutofillFillingMethod::kGroupFilling:
diff --git a/components/autofill/core/browser/autofill_granular_filling_utils.h b/components/autofill/core/browser/autofill_granular_filling_utils.h
index 5668654..02edb17 100644
--- a/components/autofill/core/browser/autofill_granular_filling_utils.h
+++ b/components/autofill/core/browser/autofill_granular_filling_utils.h
@@ -32,24 +32,24 @@
 // Autofill groups for addresses (for group filling we consider company fields
 // to be of address type), this method is effectively the union of
 // FieldTypeGroup::kAddress and FieldTypeGroup::kCompany.
-ServerFieldTypeSet GetAddressFieldsForGroupFilling();
+FieldTypeSet GetAddressFieldsForGroupFilling();
 
 // Returns true if `fields` matches one of granular filling groups, i.e.,
 // FieldTypeGroup::kName, FieldTypeGroup::kPhone, FieldTypeGroup::kEmail  or
 // `GetAddressFieldsForGroupFilling()`, see from the method above.
-bool AreFieldsGranularFillingGroup(const ServerFieldTypeSet& field_types);
+bool AreFieldsGranularFillingGroup(const FieldTypeSet& field_types);
 
 // Returns the autofill filling method corresponding to `targeted_fields`.
 AutofillFillingMethod GetFillingMethodFromTargetedFields(
-    const ServerFieldTypeSet& targeted_field_types);
+    const FieldTypeSet& targeted_field_types);
 
 // Returns a set of fields to be filled, given the last targeted fields and
 // the current trigger field type. For example, if the last targeted fields
 // matches one of the group filling sets, we will return the set of fields that
 // matches the triggering field group. This is done so that the user stays at
 // the same granularity as the one previously chosen.
-ServerFieldTypeSet GetTargetServerFieldsForTypeAndLastTargetedFields(
-    const ServerFieldTypeSet& last_targeted_field_types,
+FieldTypeSet GetTargetServerFieldsForTypeAndLastTargetedFields(
+    const FieldTypeSet& last_targeted_field_types,
     ServerFieldType trigger_field_type);
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_granular_filling_utils_unittest.cc b/components/autofill/core/browser/autofill_granular_filling_utils_unittest.cc
index d8dcc011..b523e75 100644
--- a/components/autofill/core/browser/autofill_granular_filling_utils_unittest.cc
+++ b/components/autofill/core/browser/autofill_granular_filling_utils_unittest.cc
@@ -40,7 +40,7 @@
     GetTargetServerFieldsForTypeAndLastTargetedFields_SingleField_ReturnsTriggeringFieldType) {
   EXPECT_EQ(GetTargetServerFieldsForTypeAndLastTargetedFields(
                 {ADDRESS_HOME_LINE1}, NAME_FIRST),
-            ServerFieldTypeSet({NAME_FIRST}));
+            FieldTypeSet({NAME_FIRST}));
 }
 
 // The test below asserts that when the last targeted fields match
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.cc b/components/autofill/core/browser/autofill_suggestion_generator.cc
index bce8fd7..d3fbd2df 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator.cc
+++ b/components/autofill/core/browser/autofill_suggestion_generator.cc
@@ -485,11 +485,10 @@
 }
 
 // Adds footer child suggestions to build autofill popup submenu.
-void AddFooterChildSuggestions(
-    const AutofillProfile& profile,
-    ServerFieldType trigger_field_type,
-    std::optional<ServerFieldTypeSet> last_targeted_fields,
-    Suggestion& suggestion) {
+void AddFooterChildSuggestions(const AutofillProfile& profile,
+                               ServerFieldType trigger_field_type,
+                               std::optional<FieldTypeSet> last_targeted_fields,
+                               Suggestion& suggestion) {
   // If the trigger field is not classified as an address field, then the
   // filling was triggered from the context menu. In this scenario, the user
   // should not be able to fill everything.
@@ -592,7 +591,7 @@
 // When not present, we default to full form.
 // This function is called only for first-level popup.
 PopupItemId GetProfileSuggestionPopupItemId(
-    absl::optional<ServerFieldTypeSet> last_targeted_fields,
+    absl::optional<FieldTypeSet> last_targeted_fields,
     ServerFieldType trigger_field_type) {
   if (!base::FeatureList::IsEnabled(
           features::kAutofillGranularFillingAvailable)) {
@@ -695,7 +694,7 @@
 // applied for a profile.
 std::vector<std::vector<std::u16string>> GetGranularFillingLabels(
     const std::vector<const AutofillProfile*>& profiles,
-    std::optional<ServerFieldTypeSet> last_targeted_fields,
+    std::optional<FieldTypeSet> last_targeted_fields,
     ServerFieldType triggering_field_type,
     const std::string& app_locale) {
   if (!last_targeted_fields ||
@@ -741,14 +740,14 @@
   return labels;
 }
 
-// Returns a `ServerFieldTypeSet` to be excluded from the differentiating labels
+// Returns a `FieldTypeSet` to be excluded from the differentiating labels
 // generation. The granular filling labels can contain information such
 // `ADDRESS_HOME_LINE1` depending on `triggering_field_type` and
 // `last_targeted_fields`, see `GetGranularFillingLabels()` for
 // details.
-ServerFieldTypeSet GetFieldTypesToExcludeFromDifferentiatingLabelsGeneration(
+FieldTypeSet GetFieldTypesToExcludeFromDifferentiatingLabelsGeneration(
     ServerFieldType triggering_field_type,
-    std::optional<ServerFieldTypeSet> last_targeted_fields) {
+    std::optional<FieldTypeSet> last_targeted_fields) {
   if (!last_targeted_fields ||
       !AreFieldsGranularFillingGroup(*last_targeted_fields)) {
     return {triggering_field_type};
@@ -788,9 +787,9 @@
 // `field_types` the types of the fields that will be filled by the suggestion.
 std::vector<std::u16string> GetProfileSuggestionLabels(
     const std::vector<const AutofillProfile*>& profiles,
-    const ServerFieldTypeSet& field_types,
+    const FieldTypeSet& field_types,
     ServerFieldType trigger_field_type,
-    std::optional<ServerFieldTypeSet> last_targeted_fields,
+    std::optional<FieldTypeSet> last_targeted_fields,
     const std::string& app_locale) {
   std::unique_ptr<LabelFormatter> formatter;
   bool use_formatter;
@@ -845,8 +844,8 @@
 CreateSuggestionLabelsWithGranularFillingDetails(
     base::span<const Suggestion> suggestions,
     const std::vector<const AutofillProfile*>& profiles,
-    const ServerFieldTypeSet& field_types,
-    std::optional<ServerFieldTypeSet> last_targeted_fields,
+    const FieldTypeSet& field_types,
+    std::optional<FieldTypeSet> last_targeted_fields,
     ServerFieldType trigger_field_type,
     const std::string& app_locale) {
   const std::vector<std::vector<std::u16string>>
@@ -1118,10 +1117,10 @@
 AutofillSuggestionGenerator::~AutofillSuggestionGenerator() = default;
 
 std::vector<Suggestion> AutofillSuggestionGenerator::GetSuggestionsForProfiles(
-    const ServerFieldTypeSet& field_types,
+    const FieldTypeSet& field_types,
     const FormFieldData& trigger_field,
     ServerFieldType trigger_field_type,
-    std::optional<ServerFieldTypeSet> last_targeted_fields,
+    std::optional<FieldTypeSet> last_targeted_fields,
     AutofillSuggestionTriggerSource trigger_source) {
   // If the user manually triggered suggestions from the context menu, all
   // available profiles should be shown. Selecting a suggestion overwrites the
@@ -1141,10 +1140,10 @@
   for (const AutofillProfile* profile : profiles_to_suggest) {
     previously_hidden_profiles_guid.insert(profile->guid());
   }
-  constexpr ServerFieldTypeSet street_address_field_types = {
+  constexpr FieldTypeSet street_address_field_types = {
       ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2,
       ADDRESS_HOME_LINE3};
-  ServerFieldTypeSet field_types_without_address_types = field_types;
+  FieldTypeSet field_types_without_address_types = field_types;
   field_types_without_address_types.erase_all(street_address_field_types);
 
   // Autofill already considers suggestions as different if the suggestion's
@@ -1172,7 +1171,7 @@
     ServerFieldType trigger_field_type,
     const std::u16string& field_contents,
     bool field_is_autofilled,
-    const ServerFieldTypeSet& field_types) {
+    const FieldTypeSet& field_types) {
   std::u16string field_contents_canon =
       NormalizeForComparisonForType(field_contents, trigger_field_type);
 
@@ -1206,8 +1205,8 @@
 std::vector<Suggestion>
 AutofillSuggestionGenerator::CreateSuggestionsFromProfiles(
     const std::vector<const AutofillProfile*>& profiles,
-    const ServerFieldTypeSet& field_types,
-    std::optional<ServerFieldTypeSet> last_targeted_fields,
+    const FieldTypeSet& field_types,
+    std::optional<FieldTypeSet> last_targeted_fields,
     ServerFieldType trigger_field_type,
     uint64_t trigger_field_max_length,
     const std::set<std::string>& previously_hidden_profiles_guid) {
@@ -1312,7 +1311,7 @@
 AutofillSuggestionGenerator::DeduplicatedProfilesForSuggestions(
     const std::vector<const AutofillProfile*>& matched_profiles,
     ServerFieldType trigger_field_type,
-    const ServerFieldTypeSet& field_types,
+    const FieldTypeSet& field_types,
     const AutofillProfileComparator& comparator) {
   // TODO(crbug.com/1417975): Remove when
   // `kAutofillUseAddressRewriterInProfileSubsetComparison` launches.
@@ -1431,7 +1430,7 @@
 }
 
 void AutofillSuggestionGenerator::AddAddressGranularFillingChildSuggestions(
-    std::optional<ServerFieldTypeSet> last_targeted_fields,
+    std::optional<FieldTypeSet> last_targeted_fields,
     ServerFieldType trigger_field_type,
     const AutofillProfile& profile,
     Suggestion& suggestion) const {
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.h b/components/autofill/core/browser/autofill_suggestion_generator.h
index 6851c4d..0e65cb63 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator.h
+++ b/components/autofill/core/browser/autofill_suggestion_generator.h
@@ -63,10 +63,10 @@
   // field filling, group filling or full form (default). `field_types` are the
   // relevant types for the current suggestions.
   std::vector<Suggestion> GetSuggestionsForProfiles(
-      const ServerFieldTypeSet& field_types,
+      const FieldTypeSet& field_types,
       const FormFieldData& trigger_field,
       ServerFieldType trigger_field_type,
-      absl::optional<ServerFieldTypeSet> last_targeted_fields,
+      absl::optional<FieldTypeSet> last_targeted_fields,
       AutofillSuggestionTriggerSource trigger_source);
 
   // Returns a list of profiles that will be displayed as suggestions to the
@@ -77,7 +77,7 @@
       ServerFieldType trigger_field_type,
       const std::u16string& field_contents,
       bool field_is_autofilled,
-      const ServerFieldTypeSet& field_types);
+      const FieldTypeSet& field_types);
 
   // Returns a list of Suggestion objects, each representing an element in
   // `profiles`.
@@ -89,8 +89,8 @@
   // kAutofillUseAddressRewriterInProfileSubsetComparison.
   std::vector<Suggestion> CreateSuggestionsFromProfiles(
       const std::vector<const AutofillProfile*>& profiles,
-      const ServerFieldTypeSet& field_types,
-      absl::optional<ServerFieldTypeSet> last_targeted_fields,
+      const FieldTypeSet& field_types,
+      absl::optional<FieldTypeSet> last_targeted_fields,
       ServerFieldType trigger_field_type,
       uint64_t trigger_field_max_length,
       const std::set<std::string>& previously_hidden_profiles_guid = {});
@@ -174,7 +174,7 @@
   std::vector<const AutofillProfile*> DeduplicatedProfilesForSuggestions(
       const std::vector<const AutofillProfile*>& matched_profiles,
       ServerFieldType trigger_field_type,
-      const ServerFieldTypeSet& field_types,
+      const FieldTypeSet& field_types,
       const AutofillProfileComparator& comparator);
 
   // Matches based on prefix search, and limits number of profiles.
@@ -200,7 +200,7 @@
   // `last_targeted_fields` specified the last set of fields target by the user.
   // When not present, we default to full form.
   void AddAddressGranularFillingChildSuggestions(
-      absl::optional<ServerFieldTypeSet> last_targeted_fields,
+      absl::optional<FieldTypeSet> last_targeted_fields,
       ServerFieldType trigger_field_type,
       const AutofillProfile& profile,
       Suggestion& suggestion) const;
diff --git a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
index a6006c7..80190e8 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
+++ b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
@@ -295,7 +295,7 @@
   personal_data()->AddProfile(profile3);
 
   // Simulate a form with street address, city and state.
-  ServerFieldTypeSet types = {ADDRESS_HOME_CITY, ADDRESS_HOME_STATE};
+  FieldTypeSet types = {ADDRESS_HOME_CITY, ADDRESS_HOME_STATE};
   std::vector<const AutofillProfile*> profiles =
       suggestion_generator()->GetProfilesToSuggest(ADDRESS_HOME_STREET_ADDRESS,
                                                    u"123", false, types);
@@ -1097,9 +1097,9 @@
  public:
   std::vector<Suggestion> CreateSuggestionWithChildrenFromProfile(
       const AutofillProfile& profile,
-      absl::optional<ServerFieldTypeSet> last_targeted_fields,
+      absl::optional<FieldTypeSet> last_targeted_fields,
       ServerFieldType trigger_field_type,
-      const ServerFieldTypeSet& field_types) {
+      const FieldTypeSet& field_types) {
     return suggestion_generator()->CreateSuggestionsFromProfiles(
         {&profile}, field_types, last_targeted_fields, trigger_field_type,
         /*trigger_field_max_length=*/0);
@@ -1107,7 +1107,7 @@
 
   std::vector<Suggestion> CreateSuggestionWithChildrenFromProfile(
       const AutofillProfile& profile,
-      absl::optional<ServerFieldTypeSet> last_targeted_fields,
+      absl::optional<FieldTypeSet> last_targeted_fields,
       ServerFieldType trigger_field_type) {
     return CreateSuggestionWithChildrenFromProfile(
         profile, last_targeted_fields, trigger_field_type,
@@ -1361,7 +1361,7 @@
     AutofillChildrenSuggestionGeneratorTest,
     CreateSuggestionsFromProfiles_LastTargetedFieldsIsSingleField_FieldByFieldFilling) {
   std::vector<Suggestion> suggestions = CreateSuggestionWithChildrenFromProfile(
-      profile(), absl::optional<ServerFieldTypeSet>({NAME_LAST}), NAME_FIRST);
+      profile(), absl::optional<FieldTypeSet>({NAME_LAST}), NAME_FIRST);
 
   ASSERT_EQ(suggestions.size(), 1u);
   EXPECT_THAT(suggestions[0],
@@ -1375,7 +1375,7 @@
        CreateSuggestionsFromProfiles_LastTargetedFieldsIsGroup_GroupFilling) {
   std::vector<Suggestion> suggestions = CreateSuggestionWithChildrenFromProfile(
       profile(),
-      absl::optional<ServerFieldTypeSet>(GetAddressFieldsForGroupFilling()),
+      absl::optional<FieldTypeSet>(GetAddressFieldsForGroupFilling()),
       NAME_FIRST, {NAME_FIRST, NAME_LAST});
 
   ASSERT_EQ(1U, suggestions.size());
@@ -1593,7 +1593,7 @@
   // We set only a name field as `last_targeted_fields` to denote that the user
   // chose field by field filling.
   std::vector<Suggestion> suggestions = CreateSuggestionWithChildrenFromProfile(
-      profile(), absl::optional<ServerFieldTypeSet>({NAME_FIRST}),
+      profile(), absl::optional<FieldTypeSet>({NAME_FIRST}),
       ADDRESS_HOME_LINE1);
 
   ASSERT_EQ(1U, suggestions.size());
diff --git a/components/autofill/core/browser/autofill_test_utils.cc b/components/autofill/core/browser/autofill_test_utils.cc
index 5a04b19..ff72b19 100644
--- a/components/autofill/core/browser/autofill_test_utils.cc
+++ b/components/autofill/core/browser/autofill_test_utils.cc
@@ -53,16 +53,7 @@
 namespace autofill {
 
 bool operator==(const FormFieldDataPredictions& a,
-                const FormFieldDataPredictions& b) {
-  auto members = [](const FormFieldDataPredictions& p) {
-    return std::tie(p.host_form_signature, p.signature, p.heuristic_type,
-                    p.server_type, p.html_type, p.overall_type,
-                    p.parseable_name, p.section, p.rank,
-                    p.rank_in_signature_group, p.rank_in_host_form,
-                    p.rank_in_host_form_signature_group);
-  };
-  return members(a) == members(b);
-}
+                const FormFieldDataPredictions& b) = default;
 
 bool operator==(const FormDataPredictions& a, const FormDataPredictions& b) {
   return test::WithoutUnserializedData(a.data).SameFormAs(
@@ -754,12 +745,12 @@
 }
 
 void InitializePossibleTypesAndValidities(
-    std::vector<ServerFieldTypeSet>& possible_field_types,
+    std::vector<FieldTypeSet>& possible_field_types,
     std::vector<ServerFieldTypeValidityStatesMap>&
         possible_field_types_validities,
     const std::vector<ServerFieldType>& possible_types,
     const std::vector<AutofillDataModel::ValidityState>& validity_states) {
-  possible_field_types.push_back(ServerFieldTypeSet());
+  possible_field_types.push_back(FieldTypeSet());
   possible_field_types_validities.push_back(ServerFieldTypeValidityStatesMap());
 
   if (validity_states.empty()) {
diff --git a/components/autofill/core/browser/autofill_test_utils.h b/components/autofill/core/browser/autofill_test_utils.h
index 236796e98..d7506928 100644
--- a/components/autofill/core/browser/autofill_test_utils.h
+++ b/components/autofill/core/browser/autofill_test_utils.h
@@ -47,20 +47,10 @@
 bool operator==(const FormFieldDataPredictions& a,
                 const FormFieldDataPredictions& b);
 
-inline bool operator!=(const FormFieldDataPredictions& a,
-                       const FormFieldDataPredictions& b) {
-  return !(a == b);
-}
-
 // Holds iff the underlying FormDatas sans field values are equal and the
 // remaining members are pairwise equal.
 bool operator==(const FormDataPredictions& a, const FormDataPredictions& b);
 
-inline bool operator!=(const FormDataPredictions& a,
-                       const FormDataPredictions& b) {
-  return !(a == b);
-}
-
 // Common utilities shared amongst Autofill tests.
 namespace test {
 
@@ -299,7 +289,7 @@
 // |possible_field_types_validities| given |possible_type| and their
 // corresponding |validity_state|.
 void InitializePossibleTypesAndValidities(
-    std::vector<ServerFieldTypeSet>& possible_field_types,
+    std::vector<FieldTypeSet>& possible_field_types,
     std::vector<ServerFieldTypeValidityStatesMap>&
         possible_field_types_validities,
     const std::vector<ServerFieldType>& possible_type,
diff --git a/components/autofill/core/browser/autofill_trigger_details.h b/components/autofill/core/browser/autofill_trigger_details.h
index 213da059..d34ea3e 100644
--- a/components/autofill/core/browser/autofill_trigger_details.h
+++ b/components/autofill/core/browser/autofill_trigger_details.h
@@ -56,7 +56,7 @@
 struct AutofillTriggerDetails {
   AutofillTriggerSource trigger_source = AutofillTriggerSource::kNone;
   // Default to considering every field type when filling the form.
-  ServerFieldTypeSet field_types_to_fill = kAllFieldTypes;
+  FieldTypeSet field_types_to_fill = kAllFieldTypes;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index 9af1622c..d587e8a5 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -196,7 +196,7 @@
   // There should be at least two possible field types.
   DCHECK_LE(2U, field->possible_types().size());
 
-  ServerFieldTypeSet types_to_keep;
+  FieldTypeSet types_to_keep;
   const auto& old_types = field->possible_types();
 
   for (ServerFieldType type : old_types) {
@@ -411,7 +411,7 @@
   // The first pass checks the existence of an explicitly marked field for the
   // credit card expiration year.
   for (const auto& field : form_structure) {
-    const ServerFieldTypeSet& type_set = field->possible_types();
+    const FieldTypeSet& type_set = field->possible_types();
     if (type_set.find(CREDIT_CARD_EXP_2_DIGIT_YEAR) != type_set.end() ||
         type_set.find(CREDIT_CARD_EXP_4_DIGIT_YEAR) != type_set.end()) {
       found_explicit_expiration_year_field = true;
@@ -430,7 +430,7 @@
   //   already found;
   // * it is filled with a 3-4 digit number;
   for (const auto& field : form_structure) {
-    const ServerFieldTypeSet& type_set = field->possible_types();
+    const FieldTypeSet& type_set = field->possible_types();
 
     // Checks if the field is of |CREDIT_CARD_NUMBER| type.
     if (type_set.find(CREDIT_CARD_NUMBER) != type_set.end()) {
@@ -2035,7 +2035,7 @@
   bool was_autofilled = base::Contains(autofilled_form_signatures_,
                                        submitted_form->FormSignatureAsStr());
 
-  ServerFieldTypeSet non_empty_types;
+  FieldTypeSet non_empty_types;
   client().GetPersonalDataManager()->GetNonEmptyTypes(&non_empty_types);
   // As CVC is not stored, treat it separately.
   if (!last_unlocked_credit_card_cvc_.empty() ||
@@ -2174,7 +2174,7 @@
     const FormFieldData& trigger_field,
     const Section& filling_section,
     const CreditCard* optional_credit_card,
-    const ServerFieldTypeSet& field_types_to_fill,
+    const FieldTypeSet& field_types_to_fill,
     const DenseSet<FieldTypeGroup>* optional_type_groups_originally_filled,
     bool skip_unrecognized_autocomplete_fields,
     bool is_refill) const {
@@ -2744,7 +2744,7 @@
     AutofillSuggestionTriggerSource trigger_source) const {
   address_form_event_logger_->OnDidPollSuggestions(field,
                                                    signin_state_for_metrics_);
-  absl::optional<ServerFieldTypeSet> last_address_fields_to_fill_for_section =
+  absl::optional<FieldTypeSet> last_address_fields_to_fill_for_section =
       external_delegate_->GetLastFieldTypesToFillForSection(
           autofill_field.section);
   // Getting the filling-relevant fields so that suggestions are based only on
@@ -2769,7 +2769,7 @@
           : std::vector<FieldFillingSkipReason>(
                 form_structure.field_count(),
                 FieldFillingSkipReason::kNotSkipped);
-  ServerFieldTypeSet field_types;
+  FieldTypeSet field_types;
   for (size_t i = 0; i < form_structure.field_count(); ++i) {
     if (skip_reasons[i] == FieldFillingSkipReason::kNotSkipped) {
       field_types.insert(form_structure.field(i)->Type().GetStorableType());
@@ -2988,7 +2988,7 @@
       continue;
     }
 
-    ServerFieldTypeSet matching_types;
+    FieldTypeSet matching_types;
     std::u16string value;
     base::TrimWhitespace(field->value, base::TRIM_ALL, &value);
 
@@ -3015,7 +3015,7 @@
     for (const AutofillProfile& profile : profiles) {
       profile.GetMatchingTypes(value, app_locale, &matching_types);
       if (select_content) {
-        ServerFieldTypeSet matching_types_backup = matching_types;
+        FieldTypeSet matching_types_backup = matching_types;
         profile.GetMatchingTypes(*select_content, app_locale, &matching_types);
         if (matching_types_backup != matching_types)
           metrics.classified_more_field_types = true;
@@ -3026,7 +3026,7 @@
     for (const CreditCard& card : credit_cards) {
       card.GetMatchingTypes(value, app_locale, &matching_types);
       if (select_content) {
-        ServerFieldTypeSet matching_types_backup = matching_types;
+        FieldTypeSet matching_types_backup = matching_types;
         card.GetMatchingTypes(*select_content, app_locale, &matching_types);
         if (matching_types_backup != matching_types)
           metrics.classified_more_field_types = true;
@@ -3066,7 +3066,7 @@
   AutofillField* cvc_field =
       GetBestPossibleCVCFieldForUpload(*form, last_unlocked_credit_card_cvc);
   if (cvc_field) {
-    ServerFieldTypeSet possible_types = cvc_field->possible_types();
+    FieldTypeSet possible_types = cvc_field->possible_types();
     possible_types.erase(UNKNOWN_TYPE);
     possible_types.insert(CREDIT_CARD_VERIFICATION_CODE);
     cvc_field->set_possible_types(possible_types);
@@ -3104,7 +3104,7 @@
 void BrowserAutofillManager::DisambiguateUploadTypes(FormStructure* form) {
   for (size_t i = 0; i < form->field_count(); ++i) {
     AutofillField* field = form->field(i);
-    const ServerFieldTypeSet& upload_types = field->possible_types();
+    const FieldTypeSet& upload_types = field->possible_types();
 
     // In case for credit cards and names there are many other possibilities
     // because a field can be of type NAME_FULL, NAME_LAST,
@@ -3132,7 +3132,7 @@
 void BrowserAutofillManager::DisambiguateNameUploadTypes(
     FormStructure* form,
     size_t current_index,
-    const ServerFieldTypeSet& upload_types) {
+    const FieldTypeSet& upload_types) {
   // This case happens when both a profile and a credit card have the same
   // name, and when we have exactly two possible types.
 
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h
index ee4eb3e..cd0dc86 100644
--- a/components/autofill/core/browser/browser_autofill_manager.h
+++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -451,14 +451,14 @@
   // TODO(crbug/1275649): Add the case removed in crrev.com/c/4675831 when the
   // experiment resumes.
   // TODO(crbug.com/1481035): Make `optional_type_groups_originally_filled` also
-  // a ServerFieldTypeSet.
+  // a FieldTypeSet.
   std::vector<FieldFillingSkipReason> GetFieldFillingSkipReasons(
       const FormData& form,
       const FormStructure& form_structure,
       const FormFieldData& trigger_field,
       const Section& filling_section,
       const CreditCard* optional_credit_card,
-      const ServerFieldTypeSet& field_types_to_fill,
+      const FieldTypeSet& field_types_to_fill,
       const DenseSet<FieldTypeGroup>* optional_type_groups_originally_filled,
       bool skip_unrecognized_autocomplete_fields,
       bool is_refill) const;
@@ -569,10 +569,9 @@
   static void DisambiguateUploadTypes(FormStructure* form);
 
   // Disambiguates name field upload types.
-  static void DisambiguateNameUploadTypes(
-      FormStructure* form,
-      size_t current_index,
-      const ServerFieldTypeSet& upload_types);
+  static void DisambiguateNameUploadTypes(FormStructure* form,
+                                          size_t current_index,
+                                          const FieldTypeSet& upload_types);
 
   // Calls FieldFiller::FillFormField().
   //
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
index 33b5605..aa1cfaa 100644
--- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -1570,7 +1570,7 @@
            {.role = NAME_LAST, .autocomplete_attribute = "family-name"}}});
   FormsSeen({form});
   // Only `NAME_FIRST` fields should be filled.
-  ServerFieldTypeSet target_fields = ServerFieldTypeSet({NAME_FIRST});
+  FieldTypeSet target_fields = FieldTypeSet({NAME_FIRST});
   FormData response_data = FillAutofillFormDataAndGetResults(
       form, form.fields[0], MakeGuid(1),
       {.trigger_source = AutofillTriggerSource::kPopup,
@@ -7267,7 +7267,7 @@
 
 struct ProfileMatchingTypesTestCase {
   const char* input_value;         // The value to input in the field.
-  ServerFieldTypeSet field_types;  // The expected field types to be determined.
+  FieldTypeSet field_types;        // The expected field types to be determined.
 };
 
 class ProfileMatchingTypesTest
@@ -7381,7 +7381,7 @@
 
   // Take the field types depending on the state of the structured names
   // feature.
-  const ServerFieldTypeSet& expected_possible_types = test_case.field_types;
+  const FieldTypeSet& expected_possible_types = test_case.field_types;
 
   // Set up the test profiles.
   std::vector<AutofillProfile> profiles(
@@ -7426,7 +7426,7 @@
 
   ASSERT_EQ(1U, form_structure.field_count());
 
-  ServerFieldTypeSet possible_types = form_structure.field(0)->possible_types();
+  FieldTypeSet possible_types = form_structure.field(0)->possible_types();
   EXPECT_EQ(possible_types, expected_possible_types);
 }
 
@@ -7488,14 +7488,14 @@
   if (base::FeatureList::IsEnabled(
           autofill::features::kAutofillVoteForSelectOptionValues)) {
     EXPECT_EQ(form_structure.field(0)->possible_types(),
-              ServerFieldTypeSet({ADDRESS_HOME_CITY}));
+              FieldTypeSet({ADDRESS_HOME_CITY}));
     EXPECT_EQ(form_structure.field(1)->possible_types(),
-              ServerFieldTypeSet({PHONE_HOME_COUNTRY_CODE}));
+              FieldTypeSet({PHONE_HOME_COUNTRY_CODE}));
   } else {
     EXPECT_EQ(form_structure.field(0)->possible_types(),
-              ServerFieldTypeSet({UNKNOWN_TYPE}));
+              FieldTypeSet({UNKNOWN_TYPE}));
     EXPECT_EQ(form_structure.field(1)->possible_types(),
-              ServerFieldTypeSet({ADDRESS_HOME_COUNTRY}));
+              FieldTypeSet({ADDRESS_HOME_COUNTRY}));
   }
 }
 
@@ -7538,11 +7538,11 @@
   form.url = GURL("https://myform.com/form.html");
   form.action = GURL("https://myform.com/submit.html");
 
-  std::vector<ServerFieldTypeSet> expected_types;
+  std::vector<FieldTypeSet> expected_types;
   std::vector<std::u16string> expected_values;
 
   // These fields should all match.
-  ServerFieldTypeSet types;
+  FieldTypeSet types;
 
   expected_values.push_back(u"Elvis");
   types.clear();
@@ -7728,7 +7728,7 @@
     ASSERT_EQ(test_fields.size(), form_structure.field_count());
 
     // Make sure the disambiguation method selects the expected upload type.
-    ServerFieldTypeSet possible_types;
+    FieldTypeSet possible_types;
     for (size_t i = 0; i < test_fields.size(); ++i) {
       possible_types = form_structure.field(i)->possible_types();
       if (test_fields[i].expect_disambiguation) {
@@ -8081,8 +8081,8 @@
   form.url = GURL("https://myform.com/form.html");
   form.action = GURL("https://myform.com/submit.html");
 
-  std::vector<ServerFieldTypeSet> expected_types;
-  ServerFieldTypeSet types;
+  std::vector<FieldTypeSet> expected_types;
+  FieldTypeSet types;
 
   form.fields.push_back(CreateTestFormField("First Name", "firstname", "",
                                             FormControlType::kInputText));
@@ -8131,8 +8131,8 @@
   form.url = GURL("https://myform.com/form.html");
   form.action = GURL("https://myform.com/submit.html");
 
-  std::vector<ServerFieldTypeSet> expected_types;
-  ServerFieldTypeSet types;
+  std::vector<FieldTypeSet> expected_types;
+  FieldTypeSet types;
 
   form.fields.push_back(CreateTestFormField("First Name", "firstname", "",
                                             FormControlType::kInputText));
@@ -8181,10 +8181,10 @@
   form.url = GURL("https://myform.com/form.html");
   form.action = GURL("https://myform.com/submit.html");
 
-  std::vector<ServerFieldTypeSet> expected_types;
+  std::vector<FieldTypeSet> expected_types;
 
   // These fields should all match.
-  ServerFieldTypeSet types;
+  FieldTypeSet types;
   form.fields.push_back(CreateTestFormField("First Name", "firstname", "",
                                             FormControlType::kInputText));
   types.insert(NAME_FIRST);
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
index 91afc93..e3c3f35 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
@@ -755,7 +755,7 @@
 bool AutofillCrowdsourcingManager::StartUploadRequest(
     const FormStructure& form,
     bool form_was_autofilled,
-    const ServerFieldTypeSet& available_field_types,
+    const FieldTypeSet& available_field_types,
     const std::string& login_form_signature,
     bool observed_submission,
     PrefService* prefs,
@@ -974,7 +974,6 @@
       GetMetricName(request_data.request_type, "RequestDuration"),
       AutofillTickClock::NowTicks() - request_start);
 
-  // Handle error if there is and return.
   if (!success) {
     std::string error_message =
         (response_body != nullptr) ? *response_body : "";
@@ -982,12 +981,6 @@
         GetMetricName(request_data.request_type, "FailingPayloadSize"),
         request_data.payload.length());
 
-    if (request_data.observer) {
-      request_data.observer->OnServerRequestError(
-          request_data.form_signatures.front(), request_data.request_type,
-          response_code);
-    }
-
     // If the failure was a client error don't retry.
     if (response_code >= 400 && response_code <= 499) {
       return;
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h
index 1781b547b..a671bd0f 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h
@@ -72,14 +72,6 @@
     // not send or uploaded.
     virtual void OnUploadedPossibleFieldTypes() {}
 
-    // Called when there was an error during the request.
-    // |form_signature| - the signature of the requesting form.
-    // |request_type| - type of request that failed.
-    // |http_error| - HTTP error code.
-    virtual void OnServerRequestError(FormSignature form_signature,
-                                      RequestType request_type,
-                                      int http_error) {}
-
    protected:
     virtual ~Observer() = default;
   };
@@ -126,14 +118,13 @@
   // submitted form's signature.
   // |observed_submission| indicates whether the upload request is the result of
   // an observed submission event.
-  virtual bool StartUploadRequest(
-      const FormStructure& form,
-      bool form_was_autofilled,
-      const ServerFieldTypeSet& available_field_types,
-      const std::string& login_form_signature,
-      bool observed_submission,
-      PrefService* pref_service,
-      base::WeakPtr<Observer> observer);
+  virtual bool StartUploadRequest(const FormStructure& form,
+                                  bool form_was_autofilled,
+                                  const FieldTypeSet& available_field_types,
+                                  const std::string& login_form_signature,
+                                  bool observed_submission,
+                                  PrefService* pref_service,
+                                  base::WeakPtr<Observer> observer);
 
   // Returns true if the autofill server communication is enabled.
   bool IsEnabled() const;
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager_unittest.cc b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager_unittest.cc
index 6b6518c..3fe953f 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager_unittest.cc
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager_unittest.cc
@@ -202,16 +202,13 @@
     : public AutofillCrowdsourcingManager::Observer,
       public ::testing::Test {
  public:
-  enum ResponseType {
-    QUERY_SUCCESSFULL,
-    UPLOAD_SUCCESSFULL,
-    REQUEST_QUERY_FAILED,
-    REQUEST_UPLOAD_FAILED,
+  enum class ResponseType {
+    kQuerySuccessful,
+    kUploadSuccessful,
   };
 
   struct ResponseData {
-    ResponseType type_of_response = REQUEST_QUERY_FAILED;
-    int error = 0;
+    ResponseType type_of_response = ResponseType::kQuerySuccessful;
     std::string signature;
     std::string response;
   };
@@ -244,26 +241,13 @@
       const std::vector<FormSignature>& form_signatures) override {
     ResponseData response;
     response.response = std::move(response_xml);
-    response.type_of_response = QUERY_SUCCESSFULL;
+    response.type_of_response = ResponseType::kQuerySuccessful;
     responses().push_back(response);
   }
 
   void OnUploadedPossibleFieldTypes() override {
     ResponseData response;
-    response.type_of_response = UPLOAD_SUCCESSFULL;
-    responses().push_back(response);
-  }
-
-  void OnServerRequestError(FormSignature form_signature,
-                            AutofillCrowdsourcingManager::RequestType request_type,
-                            int http_error) override {
-    ResponseData response;
-    response.signature = base::NumberToString(form_signature.value());
-    response.error = http_error;
-    response.type_of_response =
-        request_type == AutofillCrowdsourcingManager::REQUEST_QUERY
-            ? REQUEST_QUERY_FAILED
-            : REQUEST_UPLOAD_FAILED;
+    response.type_of_response = ResponseType::kUploadSuccessful;
     responses().push_back(response);
   }
 
@@ -343,7 +327,7 @@
 
   // Request with id 1.
   std::vector<AutofillUploadContents> upload_contents_1 =
-      form_structures[0]->EncodeUploadRequest(ServerFieldTypeSet(), true,
+      form_structures[0]->EncodeUploadRequest(FieldTypeSet(), true,
                                               std::string(), true);
   EXPECT_TRUE(crowdsourcing_manager->StartUploadRequest(
       std::move(upload_contents_1), form_structures[0]->submission_source(),
@@ -351,7 +335,7 @@
 
   // Request with id 2.
   std::vector<AutofillUploadContents> upload_contents_2 =
-      form_structures[1]->EncodeUploadRequest(ServerFieldTypeSet(), false,
+      form_structures[1]->EncodeUploadRequest(FieldTypeSet(), false,
                                               std::string(), true);
   EXPECT_TRUE(crowdsourcing_manager->StartUploadRequest(
       std::move(upload_contents_2), form_structures[1]->submission_source(),
@@ -359,7 +343,7 @@
   // Request with id 3. Upload request with a non-empty additional password form
   // signature.
   std::vector<AutofillUploadContents> upload_contents_3 =
-      form_structures[2]->EncodeUploadRequest(ServerFieldTypeSet(), false, "42",
+      form_structures[2]->EncodeUploadRequest(FieldTypeSet(), false, "42",
                                               true);
   EXPECT_TRUE(crowdsourcing_manager->StartUploadRequest(
       std::move(upload_contents_3), form_structures[1]->submission_source(),
@@ -398,35 +382,24 @@
   request = url_loader_factory().GetPendingRequest(0);
   url_loader_factory().SimulateResponseWithoutRemovingFromPendingList(
       request, response_contents[0]);
-  EXPECT_EQ(3U, responses().size());
+  EXPECT_THAT(responses(), SizeIs(2));
   histogram.ExpectBucketCount(AutofillCrowdsourcingManager::kUmaWasInCache,
                               CACHE_MISS, 1);
   histogram.ExpectBucketCount("Autofill.Query.HttpResponseOrErrorCode",
                               net::HTTP_OK, 1);
 
   // Check Request 1.
-  EXPECT_EQ(AutofillCrowdsourcingManagerTest::UPLOAD_SUCCESSFULL,
+  EXPECT_EQ(ResponseType::kUploadSuccessful,
             responses().front().type_of_response);
-  EXPECT_EQ(0, responses().front().error);
   EXPECT_EQ(std::string(), responses().front().signature);
   // Expected response on non-query request is an empty string.
   EXPECT_EQ(std::string(), responses().front().response);
   responses().pop_front();
 
-  // Check Request 2.
-  EXPECT_EQ(AutofillCrowdsourcingManagerTest::REQUEST_UPLOAD_FAILED,
-            responses().front().type_of_response);
-  EXPECT_EQ(net::HTTP_NOT_FOUND, responses().front().error);
-  EXPECT_EQ(form_structures[1]->FormSignatureAsStr(),
-            responses().front().signature);
-  // Expected response on non-query request is an empty string.
-  EXPECT_EQ(std::string(), responses().front().response);
-  responses().pop_front();
 
   // Check Request 0.
   EXPECT_EQ(responses().front().type_of_response,
-            AutofillCrowdsourcingManagerTest::QUERY_SUCCESSFULL);
-  EXPECT_EQ(0, responses().front().error);
+            ResponseType::kQuerySuccessful);
   EXPECT_EQ(std::string(), responses().front().signature);
   EXPECT_EQ(response_contents[0], responses().front().response);
   responses().pop_front();
@@ -451,14 +424,6 @@
   histogram.ExpectBucketCount("Autofill.Query.HttpResponseOrErrorCode",
                               net::HTTP_INTERNAL_SERVER_ERROR, 1);
 
-  // Check Request 4.
-  EXPECT_EQ(AutofillCrowdsourcingManagerTest::REQUEST_QUERY_FAILED,
-            responses().front().type_of_response);
-  EXPECT_EQ(net::HTTP_INTERNAL_SERVER_ERROR, responses().front().error);
-  // Expected response on non-query request is an empty string.
-  EXPECT_EQ(std::string(), responses().front().response);
-  responses().pop_front();
-
   // Request with id 5. Let's pretend we hit the cache.
   EXPECT_TRUE(crowdsourcing_manager->StartQueryRequest(
       ToRawPointerVector(form_structures), driver().IsolationInfo(),
@@ -477,7 +442,7 @@
 
   // Check Request 5.
   EXPECT_EQ(responses().front().type_of_response,
-            AutofillCrowdsourcingManagerTest::QUERY_SUCCESSFULL);
+            ResponseType::kQuerySuccessful);
   responses().pop_front();
   histogram.ExpectBucketCount(AutofillCrowdsourcingManager::kUmaWasInCache,
                               CACHE_HIT, 1);
@@ -567,7 +532,7 @@
   // to be called back from the observer and some histograms be incremented.
   EXPECT_EQ(1U, responses().size());
   EXPECT_EQ(responses().front().type_of_response,
-            AutofillCrowdsourcingManagerTest::QUERY_SUCCESSFULL);
+            ResponseType::kQuerySuccessful);
   histogram.ExpectBucketCount(AutofillCrowdsourcingManager::kUmaWasInCache,
                               CACHE_MISS, 1);
   histogram.ExpectBucketCount("Autofill.Query.HttpResponseOrErrorCode",
@@ -654,7 +619,7 @@
   // to be called back from the observer and some histograms be incremented.
   EXPECT_EQ(1U, responses().size());
   EXPECT_EQ(responses().front().type_of_response,
-            AutofillCrowdsourcingManagerTest::QUERY_SUCCESSFULL);
+            ResponseType::kQuerySuccessful);
   histogram.ExpectBucketCount(AutofillCrowdsourcingManager::kUmaWasInCache,
                               CACHE_MISS, 1);
   histogram.ExpectBucketCount("Autofill.Query.HttpResponseOrErrorCode",
@@ -689,8 +654,8 @@
                                                                   "dummykey");
 
   std::vector<AutofillUploadContents> upload_contents =
-      form_structure.EncodeUploadRequest(ServerFieldTypeSet(), true,
-                                         std::string(), true);
+      form_structure.EncodeUploadRequest(FieldTypeSet(), true, std::string(),
+                                         true);
   EXPECT_TRUE(crowdsourcing_manager->StartUploadRequest(
       std::move(upload_contents), form_structure.submission_source(),
       form_structure.active_field_count(), pref_service.get(), GetWeakPtr()));
@@ -728,7 +693,7 @@
   // histograms be incremented.
   EXPECT_EQ(1U, responses().size());
   // Request should be upload and successful.
-  EXPECT_EQ(AutofillCrowdsourcingManagerTest::UPLOAD_SUCCESSFULL,
+  EXPECT_EQ(ResponseType::kUploadSuccessful,
             responses().front().type_of_response);
   // We expect the request to be OK and corresponding response code to be
   // counted.
@@ -757,7 +722,7 @@
   url_loader_factory().SimulateResponseWithoutRemovingFromPendingList(
       request, network::CreateURLResponseHead(net::HTTP_INTERNAL_SERVER_ERROR),
       "", network::URLLoaderCompletionStatus(net::OK));
-  EXPECT_THAT(responses(), SizeIs(1));
+  EXPECT_THAT(responses(), IsEmpty());
 
   // A request error incurs a retry after 1 second (+- 33% fuzzing).
   EXPECT_EQ(url_loader_factory().GetPendingRequest(1), nullptr);
@@ -770,7 +735,7 @@
       request,
       network::CreateURLResponseHead(net::HTTP_REQUEST_ENTITY_TOO_LARGE),
       "<html></html>", network::URLLoaderCompletionStatus(net::OK));
-  EXPECT_THAT(responses(), SizeIs(2));
+  EXPECT_THAT(responses(), IsEmpty());
 
   // No more retries occur because the error was a client error.
   task_environment().FastForwardBy(base::Milliseconds(3000));
@@ -793,8 +758,8 @@
 
   // Request with id 0.
   std::vector<AutofillUploadContents> upload_contents =
-      form_structure.EncodeUploadRequest(ServerFieldTypeSet(), true,
-                                         std::string(), true);
+      form_structure.EncodeUploadRequest(FieldTypeSet(), true, std::string(),
+                                         true);
   EXPECT_TRUE(crowdsourcing_manager().StartUploadRequest(
       std::move(upload_contents), form_structure.submission_source(),
       form_structure.active_field_count(), &pref_service(), GetWeakPtr()));
@@ -804,16 +769,7 @@
   url_loader_factory().SimulateResponseWithoutRemovingFromPendingList(
       request, network::CreateURLResponseHead(net::HTTP_INTERNAL_SERVER_ERROR),
       "", network::URLLoaderCompletionStatus(net::OK));
-  EXPECT_EQ(1U, responses().size());
-
-  // Check that it was a failure.
-  EXPECT_EQ(AutofillCrowdsourcingManagerTest::REQUEST_UPLOAD_FAILED,
-            responses().front().type_of_response);
-  EXPECT_EQ(net::HTTP_INTERNAL_SERVER_ERROR, responses().front().error);
-  EXPECT_EQ(form_structure.FormSignatureAsStr(), responses().front().signature);
-  // Expected response on non-query request is an empty string.
-  EXPECT_EQ(std::string(), responses().front().response);
-  responses().pop_front();
+  EXPECT_THAT(responses(), IsEmpty());
 
   // A request error incurs a retry after 1 second (+- 33% fuzzing).
   EXPECT_EQ(url_loader_factory().GetPendingRequest(1), nullptr);
@@ -826,9 +782,8 @@
                                                                       "");
 
   // Check success of response.
-  EXPECT_EQ(AutofillCrowdsourcingManagerTest::UPLOAD_SUCCESSFULL,
+  EXPECT_EQ(ResponseType::kUploadSuccessful,
             responses().front().type_of_response);
-  EXPECT_EQ(0, responses().front().error);
   EXPECT_EQ(std::string(), responses().front().signature);
   // Expected response on non-query request is an empty string.
   EXPECT_EQ(std::string(), responses().front().response);
@@ -838,8 +793,8 @@
   form_structure.set_submission_source(SubmissionSource::XHR_SUCCEEDED);
   base::HistogramTester histogram;
   std::vector<AutofillUploadContents> upload_contents_2 =
-      form_structure.EncodeUploadRequest(ServerFieldTypeSet(), true,
-                                         std::string(), true);
+      form_structure.EncodeUploadRequest(FieldTypeSet(), true, std::string(),
+                                         true);
   EXPECT_TRUE(crowdsourcing_manager().StartUploadRequest(
       std::move(upload_contents_2), form_structure.submission_source(),
       form_structure.active_field_count(), &pref_service(), GetWeakPtr()));
@@ -882,12 +837,8 @@
         network::CreateURLResponseHead(net::HTTP_INTERNAL_SERVER_ERROR),
         "<html></html>", network::URLLoaderCompletionStatus(net::OK));
 
-    EXPECT_EQ(1U, responses().size());
-    const auto& response = responses().front();
-    EXPECT_EQ(AutofillCrowdsourcingManagerTest::REQUEST_QUERY_FAILED,
-              response.type_of_response);
-    EXPECT_EQ(net::HTTP_INTERNAL_SERVER_ERROR, response.error);
-    responses().pop_front();
+    // There should be no response in case of an error.
+    EXPECT_THAT(responses(), IsEmpty());
 
     task_environment().FastForwardBy(
         test_api(crowdsourcing_manager()).GetCurrentBackoffTime() +
@@ -917,8 +868,8 @@
 
   // Request with id 0.
   std::vector<AutofillUploadContents> upload_contents =
-      form_structure.EncodeUploadRequest(ServerFieldTypeSet(), true,
-                                         std::string(), true);
+      form_structure.EncodeUploadRequest(FieldTypeSet(), true, std::string(),
+                                         true);
   EXPECT_TRUE(crowdsourcing_manager().StartUploadRequest(
       std::move(upload_contents), form_structure.submission_source(),
       form_structure.active_field_count(), &pref_service(), GetWeakPtr()));
@@ -934,14 +885,7 @@
         request,
         network::CreateURLResponseHead(net::HTTP_INTERNAL_SERVER_ERROR), "",
         network::URLLoaderCompletionStatus(net::OK));
-
-    // Check that it was a failure.
-    ASSERT_THAT(responses(), SizeIs(1));
-    const auto& response = responses().front();
-    EXPECT_EQ(AutofillCrowdsourcingManagerTest::REQUEST_UPLOAD_FAILED,
-              response.type_of_response);
-    EXPECT_EQ(net::HTTP_INTERNAL_SERVER_ERROR, response.error);
-    responses().pop_front();
+    EXPECT_THAT(responses(), IsEmpty());
 
     task_environment().FastForwardBy(
         test_api(crowdsourcing_manager()).GetCurrentBackoffTime() +
@@ -1054,7 +998,7 @@
   auto* request = url_loader_factory().GetPendingRequest(0);
   url_loader_factory().SimulateResponseWithoutRemovingFromPendingList(
       request, response_contents[0]);
-  ASSERT_EQ(1U, responses().size());
+  ASSERT_THAT(responses(), SizeIs(1));
   EXPECT_EQ(response_contents[0], responses().front().response);
 
   responses().clear();
@@ -1064,7 +1008,7 @@
   histogram.ExpectUniqueSample("Autofill.ServerQueryResponse",
                                AutofillMetrics::QUERY_SENT, 2);
   // Data is available immediately from cache - no over-the-wire trip.
-  ASSERT_EQ(1U, responses().size());
+  ASSERT_THAT(responses(), SizeIs(1));
   EXPECT_EQ(response_contents[0], responses().front().response);
   responses().clear();
 
@@ -1073,12 +1017,12 @@
   histogram.ExpectUniqueSample("Autofill.ServerQueryResponse",
                                AutofillMetrics::QUERY_SENT, 3);
   // No responses yet
-  EXPECT_EQ(0U, responses().size());
+  EXPECT_THAT(responses(), IsEmpty());
 
   request = url_loader_factory().GetPendingRequest(1);
   url_loader_factory().SimulateResponseWithoutRemovingFromPendingList(
       request, response_contents[1]);
-  ASSERT_EQ(1U, responses().size());
+  ASSERT_THAT(responses(), SizeIs(1));
   EXPECT_EQ(response_contents[1], responses().front().response);
 
   responses().clear();
@@ -1091,7 +1035,7 @@
   request = url_loader_factory().GetPendingRequest(2);
   url_loader_factory().SimulateResponseWithoutRemovingFromPendingList(
       request, response_contents[2]);
-  ASSERT_EQ(1U, responses().size());
+  ASSERT_THAT(responses(), SizeIs(1));
   EXPECT_EQ(response_contents[2], responses().front().response);
 
   responses().clear();
@@ -1105,7 +1049,7 @@
   histogram.ExpectUniqueSample("Autofill.ServerQueryResponse",
                                AutofillMetrics::QUERY_SENT, 6);
 
-  ASSERT_EQ(2U, responses().size());
+  ASSERT_THAT(responses(), SizeIs(2));
   EXPECT_EQ(response_contents[1], responses().front().response);
   EXPECT_EQ(response_contents[2], responses().back().response);
   responses().clear();
@@ -1116,12 +1060,12 @@
   histogram.ExpectUniqueSample("Autofill.ServerQueryResponse",
                                AutofillMetrics::QUERY_SENT, 7);
   // No responses yet
-  EXPECT_EQ(0U, responses().size());
+  EXPECT_THAT(responses(), IsEmpty());
 
   request = url_loader_factory().GetPendingRequest(3);
   url_loader_factory().SimulateResponseWithoutRemovingFromPendingList(
       request, response_contents[0]);
-  ASSERT_EQ(1U, responses().size());
+  ASSERT_THAT(responses(), SizeIs(1));
   EXPECT_EQ(response_contents[0], responses().front().response);
 }
 
@@ -1281,7 +1225,7 @@
 
   bool SendUploadRequest(const FormStructure& form,
                          bool form_was_autofilled,
-                         const ServerFieldTypeSet& available_field_types,
+                         const FieldTypeSet& available_field_types,
                          const std::string& login_form_signature,
                          bool observed_submission) {
     EXPECT_EQ(run_loop_, nullptr);
diff --git a/components/autofill/core/browser/crowdsourcing/mock_autofill_crowdsourcing_manager.h b/components/autofill/core/browser/crowdsourcing/mock_autofill_crowdsourcing_manager.h
index 7eb8cde..2083c21a 100644
--- a/components/autofill/core/browser/crowdsourcing/mock_autofill_crowdsourcing_manager.h
+++ b/components/autofill/core/browser/crowdsourcing/mock_autofill_crowdsourcing_manager.h
@@ -45,7 +45,7 @@
               StartUploadRequest,
               (const FormStructure&,
                bool,
-               const ServerFieldTypeSet&,
+               const FieldTypeSet&,
                const std::string&,
                bool,
                PrefService*,
diff --git a/components/autofill/core/browser/data_model/address.cc b/components/autofill/core/browser/data_model/address.cc
index 2f562ff8..971018a 100644
--- a/components/autofill/core/browser/data_model/address.cc
+++ b/components/autofill/core/browser/data_model/address.cc
@@ -146,7 +146,7 @@
 
 void Address::GetMatchingTypes(const std::u16string& text,
                                const std::string& app_locale,
-                               ServerFieldTypeSet* matching_types) const {
+                               FieldTypeSet* matching_types) const {
   FormGroup::GetMatchingTypes(text, app_locale, matching_types);
 
   std::string country_code = base::UTF16ToUTF8(
@@ -182,7 +182,7 @@
   }
 }
 
-void Address::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
+void Address::GetSupportedTypes(FieldTypeSet* supported_types) const {
   structured_address_->GetSupportedTypes(supported_types);
 }
 
@@ -298,7 +298,7 @@
   // Transfer the content from the old model into the new one. Note that it
   // is possible that some nodes are not present in the updated model. Those
   // will be ignored.
-  ServerFieldTypeSet prev_supported_types;
+  FieldTypeSet prev_supported_types;
   structured_address_->GetStorableTypes(&prev_supported_types);
   prev_supported_types.erase(ADDRESS_HOME_COUNTRY);
 
diff --git a/components/autofill/core/browser/data_model/address.h b/components/autofill/core/browser/data_model/address.h
index 30a1bd6..dfbd4096b 100644
--- a/components/autofill/core/browser/data_model/address.h
+++ b/components/autofill/core/browser/data_model/address.h
@@ -25,7 +25,6 @@
   Address(const Address& address);
   Address& operator=(const Address& address);
   bool operator==(const Address& other) const;
-  bool operator!=(const Address& other) const { return !operator==(other); }
 
   // FormGroup:
   std::u16string GetRawInfo(ServerFieldType type) const override;
@@ -34,7 +33,7 @@
                                         VerificationStatus status) override;
   void GetMatchingTypes(const std::u16string& text,
                         const std::string& locale,
-                        ServerFieldTypeSet* matching_types) const override;
+                        FieldTypeSet* matching_types) const override;
 
   // Derives all missing tokens in the structured representation of the address
   // either parsing missing tokens from their assigned parent or by formatting
@@ -67,7 +66,7 @@
 
  private:
   // FormGroup:
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
   std::u16string GetInfoImpl(const AutofillType& type,
                              const std::string& locale) const override;
   bool SetInfoWithVerificationStatusImpl(const AutofillType& type,
diff --git a/components/autofill/core/browser/data_model/address_unittest.cc b/components/autofill/core/browser/data_model/address_unittest.cc
index 64f9c0a..47096a8 100644
--- a/components/autofill/core/browser/data_model/address_unittest.cc
+++ b/components/autofill/core/browser/data_model/address_unittest.cc
@@ -211,7 +211,7 @@
                                        "United states", "us"};
   for (const char* valid_match : kValidMatches) {
     SCOPED_TRACE(valid_match);
-    ServerFieldTypeSet matching_types;
+    FieldTypeSet matching_types;
     address.GetMatchingTypes(ASCIIToUTF16(valid_match), "US", &matching_types);
     ASSERT_EQ(1U, matching_types.size());
     EXPECT_EQ(ADDRESS_HOME_COUNTRY, *matching_types.begin());
@@ -219,7 +219,7 @@
 
   const char* const kInvalidMatches[] = {"United", "Garbage"};
   for (const char* invalid_match : kInvalidMatches) {
-    ServerFieldTypeSet matching_types;
+    FieldTypeSet matching_types;
     address.GetMatchingTypes(ASCIIToUTF16(invalid_match), "US",
                              &matching_types);
     EXPECT_EQ(0U, matching_types.size());
@@ -228,7 +228,7 @@
   // Make sure that garbage values don't match when the country code is empty.
   address.SetRawInfo(ADDRESS_HOME_COUNTRY, std::u16string());
   EXPECT_EQ(std::u16string(), address.GetRawInfo(ADDRESS_HOME_COUNTRY));
-  ServerFieldTypeSet matching_types;
+  FieldTypeSet matching_types;
   address.GetMatchingTypes(u"Garbage", "US", &matching_types);
   EXPECT_EQ(0U, matching_types.size());
 }
diff --git a/components/autofill/core/browser/data_model/autofill_i18n_api.cc b/components/autofill/core/browser/data_model/autofill_i18n_api.cc
index 4275a07..7ea99fc 100644
--- a/components/autofill/core/browser/data_model/autofill_i18n_api.cc
+++ b/components/autofill/core/browser/data_model/autofill_i18n_api.cc
@@ -13,6 +13,7 @@
 #include "components/autofill/core/browser/data_model/autofill_i18n_formatting_expressions.h"
 #include "components/autofill/core/browser/data_model/autofill_i18n_hierarchies.h"
 #include "components/autofill/core/browser/data_model/autofill_i18n_parsing_expressions.h"
+#include "components/autofill/core/browser/data_model/autofill_i18n_stopwords.h"
 #include "components/autofill/core/browser/data_model/autofill_structured_address.h"
 #include "components/autofill/core/browser/data_model/autofill_structured_address_format_provider.h"
 #include "components/autofill/core/browser/data_model/autofill_structured_address_name.h"
@@ -25,6 +26,7 @@
 namespace {
 using i18n_model_definition::kAutofillFormattingRulesMap;
 using i18n_model_definition::kAutofillModelRules;
+using i18n_model_definition::kAutofillModelStopwords;
 using i18n_model_definition::kAutofillParsingRulesMap;
 
 // Adjacency mapping, stores for each field type X the list of field types
@@ -37,7 +39,7 @@
 
 // Address lines are currently the only computed types. These are are shared by
 // all countries.
-constexpr ServerFieldTypeSet kAddressComputedTypes = {
+constexpr FieldTypeSet kAddressComputedTypes = {
     ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2, ADDRESS_HOME_LINE3};
 
 // Returns an instance of the AddressComponent implementation that matches
@@ -276,6 +278,16 @@
                                               : absl::nullopt;
 }
 
+std::optional<std::u16string_view> GetStopwordsExpression(
+    ServerFieldType field_type,
+    AddressCountryCode country_code) {
+  auto* it = kAutofillModelStopwords.find({country_code.value(), field_type});
+  if (it == kAutofillModelStopwords.end()) {
+    return std::nullopt;
+  }
+  return it->second;
+}
+
 bool IsTypeEnabledForCountry(ServerFieldType field_type,
                              AddressCountryCode country_code) {
   auto* it = kAutofillModelRules.find(country_code.value());
diff --git a/components/autofill/core/browser/data_model/autofill_i18n_api.h b/components/autofill/core/browser/data_model/autofill_i18n_api.h
index cf604d55..dc35b1c2 100644
--- a/components/autofill/core/browser/data_model/autofill_i18n_api.h
+++ b/components/autofill/core/browser/data_model/autofill_i18n_api.h
@@ -42,6 +42,13 @@
     ServerFieldType field_type,
     AddressCountryCode country_code);
 
+// Returns the stopwords expression corresponding to the provided parameters.
+// If the expression can't be found or the country is empty, returns
+// `std::nullopt`.
+std::optional<std::u16string_view> GetStopwordsExpression(
+    ServerFieldType field_type,
+    AddressCountryCode country_code);
+
 // The function returns true if the provided `field_type` is included in the
 // hierarchy model of the given country. Otherwise it returns false.
 bool IsTypeEnabledForCountry(ServerFieldType field_type,
diff --git a/components/autofill/core/browser/data_model/autofill_i18n_api_unittest.cc b/components/autofill/core/browser/data_model/autofill_i18n_api_unittest.cc
index 187bd09..c7ed9683 100644
--- a/components/autofill/core/browser/data_model/autofill_i18n_api_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_i18n_api_unittest.cc
@@ -26,7 +26,7 @@
 namespace {
 
 // Checks that the AddressComponent graph has no cycles.
-bool IsTree(AddressComponent* node, ServerFieldTypeSet* visited_types) {
+bool IsTree(AddressComponent* node, FieldTypeSet* visited_types) {
   if (visited_types->contains(node->GetStorageType()) ||
       visited_types->contains_any(node->GetAdditionalSupportedFieldTypes())) {
     // Repeated types exist in the tree.
@@ -62,7 +62,7 @@
           AddressCountryCode(std::string(country_code)));
 
       ASSERT_TRUE(model);
-      ServerFieldTypeSet field_type_set;
+      FieldTypeSet field_type_set;
       model->GetSupportedTypes(&field_type_set);
       EXPECT_FALSE(field_type_set.empty());
       EXPECT_FALSE(field_type_set.contains_any(
@@ -80,7 +80,7 @@
     std::unique_ptr<AddressComponent> root = CreateAddressComponentModel(
         AddressCountryCode(std::string(country_code)));
 
-    ServerFieldTypeSet supported_types;
+    FieldTypeSet supported_types;
     EXPECT_TRUE(IsTree(root.get(), &supported_types));
 
     // Test that all field types in the country rules are accessible through the
@@ -173,6 +173,25 @@
                                               kLegacyHierarchyCountryCode));
 }
 
+TEST_F(AutofillI18nApiTest, GetStopwordsExpression) {
+  // The expected values are contained in `kAutofillModelStopwords`.
+  EXPECT_EQ(u"Ponto de referência:",
+            GetStopwordsExpression(ADDRESS_HOME_OVERFLOW_AND_LANDMARK,
+                                   AddressCountryCode("BR")));
+  EXPECT_EQ(u"Andar", GetStopwordsExpression(ADDRESS_HOME_SUBPREMISE,
+                                             AddressCountryCode("BR")));
+  EXPECT_EQ(u"Entre Calles",
+            GetStopwordsExpression(ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK,
+                                   AddressCountryCode("MX")));
+  EXPECT_EQ(u"Apt\\.|Floor", GetStopwordsExpression(ADDRESS_HOME_SUBPREMISE,
+                                                    AddressCountryCode("XX")));
+  EXPECT_EQ(std::nullopt, GetStopwordsExpression(ADDRESS_HOME_OVERFLOW,
+                                                 AddressCountryCode("MX")));
+  EXPECT_EQ(std::nullopt,
+            GetStopwordsExpression(ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK,
+                                   AddressCountryCode("")));
+}
+
 TEST_F(AutofillI18nApiTest, IsTypeEnabledForCountry) {
   CountryDataMap* country_data_map = CountryDataMap::GetInstance();
   for (const std::string& country_code : country_data_map->country_codes()) {
diff --git a/components/autofill/core/browser/data_model/autofill_offer_data.cc b/components/autofill/core/browser/data_model/autofill_offer_data.cc
index e2e3ff6..7a07fb2 100644
--- a/components/autofill/core/browser/data_model/autofill_offer_data.cc
+++ b/components/autofill/core/browser/data_model/autofill_offer_data.cc
@@ -71,11 +71,6 @@
   return Compare(other_offer_data) == 0;
 }
 
-bool AutofillOfferData::operator!=(
-    const AutofillOfferData& other_offer_data) const {
-  return Compare(other_offer_data) != 0;
-}
-
 int AutofillOfferData::Compare(
     const AutofillOfferData& other_offer_data) const {
   int comparison = offer_id_ - other_offer_data.offer_id_;
diff --git a/components/autofill/core/browser/data_model/autofill_offer_data.h b/components/autofill/core/browser/data_model/autofill_offer_data.h
index 7576eeb..02eccc5 100644
--- a/components/autofill/core/browser/data_model/autofill_offer_data.h
+++ b/components/autofill/core/browser/data_model/autofill_offer_data.h
@@ -80,7 +80,6 @@
   AutofillOfferData(const AutofillOfferData&);
   AutofillOfferData& operator=(const AutofillOfferData&);
   bool operator==(const AutofillOfferData& other_offer_data) const;
-  bool operator!=(const AutofillOfferData& other_offer_data) const;
 
   // Compares two AutofillOfferData based on their member fields. Returns 0 if
   // the two offer data are exactly same. Otherwise returns the comparison
diff --git a/components/autofill/core/browser/data_model/autofill_profile.cc b/components/autofill/core/browser/data_model/autofill_profile.cc
index 658bbaa..759e3a1 100644
--- a/components/autofill/core/browser/data_model/autofill_profile.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile.cc
@@ -159,7 +159,7 @@
 // decreasing order of importance.
 void GetFieldsForDistinguishingProfiles(
     const std::vector<ServerFieldType>* suggested_fields,
-    ServerFieldTypeSet excluded_fields,
+    FieldTypeSet excluded_fields,
     std::vector<ServerFieldType>* distinguishing_fields) {
   static const ServerFieldType kDefaultDistinguishingFields[] = {
       NAME_FULL,
@@ -190,7 +190,7 @@
 
   // Keep track of which fields we've seen so that we avoid duplicate entries.
   // Always ignore fields of unknown type and those part of `excluded_fields`.
-  ServerFieldTypeSet seen_fields;
+  FieldTypeSet seen_fields;
   seen_fields.insert(UNKNOWN_TYPE);
   for (ServerFieldType excluded_field : excluded_fields) {
     seen_fields.insert(GetStorableTypeCollapsingGroups(excluded_field));
@@ -409,11 +409,10 @@
   return AutofillDataModel::GetRankingScore(current_time);
 }
 
-void AutofillProfile::GetMatchingTypes(
-    const std::u16string& text,
-    const std::string& app_locale,
-    ServerFieldTypeSet* matching_types) const {
-  ServerFieldTypeSet matching_types_in_this_profile;
+void AutofillProfile::GetMatchingTypes(const std::u16string& text,
+                                       const std::string& app_locale,
+                                       FieldTypeSet* matching_types) const {
+  FieldTypeSet matching_types_in_this_profile;
   for (const auto* form_group : FormGroups()) {
     form_group->GetMatchingTypes(text, app_locale,
                                  &matching_types_in_this_profile);
@@ -458,8 +457,7 @@
   }
 }
 
-void AutofillProfile::GetSupportedTypes(
-    ServerFieldTypeSet* supported_types) const {
+void AutofillProfile::GetSupportedTypes(FieldTypeSet* supported_types) const {
   for (const auto* form_group : FormGroups()) {
     form_group->GetSupportedTypes(supported_types);
   }
@@ -482,7 +480,7 @@
 }
 
 bool AutofillProfile::IsEmpty(const std::string& app_locale) const {
-  ServerFieldTypeSet types;
+  FieldTypeSet types;
   GetNonEmptyTypes(app_locale, &types);
   return types.empty();
 }
@@ -615,7 +613,7 @@
 
 bool AutofillProfile::IsSubsetOf(const AutofillProfileComparator& comparator,
                                  const AutofillProfile& profile) const {
-  ServerFieldTypeSet supported_types;
+  FieldTypeSet supported_types;
   GetSupportedTypes(&supported_types);
   return IsSubsetOfForFieldSet(comparator, profile, supported_types);
 }
@@ -623,7 +621,7 @@
 bool AutofillProfile::IsSubsetOfForFieldSet(
     const AutofillProfileComparator& comparator,
     const AutofillProfile& profile,
-    const ServerFieldTypeSet& types) const {
+    const FieldTypeSet& types) const {
   const std::string& app_locale = comparator.app_locale();
   // TODO(crbug.com/1417975): Remove when
   // `kAutofillUseAddressRewriterInProfileSubsetComparison` launches.
@@ -840,7 +838,7 @@
           features::kAutofillTrackProfileTokenQuality)) {
     return;
   }
-  ServerFieldTypeSet supported_types;
+  FieldTypeSet supported_types;
   merged_group.GetSupportedTypes(&supported_types);
   for (ServerFieldType type : supported_types) {
     const std::u16string& merged_value = merged_group.GetRawInfo(type);
@@ -900,8 +898,8 @@
 // static
 void AutofillProfile::CreateInferredLabels(
     const std::vector<const AutofillProfile*>& profiles,
-    const absl::optional<ServerFieldTypeSet>& suggested_fields,
-    ServerFieldTypeSet excluded_fields,
+    const absl::optional<FieldTypeSet>& suggested_fields,
+    FieldTypeSet excluded_fields,
     size_t minimal_fields_shown,
     const std::string& app_locale,
     std::vector<std::u16string>* labels) {
@@ -1205,7 +1203,7 @@
   };
 
   // Use a helper function to print the values of the stored types.
-  ServerFieldTypeSet field_types_to_print;
+  FieldTypeSet field_types_to_print;
   profile.GetSupportedTypes(&field_types_to_print);
 
   base::ranges::for_each(field_types_to_print, print_values_lambda);
@@ -1244,29 +1242,29 @@
   return account_profile;
 }
 
-ServerFieldTypeSet AutofillProfile::FindInaccessibleProfileValues() const {
-  ServerFieldTypeSet inaccessible_fields;
+FieldTypeSet AutofillProfile::FindInaccessibleProfileValues() const {
+  FieldTypeSet inaccessible_fields;
   const std::string stored_country =
       base::UTF16ToUTF8(GetRawInfo(ADDRESS_HOME_COUNTRY));
   AutofillCountry country(stored_country.empty() ? "US" : stored_country);
   // Consider only AddressFields which are invisible in the settings for some
   // countries.
-  for (const AddressField& field_type :
+  for (const AddressField& adress_field :
        {AddressField::ADMIN_AREA, AddressField::LOCALITY,
         AddressField::DEPENDENT_LOCALITY, AddressField::POSTAL_CODE,
         AddressField::SORTING_CODE}) {
-    ServerFieldType server_field_type = i18n::TypeForField(field_type);
-    if (HasRawInfo(server_field_type) &&
-        !country.IsAddressFieldSettingAccessible(server_field_type)) {
-      inaccessible_fields.insert(server_field_type);
+    ServerFieldType field_type = i18n::TypeForField(adress_field);
+    if (HasRawInfo(field_type) &&
+        !country.IsAddressFieldSettingAccessible(field_type)) {
+      inaccessible_fields.insert(field_type);
     }
   }
   return inaccessible_fields;
 }
 
-void AutofillProfile::ClearFields(const ServerFieldTypeSet& fields) {
-  for (ServerFieldType server_field_type : fields) {
-    SetRawInfoWithVerificationStatus(server_field_type, u"",
+void AutofillProfile::ClearFields(const FieldTypeSet& fields) {
+  for (ServerFieldType field_type : fields) {
+    SetRawInfoWithVerificationStatus(field_type, u"",
                                      VerificationStatus::kNoStatus);
   }
 }
diff --git a/components/autofill/core/browser/data_model/autofill_profile.h b/components/autofill/core/browser/data_model/autofill_profile.h
index c1a404a..f6ba6d9 100644
--- a/components/autofill/core/browser/data_model/autofill_profile.h
+++ b/components/autofill/core/browser/data_model/autofill_profile.h
@@ -94,7 +94,7 @@
   // FormGroup:
   void GetMatchingTypes(const std::u16string& text,
                         const std::string& app_locale,
-                        ServerFieldTypeSet* matching_types) const override;
+                        FieldTypeSet* matching_types) const override;
 
   std::u16string GetRawInfo(ServerFieldType type) const override;
 
@@ -109,7 +109,7 @@
       int value,
       VerificationStatus status) override;
 
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
 
   // Every `GetSupportedType()` is either a storable type or has a corresponding
   // storable type. For example, ADDRESS_HOME_LINE1 corresponds to the storable
@@ -164,7 +164,7 @@
   // Like `IsSubsetOf()`, but considers only the given `types`.
   bool IsSubsetOfForFieldSet(const AutofillProfileComparator& comparator,
                              const AutofillProfile& profile,
-                             const ServerFieldTypeSet& types) const;
+                             const FieldTypeSet& types) const;
 
   // Like `IsSubsetOf()`, but for strict superset instead of subset.
   bool IsStrictSupersetOf(const AutofillProfileComparator& comparator,
@@ -207,8 +207,8 @@
   // least `minimal_fields_shown` fields, if possible.
   static void CreateInferredLabels(
       const std::vector<const AutofillProfile*>& profiles,
-      const absl::optional<ServerFieldTypeSet>& suggested_fields,
-      ServerFieldTypeSet excluded_fields,
+      const absl::optional<FieldTypeSet>& suggested_fields,
+      FieldTypeSet excluded_fields,
       size_t minimal_fields_shown,
       const std::string& app_locale,
       std::vector<std::u16string>* labels);
@@ -285,10 +285,10 @@
 
   // Checks for non-empty setting-inaccessible fields and returns all that were
   // found.
-  ServerFieldTypeSet FindInaccessibleProfileValues() const;
+  FieldTypeSet FindInaccessibleProfileValues() const;
 
   // Clears all specified |fields| from the profile.
-  void ClearFields(const ServerFieldTypeSet& fields);
+  void ClearFields(const FieldTypeSet& fields);
 
   const ProfileTokenQuality& token_quality() const { return token_quality_; }
   ProfileTokenQuality& token_quality() { return token_quality_; }
diff --git a/components/autofill/core/browser/data_model/autofill_profile_comparator.cc b/components/autofill/core/browser/data_model/autofill_profile_comparator.cc
index 50eba1b..7e3e3ad 100644
--- a/components/autofill/core/browser/data_model/autofill_profile_comparator.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile_comparator.cc
@@ -184,8 +184,8 @@
 // The values corresponding to those types are visible in the settings.
 // TODO(crbug.com/1441904): Landmark, between-street and admin-level2 are in
 // progress to be included in the settings.
-ServerFieldTypeSet GetUserVisibleTypes() {
-  static const ServerFieldTypeSet user_visible_type = {
+FieldTypeSet GetUserVisibleTypes() {
+  static const FieldTypeSet user_visible_type = {
       NAME_FULL,
       NAME_HONORIFIC_PREFIX,
       ADDRESS_HOME_STREET_ADDRESS,
@@ -211,7 +211,7 @@
 AutofillProfileComparator::GetProfileDifference(
     const AutofillProfile& first_profile,
     const AutofillProfile& second_profile,
-    ServerFieldTypeSet types,
+    FieldTypeSet types,
     const std::string& app_locale) {
   std::vector<ProfileValueDifference> difference;
   difference.reserve(types.size());
@@ -232,7 +232,7 @@
 AutofillProfileComparator::GetProfileDifferenceMap(
     const AutofillProfile& first_profile,
     const AutofillProfile& second_profile,
-    ServerFieldTypeSet types,
+    FieldTypeSet types,
     const std::string& app_locale) {
   std::vector<
       std::pair<ServerFieldType, std::pair<std::u16string, std::u16string>>>
diff --git a/components/autofill/core/browser/data_model/autofill_profile_comparator.h b/components/autofill/core/browser/data_model/autofill_profile_comparator.h
index 998cddb..2e30cbd 100644
--- a/components/autofill/core/browser/data_model/autofill_profile_comparator.h
+++ b/components/autofill/core/browser/data_model/autofill_profile_comparator.h
@@ -29,7 +29,7 @@
   bool operator==(const ProfileValueDifference& right) const = default;
 };
 
-ServerFieldTypeSet GetUserVisibleTypes();
+FieldTypeSet GetUserVisibleTypes();
 
 // A utility class to assist in the comparison of AutofillProfile data.
 class AutofillProfileComparator {
@@ -85,7 +85,7 @@
   static std::vector<ProfileValueDifference> GetProfileDifference(
       const AutofillProfile& first_profile,
       const AutofillProfile& second_profile,
-      ServerFieldTypeSet types,
+      FieldTypeSet types,
       const std::string& app_locale);
 
   // Same as `GetProfileDifference()` but returns a map that maps the type to a
@@ -95,7 +95,7 @@
                         std::pair<std::u16string, std::u16string>>
   GetProfileDifferenceMap(const AutofillProfile& first_profile,
                           const AutofillProfile& second_profile,
-                          ServerFieldTypeSet types,
+                          FieldTypeSet types,
                           const std::string& app_locale);
 
   // Get the difference of two profiles for settings-visible values.
diff --git a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
index d147bac2..726c0d7 100644
--- a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
@@ -469,8 +469,8 @@
   EXPECT_EQ(u"John Doe, 666 Erebus St., Elysium", labels[0]);
   EXPECT_EQ(u"Jane Doe, 123 Letha Shore., Dis", labels[1]);
 
-  ServerFieldTypeSet suggested_fields = {ADDRESS_HOME_CITY, ADDRESS_HOME_STATE,
-                                         ADDRESS_HOME_ZIP};
+  FieldTypeSet suggested_fields = {ADDRESS_HOME_CITY, ADDRESS_HOME_STATE,
+                                   ADDRESS_HOME_ZIP};
 
   // Two fields at least, from suggested fields - no filter.
   AutofillProfile::CreateInferredLabels(
@@ -549,8 +549,8 @@
 
   // If the only name field in the suggested fields is the excluded field, we
   // should not fall back to the full name as a distinguishing field.
-  ServerFieldTypeSet suggested_fields = {NAME_LAST, ADDRESS_HOME_LINE1,
-                                         EMAIL_ADDRESS};
+  FieldTypeSet suggested_fields = {NAME_LAST, ADDRESS_HOME_LINE1,
+                                   EMAIL_ADDRESS};
   std::vector<std::u16string> labels;
   AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
                                         suggested_fields, {NAME_LAST}, 1,
@@ -583,7 +583,7 @@
 
   // If the only name field in the suggested fields is the excluded field, we
   // should not fall back to the full name as a distinguishing field.
-  ServerFieldTypeSet suggested_fields = {ADDRESS_HOME_LINE1, EMAIL_ADDRESS};
+  FieldTypeSet suggested_fields = {ADDRESS_HOME_LINE1, EMAIL_ADDRESS};
   std::vector<std::u16string> labels;
   AutofillProfile::CreateInferredLabels(
       ToRawPointerVector(profiles), suggested_fields, {}, 2, "en-US", &labels);
@@ -639,8 +639,7 @@
 
   // If the only name field in the suggested fields is the excluded field, we
   // should not fall back to the full name as a distinguishing field.
-  ServerFieldTypeSet suggested_fields = {NAME_FULL,
-                                         ADDRESS_HOME_STREET_ADDRESS};
+  FieldTypeSet suggested_fields = {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS};
   std::vector<std::u16string> labels;
   AutofillProfile::CreateInferredLabels(ToRawPointerVector(profiles),
                                         suggested_fields, {NAME_FULL}, 1,
@@ -1277,7 +1276,7 @@
        features::kAutofillEnableSupportForAddressOverflowAndLandmark},
       {});
   // Those types do store a verification status.
-  ServerFieldTypeSet structured_types{
+  FieldTypeSet structured_types{
       NAME_FULL,
       NAME_FIRST,
       NAME_MIDDLE,
@@ -1652,7 +1651,7 @@
 TEST(AutofillProfileTest, RemoveInaccessibleProfileValues) {
   // Returns true if at least one field was removed.
   auto RemoveInaccessibleProfileValues = [](AutofillProfile& profile) {
-    const ServerFieldTypeSet inaccessible_fields =
+    const FieldTypeSet inaccessible_fields =
         profile.FindInaccessibleProfileValues();
     profile.ClearFields(inaccessible_fields);
     return !inaccessible_fields.empty();
@@ -1710,7 +1709,7 @@
                                                   ADDRESS_HOME_HOUSE_NUMBER,
                                                   NAME_LAST_SECOND};
 
-  ServerFieldTypeSet non_empty_raw_types;
+  FieldTypeSet non_empty_raw_types;
   profile.GetNonEmptyRawTypes(&non_empty_raw_types);
 
   EXPECT_THAT(non_empty_raw_types,
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address.cc b/components/autofill/core/browser/data_model/autofill_structured_address.cc
index ef5c452..24d87103 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address.cc
@@ -51,7 +51,7 @@
 
 void FeatureGuardedAddressComponent::GetTypes(
     bool storable_only,
-    ServerFieldTypeSet* supported_types) const {
+    FieldTypeSet* supported_types) const {
   if (!base::FeatureList::IsEnabled(*feature_)) {
     return;
   }
@@ -263,9 +263,8 @@
   CalculateAddressLines();
 }
 
-const ServerFieldTypeSet StreetAddressNode::GetAdditionalSupportedFieldTypes()
-    const {
-  constexpr ServerFieldTypeSet additional_supported_field_types{
+const FieldTypeSet StreetAddressNode::GetAdditionalSupportedFieldTypes() const {
+  constexpr FieldTypeSet additional_supported_field_types{
       ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2, ADDRESS_HOME_LINE3};
   return additional_supported_field_types;
 }
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address.h b/components/autofill/core/browser/data_model/autofill_structured_address.h
index aa10a92..d905a9e 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address.h
+++ b/components/autofill/core/browser/data_model/autofill_structured_address.h
@@ -42,7 +42,7 @@
   // AddressComponent overrides:
   void SetValue(std::u16string value, VerificationStatus status) override;
   void GetTypes(bool storable_only,
-                ServerFieldTypeSet* supported_types) const override;
+                FieldTypeSet* supported_types) const override;
 
  private:
   // Feature guarding the rollout of this address component.
@@ -156,7 +156,7 @@
   explicit StreetAddressNode(SubcomponentsList children);
   ~StreetAddressNode() override;
 
-  const ServerFieldTypeSet GetAdditionalSupportedFieldTypes() const override;
+  const FieldTypeSet GetAdditionalSupportedFieldTypes() const override;
 
   void SetValue(std::u16string value, VerificationStatus status) override;
 
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_component.cc b/components/autofill/core/browser/data_model/autofill_structured_address_component.cc
index 8b6aa3b..26fa6cd 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_component.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_component.cc
@@ -228,18 +228,16 @@
          GetAdditionalSupportedFieldTypes().contains(field_type);
 }
 
-void AddressComponent::GetSupportedTypes(
-    ServerFieldTypeSet* supported_types) const {
+void AddressComponent::GetSupportedTypes(FieldTypeSet* supported_types) const {
   return AddressComponent::GetTypes(/*storable_only=*/false, supported_types);
 }
 
-void AddressComponent::GetStorableTypes(
-    ServerFieldTypeSet* supported_types) const {
+void AddressComponent::GetStorableTypes(FieldTypeSet* supported_types) const {
   return AddressComponent::GetTypes(/*storable_only=*/true, supported_types);
 }
 
 void AddressComponent::GetTypes(bool storable_only,
-                                ServerFieldTypeSet* supported_types) const {
+                                FieldTypeSet* supported_types) const {
   // A proper AddressComponent tree contains every type only once.
   CHECK(supported_types->find(storage_type_) == supported_types->end())
       << "The AddressComponent already contains a node that supports this "
@@ -268,9 +266,8 @@
   return std::nullopt;
 }
 
-const ServerFieldTypeSet AddressComponent::GetAdditionalSupportedFieldTypes()
-    const {
-  constexpr ServerFieldTypeSet additional_supported_field_types;
+const FieldTypeSet AddressComponent::GetAdditionalSupportedFieldTypes() const {
+  constexpr FieldTypeSet additional_supported_field_types;
   return additional_supported_field_types;
 }
 
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_component.h b/components/autofill/core/browser/data_model/autofill_structured_address_component.h
index 67bb0dc..fff6fe2 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_component.h
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_component.h
@@ -263,11 +263,11 @@
 
   // Recursively adds the supported types to the set. Calls
   // |GetAdditionalSupportedFieldTypes()| to add field types.
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const;
 
   // Recursively adds only the storable types to the set. No computed type is
   // ever added (e.g. GetAdditionalSupportedFieldTypes).
-  void GetStorableTypes(ServerFieldTypeSet* supported_types) const;
+  void GetStorableTypes(FieldTypeSet* supported_types) const;
 
   // Recursively finds the storable type of `type`:
   // - If `type` is a `storable_type_` of any node, this is simply `type`.
@@ -278,7 +278,7 @@
 
   // Adds the additional supported field types to |supported_types|.
   // The method should DCHECK that the added types are not part of the set yet.
-  virtual const ServerFieldTypeSet GetAdditionalSupportedFieldTypes() const;
+  virtual const FieldTypeSet GetAdditionalSupportedFieldTypes() const;
 
   // Unassigns all nodes with parsed or formatted values.
   void UnsetParsedAndFormattedValuesInEntireTree();
@@ -505,7 +505,7 @@
   // Recursively adds the supported types to the set. If `!storable_only`, calls
   // |GetAdditionalSupportedFieldTypes()| to add computed field types.
   virtual void GetTypes(bool storable_only,
-                        ServerFieldTypeSet* supported_types) const;
+                        FieldTypeSet* supported_types) const;
 
  private:
   // Unsets the node and all of its children.
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_component_unittest.cc b/components/autofill/core/browser/data_model/autofill_structured_address_component_unittest.cc
index fdc99503..441af0a0 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_component_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_component_unittest.cc
@@ -39,8 +39,8 @@
   TestAtomicMiddleNameAddressComponent()
       : AddressComponent(NAME_MIDDLE, {}, MergeMode::kDefault) {}
 
-  const ServerFieldTypeSet GetAdditionalSupportedFieldTypes() const override {
-    constexpr ServerFieldTypeSet supported_types{NAME_MIDDLE_INITIAL};
+  const FieldTypeSet GetAdditionalSupportedFieldTypes() const override {
+    constexpr FieldTypeSet supported_types{NAME_MIDDLE_INITIAL};
     return supported_types;
   }
 
@@ -217,7 +217,7 @@
 TEST(AutofillStructuredAddressAddressComponent,
      TestNonProperTreeDcheckFailure) {
   TestNonProperFirstNameAddressComponent non_proper_compound;
-  ServerFieldTypeSet supported_types;
+  FieldTypeSet supported_types;
   EXPECT_DCHECK_DEATH(non_proper_compound.GetSupportedTypes(&supported_types));
 }
 
@@ -244,11 +244,11 @@
 
   // The first name does not have an additional supported field type.
   EXPECT_EQ(first_name_component.GetAdditionalSupportedFieldTypes(),
-            ServerFieldTypeSet({}));
+            FieldTypeSet({}));
 
   // The middle name supports an initial.
   EXPECT_EQ(middle_name_component.GetAdditionalSupportedFieldTypes(),
-            ServerFieldTypeSet({NAME_MIDDLE_INITIAL}));
+            FieldTypeSet({NAME_MIDDLE_INITIAL}));
 }
 
 // Tests setting an additional field type.
@@ -299,7 +299,7 @@
 
 // Tests adding all supported types to the set.
 TEST(AutofillStructuredAddressAddressComponent, TestGetSupportedTypes) {
-  ServerFieldTypeSet field_type_set;
+  FieldTypeSet field_type_set;
 
   TestAtomicFirstNameAddressComponent first_name_component;
   TestAtomicMiddleNameAddressComponent middle_name_component;
@@ -307,25 +307,23 @@
 
   // The first name only supports NAME_FIRST.
   first_name_component.GetSupportedTypes(&field_type_set);
-  EXPECT_EQ(field_type_set, ServerFieldTypeSet({NAME_FIRST}));
+  EXPECT_EQ(field_type_set, FieldTypeSet({NAME_FIRST}));
 
   // The middle name supports an initial.
   field_type_set.clear();
   middle_name_component.GetSupportedTypes(&field_type_set);
-  EXPECT_EQ(field_type_set,
-            ServerFieldTypeSet({NAME_MIDDLE, NAME_MIDDLE_INITIAL}));
+  EXPECT_EQ(field_type_set, FieldTypeSet({NAME_MIDDLE, NAME_MIDDLE_INITIAL}));
 
   // Verify that all types are added correctly in a compound structure.
   field_type_set.clear();
   compound_name.GetSupportedTypes(&field_type_set);
-  EXPECT_EQ(field_type_set,
-            ServerFieldTypeSet({NAME_MIDDLE, NAME_MIDDLE_INITIAL, NAME_FIRST,
-                                NAME_LAST, NAME_FULL}));
+  EXPECT_EQ(field_type_set, FieldTypeSet({NAME_MIDDLE, NAME_MIDDLE_INITIAL,
+                                          NAME_FIRST, NAME_LAST, NAME_FULL}));
 }
 
 // Tests adding all storable types to the set.
 TEST(AutofillStructuredAddressAddressComponent, TestGetStorableTypes) {
-  ServerFieldTypeSet field_type_set;
+  FieldTypeSet field_type_set;
 
   TestAtomicFirstNameAddressComponent first_name_component;
   TestAtomicMiddleNameAddressComponent middle_name_component;
@@ -333,18 +331,18 @@
 
   // The first name only supports NAME_FIRST.
   first_name_component.GetStorableTypes(&field_type_set);
-  EXPECT_EQ(field_type_set, ServerFieldTypeSet({NAME_FIRST}));
+  EXPECT_EQ(field_type_set, FieldTypeSet({NAME_FIRST}));
 
   // The middle name supports an initial.
   field_type_set.clear();
   middle_name_component.GetStorableTypes(&field_type_set);
-  EXPECT_EQ(field_type_set, ServerFieldTypeSet({NAME_MIDDLE}));
+  EXPECT_EQ(field_type_set, FieldTypeSet({NAME_MIDDLE}));
 
   // Verify that all types are added correctly in a compound structure.
   field_type_set.clear();
   compound_name.GetStorableTypes(&field_type_set);
-  EXPECT_EQ(field_type_set, ServerFieldTypeSet({NAME_MIDDLE, NAME_FIRST,
-                                                NAME_LAST, NAME_FULL}));
+  EXPECT_EQ(field_type_set,
+            FieldTypeSet({NAME_MIDDLE, NAME_FIRST, NAME_LAST, NAME_FULL}));
 }
 
 // Tests the comparison of the atoms of the same type.
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_name.cc b/components/autofill/core/browser/data_model/autofill_structured_address_name.cc
index 1f51fc6..bb9ea999 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_name.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_name.cc
@@ -39,11 +39,6 @@
   return base::i18n::ToUpper(result);
 }
 
-NameHonorific::NameHonorific()
-    : AddressComponent(NAME_HONORIFIC_PREFIX, {}, MergeMode::kDefault) {}
-
-NameHonorific::~NameHonorific() = default;
-
 NameFirst::NameFirst()
     : AddressComponent(NAME_FIRST, {}, MergeMode::kDefault) {}
 
@@ -54,9 +49,8 @@
 
 NameMiddle::~NameMiddle() = default;
 
-const ServerFieldTypeSet NameMiddle::GetAdditionalSupportedFieldTypes() const {
-  constexpr ServerFieldTypeSet additional_supported_field_types{
-      NAME_MIDDLE_INITIAL};
+const FieldTypeSet NameMiddle::GetAdditionalSupportedFieldTypes() const {
+  constexpr FieldTypeSet additional_supported_field_types{NAME_MIDDLE_INITIAL};
   return additional_supported_field_types;
 }
 
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_name.h b/components/autofill/core/browser/data_model/autofill_structured_address_name.h
index e10eaef..18b152a 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_name.h
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_name.h
@@ -17,13 +17,6 @@
 
 namespace autofill {
 
-// Atomic component that represents the honorific prefix of a name.
-class NameHonorific : public AddressComponent {
- public:
-  NameHonorific();
-  ~NameHonorific() override;
-};
-
 // Atomic components that represents the first name.
 class NameFirst : public AddressComponent {
  public:
@@ -37,7 +30,7 @@
   NameMiddle();
   ~NameMiddle() override;
 
-  const ServerFieldTypeSet GetAdditionalSupportedFieldTypes() const override;
+  const FieldTypeSet GetAdditionalSupportedFieldTypes() const override;
 
  protected:
   // Implements support for getting the value for the |MIDDLE_NAME_INITIAL|
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_name_unittest.cc b/components/autofill/core/browser/data_model/autofill_structured_address_name_unittest.cc
index b280c31..2e42f2d 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_name_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_name_unittest.cc
@@ -347,22 +347,22 @@
 
 TEST(AutofillStructuredName, TestGetSupportedTypes_FullNameWithPrefix) {
   NameFullWithPrefix full_name_with_prefix;
-  ServerFieldTypeSet supported_types;
+  FieldTypeSet supported_types;
   full_name_with_prefix.GetSupportedTypes(&supported_types);
-  EXPECT_EQ(ServerFieldTypeSet({NAME_FULL_WITH_HONORIFIC_PREFIX, NAME_FULL,
-                                NAME_HONORIFIC_PREFIX, NAME_FIRST, NAME_MIDDLE,
-                                NAME_MIDDLE_INITIAL, NAME_LAST, NAME_LAST_FIRST,
-                                NAME_LAST_CONJUNCTION, NAME_LAST_SECOND}),
+  EXPECT_EQ(FieldTypeSet({NAME_FULL_WITH_HONORIFIC_PREFIX, NAME_FULL,
+                          NAME_HONORIFIC_PREFIX, NAME_FIRST, NAME_MIDDLE,
+                          NAME_MIDDLE_INITIAL, NAME_LAST, NAME_LAST_FIRST,
+                          NAME_LAST_CONJUNCTION, NAME_LAST_SECOND}),
             supported_types);
 }
 
 TEST(AutofillStructuredName, TestGetSupportedTypes_FullName) {
   NameFull full_name;
-  ServerFieldTypeSet supported_types;
+  FieldTypeSet supported_types;
   full_name.GetSupportedTypes(&supported_types);
-  EXPECT_EQ(ServerFieldTypeSet({NAME_FULL, NAME_FIRST, NAME_MIDDLE,
-                                NAME_MIDDLE_INITIAL, NAME_LAST, NAME_LAST_FIRST,
-                                NAME_LAST_CONJUNCTION, NAME_LAST_SECOND}),
+  EXPECT_EQ(FieldTypeSet({NAME_FULL, NAME_FIRST, NAME_MIDDLE,
+                          NAME_MIDDLE_INITIAL, NAME_LAST, NAME_LAST_FIRST,
+                          NAME_LAST_CONJUNCTION, NAME_LAST_SECOND}),
             supported_types);
 }
 
diff --git a/components/autofill/core/browser/data_model/autofill_wallet_usage_data.cc b/components/autofill/core/browser/data_model/autofill_wallet_usage_data.cc
index 60ef625..46acd3da 100644
--- a/components/autofill/core/browser/data_model/autofill_wallet_usage_data.cc
+++ b/components/autofill/core/browser/data_model/autofill_wallet_usage_data.cc
@@ -28,10 +28,6 @@
   return *a.usage_data_id() == *b.usage_data_id();
 }
 
-bool operator!=(const VirtualCardUsageData& a, const VirtualCardUsageData& b) {
-  return *a.usage_data_id() != *b.usage_data_id();
-}
-
 // static
 AutofillWalletUsageData AutofillWalletUsageData::ForVirtualCard(
     const VirtualCardUsageData& virtual_card_usage_data) {
diff --git a/components/autofill/core/browser/data_model/autofill_wallet_usage_data.h b/components/autofill/core/browser/data_model/autofill_wallet_usage_data.h
index 6e55c92..ba1267c5 100644
--- a/components/autofill/core/browser/data_model/autofill_wallet_usage_data.h
+++ b/components/autofill/core/browser/data_model/autofill_wallet_usage_data.h
@@ -41,8 +41,6 @@
 
   friend bool operator==(const VirtualCardUsageData& a,
                          const VirtualCardUsageData& b);
-  friend bool operator!=(const VirtualCardUsageData& a,
-                         const VirtualCardUsageData& b);
 
   InstrumentId instrument_id() const { return instrument_id_; }
 
diff --git a/components/autofill/core/browser/data_model/bank_account.cc b/components/autofill/core/browser/data_model/bank_account.cc
index d9fb21d7..d5bd3c54 100644
--- a/components/autofill/core/browser/data_model/bank_account.cc
+++ b/components/autofill/core/browser/data_model/bank_account.cc
@@ -3,17 +3,12 @@
 // found in the LICENSE file.
 
 #include "components/autofill/core/browser/data_model/bank_account.h"
+
 #include "components/autofill/core/browser/webdata/autofill_table.h"
 
 namespace autofill {
 
-bool operator==(const BankAccount& a, const BankAccount& b) {
-  return (static_cast<const PaymentInstrument&>(a) ==
-          static_cast<const PaymentInstrument&>(b)) &&
-         a.bank_name() == b.bank_name() &&
-         a.account_number_suffix() == b.account_number_suffix() &&
-         a.account_type() == b.account_type();
-}
+bool operator==(const BankAccount&, const BankAccount&) = default;
 
 BankAccount::BankAccount(const BankAccount& other) = default;
 BankAccount& BankAccount::operator=(const BankAccount& other) = default;
diff --git a/components/autofill/core/browser/data_model/bank_account.h b/components/autofill/core/browser/data_model/bank_account.h
index aa8fd36a..95d12262 100644
--- a/components/autofill/core/browser/data_model/bank_account.h
+++ b/components/autofill/core/browser/data_model/bank_account.h
@@ -18,8 +18,6 @@
 
 class BankAccount;
 
-bool operator==(const BankAccount& a, const BankAccount& b);
-
 // Details for a user's bank account. This data is synced from Google payments.
 class BankAccount : public PaymentInstrument {
  public:
@@ -44,6 +42,8 @@
               AccountType account_type);
   ~BankAccount() override;
 
+  friend bool operator==(const BankAccount&, const BankAccount&);
+
   // PaymentInstrument
   PaymentInstrument::InstrumentType GetInstrumentType() const override;
   bool AddToDatabase(AutofillTable* database) const override;
diff --git a/components/autofill/core/browser/data_model/birthdate.cc b/components/autofill/core/browser/data_model/birthdate.cc
index 8fda0273..373aa26 100644
--- a/components/autofill/core/browser/data_model/birthdate.cc
+++ b/components/autofill/core/browser/data_model/birthdate.cc
@@ -90,7 +90,7 @@
   }
 }
 
-void Birthdate::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
+void Birthdate::GetSupportedTypes(FieldTypeSet* supported_types) const {
   supported_types->insert(BIRTHDATE_DAY);
   supported_types->insert(BIRTHDATE_MONTH);
   supported_types->insert(BIRTHDATE_4_DIGIT_YEAR);
diff --git a/components/autofill/core/browser/data_model/birthdate.h b/components/autofill/core/browser/data_model/birthdate.h
index 8fefce8..cc2ed1b 100644
--- a/components/autofill/core/browser/data_model/birthdate.h
+++ b/components/autofill/core/browser/data_model/birthdate.h
@@ -19,12 +19,9 @@
   Birthdate& operator=(const Birthdate& other) = default;
 
   friend bool operator==(const Birthdate& a, const Birthdate& b);
-  friend bool operator!=(const Birthdate& a, const Birthdate& b) {
-    return !(a == b);
-  }
 
   // Convenience accessor to the day, month and 4 digit year components.
-  static ServerFieldTypeSet GetRawComponents() {
+  static FieldTypeSet GetRawComponents() {
     return {BIRTHDATE_DAY, BIRTHDATE_MONTH, BIRTHDATE_4_DIGIT_YEAR};
   }
 
@@ -45,7 +42,7 @@
 
  private:
   // FormGroup:
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
 
   // Zero represents an unset value.
   int day_ = 0;
diff --git a/components/autofill/core/browser/data_model/contact_info.cc b/components/autofill/core/browser/data_model/contact_info.cc
index 7e7b4b6..60eadee0 100644
--- a/components/autofill/core/browser/data_model/contact_info.cc
+++ b/components/autofill/core/browser/data_model/contact_info.cc
@@ -108,7 +108,7 @@
   DCHECK(success) << FieldTypeToStringView(type);
 }
 
-void NameInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
+void NameInfo::GetSupportedTypes(FieldTypeSet* supported_types) const {
   name_->GetSupportedTypes(supported_types);
 }
 
@@ -138,7 +138,7 @@
 
 void NameInfo::GetMatchingTypes(const std::u16string& text,
                                 const std::string& app_locale,
-                                ServerFieldTypeSet* matching_types) const {
+                                FieldTypeSet* matching_types) const {
   FormGroup::GetMatchingTypes(text, app_locale, matching_types);
   // Replace type matches for |NAME_FULL_WITH_HONORIFIC_PREFIX| with |NAME_FULL|
   // to always vote for a full name field even if the user decides to add an
@@ -181,7 +181,7 @@
   return this == &other || email_ == other.email_;
 }
 
-void EmailInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
+void EmailInfo::GetSupportedTypes(FieldTypeSet* supported_types) const {
   supported_types->insert(EMAIL_ADDRESS);
 }
 
@@ -210,13 +210,13 @@
          GetRawInfo(COMPANY_NAME) == other.GetRawInfo(COMPANY_NAME);
 }
 
-void CompanyInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
+void CompanyInfo::GetSupportedTypes(FieldTypeSet* supported_types) const {
   supported_types->insert(COMPANY_NAME);
 }
 
 void CompanyInfo::GetMatchingTypes(const std::u16string& text,
                                    const std::string& app_locale,
-                                   ServerFieldTypeSet* matching_types) const {
+                                   FieldTypeSet* matching_types) const {
   if (IsValid()) {
     FormGroup::GetMatchingTypes(text, app_locale, matching_types);
   } else if (text.empty()) {
diff --git a/components/autofill/core/browser/data_model/contact_info.h b/components/autofill/core/browser/data_model/contact_info.h
index c451580b..35c1ca5d 100644
--- a/components/autofill/core/browser/data_model/contact_info.h
+++ b/components/autofill/core/browser/data_model/contact_info.h
@@ -24,14 +24,13 @@
 
   NameInfo& operator=(const NameInfo& info);
   bool operator==(const NameInfo& other) const;
-  bool operator!=(const NameInfo& other) const { return !operator==(other); }
 
   // FormGroup:
   std::u16string GetRawInfo(ServerFieldType type) const override;
 
   void GetMatchingTypes(const std::u16string& text,
                         const std::string& app_locale,
-                        ServerFieldTypeSet* matching_types) const override;
+                        FieldTypeSet* matching_types) const override;
 
   void SetRawInfoWithVerificationStatus(ServerFieldType type,
                                         const std::u16string& value,
@@ -66,7 +65,7 @@
 
  private:
   // FormGroup:
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
   std::u16string GetInfoImpl(const AutofillType& type,
                              const std::string& app_locale) const override;
 
@@ -102,7 +101,7 @@
 
  private:
   // FormGroup:
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
 
   std::u16string email_;
 };
@@ -128,10 +127,10 @@
 
  private:
   // FormGroup:
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
   void GetMatchingTypes(const std::u16string& text,
                         const std::string& app_locale,
-                        ServerFieldTypeSet* matching_types) const override;
+                        FieldTypeSet* matching_types) const override;
 
   std::u16string company_name_;
 };
diff --git a/components/autofill/core/browser/data_model/contact_info_unittest.cc b/components/autofill/core/browser/data_model/contact_info_unittest.cc
index ad23a2b5..b848812 100644
--- a/components/autofill/core/browser/data_model/contact_info_unittest.cc
+++ b/components/autofill/core/browser/data_model/contact_info_unittest.cc
@@ -91,20 +91,20 @@
 
   test::VerifyFormGroupValues(name, expectation);
 
-  ServerFieldTypeSet matching_types;
+  FieldTypeSet matching_types;
   name.GetMatchingTypes(u"Ruiz", "US", &matching_types);
-  EXPECT_EQ(matching_types, ServerFieldTypeSet({NAME_LAST_FIRST}));
+  EXPECT_EQ(matching_types, FieldTypeSet({NAME_LAST_FIRST}));
 
   name.GetMatchingTypes(u"Mr.", "US", &matching_types);
   EXPECT_EQ(matching_types,
-            ServerFieldTypeSet({NAME_LAST_FIRST, NAME_HONORIFIC_PREFIX}));
+            FieldTypeSet({NAME_LAST_FIRST, NAME_HONORIFIC_PREFIX}));
 
   // Verify that a field filled with |NAME_FULL_WITH_HONORIFIC_PREFIX| creates a
   // |NAME_FULL| vote.
   name.GetMatchingTypes(u"Mr. Pablo Diego Ruiz y Picasso", "US",
                         &matching_types);
-  EXPECT_EQ(matching_types, ServerFieldTypeSet({NAME_FULL, NAME_LAST_FIRST,
-                                                NAME_HONORIFIC_PREFIX}));
+  EXPECT_EQ(matching_types,
+            FieldTypeSet({NAME_FULL, NAME_LAST_FIRST, NAME_HONORIFIC_PREFIX}));
 }
 
 TEST(NameInfoTest, GetMatchingTypes) {
@@ -146,13 +146,13 @@
 
   test::VerifyFormGroupValues(name, expectation);
 
-  ServerFieldTypeSet matching_types;
+  FieldTypeSet matching_types;
   name.GetMatchingTypes(u"Ruiz", "US", &matching_types);
-  EXPECT_EQ(matching_types, ServerFieldTypeSet({NAME_LAST_FIRST}));
+  EXPECT_EQ(matching_types, FieldTypeSet({NAME_LAST_FIRST}));
 
   // The honorific prefix is ignored.
   name.GetMatchingTypes(u"Mr.", "US", &matching_types);
-  EXPECT_EQ(matching_types, ServerFieldTypeSet({NAME_LAST_FIRST}));
+  EXPECT_EQ(matching_types, FieldTypeSet({NAME_LAST_FIRST}));
 }
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc
index e137bf8..402b186d 100644
--- a/components/autofill/core/browser/data_model/credit_card.cc
+++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -718,7 +718,7 @@
 
 void CreditCard::GetMatchingTypes(const std::u16string& text,
                                   const std::string& app_locale,
-                                  ServerFieldTypeSet* matching_types) const {
+                                  FieldTypeSet* matching_types) const {
   FormGroup::GetMatchingTypes(text, app_locale, matching_types);
 
   std::u16string card_number =
@@ -976,16 +976,12 @@
          Compare(credit_card) == 0;
 }
 
-bool CreditCard::operator!=(const CreditCard& credit_card) const {
-  return !operator==(credit_card);
-}
-
 bool CreditCard::IsVerified() const {
   return !origin_.empty() && !GURL(origin_).is_valid();
 }
 
 bool CreditCard::IsEmpty(const std::string& app_locale) const {
-  ServerFieldTypeSet types;
+  FieldTypeSet types;
   GetNonEmptyTypes(app_locale, &types);
   return types.empty();
 }
@@ -1242,7 +1238,7 @@
          card_art_url().spec() != kCapitalOneCardArtUrl;
 }
 
-void CreditCard::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
+void CreditCard::GetSupportedTypes(FieldTypeSet* supported_types) const {
   supported_types->insert(CREDIT_CARD_NAME_FULL);
   supported_types->insert(CREDIT_CARD_NAME_FIRST);
   supported_types->insert(CREDIT_CARD_NAME_LAST);
diff --git a/components/autofill/core/browser/data_model/credit_card.h b/components/autofill/core/browser/data_model/credit_card.h
index 29ca1793..809ab43 100644
--- a/components/autofill/core/browser/data_model/credit_card.h
+++ b/components/autofill/core/browser/data_model/credit_card.h
@@ -193,7 +193,7 @@
   // FormGroup:
   void GetMatchingTypes(const std::u16string& text,
                         const std::string& app_locale,
-                        ServerFieldTypeSet* matching_types) const override;
+                        FieldTypeSet* matching_types) const override;
   std::u16string GetRawInfo(ServerFieldType type) const override;
   void SetRawInfoWithVerificationStatus(ServerFieldType type,
                                         const std::u16string& value,
@@ -274,7 +274,6 @@
   // Equality operators compare GUIDs, origins, and the contents.
   // Usage metadata (use count, use date, modification date) are NOT compared.
   bool operator==(const CreditCard& credit_card) const;
-  bool operator!=(const CreditCard& credit_card) const;
 
   // Returns true if the data in this model was entered directly by the user,
   // rather than automatically aggregated.
@@ -471,7 +470,7 @@
   FRIEND_TEST_ALL_PREFIXES(CreditCardTest, SetExpirationYearFromString);
 
   // FormGroup:
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
   std::u16string GetInfoImpl(const AutofillType& type,
                              const std::string& app_locale) const override;
   bool SetInfoWithVerificationStatusImpl(const AutofillType& type,
diff --git a/components/autofill/core/browser/data_model/credit_card_cloud_token_data.cc b/components/autofill/core/browser/data_model/credit_card_cloud_token_data.cc
index a6016b16..d7bca3a 100644
--- a/components/autofill/core/browser/data_model/credit_card_cloud_token_data.cc
+++ b/components/autofill/core/browser/data_model/credit_card_cloud_token_data.cc
@@ -19,11 +19,6 @@
   return Compare(other_data) == 0;
 }
 
-bool CreditCardCloudTokenData::operator!=(
-    const CreditCardCloudTokenData& other_data) const {
-  return Compare(other_data) != 0;
-}
-
 std::u16string CreditCardCloudTokenData::ExpirationMonthAsString() const {
   return data_util::Expiration2DigitMonthAsString(exp_month);
 }
diff --git a/components/autofill/core/browser/data_model/credit_card_cloud_token_data.h b/components/autofill/core/browser/data_model/credit_card_cloud_token_data.h
index 756a0425..1ab9f5e 100644
--- a/components/autofill/core/browser/data_model/credit_card_cloud_token_data.h
+++ b/components/autofill/core/browser/data_model/credit_card_cloud_token_data.h
@@ -18,7 +18,6 @@
   ~CreditCardCloudTokenData();
 
   bool operator==(const CreditCardCloudTokenData&) const;
-  bool operator!=(const CreditCardCloudTokenData&) const;
 
   std::u16string ExpirationMonthAsString() const;
   std::u16string Expiration2DigitYearAsString() const;
diff --git a/components/autofill/core/browser/data_model/credit_card_unittest.cc b/components/autofill/core/browser/data_model/credit_card_unittest.cc
index a2eb2da..e455dfca 100644
--- a/components/autofill/core/browser/data_model/credit_card_unittest.cc
+++ b/components/autofill/core/browser/data_model/credit_card_unittest.cc
@@ -1613,7 +1613,7 @@
                               const char* card_exp_month,
                               const char* card_exp_year,
                               CreditCard::RecordType record_type,
-                              ServerFieldTypeSet expected_matched_types,
+                              FieldTypeSet expected_matched_types,
                               const char* locale = "US")
       : value(value),
         card_exp_month(card_exp_month),
@@ -1630,7 +1630,7 @@
   const char* card_exp_year;
   const CreditCard::RecordType record_type;
   // The types that are expected to match.
-  const ServerFieldTypeSet expected_matched_types;
+  const FieldTypeSet expected_matched_types;
 
   const char* locale = "US";
 };
@@ -1649,7 +1649,7 @@
   card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR,
                   ASCIIToUTF16(test_case.card_exp_year));
 
-  ServerFieldTypeSet matching_types;
+  FieldTypeSet matching_types;
   card.GetMatchingTypes(UTF8ToUTF16(test_case.value), test_case.locale,
                         &matching_types);
   EXPECT_EQ(test_case.expected_matched_types, matching_types);
@@ -1664,22 +1664,21 @@
      MASKED_SERVER_CARD,
      {CREDIT_CARD_NUMBER}},
     {"4111111111111111", "01", "2020",
-     CreditCard::RecordType::kMaskedServerCard, ServerFieldTypeSet()},
+     CreditCard::RecordType::kMaskedServerCard, FieldTypeSet()},
     // Same value will not match a local card or full server card since we
     // have the full number for those. However the full number will.
-    {"1881", "01", "2020", LOCAL_CARD, ServerFieldTypeSet()},
-    {"1881", "01", "2020", FULL_SERVER_CARD, ServerFieldTypeSet()},
+    {"1881", "01", "2020", LOCAL_CARD, FieldTypeSet()},
+    {"1881", "01", "2020", FULL_SERVER_CARD, FieldTypeSet()},
     {"4012888888881881", "01", "2020", LOCAL_CARD, {CREDIT_CARD_NUMBER}},
     {"4012888888881881", "01", "2020", FULL_SERVER_CARD, {CREDIT_CARD_NUMBER}},
 
     // Wrong last four digits.
-    {"1111", "01", "2020", MASKED_SERVER_CARD, ServerFieldTypeSet()},
-    {"1111", "01", "2020", LOCAL_CARD, ServerFieldTypeSet()},
-    {"1111", "01", "2020", FULL_SERVER_CARD, ServerFieldTypeSet()},
-    {"4111111111111111", "01", "2020", MASKED_SERVER_CARD,
-     ServerFieldTypeSet()},
-    {"4111111111111111", "01", "2020", LOCAL_CARD, ServerFieldTypeSet()},
-    {"4111111111111111", "01", "2020", FULL_SERVER_CARD, ServerFieldTypeSet()},
+    {"1111", "01", "2020", MASKED_SERVER_CARD, FieldTypeSet()},
+    {"1111", "01", "2020", LOCAL_CARD, FieldTypeSet()},
+    {"1111", "01", "2020", FULL_SERVER_CARD, FieldTypeSet()},
+    {"4111111111111111", "01", "2020", MASKED_SERVER_CARD, FieldTypeSet()},
+    {"4111111111111111", "01", "2020", LOCAL_CARD, FieldTypeSet()},
+    {"4111111111111111", "01", "2020", FULL_SERVER_CARD, FieldTypeSet()},
 
     // Matching the expiration month.
     {"01", "01", "2020", LOCAL_CARD, {CREDIT_CARD_EXP_MONTH}},
@@ -1690,7 +1689,7 @@
     {"janv.", "01", "2020", LOCAL_CARD, {CREDIT_CARD_EXP_MONTH}, "FR"},
     {"janvier", "01", "2020", LOCAL_CARD, {CREDIT_CARD_EXP_MONTH}, "FR"},
     {"février", "02", "2020", LOCAL_CARD, {CREDIT_CARD_EXP_MONTH}, "FR"},
-    {"mars", "01", "2020", LOCAL_CARD, ServerFieldTypeSet(), "FR"},
+    {"mars", "01", "2020", LOCAL_CARD, FieldTypeSet(), "FR"},
 
     // Matching the expiration year.
     {"2019", "01", "2019", LOCAL_CARD, {CREDIT_CARD_EXP_4_DIGIT_YEAR}},
@@ -1700,9 +1699,9 @@
     {"01/19", "01", "2019", LOCAL_CARD, {CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}},
     {"01-19", "01", "2019", LOCAL_CARD, {CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}},
     {"01 / 19", "01", "2019", LOCAL_CARD, {CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}},
-    {"01/2020", "01", "2019", LOCAL_CARD, ServerFieldTypeSet()},
-    {"20", "01", "2019", LOCAL_CARD, ServerFieldTypeSet()},
-    {"2021", "01", "2019", LOCAL_CARD, ServerFieldTypeSet()},
+    {"01/2020", "01", "2019", LOCAL_CARD, FieldTypeSet()},
+    {"20", "01", "2019", LOCAL_CARD, FieldTypeSet()},
+    {"2021", "01", "2019", LOCAL_CARD, FieldTypeSet()},
 };
 
 INSTANTIATE_TEST_SUITE_P(CreditCardTest,
@@ -2112,7 +2111,7 @@
       CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR,
       CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR};
 
-  ServerFieldTypeSet non_empty_raw_types;
+  FieldTypeSet non_empty_raw_types;
   credit_card.GetNonEmptyRawTypes(&non_empty_raw_types);
 
   EXPECT_THAT(non_empty_raw_types,
diff --git a/components/autofill/core/browser/data_model/form_group.cc b/components/autofill/core/browser/data_model/form_group.cc
index f0b49c00..95aae0b 100644
--- a/components/autofill/core/browser/data_model/form_group.cc
+++ b/components/autofill/core/browser/data_model/form_group.cc
@@ -16,7 +16,7 @@
 
 void FormGroup::GetMatchingTypes(const std::u16string& text,
                                  const std::string& app_locale,
-                                 ServerFieldTypeSet* matching_types) const {
+                                 FieldTypeSet* matching_types) const {
   if (text.empty()) {
     matching_types->insert(EMPTY_TYPE);
     return;
@@ -29,7 +29,7 @@
 
   std::u16string canonicalized_text =
       AutofillProfileComparator::NormalizeForComparison(text);
-  ServerFieldTypeSet types;
+  FieldTypeSet types;
   GetSupportedTypes(&types);
   for (auto type : types) {
     if (comparator.Compare(canonicalized_text,
@@ -40,8 +40,8 @@
 }
 
 void FormGroup::GetNonEmptyTypes(const std::string& app_locale,
-                                 ServerFieldTypeSet* non_empty_types) const {
-  ServerFieldTypeSet types;
+                                 FieldTypeSet* non_empty_types) const {
+  FieldTypeSet types;
   GetSupportedTypes(&types);
   for (auto type : types) {
     if (!GetInfo(AutofillType(type), app_locale).empty())
@@ -49,8 +49,8 @@
   }
 }
 
-void FormGroup::GetNonEmptyRawTypes(ServerFieldTypeSet* non_empty_types) const {
-  ServerFieldTypeSet types;
+void FormGroup::GetNonEmptyRawTypes(FieldTypeSet* non_empty_types) const {
+  FieldTypeSet types;
   GetSupportedTypes(&types);
   for (auto type : types) {
     if (!GetRawInfo(type).empty())
diff --git a/components/autofill/core/browser/data_model/form_group.h b/components/autofill/core/browser/data_model/form_group.h
index db361769..b91b9e8 100644
--- a/components/autofill/core/browser/data_model/form_group.h
+++ b/components/autofill/core/browser/data_model/form_group.h
@@ -26,16 +26,16 @@
   // method is additive on |matching_types|.
   virtual void GetMatchingTypes(const std::u16string& text,
                                 const std::string& app_locale,
-                                ServerFieldTypeSet* matching_types) const;
+                                FieldTypeSet* matching_types) const;
 
   // Returns a set of server field types for which this FormGroup has non-empty
   // data. This method is additive on |non_empty_types|.
   virtual void GetNonEmptyTypes(const std::string& app_locale,
-                                ServerFieldTypeSet* non_empty_types) const;
+                                FieldTypeSet* non_empty_types) const;
 
   // Returns a set of server field types for which this FormGroup has non-empty
   // raw data. This method is additive on `non_empty_types`.
-  virtual void GetNonEmptyRawTypes(ServerFieldTypeSet* non_empty_types) const;
+  virtual void GetNonEmptyRawTypes(FieldTypeSet* non_empty_types) const;
 
   // Returns the string associated with |type|, without canonicalizing the
   // returned value. For user-visible strings, use GetInfo() instead.
@@ -124,7 +124,7 @@
 
   // Returns a set of server field types for which this FormGroup can store
   // data. This method is additive on |supported_types|.
-  virtual void GetSupportedTypes(ServerFieldTypeSet* supported_types) const = 0;
+  virtual void GetSupportedTypes(FieldTypeSet* supported_types) const = 0;
 
   // Returns the string that should be auto-filled into a text field given the
   // type of that field, localized to the given |app_locale| if appropriate.
diff --git a/components/autofill/core/browser/data_model/iban.cc b/components/autofill/core/browser/data_model/iban.cc
index 156a4dc..96419cdb 100644
--- a/components/autofill/core/browser/data_model/iban.cc
+++ b/components/autofill/core/browser/data_model/iban.cc
@@ -262,12 +262,12 @@
   }
 }
 
-void Iban::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
+void Iban::GetSupportedTypes(FieldTypeSet* supported_types) const {
   supported_types->insert(IBAN_VALUE);
 }
 
 bool Iban::IsEmpty(const std::string& app_locale) const {
-  ServerFieldTypeSet types;
+  FieldTypeSet types;
   GetNonEmptyTypes(app_locale, &types);
   return types.empty();
 }
@@ -315,10 +315,6 @@
   return Compare(iban) == 0;
 }
 
-bool Iban::operator!=(const Iban& iban) const {
-  return !operator==(iban);
-}
-
 void Iban::set_identifier(const absl::variant<Guid, InstrumentId>& identifier) {
   if (absl::holds_alternative<Guid>(identifier_)) {
     CHECK_NE(record_type_, kServerIban);
diff --git a/components/autofill/core/browser/data_model/iban.h b/components/autofill/core/browser/data_model/iban.h
index c3cdc3ce6f..8438dd2 100644
--- a/components/autofill/core/browser/data_model/iban.h
+++ b/components/autofill/core/browser/data_model/iban.h
@@ -80,7 +80,7 @@
   void SetRawInfoWithVerificationStatus(ServerFieldType type,
                                         const std::u16string& value,
                                         VerificationStatus status) override;
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
 
   // Returns true if there are no values (field types) set.
   bool IsEmpty(const std::string& app_locale) const;
@@ -93,7 +93,6 @@
 
   // Equality operators compare GUIDs, origins, |value_| and |nickname_|.
   bool operator==(const Iban& iban) const;
-  bool operator!=(const Iban& iban) const;
 
   void set_identifier(const absl::variant<Guid, InstrumentId>& identifier);
 
diff --git a/components/autofill/core/browser/data_model/payment_instrument.cc b/components/autofill/core/browser/data_model/payment_instrument.cc
index c99b767..994afe0 100644
--- a/components/autofill/core/browser/data_model/payment_instrument.cc
+++ b/components/autofill/core/browser/data_model/payment_instrument.cc
@@ -6,12 +6,8 @@
 
 namespace autofill {
 
-bool operator==(const PaymentInstrument& a, const PaymentInstrument& b) {
-  return a.instrument_id() == b.instrument_id() &&
-         a.nickname() == b.nickname() &&
-         a.display_icon_url() == b.display_icon_url() &&
-         a.supported_rails() == b.supported_rails();
-}
+bool operator==(const PaymentInstrument& a,
+                const PaymentInstrument& b) = default;
 
 PaymentInstrument::PaymentInstrument(int64_t instrument_id,
                                      std::u16string_view nickname,
diff --git a/components/autofill/core/browser/data_model/payment_instrument.h b/components/autofill/core/browser/data_model/payment_instrument.h
index 549c171..712031c 100644
--- a/components/autofill/core/browser/data_model/payment_instrument.h
+++ b/components/autofill/core/browser/data_model/payment_instrument.h
@@ -16,8 +16,6 @@
 class AutofillTable;
 class PaymentInstrument;
 
-bool operator==(const PaymentInstrument& a, const PaymentInstrument& b);
-
 // Base class for all payment instruments. A payment instrument is considered to
 // be any form of payment stored in the GPay backend that can be used to
 // facilitate a payment on a webpage. Examples of derived class: BankAccount,
@@ -40,6 +38,9 @@
   PaymentInstrument(const PaymentInstrument& other);
   PaymentInstrument& operator=(const PaymentInstrument& other);
   virtual ~PaymentInstrument();
+
+  friend bool operator==(const PaymentInstrument&, const PaymentInstrument&);
+
   // Return the type of PaymentInstrument.
   virtual InstrumentType GetInstrumentType() const = 0;
 
diff --git a/components/autofill/core/browser/data_model/phone_number.cc b/components/autofill/core/browser/data_model/phone_number.cc
index 50534c2d..cc9d359 100644
--- a/components/autofill/core/browser/data_model/phone_number.cc
+++ b/components/autofill/core/browser/data_model/phone_number.cc
@@ -66,7 +66,7 @@
   return number_ == other.number_ && profile_ == other.profile_;
 }
 
-void PhoneNumber::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
+void PhoneNumber::GetSupportedTypes(FieldTypeSet* supported_types) const {
   supported_types->insert(PHONE_HOME_WHOLE_NUMBER);
   supported_types->insert(PHONE_HOME_NUMBER);
   supported_types->insert(PHONE_HOME_NUMBER_PREFIX);
@@ -111,7 +111,7 @@
 
 void PhoneNumber::GetMatchingTypes(const std::u16string& text,
                                    const std::string& app_locale,
-                                   ServerFieldTypeSet* matching_types) const {
+                                   FieldTypeSet* matching_types) const {
   // Strip the common phone number non numerical characters before calling the
   // base matching type function. For example, the |text| "(514) 121-1523"
   // would become the stripped text "5141211523". Since the base matching
diff --git a/components/autofill/core/browser/data_model/phone_number.h b/components/autofill/core/browser/data_model/phone_number.h
index fc55a05..5fd0c5d 100644
--- a/components/autofill/core/browser/data_model/phone_number.h
+++ b/components/autofill/core/browser/data_model/phone_number.h
@@ -26,14 +26,13 @@
 
   PhoneNumber& operator=(const PhoneNumber& number);
   bool operator==(const PhoneNumber& other) const;
-  bool operator!=(const PhoneNumber& other) const { return !operator==(other); }
 
   void set_profile(const AutofillProfile* profile) { profile_ = profile; }
 
   // FormGroup implementation:
   void GetMatchingTypes(const std::u16string& text,
                         const std::string& app_locale,
-                        ServerFieldTypeSet* matching_types) const override;
+                        FieldTypeSet* matching_types) const override;
   std::u16string GetRawInfo(ServerFieldType type) const override;
   void SetRawInfoWithVerificationStatus(ServerFieldType type,
                                         const std::u16string& value,
@@ -70,7 +69,7 @@
 
  private:
   // FormGroup:
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
   std::u16string GetInfoImpl(const AutofillType& type,
                              const std::string& app_locale) const override;
   bool SetInfoWithVerificationStatusImpl(const AutofillType& type,
diff --git a/components/autofill/core/browser/data_model/phone_number_unittest.cc b/components/autofill/core/browser/data_model/phone_number_unittest.cc
index fa0ecfe..166d562 100644
--- a/components/autofill/core/browser/data_model/phone_number_unittest.cc
+++ b/components/autofill/core/browser/data_model/phone_number_unittest.cc
@@ -27,7 +27,7 @@
 
 struct MatchingTypesTestCase {
   std::u16string input;
-  ServerFieldTypeSet expected_types;
+  FieldTypeSet expected_types;
 };
 // Constructs a `PhoneNumber` from `number` and verifies that the matching types
 // on `input` equal `expected_type` on every test case in `tests`.
@@ -50,7 +50,7 @@
   // `kLocale` is irrelevant, because `profile` has country information.
   phone_number.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER), number, kLocale);
   for (const MatchingTypesTestCase& test : tests) {
-    ServerFieldTypeSet matching_types;
+    FieldTypeSet matching_types;
     phone_number.GetMatchingTypes(test.input, kLocale, &matching_types);
     EXPECT_EQ(matching_types, test.expected_types);
   }
@@ -296,7 +296,7 @@
   AutofillProfile profile(i18n_model_definition::kLegacyHierarchyCountryCode);
   PhoneNumber phone_number(&profile);
 
-  ServerFieldTypeSet types;
+  FieldTypeSet types;
   profile.GetSupportedTypes(&types);
   std::vector<ServerFieldType> fields{types.begin(), types.end()};
   std::erase_if(fields, [](ServerFieldType type) {
@@ -468,7 +468,7 @@
   for (size_t i = 0; i < test_cases.size(); i++) {
     SCOPED_TRACE(testing::Message() << "i(US) = " << i);
 
-    ServerFieldTypeSet matching_types;
+    FieldTypeSet matching_types;
     phone_number.GetMatchingTypes(ASCIIToUTF16(test_cases[i]), "US",
                                   &matching_types);
 
@@ -486,7 +486,7 @@
   for (size_t i = 0; i < test_cases.size(); i++) {
     SCOPED_TRACE(testing::Message() << "i(DE) = " << i);
 
-    ServerFieldTypeSet matching_types;
+    FieldTypeSet matching_types;
     phone_number_de.GetMatchingTypes(ASCIIToUTF16(test_cases[i]), kLocaleDE,
                                      &matching_types);
 
@@ -510,7 +510,7 @@
   for (size_t i = 0; i < test_cases.size(); i++) {
     SCOPED_TRACE(testing::Message() << "i = " << i);
 
-    ServerFieldTypeSet matching_types;
+    FieldTypeSet matching_types;
     phone_number.GetMatchingTypes(ASCIIToUTF16(test_cases[i]), kLocale,
                                   &matching_types);
 
diff --git a/components/autofill/core/browser/data_model/test_autofill_data_model.cc b/components/autofill/core/browser/data_model/test_autofill_data_model.cc
index a0d1b330..a047317 100644
--- a/components/autofill/core/browser/data_model/test_autofill_data_model.cc
+++ b/components/autofill/core/browser/data_model/test_autofill_data_model.cc
@@ -26,6 +26,6 @@
     VerificationStatus status) {}
 
 void TestAutofillDataModel::GetSupportedTypes(
-    ServerFieldTypeSet* supported_types) const {}
+    FieldTypeSet* supported_types) const {}
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/test_autofill_data_model.h b/components/autofill/core/browser/data_model/test_autofill_data_model.h
index 0c05d12..15ca2916 100644
--- a/components/autofill/core/browser/data_model/test_autofill_data_model.h
+++ b/components/autofill/core/browser/data_model/test_autofill_data_model.h
@@ -26,7 +26,7 @@
   void SetRawInfoWithVerificationStatus(ServerFieldType type,
                                         const std::u16string& value,
                                         VerificationStatus status) override;
-  void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
+  void GetSupportedTypes(FieldTypeSet* supported_types) const override;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/field_type_utils.cc b/components/autofill/core/browser/field_type_utils.cc
index 3ea021cf..d9c9231 100644
--- a/components/autofill/core/browser/field_type_utils.cc
+++ b/components/autofill/core/browser/field_type_utils.cc
@@ -12,8 +12,8 @@
 
 namespace autofill {
 
-const ServerFieldTypeSet& GetDatabaseStoredTypesOfAutofillProfile() {
-  static constexpr ServerFieldTypeSet stored_types{
+const FieldTypeSet& GetDatabaseStoredTypesOfAutofillProfile() {
+  static constexpr FieldTypeSet stored_types{
       COMPANY_NAME,
       NAME_HONORIFIC_PREFIX,
       NAME_FIRST,
diff --git a/components/autofill/core/browser/field_type_utils.h b/components/autofill/core/browser/field_type_utils.h
index 482d6ff..2c8f4a9b2 100644
--- a/components/autofill/core/browser/field_type_utils.h
+++ b/components/autofill/core/browser/field_type_utils.h
@@ -24,7 +24,7 @@
 // - Some supported types (like PHONE_HOME_CITY_CODE) are not stored.
 // - Some non-supported types are stored (usually types that don't have
 //   filling support yet).
-const ServerFieldTypeSet& GetDatabaseStoredTypesOfAutofillProfile();
+const FieldTypeSet& GetDatabaseStoredTypesOfAutofillProfile();
 
 // Return true if the `field` has at least one possible field type. A possible
 // field type is every type that is neither UNKNOWN_TYPE or EMPTY_TYPE. The
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc
index cf0987d2..8f16c5ea 100644
--- a/components/autofill/core/browser/field_types.cc
+++ b/components/autofill/core/browser/field_types.cc
@@ -458,9 +458,9 @@
 
 FieldTypeSet GetFieldTypesOfGroup(FieldTypeGroup group) {
   FieldTypeSet fields_matching_group;
-  for (FieldType server_field_type : kAllFieldTypes) {
-    if (GroupTypeOfServerFieldType(server_field_type) == group) {
-      fields_matching_group.insert(server_field_type);
+  for (FieldType field_type : kAllFieldTypes) {
+    if (GroupTypeOfServerFieldType(field_type) == group) {
+      fields_matching_group.insert(field_type);
     }
   }
   return fields_matching_group;
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index eaa6803..9b2ab71 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -264,7 +264,7 @@
 
 void FormDataImporter::RemoveInaccessibleProfileValues(
     AutofillProfile& profile) {
-  const ServerFieldTypeSet inaccessible_fields =
+  const FieldTypeSet inaccessible_fields =
       profile.FindInaccessibleProfileValues();
   profile.ClearFields(inaccessible_fields);
   autofill_metrics::LogRemovedSettingInaccessibleFields(
@@ -520,18 +520,18 @@
       import_metadata.num_autocomplete_unrecognized_fields++;
     }
 
-    AutofillType field_type = field->Type();
+    AutofillType autofill_type = field->Type();
 
     // Credit card fields are handled by ExtractCreditCard().
-    if (field_type.group() == FieldTypeGroup::kCreditCard) {
+    if (autofill_type.group() == FieldTypeGroup::kCreditCard) {
       continue;
     }
 
     // There can be multiple email fields (e.g. in the case of 'confirm email'
     // fields) but they must all contain the same value, else the profile is
     // invalid.
-    ServerFieldType server_field_type = field_type.GetStorableType();
-    if (server_field_type == EMAIL_ADDRESS) {
+    ServerFieldType field_type = autofill_type.GetStorableType();
+    if (field_type == EMAIL_ADDRESS) {
       auto email_it = observed_field_values.find(EMAIL_ADDRESS);
       if (email_it != observed_field_values.end() &&
           email_it->second != value) {
@@ -544,14 +544,14 @@
 
     // If the field type and |value| don't pass basic validity checks then
     // abandon the import.
-    if (!IsValidFieldTypeAndValue(observed_field_values, server_field_type,
-                                  value, import_log_buffer)) {
+    if (!IsValidFieldTypeAndValue(observed_field_values, field_type, value,
+                                  import_log_buffer)) {
       has_invalid_field_types = true;
     }
 
     // Found phone number component field.
     // TODO(crbug.com/1156315) Remove feature check when launched.
-    if (field_type.group() == FieldTypeGroup::kPhone &&
+    if (autofill_type.group() == FieldTypeGroup::kPhone &&
         base::FeatureList::IsEnabled(
             features::kAutofillEnableImportWhenMultiplePhoneNumbers)) {
       if (ignore_phone_number_fields) {
@@ -561,15 +561,16 @@
       // type a second time implies that it belongs to a new number. Since
       // Autofill currently supports storing only one phone number per profile,
       // ignore this and all subsequent phone number fields.
-      if (observed_field_values.contains(server_field_type)) {
+      if (observed_field_values.contains(field_type)) {
         ignore_phone_number_fields = true;
         continue;
       }
     }
 
-    observed_field_values.insert_or_assign(field_type.GetStorableType(), value);
+    observed_field_values.insert_or_assign(autofill_type.GetStorableType(),
+                                           value);
 
-    if (FieldTypeGroupToFormType(field_type.group()) ==
+    if (FieldTypeGroupToFormType(autofill_type.group()) ==
         FormType::kAddressForm) {
       has_address_related_fields = true;
       if (field->parsed_autocomplete) {
@@ -960,26 +961,27 @@
 FormDataImporter::ExtractCreditCardFromForm(const FormStructure& form) {
   ExtractCreditCardFromFormResult result;
 
-  ServerFieldTypeSet types_seen;
+  FieldTypeSet types_seen;
   for (const auto& field : form) {
     // If we don't know the type of the field, then skip it.
     if (!field->IsFieldFillable()) {
       continue;
     }
 
-    AutofillType field_type = field->Type();
+    AutofillType autofill_type = field->Type();
     // Field was not identified as a credit card field.
-    if (field_type.group() != FieldTypeGroup::kCreditCard)
+    if (autofill_type.group() != FieldTypeGroup::kCreditCard) {
       continue;
+    }
 
-    ServerFieldType server_field_type = field_type.GetStorableType();
+    ServerFieldType field_type = autofill_type.GetStorableType();
 
     std::u16string value_view = field->value;
     std::u16string_view user_input_view =
         base::TrimWhitespace(field->user_input, base::TRIM_ALL);
     if (base::FeatureList::IsEnabled(
             features::kAutofillUseTypedCreditCardNumber) &&
-        server_field_type == ServerFieldType::CREDIT_CARD_NUMBER &&
+        field_type == ServerFieldType::CREDIT_CARD_NUMBER &&
         !user_input_view.empty()) {
       value_view = user_input_view;
     }
@@ -993,26 +995,26 @@
     std::u16string value = value_view;
 
     result.has_duplicate_credit_card_field_type |=
-        types_seen.contains(server_field_type);
-    types_seen.insert(server_field_type);
+        types_seen.contains(field_type);
+    types_seen.insert(field_type);
 
     // If |field| is an HTML5 month input, handle it as a special case.
     if (field->form_control_type == FormControlType::kInputMonth) {
-      DCHECK_EQ(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, server_field_type);
+      DCHECK_EQ(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, field_type);
       result.card.SetInfoForMonthInputType(value);
       continue;
     }
 
-    // CreditCard handles storing the |value| according to |field_type|.
-    bool saved = result.card.SetInfo(field_type, value, app_locale_);
+    // CreditCard handles storing the |value| according to |autofill_type|.
+    bool saved = result.card.SetInfo(autofill_type, value, app_locale_);
 
     // Saving with the option text (here |value|) may fail for the expiration
     // month. Attempt to save with the option value. First find the index of the
     // option text in the select options and try the corresponding value.
-    if (!saved && server_field_type == CREDIT_CARD_EXP_MONTH) {
+    if (!saved && field_type == CREDIT_CARD_EXP_MONTH) {
       for (const SelectOption& option : field->options) {
         if (value == option.content) {
-          result.card.SetInfo(field_type, option.value, app_locale_);
+          result.card.SetInfo(autofill_type, option.value, app_locale_);
           break;
         }
       }
@@ -1032,10 +1034,10 @@
       continue;
     }
 
-    AutofillType field_type = field->Type();
-    if (field_type.GetStorableType() == IBAN_VALUE &&
+    AutofillType autofill_type = field->Type();
+    if (autofill_type.GetStorableType() == IBAN_VALUE &&
         Iban::IsValid(field->value)) {
-      candidate_iban.SetInfo(field_type, field->value, app_locale_);
+      candidate_iban.SetInfo(autofill_type, field->value, app_locale_);
       break;
     }
   }
diff --git a/components/autofill/core/browser/form_parsing/form_field.cc b/components/autofill/core/browser/form_parsing/form_field.cc
index 3a64ed6..86508d79 100644
--- a/components/autofill/core/browser/form_parsing/form_field.cc
+++ b/components/autofill/core/browser/form_parsing/form_field.cc
@@ -165,7 +165,7 @@
     const GeoIpCountryCode& client_country,
     LogManager* log_manager) {
   // Set to count distinct field types.
-  ServerFieldTypeSet heuristic_types;
+  FieldTypeSet heuristic_types;
   for (const auto& [field_id, candidates] : field_candidates) {
     if (ServerFieldType heuristic_type = candidates.BestHeuristicType();
         IsFillableFieldType(heuristic_type)) {
@@ -190,7 +190,7 @@
     return;
   }
 
-  ServerFieldTypeSet permitted_single_field_types{
+  FieldTypeSet permitted_single_field_types{
       MERCHANT_PROMO_CODE, IBAN_VALUE,
       CREDIT_CARD_STANDALONE_VERIFICATION_CODE};
   if (base::FeatureList::IsEnabled(
@@ -201,7 +201,7 @@
 
   // For historic reasons email addresses are only retained if they appear in
   // a <form> tag. It's unclear whether that's necessary.
-  ServerFieldTypeSet permitted_single_field_types_in_form{EMAIL_ADDRESS};
+  FieldTypeSet permitted_single_field_types_in_form{EMAIL_ADDRESS};
 
   // Returns whether a field type may exist as a stand-alone field.
   auto retainable_field_type =
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 1a044fb..b37bb1f0 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -100,7 +100,7 @@
 
 // Helper for |EncodeUploadRequest()| that creates a bit field corresponding to
 // |available_field_types| and returns the hex representation as a string.
-std::string EncodeFieldTypes(const ServerFieldTypeSet& available_field_types) {
+std::string EncodeFieldTypes(const FieldTypeSet& available_field_types) {
   // There are |MAX_VALID_FIELD_TYPE| different field types and 8 bits per byte,
   // so we need ceil(MAX_VALID_FIELD_TYPE / 8) bytes to encode the bit field.
   const size_t kNumBytes = (MAX_VALID_FIELD_TYPE + 0x7) / 8;
@@ -147,9 +147,8 @@
 
 // Returns the first form field type that is not contained in |contained_types|
 // or MAX_VALID_FIELD_TYPE if no such type exists.
-ServerFieldType FirstNonCapturedType(
-    const FormStructure& form,
-    const ServerFieldTypeSet& contained_types) {
+ServerFieldType FirstNonCapturedType(const FormStructure& form,
+                                     const FieldTypeSet& contained_types) {
   for (const auto& field : form) {
     for (auto type : field->possible_types()) {
       if (type != UNKNOWN_TYPE && type != EMPTY_TYPE &&
@@ -538,7 +537,7 @@
 }
 
 std::vector<AutofillUploadContents> FormStructure::EncodeUploadRequest(
-    const ServerFieldTypeSet& available_field_types,
+    const FieldTypeSet& available_field_types,
     bool form_was_autofilled,
     const std::string_view& login_form_signature,
     bool observed_submission) const {
@@ -1619,7 +1618,7 @@
   Section credit_card_section;
 
   // Keep track of the types we've seen in this section.
-  ServerFieldTypeSet seen_types;
+  FieldTypeSet seen_types;
   ServerFieldType previous_type = UNKNOWN_TYPE;
 
   // Boolean flag that is set to true when a field in the current section
@@ -1790,7 +1789,7 @@
     Section current_section;
 
     // Keep track of the types we've seen in this section.
-    ServerFieldTypeSet seen_types;
+    FieldTypeSet seen_types;
     ServerFieldType previous_type = UNKNOWN_TYPE;
 
     bool is_hidden_section = false;
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h
index ae51c3a..f7ef9366 100644
--- a/components/autofill/core/browser/form_structure.h
+++ b/components/autofill/core/browser/form_structure.h
@@ -113,7 +113,7 @@
   // fields. We want to vote for this flattened form as well as for the original
   // form signatures of forms 1 and 2.
   std::vector<AutofillUploadContents> EncodeUploadRequest(
-      const ServerFieldTypeSet& available_field_types,
+      const FieldTypeSet& available_field_types,
       bool form_was_autofilled,
       const std::string_view& login_form_signature,
       bool observed_submission) const;
diff --git a/components/autofill/core/browser/form_structure_rationalization_engine.cc b/components/autofill/core/browser/form_structure_rationalization_engine.cc
index c0c7400..88267ad 100644
--- a/components/autofill/core/browser/form_structure_rationalization_engine.cc
+++ b/components/autofill/core/browser/form_structure_rationalization_engine.cc
@@ -292,8 +292,7 @@
              // This is the core field to which the rule applies.
              .SetTriggerField(FieldCondition{
                  // The trigger field needs to be an ADDRESS_HOME_LINE2.
-                 .possible_overall_types =
-                     ServerFieldTypeSet{ADDRESS_HOME_LINE2},
+                 .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE2},
                  // Lookup in legacy_regex_patterns.
                  .regex_reference_match = "ADDRESS_HOME_DEPENDENT_LOCALITY",
              })
@@ -305,8 +304,7 @@
              .SetOtherFieldConditions({
                  FieldCondition{
                      .location = FieldLocation::kLastClassifiedPredecessor,
-                     .possible_overall_types =
-                         ServerFieldTypeSet{ADDRESS_HOME_LINE1},
+                     .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE1},
                  },
              })
 
diff --git a/components/autofill/core/browser/form_structure_rationalization_engine.h b/components/autofill/core/browser/form_structure_rationalization_engine.h
index f1bceaa..38cc1ad 100644
--- a/components/autofill/core/browser/form_structure_rationalization_engine.h
+++ b/components/autofill/core/browser/form_structure_rationalization_engine.h
@@ -92,7 +92,7 @@
 
   // If specified, the condition is only true if the overall type of the field
   // before the rule evaluation is in `possible_overall_types`.
-  std::optional<ServerFieldTypeSet> possible_overall_types;
+  std::optional<FieldTypeSet> possible_overall_types;
 
   // If specified, the condition is only true if the field meets the criteria
   // of the references regular expression. See
diff --git a/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc b/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc
index 1a53e64..fd40092 100644
--- a/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc
+++ b/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc
@@ -62,13 +62,13 @@
               .SetFeature(&kTestFeatureForFormStructureRationalizationEngine)
               .Build())
       .SetTriggerField(FieldCondition{
-          .possible_overall_types = ServerFieldTypeSet{ADDRESS_HOME_LINE2},
+          .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE2},
           .regex_reference_match = "ADDRESS_HOME_DEPENDENT_LOCALITY",
       })
       .SetOtherFieldConditions({
           FieldCondition{
               .location = FieldLocation::kLastClassifiedPredecessor,
-              .possible_overall_types = ServerFieldTypeSet{ADDRESS_HOME_LINE1},
+              .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE1},
           },
       })
       .SetActions({
@@ -97,7 +97,7 @@
 
   EXPECT_EQ(rule.trigger_field.location, FieldLocation::kTriggerField);
   EXPECT_EQ(rule.trigger_field.possible_overall_types,
-            ServerFieldTypeSet{ADDRESS_HOME_LINE2});
+            FieldTypeSet{ADDRESS_HOME_LINE2});
   EXPECT_EQ(rule.trigger_field.regex_reference_match,
             "ADDRESS_HOME_DEPENDENT_LOCALITY");
 
@@ -105,7 +105,7 @@
   EXPECT_EQ(rule.other_field_conditions[0].location,
             FieldLocation::kLastClassifiedPredecessor);
   EXPECT_EQ(rule.other_field_conditions[0].possible_overall_types,
-            ServerFieldTypeSet{ADDRESS_HOME_LINE1});
+            FieldTypeSet{ADDRESS_HOME_LINE1});
 
   ASSERT_EQ(rule.actions.size(), 2u);
   EXPECT_EQ(rule.actions[0].target, FieldLocation::kLastClassifiedPredecessor);
@@ -176,7 +176,7 @@
 
   FieldCondition no_possible_types_required = {};
   FieldCondition requires_address_line1_type = {
-      .possible_overall_types = ServerFieldTypeSet{ADDRESS_HOME_LINE1},
+      .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE1},
   };
 
   LanguageCode page_language = LanguageCode("es");
diff --git a/components/autofill/core/browser/form_structure_rationalizer.cc b/components/autofill/core/browser/form_structure_rationalizer.cc
index 7759ce99..b811ee9e 100644
--- a/components/autofill/core/browser/form_structure_rationalizer.cc
+++ b/components/autofill/core/browser/form_structure_rationalizer.cc
@@ -26,13 +26,12 @@
 // `type` are only filled if at least one field of some `GetNecessaryTypesFor()`
 // is present.
 // TODO(crbug.com/1311937) Cleanup when launched.
-ServerFieldTypeSet GetNecessaryTypesFor(ServerFieldType type) {
+FieldTypeSet GetNecessaryTypesFor(ServerFieldType type) {
   switch (type) {
     case PHONE_HOME_COUNTRY_CODE: {
-      return ServerFieldTypeSet{
-          PHONE_HOME_NUMBER, PHONE_HOME_NUMBER_PREFIX,
-          PHONE_HOME_CITY_AND_NUMBER,
-          PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX};
+      return FieldTypeSet{PHONE_HOME_NUMBER, PHONE_HOME_NUMBER_PREFIX,
+                          PHONE_HOME_CITY_AND_NUMBER,
+                          PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX};
     }
     default:
       return {};
@@ -998,14 +997,14 @@
 void FormStructureRationalizer::RationalizeTypeRelationships(
     LogManager* log_manager) {
   // Create a local set of all the types for faster lookup.
-  ServerFieldTypeSet types;
+  FieldTypeSet types;
   for (const auto& field : *fields_) {
     types.insert(field->Type().GetStorableType());
   }
 
   for (const auto& field : *fields_) {
     ServerFieldType field_type = field->Type().GetStorableType();
-    ServerFieldTypeSet necessary_types = GetNecessaryTypesFor(field_type);
+    FieldTypeSet necessary_types = GetNecessaryTypesFor(field_type);
     if (!necessary_types.empty() && !types.contains_any(necessary_types)) {
       // We have relationship rules for this type, but no `necessary_type` was
       // found. Disabling Autofill for this field.
diff --git a/components/autofill/core/browser/form_structure_sectioning_util.cc b/components/autofill/core/browser/form_structure_sectioning_util.cc
index de18f78..71cd98cd 100644
--- a/components/autofill/core/browser/form_structure_sectioning_util.cc
+++ b/components/autofill/core/browser/form_structure_sectioning_util.cc
@@ -18,12 +18,11 @@
 
 namespace {
 
-bool HaveSeenSimilarType(ServerFieldType type,
-                         const ServerFieldTypeSet& seen_types) {
+bool HaveSeenSimilarType(ServerFieldType type, const FieldTypeSet& seen_types) {
   // Forms sometimes have a different format of inputting names in
   // different sections. If we believe a new name is being entered, assume
   // it is a new section.
-  ServerFieldTypeSet first_last_name = {NAME_FIRST, NAME_LAST};
+  FieldTypeSet first_last_name = {NAME_FIRST, NAME_LAST};
   if ((type == NAME_FULL && seen_types.contains_any(first_last_name)) ||
       (first_last_name.contains(type) && seen_types.contains(NAME_FULL))) {
     return true;
@@ -49,9 +48,9 @@
       GroupTypeOfServerFieldType(previous_type) == FieldTypeGroup::kName) {
     return true;
   }
-  if (ServerFieldTypeSet({ADDRESS_HOME_ZIP, ADDRESS_HOME_DEPENDENT_LOCALITY,
-                          ADDRESS_HOME_CITY, ADDRESS_HOME_ADMIN_LEVEL2,
-                          ADDRESS_HOME_STATE, ADDRESS_HOME_COUNTRY})
+  if (FieldTypeSet({ADDRESS_HOME_ZIP, ADDRESS_HOME_DEPENDENT_LOCALITY,
+                    ADDRESS_HOME_CITY, ADDRESS_HOME_ADMIN_LEVEL2,
+                    ADDRESS_HOME_STATE, ADDRESS_HOME_COUNTRY})
           .contains_all({previous_type, current_type})) {
     return true;
   }
@@ -131,7 +130,7 @@
   }
 }
 
-bool BelongsToCurrentSection(const ServerFieldTypeSet& seen_types,
+bool BelongsToCurrentSection(const FieldTypeSet& seen_types,
                              const AutofillField& current_field,
                              const AutofillField& previous_field) {
   if (current_field.section)
@@ -182,7 +181,7 @@
     base::span<const std::unique_ptr<AutofillField>>::iterator begin,
     base::span<const std::unique_ptr<AutofillField>>::iterator end) {
   // Keeps track of the focusable types we've seen in this section.
-  ServerFieldTypeSet seen_types;
+  FieldTypeSet seen_types;
   // The `prev_field` is from the section whose end we are currently searching.
   const AutofillField* prev_field = nullptr;
   for (auto it = begin; it != end; it++) {
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc
index f32f0c6..b01fef6 100644
--- a/components/autofill/core/browser/form_structure_unittest.cc
+++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -2470,7 +2470,7 @@
   // Setup
   ////////////////
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
@@ -2550,7 +2550,7 @@
         possible_field_types_validities[i]);
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(ADDRESS_HOME_LINE1);
@@ -2643,7 +2643,7 @@
   // Setup
   ////////////////
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
@@ -2722,7 +2722,7 @@
         possible_field_types_validities[i]);
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(ADDRESS_HOME_LINE1);
@@ -2760,7 +2760,7 @@
   // Setup
   ////////////////
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
@@ -2841,7 +2841,7 @@
         possible_field_types_validities[i]);
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(ADDRESS_HOME_LINE1);
@@ -2878,7 +2878,7 @@
 
 TEST_F(FormStructureTestImpl, EncodeUploadRequest) {
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
@@ -2957,7 +2957,7 @@
         possible_field_types_validities[i]);
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(ADDRESS_HOME_LINE1);
@@ -3073,7 +3073,7 @@
 TEST_F(FormStructureTestImpl,
        EncodeUploadRequestWithAdditionalPasswordFormSignature) {
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
@@ -3126,7 +3126,7 @@
     }
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(EMAIL_ADDRESS);
@@ -3180,7 +3180,7 @@
 
 TEST_F(FormStructureTestImpl, EncodeUploadRequestWithPropertiesMask) {
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
@@ -3230,7 +3230,7 @@
         possible_field_types_validities[i]);
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(EMAIL_ADDRESS);
@@ -3264,7 +3264,7 @@
 
 TEST_F(FormStructureTestImpl, EncodeUploadRequest_ObservedSubmissionFalse) {
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
@@ -3312,7 +3312,7 @@
         possible_field_types_validities[i]);
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(EMAIL_ADDRESS);
@@ -3342,7 +3342,7 @@
 
 TEST_F(FormStructureTestImpl, EncodeUploadRequest_WithLabels) {
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
@@ -3383,7 +3383,7 @@
         possible_field_types_validities[i]);
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(EMAIL_ADDRESS);
@@ -3415,7 +3415,7 @@
 // one for each of the original forms.
 TEST_F(FormStructureTestImpl, EncodeUploadRequest_WithSubForms) {
   std::unique_ptr<FormStructure> form_structure;
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.host_frame = test::MakeLocalFrameToken();
@@ -3481,7 +3481,7 @@
         possible_field_types_validities[i]);
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(CREDIT_CARD_NAME_FULL);
   available_field_types.insert(CREDIT_CARD_NUMBER);
   available_field_types.insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
@@ -3580,7 +3580,7 @@
   for (auto& fs_field : form_structure)
     fs_field->host_form_signature = form_structure.form_signature();
 
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
 
   for (size_t i = 0; i < form_structure.field_count(); ++i) {
@@ -3594,7 +3594,7 @@
   // No available types.
   // datapresent should be "" == trimmed(0x0000000000000000) ==
   //     0b0000000000000000000000000000000000000000000000000000000000000000
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
 
   // Prepare the expected proto string.
   AutofillUploadContents upload;
@@ -3791,7 +3791,7 @@
   // 33 == ADDRESS_HOME_CITY
   // 34 == ADDRESS_HOME_STATE
   // 60 == COMPANY_NAME
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   available_field_types.insert(NAME_FIRST);
   available_field_types.insert(NAME_LAST);
   available_field_types.insert(EMAIL_ADDRESS);
@@ -3802,7 +3802,7 @@
   available_field_types.insert(COMPANY_NAME);
 
   // Check that multiple types for the field are processed correctly.
-  std::vector<ServerFieldTypeSet> possible_field_types;
+  std::vector<FieldTypeSet> possible_field_types;
   std::vector<ServerFieldTypeValidityStatesMap> possible_field_types_validities;
   FormData form;
   form.url = GURL("http://www.foo.com/");
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc
index 5f11a47..35b242b 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -458,7 +458,7 @@
 // the "actual" field type when calculating metrics. If the |predicted_type| is
 // among the |possible_types] then use that as the best type (i.e., the
 // prediction is deemed to have been correct).
-ServerFieldType GetActualFieldType(const ServerFieldTypeSet& possible_types,
+ServerFieldType GetActualFieldType(const FieldTypeSet& possible_types,
                                    ServerFieldType predicted_type) {
   DCHECK_NE(possible_types.size(), 0u);
 
@@ -477,7 +477,7 @@
 
   // Collapse field types that Chrome treats as identical, e.g. home and
   // billing address fields.
-  ServerFieldTypeSet collapsed_field_types;
+  FieldTypeSet collapsed_field_types;
   for (auto type : possible_types) {
     DCHECK_NE(type, EMPTY_TYPE);
     DCHECK_NE(type, UNKNOWN_TYPE);
@@ -691,10 +691,9 @@
   std::string rationalization_quality_histogram = base::JoinString(
       {"Autofill.RationalizationQuality.PhoneNumber", suffix}, "");
 
-  const ServerFieldTypeSet& possible_types =
+  const FieldTypeSet& possible_types =
       metric_type == AutofillMetrics::TYPE_AUTOCOMPLETE_BASED
-          ? ServerFieldTypeSet{AutofillType(field.html_type())
-                                   .GetStorableType()}
+          ? FieldTypeSet{AutofillType(field.html_type()).GetStorableType()}
           : field.possible_types();
 
   // Get the best type classification we can for the field.
@@ -1774,7 +1773,7 @@
 }
 
 AutofillMetrics::CreditCardSeamlessness::CreditCardSeamlessness(
-    const ServerFieldTypeSet& filled_types)
+    const FieldTypeSet& filled_types)
     : name_(filled_types.contains(CREDIT_CARD_NAME_FULL) ||
             (filled_types.contains(CREDIT_CARD_NAME_FIRST) &&
              filled_types.contains(CREDIT_CARD_NAME_LAST))),
@@ -1872,7 +1871,7 @@
   auto GetSeamlessness = [&p](bool only_newly_filled_fields,
                               bool only_after_security_policy,
                               bool only_visible_fields) {
-    ServerFieldTypeSet autofilled_types;
+    FieldTypeSet autofilled_types;
     for (const auto& field : *p.form) {
       FieldGlobalId id = field->global_id();
       if (only_newly_filled_fields && !p.newly_filled_fields->contains(id))
@@ -2009,7 +2008,7 @@
 
 // static
 void AutofillMetrics::LogCreditCardSeamlessnessAtSubmissionTime(
-    const ServerFieldTypeSet& autofilled_types) {
+    const FieldTypeSet& autofilled_types) {
   CreditCardSeamlessness seamlessness(autofilled_types);
   if (seamlessness.is_valid()) {
     base::UmaHistogramExactLinear(
@@ -2626,7 +2625,7 @@
         .SetFieldSessionIdentifier(
             AutofillMetrics::FieldGlobalIdToHash64Bit(field->global_id()));
 
-    const ServerFieldTypeSet& type_set = field->possible_types();
+    const FieldTypeSet& type_set = field->possible_types();
     if (!type_set.empty()) {
       auto type = type_set.begin();
       submitted_type1 = *type;
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.h b/components/autofill/core/browser/metrics/autofill_metrics.h
index 750c9cf..ac02fa8 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.h
+++ b/components/autofill/core/browser/metrics/autofill_metrics.h
@@ -676,7 +676,7 @@
       kMaxValue = kPartialFill,
     };
 
-    explicit CreditCardSeamlessness(const ServerFieldTypeSet& filled_types);
+    explicit CreditCardSeamlessness(const FieldTypeSet& filled_types);
 
     explicit operator bool() const { return is_valid(); }
     bool is_valid() const { return name_ || number_ || exp_ || cvc_; }
@@ -1186,7 +1186,7 @@
 
   // Logs Autofill.CreditCard.SeamlessFills.AtSubmissionTime.
   static void LogCreditCardSeamlessnessAtSubmissionTime(
-      const ServerFieldTypeSet& autofilled_types);
+      const FieldTypeSet& autofilled_types);
 
   // This should be called when parsing each form.
   static void LogParseFormTiming(const base::TimeDelta& duration);
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
index d8e18de..9b848b1 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -7919,7 +7919,7 @@
   // Since this test suite doesn't use mocks, we can't intercept the autofilled
   // form. Therefore, after each manual fill or autofill, we shall call
   // SetFormValues()
-  void SetFormValues(const ServerFieldTypeSet& fill_field_types,
+  void SetFormValues(const FieldTypeSet& fill_field_types,
                      bool is_autofilled,
                      bool is_user_typed) {
     auto type_to_index = base::MakeFixedFlatMap<ServerFieldType, size_t>(
diff --git a/components/autofill/core/browser/metrics/profile_token_quality_metrics.cc b/components/autofill/core/browser/metrics/profile_token_quality_metrics.cc
index 18fada9..0df16fd 100644
--- a/components/autofill/core/browser/metrics/profile_token_quality_metrics.cc
+++ b/components/autofill/core/browser/metrics/profile_token_quality_metrics.cc
@@ -31,8 +31,8 @@
 // Gets all types of the `profile` that are relevant for ProfileTokenQuality
 // metrics. This excludes additional supported types, since no observations
 // are tracked for them.
-ServerFieldTypeSet GetMetricRelevantTypes(const AutofillProfile& profile) {
-  ServerFieldTypeSet relevant_types;
+FieldTypeSet GetMetricRelevantTypes(const AutofillProfile& profile) {
+  FieldTypeSet relevant_types;
   profile.GetSupportedTypes(&relevant_types);
   relevant_types.intersect(GetDatabaseStoredTypesOfAutofillProfile());
   return relevant_types;
@@ -40,7 +40,7 @@
 
 // Returns the total number of observations for all `types`.
 size_t GetTotalObservationCount(const AutofillProfile& profile,
-                                const ServerFieldTypeSet& types) {
+                                const FieldTypeSet& types) {
   size_t total_observations = 0;
   for (ServerFieldType type : types) {
     total_observations +=
@@ -53,7 +53,7 @@
 // Type in `types`. It tracks the different observation types available for that
 // Type.
 void LogStoredObservationsPerType(const AutofillProfile& profile,
-                                  const ServerFieldTypeSet& types) {
+                                  const FieldTypeSet& types) {
   for (ServerFieldType type : types) {
     for (ObservationType observation :
          profile.token_quality().GetObservationTypesForFieldType(type)) {
@@ -99,7 +99,7 @@
 // Also emits Autofill.ProfileTokenQuality.PerProfile, which represents the same
 // acceptance rate, but accumulated over all `types`.
 void LogStoredTokenQuality(const AutofillProfile& profile,
-                           const ServerFieldTypeSet& types) {
+                           const FieldTypeSet& types) {
   size_t total_stored_good_observations = 0, total_stored_bad_observations = 0;
   for (ServerFieldType type : types) {
     auto [good_observations, bad_observations] = CountObservationsByQuality(
@@ -130,7 +130,7 @@
     return;
   }
   for (const AutofillProfile* profile : profiles) {
-    ServerFieldTypeSet relevant_types = GetMetricRelevantTypes(*profile);
+    FieldTypeSet relevant_types = GetMetricRelevantTypes(*profile);
     base::UmaHistogramCounts1000(
         base::StrCat({kHistogramPrefix, "StoredObservationsCount.PerProfile"}),
         GetTotalObservationCount(*profile, relevant_types));
diff --git a/components/autofill/core/browser/metrics/quality_metrics.cc b/components/autofill/core/browser/metrics/quality_metrics.cc
index 0700a9a1..91c6b59 100644
--- a/components/autofill/core/browser/metrics/quality_metrics.cc
+++ b/components/autofill/core/browser/metrics/quality_metrics.cc
@@ -36,7 +36,7 @@
   bool card_form = base::Contains(form_types, FormType::kCreditCardForm);
   bool address_form = base::Contains(form_types, FormType::kAddressForm);
 
-  ServerFieldTypeSet autofilled_field_types;
+  FieldTypeSet autofilled_field_types;
   size_t num_detected_field_types = 0;
   size_t num_edited_autofilled_fields = 0;
   size_t num_of_accepted_autofilled_fields = 0;
@@ -207,7 +207,7 @@
     /// field type. This means the field must contain a value that can be found
     /// in one of the stored Autofill profiles.
     ///////////////////////////////////////////////////////////////////////////
-    const ServerFieldTypeSet& field_types = field->possible_types();
+    const FieldTypeSet& field_types = field->possible_types();
     DCHECK(!field_types.empty());
 
     // For every field that has a heuristics prediction for a
diff --git a/components/autofill/core/browser/metrics/quality_metrics_unittest.cc b/components/autofill/core/browser/metrics/quality_metrics_unittest.cc
index 88bb6122..a8f196a 100644
--- a/components/autofill/core/browser/metrics/quality_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/quality_metrics_unittest.cc
@@ -533,8 +533,8 @@
     return (predicted_type << 16) | actual_type;
   }
 
-  const ServerFieldTypeSet unknown_equivalent_types_{UNKNOWN_TYPE, EMPTY_TYPE,
-                                                     AMBIGUOUS_TYPE};
+  const FieldTypeSet unknown_equivalent_types_{UNKNOWN_TYPE, EMPTY_TYPE,
+                                               AMBIGUOUS_TYPE};
 };
 
 TEST_P(PredictionQualityMetricsTest, Classification) {
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics.cc b/components/autofill/core/browser/metrics/shadow_prediction_metrics.cc
index 945847c..2417d7d1 100644
--- a/components/autofill/core/browser/metrics/shadow_prediction_metrics.cc
+++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics.cc
@@ -20,7 +20,7 @@
 ShadowPredictionComparison GetBaseComparison(
     ServerFieldType current,
     ServerFieldType next,
-    const ServerFieldTypeSet& submitted_types) {
+    const FieldTypeSet& submitted_types) {
   if (current == NO_SERVER_DATA || next == NO_SERVER_DATA) {
     return ShadowPredictionComparison::kNoPrediction;
   } else if (current == next) {
@@ -41,7 +41,7 @@
 
 void LogRegexShadowPredictions(const AutofillField& field) {
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-  const ServerFieldTypeSet& submitted_types = field.possible_types();
+  const FieldTypeSet& submitted_types = field.possible_types();
   base::UmaHistogramSparse(
       "Autofill.ShadowPredictions.DefaultHeuristicToDefaultServer",
       GetShadowPrediction(field.heuristic_type(), field.server_type(),
@@ -74,7 +74,7 @@
   if (!base::FeatureList::IsEnabled(features::kAutofillModelPredictions)) {
     return;
   }
-  const ServerFieldTypeSet& submitted_types = field.possible_types();
+  const FieldTypeSet& submitted_types = field.possible_types();
   base::UmaHistogramSparse(
       "Autofill.ShadowPredictions.DefaultServerToMLModel",
       GetShadowPrediction(
@@ -106,7 +106,7 @@
 
 int GetShadowPrediction(ServerFieldType current,
                         ServerFieldType next,
-                        const ServerFieldTypeSet& submitted_types) {
+                        const FieldTypeSet& submitted_types) {
   ShadowPredictionComparison comparison =
       GetBaseComparison(current, next, submitted_types);
   // Encode the `current` type and `comparison` into an int.
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics.h b/components/autofill/core/browser/metrics/shadow_prediction_metrics.h
index fcd8757..1531544e 100644
--- a/components/autofill/core/browser/metrics/shadow_prediction_metrics.h
+++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics.h
@@ -37,7 +37,7 @@
 // the shadow predictions perform compared to the `current` predictions.
 int GetShadowPrediction(ServerFieldType current,
                         ServerFieldType next,
-                        const ServerFieldTypeSet& submitted_types);
+                        const FieldTypeSet& submitted_types);
 
 // Logs Autofill.ShadowPredictions.* metrics by comparing the submitted
 // values to the actual and hypothetical predictions.
diff --git a/components/autofill/core/browser/mock_autofill_compose_delegate.h b/components/autofill/core/browser/mock_autofill_compose_delegate.h
index 3d495c37..906c3c9 100644
--- a/components/autofill/core/browser/mock_autofill_compose_delegate.h
+++ b/components/autofill/core/browser/mock_autofill_compose_delegate.h
@@ -19,13 +19,11 @@
               ShouldOfferComposePopup,
               (const FormFieldData&),
               (override));
-  MOCK_METHOD(void,
-              OpenCompose,
-              (autofill::AutofillDriver&,
-               FormRendererId,
-               FieldRendererId,
-               UiEntryPoint),
-              (override));
+  MOCK_METHOD(
+      void,
+      OpenCompose,
+      (autofill::AutofillDriver&, FormGlobalId, FieldGlobalId, UiEntryPoint),
+      (override));
   MOCK_METHOD(bool, HasSavedState, (const FieldGlobalId&), (override));
 };
 
diff --git a/components/autofill/core/browser/payments/payments_customer_data.h b/components/autofill/core/browser/payments/payments_customer_data.h
index dab34210..c916837 100644
--- a/components/autofill/core/browser/payments/payments_customer_data.h
+++ b/components/autofill/core/browser/payments/payments_customer_data.h
@@ -14,12 +14,7 @@
   explicit PaymentsCustomerData(const std::string& customer_id)
       : customer_id(customer_id) {}
 
-  bool operator==(const PaymentsCustomerData& other) const {
-    return customer_id == other.customer_id;
-  }
-  bool operator!=(const PaymentsCustomerData& other) const {
-    return !(*this == other);
-  }
+  bool operator==(const PaymentsCustomerData&) const = default;
 
   // The identifier by which a Google Payments account is identified.
   std::string customer_id;
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index fca03d16..12f98501 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -1327,7 +1327,7 @@
 }
 
 void PersonalDataManager::GetNonEmptyTypes(
-    ServerFieldTypeSet* non_empty_types) const {
+    FieldTypeSet* non_empty_types) const {
   for (AutofillProfile* profile : GetProfiles())
     profile->GetNonEmptyTypes(app_locale_, non_empty_types);
   for (CreditCard* card : GetCreditCards())
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h
index 7ed62a6..4334598 100644
--- a/components/autofill/core/browser/personal_data_manager.h
+++ b/components/autofill/core/browser/personal_data_manager.h
@@ -401,7 +401,7 @@
   CreditCard* GetCreditCardByServerId(const std::string& server_id);
 
   // Gets the field types available in the stored address and credit card data.
-  void GetNonEmptyTypes(ServerFieldTypeSet* non_empty_types) const;
+  void GetNonEmptyTypes(FieldTypeSet* non_empty_types) const;
 
   // Returns whether the personal data has been loaded from the web database.
   virtual bool IsDataLoaded() const;
diff --git a/components/autofill/core/browser/personal_data_manager_cleaner.cc b/components/autofill/core/browser/personal_data_manager_cleaner.cc
index e3fb4e3..3f95d8c0e 100644
--- a/components/autofill/core/browser/personal_data_manager_cleaner.cc
+++ b/components/autofill/core/browser/personal_data_manager_cleaner.cc
@@ -147,7 +147,7 @@
   for (const AutofillProfile* profile :
        personal_data_manager_->GetProfilesFromSource(
            AutofillProfile::Source::kLocalOrSyncable)) {
-    const ServerFieldTypeSet inaccessible_fields =
+    const FieldTypeSet inaccessible_fields =
         profile->FindInaccessibleProfileValues();
     if (!inaccessible_fields.empty()) {
       // We need to create a copy, because otherwise the internally stored
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index f4491cf..38bdc48d 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -1944,7 +1944,7 @@
 
 TEST_F(PersonalDataManagerTest, GetNonEmptyTypes) {
   // Check that there are no available types with no profiles stored.
-  ServerFieldTypeSet non_empty_types;
+  FieldTypeSet non_empty_types;
   personal_data_->GetNonEmptyTypes(&non_empty_types);
   EXPECT_EQ(0U, non_empty_types.size());
 
diff --git a/components/autofill/core/browser/profile_token_quality.cc b/components/autofill/core/browser/profile_token_quality.cc
index d308241..7a8339b2 100644
--- a/components/autofill/core/browser/profile_token_quality.cc
+++ b/components/autofill/core/browser/profile_token_quality.cc
@@ -32,8 +32,8 @@
 
 using ObservationType = ProfileTokenQuality::ObservationType;
 
-ServerFieldTypeSet GetSupportedTypes(const AutofillProfile& profile) {
-  ServerFieldTypeSet types;
+FieldTypeSet GetSupportedTypes(const AutofillProfile& profile) {
+  FieldTypeSet types;
   profile.GetSupportedTypes(&types);
   return types;
 }
@@ -61,7 +61,7 @@
 
   // Returns true if the `current_field_value` case-insensitively equals the
   // value of the `profile` for any of the `types`.
-  auto matches = [&](ServerFieldTypeSet types, const AutofillProfile& profile) {
+  auto matches = [&](FieldTypeSet types, const AutofillProfile& profile) {
     const l10n::CaseInsensitiveCompare compare;
     return base::ranges::any_of(types, [&](ServerFieldType type) {
       return profile.HasInfo(type) &&
@@ -72,7 +72,7 @@
 
   // Returns all supported types of the `profile` except for `type`.
   auto other_types = [&](const AutofillProfile& profile) {
-    ServerFieldTypeSet other_types = GetSupportedTypes(profile);
+    FieldTypeSet other_types = GetSupportedTypes(profile);
     other_types.erase(type);
     return other_types;
   };
@@ -122,10 +122,6 @@
                              });
 }
 
-bool ProfileTokenQuality::operator!=(const ProfileTokenQuality& other) const {
-  return !operator==(other);
-}
-
 bool ProfileTokenQuality::AddObservationsForFilledForm(
     const FormStructure& form_structure,
     const FormData& form_data,
diff --git a/components/autofill/core/browser/profile_token_quality.h b/components/autofill/core/browser/profile_token_quality.h
index 15620e7..1ef067f 100644
--- a/components/autofill/core/browser/profile_token_quality.h
+++ b/components/autofill/core/browser/profile_token_quality.h
@@ -102,7 +102,6 @@
   ~ProfileTokenQuality();
 
   bool operator==(const ProfileTokenQuality& other) const;
-  bool operator!=(const ProfileTokenQuality& other) const;
 
   // Derives an observation from every field of the `form_structure` that was
   // autofilled with the `profile_`. Only fields with no existing observation
diff --git a/components/autofill/core/browser/test_browser_autofill_manager.cc b/components/autofill/core/browser/test_browser_autofill_manager.cc
index 4bc078c7..8a322df 100644
--- a/components/autofill/core/browser/test_browser_autofill_manager.cc
+++ b/components/autofill/core/browser/test_browser_autofill_manager.cc
@@ -130,7 +130,7 @@
       SCOPED_TRACE(base::StringPrintf(
           "Field %d with value %s", static_cast<int>(i),
           base::UTF16ToUTF8(submitted_form->field(i)->value).c_str()));
-      const ServerFieldTypeSet& possible_types =
+      const FieldTypeSet& possible_types =
           submitted_form->field(i)->possible_types();
       EXPECT_EQ(expected_submitted_field_types_[i].size(),
                 possible_types.size());
@@ -255,7 +255,7 @@
 }
 
 void TestBrowserAutofillManager::SetExpectedSubmittedFieldTypes(
-    const std::vector<ServerFieldTypeSet>& expected_types) {
+    const std::vector<FieldTypeSet>& expected_types) {
   expected_submitted_field_types_ = expected_types;
 }
 
diff --git a/components/autofill/core/browser/test_browser_autofill_manager.h b/components/autofill/core/browser/test_browser_autofill_manager.h
index 23b7352..0500ac2c 100644
--- a/components/autofill/core/browser/test_browser_autofill_manager.h
+++ b/components/autofill/core/browser/test_browser_autofill_manager.h
@@ -124,7 +124,7 @@
                                         bool credit_card_enabled);
 
   void SetExpectedSubmittedFieldTypes(
-      const std::vector<ServerFieldTypeSet>& expected_types);
+      const std::vector<FieldTypeSet>& expected_types);
 
   void SetExpectedObservedSubmission(bool expected);
 
@@ -137,7 +137,7 @@
   std::unique_ptr<base::RunLoop> run_loop_;
 
   std::string submitted_form_signature_;
-  std::vector<ServerFieldTypeSet> expected_submitted_field_types_;
+  std::vector<FieldTypeSet> expected_submitted_field_types_;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/test_utils/vote_uploads_test_matchers.h b/components/autofill/core/browser/test_utils/vote_uploads_test_matchers.h
index 4edd747..e66de81b2e 100644
--- a/components/autofill/core/browser/test_utils/vote_uploads_test_matchers.h
+++ b/components/autofill/core/browser/test_utils/vote_uploads_test_matchers.h
@@ -5,27 +5,16 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_UTILS_VOTE_UPLOADS_TEST_MATCHERS_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_UTILS_VOTE_UPLOADS_TEST_MATCHERS_H_
 
+#include <initializer_list>
 #include <string>
 
-#include "base/containers/contains.h"
-#include "base/containers/cxx20_erase.h"
-#include "base/strings/string_number_conversions.h"
-#include "components/autofill/core/browser/form_structure.h"
-#include "components/autofill/core/browser/form_structure_test_api.h"
 #include "components/autofill/core/browser/proto/server.pb.h"
 #include "components/autofill/core/common/signatures.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace autofill {
 
-using ::testing::ContainerEq;
-using ::testing::Contains;
-using ::testing::Field;
-using ::testing::Property;
-using ::testing::ResultOf;
-
 // Returns a container matcher that applies `matcher` to the first element of
 // the container.
 inline auto FirstElementIs(auto matcher) {
@@ -38,12 +27,19 @@
 // make their names briefer.
 namespace upload_contents_matchers {
 
+inline ::testing::Matcher<AutofillUploadContents> AutofillUsedIs(
+    bool autofill_used) {
+  return ::testing::Property(
+      "autofill_used", &AutofillUploadContents::autofill_used, autofill_used);
+}
+
 // Creates a matcher for an `AutofillUploadContents`'s form_signature method
 // against `form_signature`.
 inline ::testing::Matcher<AutofillUploadContents> FormSignatureIs(
     FormSignature form_signature) {
-  return Property("form_signature", &AutofillUploadContents::form_signature,
-                  form_signature.value());
+  return ::testing::Property("form_signature",
+                             &AutofillUploadContents::form_signature,
+                             form_signature.value());
 }
 
 // Creates a matcher that matches `matchers` against the fields of an
@@ -55,17 +51,38 @@
                              ::testing::ElementsAre(matchers...));
 }
 
+// Creates a matcher that matches `matchers` against the fields of an
+// `AutofillUploadContents`. It requires the fields in the proto contain (i.e.
+// are a super set of) the provided `matchers`.
+template <typename... Matchers>
+  requires(sizeof...(Matchers) > 0)
+inline ::testing::Matcher<AutofillUploadContents> FieldsContain(
+    Matchers... matchers) {
+  return ::testing::Property(
+      "field", &AutofillUploadContents::field,
+      ::testing::IsSupersetOf(
+          std::initializer_list<
+              ::testing::Matcher<AutofillUploadContents::Field>>{matchers...}));
+}
+
 inline ::testing::Matcher<AutofillUploadContents> ObservedSubmissionIs(
     bool observed_submission) {
   return ::testing::Property("submission", &AutofillUploadContents::submission,
                              observed_submission);
 }
 
+inline ::testing::Matcher<AutofillUploadContents> SubmissionIndicatorEventIs(
+    mojom::SubmissionIndicatorEvent event) {
+  return ::testing::Property(
+      "submission_event", &AutofillUploadContents::submission_event,
+      static_cast<AutofillUploadContents::SubmissionIndicatorEvent>(event));
+}
+
 // Matchers for `AutofillUploadContents::Field`.
 inline ::testing::Matcher<AutofillUploadContents::Field> FieldAutofillTypeIs(
-    ServerFieldTypeSet type_set) {
+    FieldTypeSet type_set) {
   auto extract_types = [](const AutofillUploadContents::Field& field) {
-    ServerFieldTypeSet s;
+    FieldTypeSet s;
     for (auto type : field.autofill_type()) {
       s.insert(ToSafeFieldType(type, ServerFieldType::NO_SERVER_DATA));
     }
@@ -74,60 +91,15 @@
   return ::testing::ResultOf(extract_types, ::testing::Eq(type_set));
 }
 
+inline ::testing::Matcher<AutofillUploadContents::Field> FieldSignatureIs(
+    FieldSignature signature) {
+  return ::testing::Property("signature",
+                             &AutofillUploadContents::Field::signature,
+                             signature.value());
+}
+
 }  // namespace upload_contents_matchers
 
-inline auto SignatureIsSameAs(const FormData& form) {
-  return Property("form_signature", &FormStructure::form_signature,
-                  CalculateFormSignature(form));
-}
-
-inline auto SignatureIs(FormSignature sig) {
-  return Property("form_signature", &FormStructure::form_signature, sig);
-}
-
-inline auto SubmissionEventIsSameAs(mojom::SubmissionIndicatorEvent exp) {
-  auto get_submission_event = [](const FormStructure& form) {
-    return test_api(const_cast<FormStructure&>(form)).get_submission_event();
-  };
-  return ResultOf("get_submission_event", get_submission_event, exp);
-}
-
-inline auto UsernameVoteTypeIsSameAs(auto expected_type) {
-  auto get_username_vote_type = [](const FormStructure& form) {
-    return test_api(const_cast<FormStructure&>(form)).get_username_vote_type();
-  };
-  return ResultOf("get_username_vote_type", get_username_vote_type,
-                  expected_type);
-}
-
-inline auto UploadedAutofillTypesAre(
-    std::map<std::u16string, ServerFieldTypeSet> expected_types) {
-  // Normalize the actual and expected sets by removing all UNKNOWN_TYPEs.
-  auto get_possible_field_types = [](const FormStructure& actual) {
-    std::map<std::u16string, ServerFieldTypeSet> type_map;
-    for (const auto& field : actual) {
-      ServerFieldTypeSet types = field->possible_types();
-      types.erase(UNKNOWN_TYPE);
-      if (!types.empty())
-        type_map[field->name] = types;
-    }
-    return type_map;
-  };
-  for (auto& [field_name, types] : expected_types)
-    types.erase(UNKNOWN_TYPE);
-  base::EraseIf(expected_types, [](const auto& p) { return p.second.empty(); });
-  return ResultOf("get_possible_field_types", get_possible_field_types,
-                  ContainerEq(expected_types));
-}
-
-inline auto UploadedAutofillTypesAre(
-    const std::map<std::u16string, ServerFieldType>& expected_types) {
-  std::map<std::u16string, ServerFieldTypeSet> map;
-  for (const auto& [field_name, type] : expected_types)
-    map[field_name] = {type};
-  return UploadedAutofillTypesAre(map);
-}
-
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_UTILS_VOTE_UPLOADS_TEST_MATCHERS_H_
diff --git a/components/autofill/core/browser/ui/address_contact_form_label_formatter.cc b/components/autofill/core/browser/ui/address_contact_form_label_formatter.cc
index aa1270db..b513ddf 100644
--- a/components/autofill/core/browser/ui/address_contact_form_label_formatter.cc
+++ b/components/autofill/core/browser/ui/address_contact_form_label_formatter.cc
@@ -14,7 +14,7 @@
     const std::string& app_locale,
     ServerFieldType focused_field_type,
     uint32_t groups,
-    const ServerFieldTypeSet& field_types)
+    const FieldTypeSet& field_types)
     : LabelFormatter(profiles,
                      app_locale,
                      focused_field_type,
diff --git a/components/autofill/core/browser/ui/address_contact_form_label_formatter.h b/components/autofill/core/browser/ui/address_contact_form_label_formatter.h
index 324fda7..9dcdff2 100644
--- a/components/autofill/core/browser/ui/address_contact_form_label_formatter.h
+++ b/components/autofill/core/browser/ui/address_contact_form_label_formatter.h
@@ -23,7 +23,7 @@
       const std::string& app_locale,
       ServerFieldType focused_field_type,
       uint32_t groups,
-      const ServerFieldTypeSet& field_types);
+      const FieldTypeSet& field_types);
 
   ~AddressContactFormLabelFormatter() override;
 
diff --git a/components/autofill/core/browser/ui/address_contact_form_label_formatter_unittest.cc b/components/autofill/core/browser/ui/address_contact_form_label_formatter_unittest.cc
index 4927701..6299278 100644
--- a/components/autofill/core/browser/ui/address_contact_form_label_formatter_unittest.cc
+++ b/components/autofill/core/browser/ui/address_contact_form_label_formatter_unittest.cc
@@ -22,7 +22,7 @@
 namespace autofill {
 namespace {
 
-ServerFieldTypeSet GetFieldTypes() {
+FieldTypeSet GetFieldTypes() {
   return {NO_SERVER_DATA,         NAME_FULL,
           EMAIL_ADDRESS,          ADDRESS_HOME_LINE1,
           ADDRESS_HOME_LINE2,     ADDRESS_HOME_DEPENDENT_LOCALITY,
diff --git a/components/autofill/core/browser/ui/address_email_form_label_formatter.cc b/components/autofill/core/browser/ui/address_email_form_label_formatter.cc
index 1125072d..88e85a8a 100644
--- a/components/autofill/core/browser/ui/address_email_form_label_formatter.cc
+++ b/components/autofill/core/browser/ui/address_email_form_label_formatter.cc
@@ -14,7 +14,7 @@
     const std::string& app_locale,
     ServerFieldType focused_field_type,
     uint32_t groups,
-    const ServerFieldTypeSet& field_types)
+    const FieldTypeSet& field_types)
     : LabelFormatter(profiles,
                      app_locale,
                      focused_field_type,
diff --git a/components/autofill/core/browser/ui/address_email_form_label_formatter.h b/components/autofill/core/browser/ui/address_email_form_label_formatter.h
index 4d0438a..a816ae5 100644
--- a/components/autofill/core/browser/ui/address_email_form_label_formatter.h
+++ b/components/autofill/core/browser/ui/address_email_form_label_formatter.h
@@ -23,7 +23,7 @@
       const std::string& app_locale,
       ServerFieldType focused_field_type,
       uint32_t groups,
-      const ServerFieldTypeSet& field_types);
+      const FieldTypeSet& field_types);
 
   ~AddressEmailFormLabelFormatter() override;
 
diff --git a/components/autofill/core/browser/ui/address_email_form_label_formatter_unittest.cc b/components/autofill/core/browser/ui/address_email_form_label_formatter_unittest.cc
index 826f50fd..7f6b756 100644
--- a/components/autofill/core/browser/ui/address_email_form_label_formatter_unittest.cc
+++ b/components/autofill/core/browser/ui/address_email_form_label_formatter_unittest.cc
@@ -22,7 +22,7 @@
 namespace autofill {
 namespace {
 
-ServerFieldTypeSet GetFieldTypes() {
+FieldTypeSet GetFieldTypes() {
   return {NAME_FULL,
           EMAIL_ADDRESS,
           ADDRESS_HOME_LINE1,
diff --git a/components/autofill/core/browser/ui/address_form_label_formatter.cc b/components/autofill/core/browser/ui/address_form_label_formatter.cc
index f687f25..1f6b1ba9 100644
--- a/components/autofill/core/browser/ui/address_form_label_formatter.cc
+++ b/components/autofill/core/browser/ui/address_form_label_formatter.cc
@@ -14,7 +14,7 @@
     const std::string& app_locale,
     ServerFieldType focused_field_type,
     uint32_t groups,
-    const ServerFieldTypeSet& field_types)
+    const FieldTypeSet& field_types)
     : LabelFormatter(profiles,
                      app_locale,
                      focused_field_type,
diff --git a/components/autofill/core/browser/ui/address_form_label_formatter.h b/components/autofill/core/browser/ui/address_form_label_formatter.h
index 9dcb3a3..5bf428af 100644
--- a/components/autofill/core/browser/ui/address_form_label_formatter.h
+++ b/components/autofill/core/browser/ui/address_form_label_formatter.h
@@ -22,7 +22,7 @@
                             const std::string& app_locale,
                             ServerFieldType focused_field_type,
                             uint32_t groups,
-                            const ServerFieldTypeSet& field_types);
+                            const FieldTypeSet& field_types);
 
   ~AddressFormLabelFormatter() override;
 
diff --git a/components/autofill/core/browser/ui/address_form_label_formatter_unittest.cc b/components/autofill/core/browser/ui/address_form_label_formatter_unittest.cc
index c87dbab..ac640d0 100644
--- a/components/autofill/core/browser/ui/address_form_label_formatter_unittest.cc
+++ b/components/autofill/core/browser/ui/address_form_label_formatter_unittest.cc
@@ -21,7 +21,7 @@
 namespace autofill {
 namespace {
 
-ServerFieldTypeSet GetFieldTypes() {
+FieldTypeSet GetFieldTypes() {
   return {NO_SERVER_DATA,     NAME_FIRST,
           NAME_LAST,          ADDRESS_HOME_LINE1,
           ADDRESS_HOME_LINE2, ADDRESS_HOME_DEPENDENT_LOCALITY,
diff --git a/components/autofill/core/browser/ui/address_phone_form_label_formatter.cc b/components/autofill/core/browser/ui/address_phone_form_label_formatter.cc
index 558c76a..904c37f 100644
--- a/components/autofill/core/browser/ui/address_phone_form_label_formatter.cc
+++ b/components/autofill/core/browser/ui/address_phone_form_label_formatter.cc
@@ -15,7 +15,7 @@
     const std::string& app_locale,
     ServerFieldType focused_field_type,
     uint32_t groups,
-    const ServerFieldTypeSet& field_types)
+    const FieldTypeSet& field_types)
     : LabelFormatter(profiles,
                      app_locale,
                      focused_field_type,
diff --git a/components/autofill/core/browser/ui/address_phone_form_label_formatter.h b/components/autofill/core/browser/ui/address_phone_form_label_formatter.h
index 78147d0..95190f8 100644
--- a/components/autofill/core/browser/ui/address_phone_form_label_formatter.h
+++ b/components/autofill/core/browser/ui/address_phone_form_label_formatter.h
@@ -23,7 +23,7 @@
       const std::string& app_locale,
       ServerFieldType focused_field_type,
       uint32_t groups,
-      const ServerFieldTypeSet& field_types);
+      const FieldTypeSet& field_types);
 
   ~AddressPhoneFormLabelFormatter() override;
 
diff --git a/components/autofill/core/browser/ui/address_phone_form_label_formatter_unittest.cc b/components/autofill/core/browser/ui/address_phone_form_label_formatter_unittest.cc
index 4202a92..4e685eed 100644
--- a/components/autofill/core/browser/ui/address_phone_form_label_formatter_unittest.cc
+++ b/components/autofill/core/browser/ui/address_phone_form_label_formatter_unittest.cc
@@ -22,7 +22,7 @@
 namespace autofill {
 namespace {
 
-ServerFieldTypeSet GetFieldTypes() {
+FieldTypeSet GetFieldTypes() {
   return {NO_SERVER_DATA,     NAME_FULL,          PHONE_HOME_WHOLE_NUMBER,
           ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2, ADDRESS_HOME_CITY,
           ADDRESS_HOME_STATE, ADDRESS_HOME_ZIP,   ADDRESS_HOME_COUNTRY};
diff --git a/components/autofill/core/browser/ui/contact_form_label_formatter.cc b/components/autofill/core/browser/ui/contact_form_label_formatter.cc
index 38241e6..287621c 100644
--- a/components/autofill/core/browser/ui/contact_form_label_formatter.cc
+++ b/components/autofill/core/browser/ui/contact_form_label_formatter.cc
@@ -14,7 +14,7 @@
     const std::string& app_locale,
     ServerFieldType focused_field_type,
     uint32_t groups,
-    const ServerFieldTypeSet& field_types)
+    const FieldTypeSet& field_types)
     : LabelFormatter(profiles,
                      app_locale,
                      focused_field_type,
diff --git a/components/autofill/core/browser/ui/contact_form_label_formatter.h b/components/autofill/core/browser/ui/contact_form_label_formatter.h
index d5ee9bb2..20c00638 100644
--- a/components/autofill/core/browser/ui/contact_form_label_formatter.h
+++ b/components/autofill/core/browser/ui/contact_form_label_formatter.h
@@ -22,7 +22,7 @@
                             const std::string& app_locale,
                             ServerFieldType focused_field_type,
                             uint32_t groups,
-                            const ServerFieldTypeSet& field_types);
+                            const FieldTypeSet& field_types);
 
   ~ContactFormLabelFormatter() override;
 
diff --git a/components/autofill/core/browser/ui/contact_form_label_formatter_unittest.cc b/components/autofill/core/browser/ui/contact_form_label_formatter_unittest.cc
index c0023e4..1d7b5eb 100644
--- a/components/autofill/core/browser/ui/contact_form_label_formatter_unittest.cc
+++ b/components/autofill/core/browser/ui/contact_form_label_formatter_unittest.cc
@@ -22,7 +22,7 @@
 namespace autofill {
 namespace {
 
-ServerFieldTypeSet GetNamePhoneAndEmailFieldTypes() {
+FieldTypeSet GetNamePhoneAndEmailFieldTypes() {
   return {NAME_FIRST, NAME_LAST, PHONE_HOME_WHOLE_NUMBER, EMAIL_ADDRESS};
 }
 
diff --git a/components/autofill/core/browser/ui/label_formatter.cc b/components/autofill/core/browser/ui/label_formatter.cc
index c340b964..3d466b3 100644
--- a/components/autofill/core/browser/ui/label_formatter.cc
+++ b/components/autofill/core/browser/ui/label_formatter.cc
@@ -37,7 +37,7 @@
     const std::string& app_locale,
     ServerFieldType focused_field_type,
     uint32_t groups,
-    const ServerFieldTypeSet& field_types)
+    const FieldTypeSet& field_types)
     : profiles_(profiles),
       app_locale_(app_locale),
       focused_field_type_(focused_field_type),
@@ -86,7 +86,7 @@
     const std::vector<const AutofillProfile*>& profiles,
     const std::string& app_locale,
     ServerFieldType focused_field_type,
-    const ServerFieldTypeSet& field_types) {
+    const FieldTypeSet& field_types) {
   const uint32_t groups = data_util::DetermineGroups(field_types);
   if (!data_util::IsSupportedFormType(groups)) {
     return nullptr;
diff --git a/components/autofill/core/browser/ui/label_formatter.h b/components/autofill/core/browser/ui/label_formatter.h
index 230160d..2a8de691 100644
--- a/components/autofill/core/browser/ui/label_formatter.h
+++ b/components/autofill/core/browser/ui/label_formatter.h
@@ -22,7 +22,7 @@
                  const std::string& app_locale,
                  ServerFieldType focused_field_type,
                  uint32_t groups,
-                 const ServerFieldTypeSet& field_types);
+                 const FieldTypeSet& field_types);
   virtual ~LabelFormatter();
 
   // Returns the bitmask indicating which FieldTypeGroups are represented in
@@ -40,7 +40,7 @@
       const std::vector<const AutofillProfile*>& profiles,
       const std::string& app_locale,
       ServerFieldType focused_field_type,
-      const ServerFieldTypeSet& field_types);
+      const FieldTypeSet& field_types);
 
  protected:
   // Returns a label to show the user. The elements of the label and their
diff --git a/components/autofill/core/browser/ui/mobile_label_formatter.cc b/components/autofill/core/browser/ui/mobile_label_formatter.cc
index c3af33e..9c2dfff 100644
--- a/components/autofill/core/browser/ui/mobile_label_formatter.cc
+++ b/components/autofill/core/browser/ui/mobile_label_formatter.cc
@@ -29,7 +29,7 @@
     const std::string& app_locale,
     ServerFieldType focused_field_type,
     uint32_t groups,
-    const ServerFieldTypeSet& field_types)
+    const FieldTypeSet& field_types)
     : LabelFormatter(profiles,
                      app_locale,
                      focused_field_type,
diff --git a/components/autofill/core/browser/ui/mobile_label_formatter.h b/components/autofill/core/browser/ui/mobile_label_formatter.h
index 205ef470..12fff8a3 100644
--- a/components/autofill/core/browser/ui/mobile_label_formatter.h
+++ b/components/autofill/core/browser/ui/mobile_label_formatter.h
@@ -38,7 +38,7 @@
                        const std::string& app_locale,
                        ServerFieldType focused_field_type,
                        uint32_t groups,
-                       const ServerFieldTypeSet& field_types);
+                       const FieldTypeSet& field_types);
 
   ~MobileLabelFormatter() override;
 
diff --git a/components/autofill/core/browser/ui/mobile_label_formatter_unittest.cc b/components/autofill/core/browser/ui/mobile_label_formatter_unittest.cc
index 759f042..747985a 100644
--- a/components/autofill/core/browser/ui/mobile_label_formatter_unittest.cc
+++ b/components/autofill/core/browser/ui/mobile_label_formatter_unittest.cc
@@ -25,12 +25,12 @@
 namespace autofill {
 namespace {
 
-ServerFieldTypeSet GetContactOnlyFieldTypes() {
+FieldTypeSet GetContactOnlyFieldTypes() {
   return {NO_SERVER_DATA, NAME_FIRST, NAME_LAST, EMAIL_ADDRESS,
           PHONE_HOME_WHOLE_NUMBER};
 }
 
-ServerFieldTypeSet GetAddressOnlyFieldTypes() {
+FieldTypeSet GetAddressOnlyFieldTypes() {
   return {NO_SERVER_DATA,     NAME_FIRST,
           NAME_LAST,          ADDRESS_HOME_LINE1,
           ADDRESS_HOME_LINE2, ADDRESS_HOME_DEPENDENT_LOCALITY,
@@ -38,7 +38,7 @@
           ADDRESS_HOME_ZIP,   ADDRESS_HOME_COUNTRY};
 }
 
-ServerFieldTypeSet GetAddressPlusEmailFieldTypes() {
+FieldTypeSet GetAddressPlusEmailFieldTypes() {
   return {NO_SERVER_DATA,
           NAME_FIRST,
           NAME_LAST,
@@ -52,7 +52,7 @@
           ADDRESS_HOME_COUNTRY};
 }
 
-ServerFieldTypeSet GetAddressPlusContactFieldTypes() {
+FieldTypeSet GetAddressPlusContactFieldTypes() {
   return {NO_SERVER_DATA,
           NAME_FIRST,
           NAME_LAST,
diff --git a/components/autofill/core/browser/webdata/autofill_change.h b/components/autofill/core/browser/webdata/autofill_change.h
index 10b056db..dad3607 100644
--- a/components/autofill/core/browser/webdata/autofill_change.h
+++ b/components/autofill/core/browser/webdata/autofill_change.h
@@ -30,9 +30,7 @@
   Type type() const { return type_; }
   const AutocompleteKey& key() const { return key_; }
 
-  bool operator==(const AutocompleteChange& change) const {
-    return type() == change.type() && key() == change.key();
-  }
+  bool operator==(const AutocompleteChange&) const = default;
 
  private:
   Type type_;
diff --git a/components/autofill/core/common/autocomplete_parsing_util.cc b/components/autofill/core/common/autocomplete_parsing_util.cc
index 4813056..77de0eb6 100644
--- a/components/autofill/core/common/autocomplete_parsing_util.cc
+++ b/components/autofill/core/common/autocomplete_parsing_util.cc
@@ -169,22 +169,16 @@
 
 }  // namespace
 
-bool operator==(const AutocompleteParsingResult& a,
-                const AutocompleteParsingResult& b) {
-  return std::tie(a.section, a.mode, a.field_type) ==
-         std::tie(b.section, b.mode, b.field_type);
-}
-bool operator!=(const AutocompleteParsingResult& a,
-                const AutocompleteParsingResult& b) {
-  return !(a == b);
-}
-
 std::string AutocompleteParsingResult::ToString() const {
   return base::StrCat({"section='", section, "' ", "mode='",
                        HtmlFieldModeToStringView(mode), "' ", "field_type='",
-                       FieldTypeToStringView(field_type), "'"});
+                       FieldTypeToStringView(field_type), "' ", "webauthn='",
+                       webauthn ? "true" : "false", "'"});
 }
 
+bool AutocompleteParsingResult::operator==(
+    const AutocompleteParsingResult&) const = default;
+
 HtmlFieldType FieldTypeFromAutocompleteAttributeValue(std::string value) {
   if (value.empty())
     return HtmlFieldType::kUnspecified;
diff --git a/components/autofill/core/common/autocomplete_parsing_util.h b/components/autofill/core/common/autocomplete_parsing_util.h
index 22ca590..e229cd9 100644
--- a/components/autofill/core/common/autocomplete_parsing_util.h
+++ b/components/autofill/core/common/autocomplete_parsing_util.h
@@ -27,6 +27,8 @@
 struct AutocompleteParsingResult {
   std::string ToString() const;
 
+  bool operator==(const AutocompleteParsingResult&) const;
+
   // `section` corresponds to the string after "section-".
   std::string section;
   HtmlFieldMode mode = HtmlFieldMode::kNone;
@@ -36,11 +38,6 @@
   bool webauthn = false;
 };
 
-bool operator==(const AutocompleteParsingResult& a,
-                const AutocompleteParsingResult& b);
-bool operator!=(const AutocompleteParsingResult& a,
-                const AutocompleteParsingResult& b);
-
 absl::optional<AutocompleteParsingResult> ParseAutocompleteAttribute(
     std::string_view autocomplete_attribute);
 
diff --git a/components/autofill/core/common/form_field_data_predictions.h b/components/autofill/core/common/form_field_data_predictions.h
index 0d66d8f..2933405 100644
--- a/components/autofill/core/common/form_field_data_predictions.h
+++ b/components/autofill/core/common/form_field_data_predictions.h
@@ -20,6 +20,9 @@
   FormFieldDataPredictions& operator=(FormFieldDataPredictions&&);
   ~FormFieldDataPredictions();
 
+  friend bool operator==(const FormFieldDataPredictions&,
+                         const FormFieldDataPredictions&);
+
   std::string host_form_signature;
   std::string signature;
   std::string heuristic_type;
diff --git a/components/autofill/ios/form_util/form_activity_params.h b/components/autofill/ios/form_util/form_activity_params.h
index ff2f826..9e34158 100644
--- a/components/autofill/ios/form_util/form_activity_params.h
+++ b/components/autofill/ios/form_util/form_activity_params.h
@@ -25,7 +25,7 @@
   virtual ~BaseFormActivityParams();
 
   // Comparison operator for the BaseFormActivityParams structure.
-  bool operator==(const BaseFormActivityParams& params) const;
+  bool operator==(const BaseFormActivityParams&) const;
 
   // Reads data from a message into a BaseFormActivityParams object.
   // Returns whether reading the information from the message was successful.
diff --git a/components/autofill/ios/form_util/form_activity_params.mm b/components/autofill/ios/form_util/form_activity_params.mm
index a779674..778a461 100644
--- a/components/autofill/ios/form_util/form_activity_params.mm
+++ b/components/autofill/ios/form_util/form_activity_params.mm
@@ -61,14 +61,8 @@
   return true;
 }
 
-bool BaseFormActivityParams::operator==(
-    const BaseFormActivityParams& params) const {
-  return (form_name == params.form_name) &&
-         (unique_form_id == params.unique_form_id) &&
-         (frame_id == params.frame_id) &&
-         (input_missing == params.input_missing) &&
-         (is_main_frame == params.is_main_frame);
-}
+bool BaseFormActivityParams::operator==(const BaseFormActivityParams&) const =
+    default;
 
 bool FormActivityParams::FromMessage(const web::ScriptMessage& message,
                                      FormActivityParams* params) {
diff --git a/components/browser_ui/site_settings/android/java/res/xml/website_preferences.xml b/components/browser_ui/site_settings/android/java/res/xml/website_preferences.xml
index f2c9ba6..011ae57 100644
--- a/components/browser_ui/site_settings/android/java/res/xml/website_preferences.xml
+++ b/components/browser_ui/site_settings/android/java/res/xml/website_preferences.xml
@@ -45,23 +45,6 @@
         android:title="@string/enable_notifications_vibrate_title"
         android:summary="@string/enable_notifications_vibrate_summary"
         android:defaultValue="true" />
-    <!-- A checkbox for enabling request desktop site for accessories,
-         including keyboard, trackpad and mouse.
-         Only shown in the Desktop site category. -->
-    <org.chromium.components.browser_ui.settings.ChromeBaseCheckBoxPreference
-        android:key="desktop_site_peripheral"
-        android:title="@string/enable_desktop_site_peripheral_title"
-        android:summary="@string/enable_desktop_site_peripheral_summary"
-        android:defaultValue="false"
-        android:persistent="false" />
-    <!-- A checkbox for enabling request desktop site for external display.
-         Only shown in the Desktop site category. -->
-    <org.chromium.components.browser_ui.settings.ChromeBaseCheckBoxPreference
-        android:key="desktop_site_display"
-        android:title="@string/enable_desktop_site_external_display_title"
-        android:summary="@string/enable_desktop_site_external_display_summary"
-        android:defaultValue="false"
-        android:persistent="false" />
     <!-- A checkbox to request mobile view when the window is narrow.
          Only shown in the Desktop site category. -->
     <org.chromium.components.browser_ui.settings.ChromeBaseCheckBoxPreference
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
index 040497c..b601909 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
@@ -7,8 +7,6 @@
 import static org.chromium.components.browser_ui.settings.SearchUtils.handleSearchNavigation;
 import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;
 import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
-import static org.chromium.components.content_settings.PrefNames.DESKTOP_SITE_DISPLAY_SETTING_ENABLED;
-import static org.chromium.components.content_settings.PrefNames.DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED;
 import static org.chromium.components.content_settings.PrefNames.DESKTOP_SITE_WINDOW_SETTING_ENABLED;
 import static org.chromium.components.content_settings.PrefNames.ENABLE_QUIET_NOTIFICATION_PERMISSION_UI;
 import static org.chromium.components.content_settings.PrefNames.NOTIFICATIONS_VIBRATE_ENABLED;
@@ -177,10 +175,6 @@
     private @GlobalToggleLayout int mGlobalToggleLayout = GlobalToggleLayout.BINARY_TOGGLE;
     // The "notifications_quiet_ui" preference to allow hiding/showing it.
     private ChromeBaseCheckBoxPreference mNotificationsQuietUiPref;
-    // The "desktop_site_peripheral" preference to allow hiding/showing it.
-    private ChromeBaseCheckBoxPreference mDesktopSitePeripheralPref;
-    // The "desktop_site_display" preference to allow hiding/showing it.
-    private ChromeBaseCheckBoxPreference mDesktopSiteDisplayPref;
     // The "desktop_site_window" preference to allow hiding/showing it.
     private ChromeBaseCheckBoxPreference mDesktopSiteWindowPref;
     private CardPreference mCardPreference;
@@ -231,8 +225,6 @@
     // Keys for category-specific preferences (toggle, link, button etc.), dynamically shown.
     public static final String NOTIFICATIONS_VIBRATE_TOGGLE_KEY = "notifications_vibrate";
     public static final String NOTIFICATIONS_QUIET_UI_TOGGLE_KEY = "notifications_quiet_ui";
-    public static final String DESKTOP_SITE_PERIPHERAL_TOGGLE_KEY = "desktop_site_peripheral";
-    public static final String DESKTOP_SITE_DISPLAY_TOGGLE_KEY = "desktop_site_display";
     public static final String DESKTOP_SITE_WINDOW_TOGGLE_KEY = "desktop_site_window";
     public static final String EXPLAIN_PROTECTED_MEDIA_KEY = "protected_content_learn_more";
     public static final String ADD_EXCEPTION_KEY = "add_exception";
@@ -641,7 +633,6 @@
                         AutoDarkSettingsChangeSource.SITE_SETTINGS_GLOBAL, toggleValue);
             } else if (type == SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE) {
                 recordSiteLayoutChanged(toggleValue);
-                updateDesktopSiteSecondaryControls();
                 updateDesktopSiteWindowSetting();
             }
             getInfoForOrigins();
@@ -662,10 +653,6 @@
                 // Clear the pref so if the default changes later the user will get the new default.
                 prefService.clearPref(ENABLE_QUIET_NOTIFICATION_PERMISSION_UI);
             }
-        } else if (DESKTOP_SITE_PERIPHERAL_TOGGLE_KEY.equals(preference.getKey())) {
-            prefService.setBoolean(DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED, (boolean) newValue);
-        } else if (DESKTOP_SITE_DISPLAY_TOGGLE_KEY.equals(preference.getKey())) {
-            prefService.setBoolean(DESKTOP_SITE_DISPLAY_SETTING_ENABLED, (boolean) newValue);
         } else if (DESKTOP_SITE_WINDOW_TOGGLE_KEY.equals(preference.getKey())) {
             prefService.setBoolean(DESKTOP_SITE_WINDOW_SETTING_ENABLED, (boolean) newValue);
             RecordHistogram.recordBooleanHistogram(
@@ -1152,8 +1139,6 @@
                 screen.findPreference(TRI_STATE_COOKIE_TOGGLE);
         Preference notificationsVibrate = screen.findPreference(NOTIFICATIONS_VIBRATE_TOGGLE_KEY);
         mNotificationsQuietUiPref = screen.findPreference(NOTIFICATIONS_QUIET_UI_TOGGLE_KEY);
-        mDesktopSitePeripheralPref = screen.findPreference(DESKTOP_SITE_PERIPHERAL_TOGGLE_KEY);
-        mDesktopSiteDisplayPref = screen.findPreference(DESKTOP_SITE_DISPLAY_TOGGLE_KEY);
         mDesktopSiteWindowPref = screen.findPreference(DESKTOP_SITE_WINDOW_TOGGLE_KEY);
         Preference explainProtectedMediaKey = screen.findPreference(EXPLAIN_PROTECTED_MEDIA_KEY);
         PreferenceGroup allowedGroup = screen.findPreference(ALLOWED_GROUP);
@@ -1220,8 +1205,6 @@
 
             screen.removePreference(notificationsVibrate);
             screen.removePreference(mNotificationsQuietUiPref);
-            screen.removePreference(mDesktopSitePeripheralPref);
-            screen.removePreference(mDesktopSiteDisplayPref);
             screen.removePreference(mDesktopSiteWindowPref);
             screen.removePreference(explainProtectedMediaKey);
             screen.removePreference(allowedGroup);
@@ -1252,17 +1235,6 @@
             screen.removePreference(mNotificationsQuietUiPref);
         }
 
-        // Configure/hide the desktop site peripheral/display settings, as needed.
-        if (mCategory.getType() == SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE
-                && ContentFeatureMap.isEnabled(ContentFeatureList.REQUEST_DESKTOP_SITE_ADDITIONS)) {
-            mDesktopSitePeripheralPref.setOnPreferenceChangeListener(this);
-            mDesktopSiteDisplayPref.setOnPreferenceChangeListener(this);
-            updateDesktopSiteSecondaryControls();
-        } else {
-            screen.removePreference(mDesktopSitePeripheralPref);
-            screen.removePreference(mDesktopSiteDisplayPref);
-        }
-
         // Configure/hide the desktop site window setting, as needed.
         if (mCategory.getType() == SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE
                 && ContentFeatureMap.isEnabled(
@@ -1443,34 +1415,6 @@
 
     // TODO(crbug.com/1343640): Looking at a different class setup for SingleCategorySettings that
     // allows category specific logic to live in separate files.
-    private void updateDesktopSiteSecondaryControls() {
-        if (!ContentFeatureMap.isEnabled(ContentFeatureList.REQUEST_DESKTOP_SITE_ADDITIONS)) {
-            return;
-        }
-
-        BrowserContextHandle browserContextHandle =
-                getSiteSettingsDelegate().getBrowserContextHandle();
-        Boolean categoryEnabled =
-                WebsitePreferenceBridge.isCategoryEnabled(
-                        browserContextHandle, ContentSettingsType.REQUEST_DESKTOP_SITE);
-
-        if (categoryEnabled) {
-            // When the global setting for RDS is on, secondary settings for peripherals and
-            // external display should be hidden.
-            getPreferenceScreen().removePreference(mDesktopSitePeripheralPref);
-            getPreferenceScreen().removePreference(mDesktopSiteDisplayPref);
-        } else {
-            // Otherwise, ensure secondary settings are displayed.
-            getPreferenceScreen().addPreference(mDesktopSitePeripheralPref);
-            getPreferenceScreen().addPreference(mDesktopSiteDisplayPref);
-            PrefService prefService = UserPrefs.get(browserContextHandle);
-            mDesktopSitePeripheralPref.setChecked(
-                    prefService.getBoolean(DESKTOP_SITE_PERIPHERAL_SETTING_ENABLED));
-            mDesktopSiteDisplayPref.setChecked(
-                    prefService.getBoolean(DESKTOP_SITE_DISPLAY_SETTING_ENABLED));
-        }
-    }
-
     private void updateDesktopSiteWindowSetting() {
         if (!ContentFeatureMap.isEnabled(ContentFeatureList.REQUEST_DESKTOP_SITE_WINDOW_SETTING)) {
             return;
diff --git a/components/browser_ui/strings/android/site_settings.grdp b/components/browser_ui/strings/android/site_settings.grdp
index 065054aa..edd38db 100644
--- a/components/browser_ui/strings/android/site_settings.grdp
+++ b/components/browser_ui/strings/android/site_settings.grdp
@@ -156,18 +156,6 @@
   <message name="IDS_ENABLE_NOTIFICATIONS_VIBRATE_SUMMARY" desc="Summary for the preference to enable vibration for notifications">
     Notifications may vibrate the device
   </message>
-    <message name="IDS_ENABLE_DESKTOP_SITE_PERIPHERAL_TITLE" translateable="false" desc="Title for the preference to enable peripheral setting for request desktop site">
-    Accessories
-  </message>
-  <message name="IDS_ENABLE_DESKTOP_SITE_PERIPHERAL_SUMMARY" translateable="false" desc="Summary for the preference to enable peripheral setting for request desktop site">
-    Always request desktop site if a keyboard, trackpad, or mouse is attached
-  </message>
-  <message name="IDS_ENABLE_DESKTOP_SITE_EXTERNAL_DISPLAY_TITLE" translateable="false" desc="Title for the preference to enable display setting for request desktop site">
-    Displays
-  </message>
-  <message name="IDS_ENABLE_DESKTOP_SITE_EXTERNAL_DISPLAY_SUMMARY" translateable="false" desc="Summary for the preference to enable display setting for request desktop site">
-    Always request desktop site if a monitor is connected
-  </message>
   <message name="IDS_ENABLE_DESKTOP_SITE_WINDOW_SETTING_TITLE" desc="Title for the preference to enable window setting for request desktop site">
     When the window is narrow, request mobile view
   </message>
diff --git a/components/components_strings.grd b/components/components_strings.grd
index 62cd956..1f9eba90 100644
--- a/components/components_strings.grd
+++ b/components/components_strings.grd
@@ -344,7 +344,6 @@
       <if expr="is_android">
         <part file="android_system_error_page_strings.grdp" />
         <part file="external_intents_strings.grdp" />
-        <part file="webauthn_strings.grdp" />
       </if>
       <if expr="is_ios">
         <part file="management_ios_strings.grdp" />
diff --git a/components/compose/core/browser/compose_manager.h b/components/compose/core/browser/compose_manager.h
index 357cf7bb..5b814b5 100644
--- a/components/compose/core/browser/compose_manager.h
+++ b/components/compose/core/browser/compose_manager.h
@@ -5,6 +5,11 @@
 #ifndef COMPONENTS_COMPOSE_CORE_BROWSER_COMPOSE_MANAGER_H_
 #define COMPONENTS_COMPOSE_CORE_BROWSER_COMPOSE_MANAGER_H_
 
+#include <optional>
+#include <string>
+
+#include "base/functional/callback_forward.h"
+#include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_compose_delegate.h"
 
 namespace compose {
@@ -12,6 +17,10 @@
 // The interface for embedder-independent, tab-specific compose logic.
 class ComposeManager : public autofill::AutofillComposeDelegate {
  public:
+  // The callback to Autofill. When run, it fills the passed string into the
+  // form field on which it was triggered.
+  using ComposeCallback = base::OnceCallback<void(const std::u16string&)>;
+
   // TODO(b/300325327): Add non-Autofill specific methods.
   // Opens the Compose UI. `ui_entry_point` and `trigger_field` describe the
   // field on which Compose was triggered. `popup_screen_location` contains the
diff --git a/components/compose/core/browser/compose_manager_impl.cc b/components/compose/core/browser/compose_manager_impl.cc
index 7e74a518..4027630 100644
--- a/components/compose/core/browser/compose_manager_impl.cc
+++ b/components/compose/core/browser/compose_manager_impl.cc
@@ -87,19 +87,14 @@
                                std::move(compose_callback));
 }
 
-void ComposeManagerImpl::OpenCompose(
-    autofill::AutofillDriver& driver,
-    autofill::FormRendererId form_renderer_id,
-    autofill::FieldRendererId field_renderer_id,
-    UiEntryPoint entry_point) {
-  const autofill::LocalFrameToken frame_token = driver.GetFrameToken();
-  autofill::FormGlobalId form_global_id = {frame_token, form_renderer_id};
-  autofill::FieldGlobalId field_global_id = {frame_token, field_renderer_id};
-
-  driver.ExtractForm(form_global_id,
-                     base::BindOnce(&ComposeManagerImpl::GetBrowserFormHandler,
-                                    weak_ptr_factory_.GetWeakPtr(),
-                                    field_global_id, entry_point));
+void ComposeManagerImpl::OpenCompose(autofill::AutofillDriver& driver,
+                                     autofill::FormGlobalId form_id,
+                                     autofill::FieldGlobalId field_id,
+                                     UiEntryPoint entry_point) {
+  driver.ExtractForm(
+      form_id,
+      base::BindOnce(&ComposeManagerImpl::GetBrowserFormHandler,
+                     weak_ptr_factory_.GetWeakPtr(), field_id, entry_point));
 }
 
 void ComposeManagerImpl::OpenComposeWithFormFieldData(
diff --git a/components/compose/core/browser/compose_manager_impl.h b/components/compose/core/browser/compose_manager_impl.h
index ceb1b524..4e0c1f3 100644
--- a/components/compose/core/browser/compose_manager_impl.h
+++ b/components/compose/core/browser/compose_manager_impl.h
@@ -7,6 +7,7 @@
 
 #include "base/memory/raw_ref.h"
 #include "components/autofill/core/browser/autofill_driver.h"
+#include "components/autofill/core/common/unique_ids.h"
 #include "components/compose/core/browser/compose_client.h"
 #include "components/compose/core/browser/compose_manager.h"
 
@@ -26,8 +27,8 @@
       const autofill::FormFieldData& trigger_field) override;
   bool HasSavedState(const autofill::FieldGlobalId& trigger_field_id) override;
   void OpenCompose(autofill::AutofillDriver& driver,
-                   autofill::FormRendererId form_renderer_id,
-                   autofill::FieldRendererId field_renderer_id,
+                   autofill::FormGlobalId form_id,
+                   autofill::FieldGlobalId field_id,
                    UiEntryPoint ui_entry_point) override;
 
   // ComposeManager
diff --git a/components/content_settings/core/common/pref_names.cc b/components/content_settings/core/common/pref_names.cc
index 5c0ae408..4bb0822a 100644
--- a/components/content_settings/core/common/pref_names.cc
+++ b/components/content_settings/core/common/pref_names.cc
@@ -206,13 +206,6 @@
 #if BUILDFLAG(IS_ANDROID)
 // Enable vibration for web notifications.
 const char kNotificationsVibrateEnabled[] = "notifications.vibrate_enabled";
-// Peripheral setting for request desktop site. When enabled, we will always
-// request desktop site if a keyboard, trackpad, or mouse is attached.
-const char kDesktopSitePeripheralSettingEnabled[] =
-    "desktop_site.peripheral_setting";
-// Display setting for request desktop site. When enabled, we will always
-// request desktop site if a monitor is connected.
-const char kDesktopSiteDisplaySettingEnabled[] = "desktop_site.display_setting";
 // Window setting for request desktop site. When enabled, we will request
 // mobile site if the window is narrow.
 const char kDesktopSiteWindowSettingEnabled[] = "desktop_site.window_setting";
diff --git a/components/content_settings/core/common/pref_names.h b/components/content_settings/core/common/pref_names.h
index 98c93242..9fece81 100644
--- a/components/content_settings/core/common/pref_names.h
+++ b/components/content_settings/core/common/pref_names.h
@@ -97,8 +97,6 @@
 
 #if BUILDFLAG(IS_ANDROID)
 extern const char kNotificationsVibrateEnabled[];
-extern const char kDesktopSitePeripheralSettingEnabled[];
-extern const char kDesktopSiteDisplaySettingEnabled[];
 extern const char kDesktopSiteWindowSettingEnabled[];
 #endif
 
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc
index 98883c5..92815c0 100644
--- a/components/feature_engagement/public/feature_configurations.cc
+++ b/components/feature_engagement/public/feature_configurations.cc
@@ -473,27 +473,6 @@
     return config;
   }
 
-  if (kIPHDownloadEsbPromoFeature.name == feature->name) {
-    absl::optional<FeatureConfig> config = FeatureConfig();
-    config->valid = true;
-    config->availability = Comparator(ANY, 0);
-    config->session_rate = Comparator(EQUAL, 0);
-    SessionRateImpact session_rate_impact;
-    session_rate_impact.type = SessionRateImpact::Type::NONE;
-    config->session_rate_impact = session_rate_impact;
-    // Don't show if user has already seen an IPH this session.
-    // Show the promo max once a year if the user hasn't interacted with
-    // a dangerous download within the last 21 days.
-    config->trigger = EventConfig("download_bubble_esb_iph_trigger",
-                                  Comparator(EQUAL, 0), 360, 360);
-    config->used = EventConfig("enable_enhanced_protection",
-                               Comparator(EQUAL, 0), 21, 360);
-    config->event_configs.insert(
-        EventConfig("download_bubble_dangerous_download_detected",
-                    Comparator(GREATER_THAN_OR_EQUAL, 1), 21, 360));
-    return config;
-  }
-
   if (kIPHDownloadToolbarButtonFeature.name == feature->name) {
     absl::optional<FeatureConfig> config = FeatureConfig();
     config->valid = true;
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index 1f2de5f..6a0b6055 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -52,9 +52,6 @@
 BASE_FEATURE(kIPHDesktopNewTabPageModulesCustomizeFeature,
              "IPH_DesktopNewTabPageModulesCustomize",
              base::FEATURE_DISABLED_BY_DEFAULT);
-BASE_FEATURE(kIPHDownloadEsbPromoFeature,
-             "IPH_DownloadEsbPromo",
-             base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHDownloadToolbarButtonFeature,
              "IPH_DownloadToolbarButton",
              base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index 8e70f3e..6f7afc2c 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -36,7 +36,6 @@
 BASE_DECLARE_FEATURE(kIPHDesktopCustomizeChromeFeature);
 BASE_DECLARE_FEATURE(kIPHDesktopCustomizeChromeRefreshFeature);
 BASE_DECLARE_FEATURE(kIPHDesktopNewTabPageModulesCustomizeFeature);
-BASE_DECLARE_FEATURE(kIPHDownloadEsbPromoFeature);
 BASE_DECLARE_FEATURE(kIPHDownloadToolbarButtonFeature);
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 BASE_DECLARE_FEATURE(kIPHExtensionsMenuFeature);
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc
index b7872db1..81a2b9a 100644
--- a/components/feature_engagement/public/feature_list.cc
+++ b/components/feature_engagement/public/feature_list.cc
@@ -162,7 +162,6 @@
     &kIPHDesktopCustomizeChromeFeature,
     &kIPHDesktopCustomizeChromeRefreshFeature,
     &kIPHDesktopNewTabPageModulesCustomizeFeature,
-    &kIPHDownloadEsbPromoFeature,
     &kIPHDownloadToolbarButtonFeature,
 #if BUILDFLAG(ENABLE_EXTENSIONS)
     &kIPHExtensionsMenuFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h
index 82bc5d0..88d97413 100644
--- a/components/feature_engagement/public/feature_list.h
+++ b/components/feature_engagement/public/feature_list.h
@@ -298,7 +298,6 @@
                        "IPH_DesktopNewTabPageModulesCustomize");
 DEFINE_VARIATION_PARAM(kIPHDesktopTabGroupsNewGroupFeature,
                        "IPH_DesktopTabGroupsNewGroup");
-DEFINE_VARIATION_PARAM(kIPHDownloadEsbPromoFeature, "IPH_DownloadEsbPromo");
 DEFINE_VARIATION_PARAM(kIPHDownloadToolbarButtonFeature,
                        "IPH_DownloadToolbarButton");
 #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/components/metrics/debug/structured/structured_metrics_watcher.cc b/components/metrics/debug/structured/structured_metrics_watcher.cc
index c6bafc8c..9ea8754f 100644
--- a/components/metrics/debug/structured/structured_metrics_watcher.cc
+++ b/components/metrics/debug/structured/structured_metrics_watcher.cc
@@ -32,8 +32,4 @@
   /* Do nothing */
 }
 
-void StructuredMetricsWatcher::OnReportingStateChanged(bool enabled) {
-  /* Do nothing */
-}
-
 }  // namespace metrics::structured
diff --git a/components/metrics/debug/structured/structured_metrics_watcher.h b/components/metrics/debug/structured/structured_metrics_watcher.h
index 1d652156..086dad5 100644
--- a/components/metrics/debug/structured/structured_metrics_watcher.h
+++ b/components/metrics/debug/structured/structured_metrics_watcher.h
@@ -29,7 +29,6 @@
   // Recorder::RecorderImpl:
   void OnEventRecord(const Event& event) override;
   void OnProfileAdded(const base::FilePath& profile_path) override;
-  void OnReportingStateChanged(bool enabled) override;
 
   const std::vector<Event>& events() const { return events_; }
 
diff --git a/components/metrics/structured/recorder.cc b/components/metrics/structured/recorder.cc
index 8100a63..eb268bd 100644
--- a/components/metrics/structured/recorder.cc
+++ b/components/metrics/structured/recorder.cc
@@ -70,12 +70,6 @@
   delegating_events_processor_.OnProfileAdded(profile_path);
 }
 
-void Recorder::OnReportingStateChanged(bool enabled) {
-  for (auto& observer : observers_) {
-    observer.OnReportingStateChanged(enabled);
-  }
-}
-
 void Recorder::OnSystemProfileInitialized() {
   for (auto& observer : observers_) {
     observer.OnSystemProfileInitialized();
diff --git a/components/metrics/structured/recorder.h b/components/metrics/structured/recorder.h
index a5626ef..be2a5cc 100644
--- a/components/metrics/structured/recorder.h
+++ b/components/metrics/structured/recorder.h
@@ -54,8 +54,6 @@
     virtual void OnEventRecord(const Event& event) = 0;
     // Called on a call to ProfileAdded.
     virtual void OnProfileAdded(const base::FilePath& profile_path) = 0;
-    // Called on a call to OnReportingStateChanged.
-    virtual void OnReportingStateChanged(bool enabled) = 0;
     // Called when SystemProfile has finished loading
     virtual void OnSystemProfileInitialized() {}
   };
@@ -78,9 +76,6 @@
   // investigate whether initialization can be simplified for Chrome.
   void ProfileAdded(const base::FilePath& profile_path);
 
-  // Notifies observers that metrics reporting has been enabled or disabled.
-  void OnReportingStateChanged(bool enabled);
-
   // Notifies observers that system profile has been loaded.
   void OnSystemProfileInitialized();
 
diff --git a/components/metrics/structured/structured_metrics_recorder.cc b/components/metrics/structured/structured_metrics_recorder.cc
index 17021df5c..e3194de6 100644
--- a/components/metrics/structured/structured_metrics_recorder.cc
+++ b/components/metrics/structured/structured_metrics_recorder.cc
@@ -116,6 +116,9 @@
   CHECK(event_storage_);
   event_storage_->Purge();
   key_data_provider_->Purge();
+
+  unhashed_events_.clear();
+  unhashed_profile_events_.clear();
 }
 
 void StructuredMetricsRecorder::OnProfileAdded(
@@ -132,12 +135,6 @@
   init_state_.Put(State::kProfileAdded);
 
   event_storage_->OnProfileAdded(profile_path);
-
-  // See DisableRecording for more information.
-  if (purge_state_on_init_) {
-    Purge();
-    purge_state_on_init_ = false;
-  }
 }
 
 void StructuredMetricsRecorder::OnEventRecord(const Event& event) {
@@ -170,42 +167,6 @@
   return init_state_.Has(state);
 }
 
-void StructuredMetricsRecorder::OnReportingStateChanged(bool enabled) {
-  DCHECK(base::CurrentUIThread::IsSet());
-
-  // When reporting is enabled, OnRecordingEnabled is also called. Let that
-  // handle enabling.
-  if (enabled) {
-    return;
-  }
-
-  // Clean up any events that were recording during the pre-user.
-  if (!recording_enabled_ && !enabled) {
-    Purge();
-  }
-
-  // When reporting is disabled, OnRecordingDisabled is also called. Disabling
-  // here is redundant but done for clarity.
-  recording_enabled_ = false;
-
-  // Delete keys and unsent logs. We need to handle two cases:
-  //
-  // 1. A profile hasn't been added yet and we can't delete the files
-  //    immediately. In this case set |purge_state_on_init_| and let
-  //    OnProfileAdded call Purge after initialization.
-  //
-  // 2. A profile has been added and so the backing PersistentProtos have been
-  //    constructed. In this case just call Purge directly.
-  //
-  // Note that Purge will ensure the events are deleted from disk even if the
-  // PersistentProto hasn't itself finished being read.
-  if (!IsInitialized()) {
-    purge_state_on_init_ = true;
-  } else {
-    Purge();
-  }
-}
-
 void StructuredMetricsRecorder::SetOnReadyToRecord(base::OnceClosure callback) {
   on_ready_callback_ = std::move(callback);
 
diff --git a/components/metrics/structured/structured_metrics_recorder.h b/components/metrics/structured/structured_metrics_recorder.h
index 4f75408..14de9092c 100644
--- a/components/metrics/structured/structured_metrics_recorder.h
+++ b/components/metrics/structured/structured_metrics_recorder.h
@@ -116,9 +116,6 @@
   friend class TestStructuredMetricsProvider;
   friend class StructuredMetricsServiceTest;
 
-  // Recorder::RecorderImpl:
-  void OnReportingStateChanged(bool enabled) override;
-
   // Records events before IsInitialized().
   void RecordEventBeforeInitialization(const Event& event);
 
@@ -227,11 +224,6 @@
   // feature flag is enabled.
   bool recording_enabled_ = false;
 
-  // Set by OnReportingStateChanged if all keys and events should be deleted,
-  // but the files backing that state haven't been initialized yet. If set,
-  // state will be purged upon initialization.
-  bool purge_state_on_init_ = false;
-
   // Store for events that were recorded before keys are loaded.
   std::deque<Event> unhashed_events_;
 
diff --git a/components/metrics/structured/structured_metrics_recorder_unittest.cc b/components/metrics/structured/structured_metrics_recorder_unittest.cc
index 168be85..7b78901 100644
--- a/components/metrics/structured/structured_metrics_recorder_unittest.cc
+++ b/components/metrics/structured/structured_metrics_recorder_unittest.cc
@@ -255,10 +255,6 @@
 
   void OnRecordingDisabled() { recorder_->DisableRecording(); }
 
-  void OnReportingStateChanged(bool enabled) {
-    recorder_->OnReportingStateChanged(enabled);
-  }
-
   void OnProfileAdded(const base::FilePath& path) {
     recorder_->OnProfileAdded(path);
   }
@@ -336,40 +332,6 @@
   ExpectNoErrors();
 }
 
-// Ensure that keys and unsent logs are deleted when reporting is disabled, and
-// that reporting resumes when re-enabled.
-TEST_F(StructuredMetricsRecorderTest, ReportingStateChangesHandledCorrectly) {
-  Init();
-
-  // Record an event and read the keys, there should be one.
-  events::v2::test_project_one::TestEventOne().Record();
-  EXPECT_EQ(GetEventMetrics().events_size(), 1);
-
-  const KeyDataProto enabled_proto = ReadKeys(ProfileKeyFilePath());
-  EXPECT_EQ(enabled_proto.keys_size(), 1);
-
-  // Record an event, disable reporting, then record another event. Both of
-  // these events should have been ignored.
-  events::v2::test_project_one::TestEventOne().Record();
-  OnReportingStateChanged(false);
-  events::v2::test_project_one::TestEventOne().Record();
-  EXPECT_EQ(GetEventMetrics().events_size(), 0);
-
-  // Read the keys again, it should be empty.
-  const KeyDataProto disabled_proto = ReadKeys(ProfileKeyFilePath());
-  EXPECT_EQ(disabled_proto.keys_size(), 0);
-
-  // Enable reporting again, and record an event.
-  OnReportingStateChanged(true);
-  OnRecordingEnabled();
-  events::v2::test_project_one::TestEventOne().Record();
-  EXPECT_EQ(GetEventMetrics().events_size(), 1);
-  const KeyDataProto reenabled_proto = ReadKeys(ProfileKeyFilePath());
-  EXPECT_EQ(reenabled_proto.keys_size(), 1);
-
-  ExpectNoErrors();
-}
-
 // Ensure that, if recording is disabled part-way through initialization, the
 // initialization still completes correctly, but recording is correctly set to
 // disabled.
@@ -828,22 +790,6 @@
   ASSERT_EQ(data.events(0).event_name_hash(), kEventEightHash);
 }
 
-TEST_F(StructuredMetricsRecorderTest, PurgeForceRecordedEvents) {
-  // Init and disable recorder.
-  Init();
-  OnRecordingDisabled();
-
-  events::v2::test_project_seven::TestEventEight().Record();
-
-  OnReportingStateChanged(false);
-
-  OnRecordingEnabled();
-
-  const auto data = GetEventMetrics();
-
-  ASSERT_EQ(data.events_size(), 0);
-}
-
 TEST_F(StructuredMetricsRecorderTest, EventMetadataLookupCorrectly) {
   constexpr std::string_view kProjectName = "TestProjectOne";
   constexpr std::string_view kEventName = "TestEventOne";
diff --git a/components/metrics/structured/test/test_structured_metrics_provider.cc b/components/metrics/structured/test/test_structured_metrics_provider.cc
index cd71686e..b521f70 100644
--- a/components/metrics/structured/test/test_structured_metrics_provider.cc
+++ b/components/metrics/structured/test/test_structured_metrics_provider.cc
@@ -112,10 +112,6 @@
   event_record_callback_.Run(event);
 }
 
-void TestStructuredMetricsProvider::OnReportingStateChanged(bool enabled) {
-  structured_metrics_provider_->recorder().OnReportingStateChanged(enabled);
-}
-
 void TestStructuredMetricsProvider::AddProfilePath(
     const base::FilePath& user_path) {
   OnProfileAdded(temp_dir_.GetPath().Append(user_path));
diff --git a/components/metrics/structured/test/test_structured_metrics_provider.h b/components/metrics/structured/test/test_structured_metrics_provider.h
index ebb3ddd6..f2989e2 100644
--- a/components/metrics/structured/test/test_structured_metrics_provider.h
+++ b/components/metrics/structured/test/test_structured_metrics_provider.h
@@ -59,7 +59,6 @@
   // Recorder::RecorderImpl:
   void OnProfileAdded(const base::FilePath& profile_path) override;
   void OnEventRecord(const Event& event) override;
-  void OnReportingStateChanged(bool enabled) override;
 
   std::unique_ptr<StructuredMetricsRecorder> structured_metrics_recorder_;
 
diff --git a/components/metrics_services_manager/metrics_services_manager.cc b/components/metrics_services_manager/metrics_services_manager.cc
index 366c501b..6bfe0b11 100644
--- a/components/metrics_services_manager/metrics_services_manager.cc
+++ b/components/metrics_services_manager/metrics_services_manager.cc
@@ -102,7 +102,7 @@
                                                bool current_consent_given,
                                                bool current_may_upload) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  // If the user has opted out of metrics, delete local UKM and SM state.
+  // If the user has opted out of metrics, delete local UKM state.
   // TODO(crbug.com/1445075): Investigate if UMA needs purging logic.
   if (consent_given_ && !current_consent_given) {
     ukm::UkmService* ukm = GetUkmService();
@@ -110,7 +110,13 @@
       ukm->Purge();
       ukm->ResetClientState(ukm::ResetReason::kUpdatePermissions);
     }
+  }
 
+  // If the user has opted out of metrics, purge Structured Metrics if consent
+  // is not granted. On ChromeOS, SM will record specific events when consent is
+  // unknown during primarily OOBE; but these events need to be purged once
+  // consent is confirmed. This feature shouldn't be used on other platforms.
+  if (!current_consent_given) {
     metrics::structured::StructuredMetricsService* sm_service =
         GetStructuredMetricsService();
     if (sm_service) {
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index 173f058..faa64fd 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit 173f05847ba29e71a934e10d0b8dcc97584e1b1b
+Subproject commit faa64fd015b00924d8c041a05e3c2bd2817bf325
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
index afca6f6..6404f8c1 100644
--- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
+++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
@@ -237,7 +237,8 @@
     const url::SchemeHostPort& final_response_url,
     int request_id,
     const network::mojom::URLResponseHead& response_head,
-    network::mojom::RequestDestination request_destination) {
+    network::mojom::RequestDestination request_destination,
+    bool is_ad_resource) {
   if (provisional_frame_resource_data_use_ &&
       blink::IsRequestDestinationFrame(request_destination)) {
     // TODO(rajendrant): This frame request might start before the provisional
@@ -245,10 +246,12 @@
     // case. There should be a guarantee that DidStartProvisionalLoad be called
     // before DidStartResponse for the frame request.
     provisional_frame_resource_data_use_->DidStartResponse(
-        final_response_url, request_id, response_head, request_destination);
+        final_response_url, request_id, response_head, request_destination,
+        is_ad_resource);
   } else if (page_timing_metrics_sender_) {
     page_timing_metrics_sender_->DidStartResponse(
-        final_response_url, request_id, response_head, request_destination);
+        final_response_url, request_id, response_head, request_destination,
+        is_ad_resource);
     UpdateResourceMetadata(request_id);
   }
 }
@@ -420,23 +423,6 @@
   OnMetricsSenderCreated();
 }
 
-void MetricsRenderFrameObserver::SetAdResourceTracker(
-    subresource_filter::AdResourceTracker* ad_resource_tracker) {
-  // Remove all sources and set a new source for the observer.
-  scoped_ad_resource_observation_.Reset();
-  scoped_ad_resource_observation_.Observe(ad_resource_tracker);
-}
-
-void MetricsRenderFrameObserver::OnAdResourceTrackerGoingAway() {
-  DCHECK(scoped_ad_resource_observation_.IsObserving());
-
-  scoped_ad_resource_observation_.Reset();
-}
-
-void MetricsRenderFrameObserver::OnAdResourceObserved(int request_id) {
-  ad_request_ids_.insert(request_id);
-}
-
 void MetricsRenderFrameObserver::OnMainFrameIntersectionChanged(
     const gfx::Rect& main_frame_intersection_rect) {
   if (page_timing_metrics_sender_) {
@@ -496,28 +482,16 @@
 void MetricsRenderFrameObserver::UpdateResourceMetadata(int request_id) {
   DCHECK(page_timing_metrics_sender_);
 
-  // If the request is an ad, pop it off the list of known ad requests.
-  auto ad_resource_it = ad_request_ids_.find(request_id);
-  bool reported_as_ad_resource =
-      ad_request_ids_.find(request_id) != ad_request_ids_.end();
-  if (reported_as_ad_resource) {
-    ad_request_ids_.erase(ad_resource_it);
-  }
-
   bool is_main_frame_resource = render_frame()->IsMainFrame();
 
   if (provisional_frame_resource_data_use_ &&
       provisional_frame_resource_data_use_->resource_id() == request_id) {
-    if (reported_as_ad_resource) {
-      provisional_frame_resource_data_use_->SetReportedAsAdResource(
-          reported_as_ad_resource);
-    }
     provisional_frame_resource_data_use_->SetIsMainFrameResource(
         is_main_frame_resource);
     // Don't bother with before-fcp metrics for a provisional frame.
   } else {
-    page_timing_metrics_sender_->UpdateResourceMetadata(
-        request_id, reported_as_ad_resource, is_main_frame_resource);
+    page_timing_metrics_sender_->UpdateResourceMetadata(request_id,
+                                                        is_main_frame_resource);
   }
 }
 
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.h b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
index fada9c3..a185796 100644
--- a/components/page_load_metrics/renderer/metrics_render_frame_observer.h
+++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
@@ -12,7 +12,6 @@
 #include "components/page_load_metrics/common/page_load_timing.h"
 #include "components/page_load_metrics/renderer/page_resource_data_use.h"
 #include "components/page_load_metrics/renderer/page_timing_metadata_recorder.h"
-#include "components/subresource_filter/content/renderer/ad_resource_tracker.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/loader/loading_behavior_flag.h"
@@ -68,10 +67,8 @@
 // MetricsRenderFrameObserver is instantiated for each frame (main frames and
 // child frames). MetricsRenderFrameObserver dispatches timing and metadata
 // updates for main frames, but only metadata updates for child frames.
-class MetricsRenderFrameObserver
-    : public content::RenderFrameObserver,
-      public blink::WebLocalFrameObserver,
-      public subresource_filter::AdResourceTracker::Observer {
+class MetricsRenderFrameObserver : public content::RenderFrameObserver,
+                                   public blink::WebLocalFrameObserver {
  public:
   explicit MetricsRenderFrameObserver(content::RenderFrame* render_frame);
 
@@ -97,11 +94,11 @@
       const blink::UseCounterFeature& feature) override;
   void DidObserveSoftNavigation(blink::SoftNavigationMetrics metrics) override;
   void DidObserveLayoutShift(double score, bool after_input_or_scroll) override;
-  void DidStartResponse(
-      const url::SchemeHostPort& final_response_url,
-      int request_id,
-      const network::mojom::URLResponseHead& response_head,
-      network::mojom::RequestDestination request_destination) override;
+  void DidStartResponse(const url::SchemeHostPort& final_response_url,
+                        int request_id,
+                        const network::mojom::URLResponseHead& response_head,
+                        network::mojom::RequestDestination request_destination,
+                        bool is_ad_resource) override;
   void DidReceiveTransferSizeUpdate(int request_id,
                                     int received_data_length) override;
   void DidCompleteResponse(
@@ -129,14 +126,6 @@
   // before being destroyed.
   void WillDetach(blink::DetachReason detach_reason) override;
 
-  // Set the ad resource tracker that |this| observes.
-  void SetAdResourceTracker(
-      subresource_filter::AdResourceTracker* ad_resource_tracker);
-
-  // AdResourceTracker implementation
-  void OnAdResourceTrackerGoingAway() override;
-  void OnAdResourceObserved(int request_id) override;
-
   void OnMainFrameIntersectionChanged(
       const gfx::Rect& main_frame_intersection_rect) override;
   void OnMainFrameViewportRectangleChanged(
@@ -190,13 +179,6 @@
   // before this page loads in a new renderer).
   std::unique_ptr<PageResourceDataUse> provisional_frame_resource_data_use_;
 
-  base::ScopedObservation<subresource_filter::AdResourceTracker,
-                          subresource_filter::AdResourceTracker::Observer>
-      scoped_ad_resource_observation_{this};
-
-  // Set containing all request ids that were reported as ads from the renderer.
-  std::set<int> ad_request_ids_;
-
   // Handle to the shared memory for transporting smoothness related ukm data.
   base::ReadOnlySharedMemoryRegion ukm_smoothness_data_;
 
diff --git a/components/page_load_metrics/renderer/page_resource_data_use.cc b/components/page_load_metrics/renderer/page_resource_data_use.cc
index fa7fc94..5629780 100644
--- a/components/page_load_metrics/renderer/page_resource_data_use.cc
+++ b/components/page_load_metrics/renderer/page_resource_data_use.cc
@@ -24,7 +24,8 @@
     const url::SchemeHostPort& final_response_url,
     int resource_id,
     const network::mojom::URLResponseHead& response_head,
-    network::mojom::RequestDestination request_destination) {
+    network::mojom::RequestDestination request_destination,
+    bool is_ad_resource) {
   if (resource_id_ != kUnknownResourceId) {
     CHECK_EQ(resource_id_, resource_id);
   }
@@ -37,6 +38,7 @@
   is_secure_scheme_ = GURL::SchemeIsCryptographic(final_response_url.scheme());
   is_primary_frame_resource_ =
       blink::IsRequestDestinationFrame(request_destination);
+  reported_as_ad_resource_ = is_ad_resource;
 }
 
 void PageResourceDataUse::DidReceiveTransferSizeUpdate(
@@ -81,11 +83,6 @@
   return is_complete_ || is_canceled_;
 }
 
-void PageResourceDataUse::SetReportedAsAdResource(
-    bool reported_as_ad_resource) {
-  reported_as_ad_resource_ = reported_as_ad_resource;
-}
-
 void PageResourceDataUse::SetIsMainFrameResource(bool is_main_frame_resource) {
   is_main_frame_resource_ = is_main_frame_resource;
 }
diff --git a/components/page_load_metrics/renderer/page_resource_data_use.h b/components/page_load_metrics/renderer/page_resource_data_use.h
index a2121c8..29d6f65 100644
--- a/components/page_load_metrics/renderer/page_resource_data_use.h
+++ b/components/page_load_metrics/renderer/page_resource_data_use.h
@@ -38,7 +38,8 @@
   void DidStartResponse(const url::SchemeHostPort& final_response_url,
                         int resource_id,
                         const network::mojom::URLResponseHead& response_head,
-                        network::mojom::RequestDestination request_destination);
+                        network::mojom::RequestDestination request_destination,
+                        bool is_ad_resource);
 
   // Updates received bytes.
   void DidReceiveTransferSizeUpdate(int received_data_length);
@@ -62,7 +63,6 @@
 
   int resource_id() const { return resource_id_; }
 
-  void SetReportedAsAdResource(bool reported_as_ad_resource);
   void SetIsMainFrameResource(bool is_main_frame_resource);
 
   // Creates a ResourceDataUpdate mojo for this resource. This page resource
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
index e255154..88da728 100644
--- a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
+++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
@@ -150,12 +150,13 @@
     const url::SchemeHostPort& final_response_url,
     int resource_id,
     const network::mojom::URLResponseHead& response_head,
-    network::mojom::RequestDestination request_destination) {
+    network::mojom::RequestDestination request_destination,
+    bool is_ad_resource) {
   // There can be multiple `DidStartResponse` for the same resource id
   // (crbug.com/1504430).
   FindOrInsertPageResourceDataUse(resource_id)
       ->DidStartResponse(final_response_url, resource_id, response_head,
-                         request_destination);
+                         request_destination, is_ad_resource);
 }
 
 void PageTimingMetricsSender::DidReceiveTransferSizeUpdate(
@@ -230,17 +231,11 @@
 
 void PageTimingMetricsSender::UpdateResourceMetadata(
     int resource_id,
-    bool reported_as_ad_resource,
     bool is_main_frame_resource) {
   auto it = page_resource_data_use_.find(resource_id);
   if (it == page_resource_data_use_.end())
     return;
 
-  // This can get called multiple times for a resource, and this flag will only
-  // be true once.
-  if (reported_as_ad_resource)
-    it->second->SetReportedAsAdResource(reported_as_ad_resource);
-
   it->second->SetIsMainFrameResource(is_main_frame_resource);
 }
 
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.h b/components/page_load_metrics/renderer/page_timing_metrics_sender.h
index 27f2b6a1..6f68ada 100644
--- a/components/page_load_metrics/renderer/page_timing_metrics_sender.h
+++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.h
@@ -71,7 +71,8 @@
   void DidStartResponse(const url::SchemeHostPort& final_response_url,
                         int resource_id,
                         const network::mojom::URLResponseHead& response_head,
-                        network::mojom::RequestDestination request_destination);
+                        network::mojom::RequestDestination request_destination,
+                        bool is_ad_resource);
   void DidReceiveTransferSizeUpdate(int resource_id, int received_data_length);
   void DidCompleteResponse(int resource_id,
                            const network::URLLoaderCompletionStatus& status);
@@ -103,9 +104,7 @@
   // Updates the PageLoadMetrics::CpuTiming data and starts the send timer.
   void UpdateCpuTiming(base::TimeDelta task_time);
 
-  void UpdateResourceMetadata(int resource_id,
-                              bool is_ad_resource,
-                              bool is_main_frame_resource);
+  void UpdateResourceMetadata(int resource_id, bool is_main_frame_resource);
   void SetUpSmoothnessReporting(base::ReadOnlySharedMemoryRegion shared_memory);
   void InitiateUserInteractionTiming();
   mojom::SoftNavigationMetricsPtr GetSoftNavigationMetrics() {
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc
index 0093cb3..445b56c 100644
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -77,9 +77,11 @@
 namespace {
 
 using ::autofill::AutofillUploadContents;
+using ::autofill::CalculateFieldSignatureForField;
 using ::autofill::FieldPropertiesFlags;
 using ::autofill::FieldRendererId;
 using ::autofill::FieldSignature;
+using ::autofill::FieldTypeSet;
 using ::autofill::FormData;
 using ::autofill::FormFieldData;
 using ::autofill::FormRendererId;
@@ -90,11 +92,14 @@
 using ::autofill::PasswordFormFillData;
 using ::autofill::PasswordFormGenerationData;
 using ::autofill::ServerFieldType;
-using ::autofill::ServerFieldTypeSet;
 using ::autofill::SINGLE_USERNAME;
 using ::autofill::SINGLE_USERNAME_FORGOT_PASSWORD;
 using ::autofill::UNKNOWN_TYPE;
 using ::autofill::password_generation::PasswordGenerationType;
+using ::autofill::upload_contents_matchers::FieldAutofillTypeIs;
+using ::autofill::upload_contents_matchers::FieldsContain;
+using ::autofill::upload_contents_matchers::FieldSignatureIs;
+using ::autofill::upload_contents_matchers::FormSignatureIs;
 using ::base::TestMockTimeTaskRunner;
 using ::signin::GaiaIdHash;
 using ::testing::_;
@@ -112,6 +117,14 @@
 using ::testing::SaveArg;
 using ::testing::SaveArgPointee;
 using ::testing::UnorderedElementsAre;
+using upload_contents_matchers::FieldGenerationTypeIs;
+using upload_contents_matchers::FieldIsMostRecentSingleUsernameCandidateIs;
+using upload_contents_matchers::FieldSingleUsernameVoteTypeIs;
+using upload_contents_matchers::FieldVoteTypeIs;
+using upload_contents_matchers::IsPasswordUpload;
+using upload_contents_matchers::PasswordsRevealedIs;
+using upload_contents_matchers::SingleUsernameDataIs;
+using Field = ::autofill::AutofillUploadContents::Field;
 
 // Indices of username and password fields in the observed form.
 constexpr int kUsernameFieldIndex = 1;
@@ -124,6 +137,27 @@
 // Unique renderer id of the single username field.
 constexpr autofill::FieldRendererId kSingleUsernameFieldRendererId(101);
 
+// Creates a matcher for an `autofill::AutofillUploadContents::Field` that
+// checks that the field's signature matches that of `field` and its predicted
+// type is `type`.
+auto UploadFieldIs(const FormFieldData& field,
+                   ServerFieldType type,
+                   auto... matchers) {
+  return AllOf(FieldSignatureIs(CalculateFieldSignatureForField(field)),
+               FieldAutofillTypeIs({type}), matchers...);
+}
+
+// Returns a matcher that checks that a vote upload happened for a form with
+// `kSingleUsernameFormSignature` and a field with
+// `kSingleUsernameFieldSignature` with type `SINGLE_USERNAME`.
+auto IsSingleUsernameUpload() {
+  return IsPasswordUpload(
+      FormSignatureIs(kSingleUsernameFormSignature),
+      FieldsContain(
+          AllOf(FieldSignatureIs(kSingleUsernameFieldSignature),
+                FieldAutofillTypeIs({ServerFieldType::SINGLE_USERNAME}))));
+}
+
 MATCHER_P(FormHasUniqueKey, key, "") {
   return ArePasswordFormUniqueKeysEqual(arg, key);
 }
@@ -436,14 +470,13 @@
         submitted_form_.fields[kPasswordFieldIndex].value;
 
     EXPECT_CALL(client_, GetAutofillCrowdsourcingManager())
-        .WillRepeatedly(Return(&mock_autofill_crowdsourcing_manager_));
+        .WillRepeatedly(Return(&crowdsourcing_manager()));
     ON_CALL(client_, GetPrefs()).WillByDefault(Return(&pref_service_));
     ON_CALL(client_, IsCommittedMainFrameSecure()).WillByDefault(Return(true));
     ON_CALL(*client_.GetPasswordFeatureManager(),
             ShouldShowAccountStorageBubbleUi)
         .WillByDefault(Return(true));
-    ON_CALL(mock_autofill_crowdsourcing_manager_,
-            StartUploadRequest(_, _, _, _, _, _, _))
+    ON_CALL(crowdsourcing_manager(), StartUploadRequest(_, _, _, _, _))
         .WillByDefault(Return(true));
     ON_CALL(*client_.GetPasswordFeatureManager(), GetDefaultPasswordStore)
         .WillByDefault(Return(PasswordForm::Store::kProfileStore));
@@ -475,34 +508,6 @@
   void SetUp() override { CreateFormManager(observed_form_); }
 
  protected:
-  autofill::test::AutofillUnitTestEnvironment autofill_test_environment_;
-  NiceMock<autofill::MockAutofillCrowdsourcingManager>
-      mock_autofill_crowdsourcing_manager_{/*client=*/nullptr};
-  FormData observed_form_;
-  FormData submitted_form_;
-  FormData observed_form_only_password_fields_;
-  FormData non_password_form_;
-  FormData submitted_non_password_form_;
-  PasswordForm saved_match_;
-  PasswordForm psl_saved_match_;
-  PasswordForm parsed_observed_form_;
-  PasswordForm parsed_submitted_form_;
-  base::test::TaskEnvironment task_environment_{
-      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
-  signin::IdentityTestEnvironment identity_test_env_;
-  TestingPrefServiceSimple pref_service_;
-  NiceMock<MockPasswordManagerClient> client_;
-  NiceMock<MockPasswordManagerDriver> driver_;
-  NiceMock<MockWebAuthnCredentialsDelegate> webauthn_credentials_delegate_;
-  std::unique_ptr<FieldInfoManager> field_info_manager_;
-  scoped_refptr<TestMockTimeTaskRunner> task_runner_;
-  std::optional<std::vector<PasskeyCredential>> passkeys_;
-
-  // Define |fetcher_| before |form_manager_|, because the former needs to
-  // outlive the latter.
-  std::unique_ptr<FakeFormFetcher> fetcher_;
-  std::unique_ptr<PasswordFormManager> form_manager_;
-
   // Creates PasswordFormManager and sets it to |form_manager_|. Along the
   // way a new |fetcher_| is created.
   virtual void CreateFormManager(const FormData& observed_form) {
@@ -558,21 +563,28 @@
     field_info_manager_->AddFieldInfo(info, predictions);
   }
 
-  void ExpectSingleUsernameUpload(
+  void ExpectIsSingleUsernameUpload(
       FormSignature form_signature,
-      AutofillUploadContents::Field::SingleUsernameVoteType vote_type,
-      autofill::ServerFieldType field_type,
-      autofill::IsMostRecentSingleUsernameCandidate
+      Field::SingleUsernameVoteType vote_type,
+      ServerFieldType field_type,
+      IsMostRecentSingleUsernameCandidate
           is_most_recent_single_username_candidate =
-              autofill::IsMostRecentSingleUsernameCandidate::
+              IsMostRecentSingleUsernameCandidate::
                   kNotPartOfUsernameFirstFlow) {
-    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                StartUploadRequest(
-                    AllOf(SignatureIs(form_signature),
-                          UploadedSingleUsernameVoteTypeIs(vote_type),
-                          UploadedSingleUsernameVoteIsMostRecentCandidate(
-                              is_most_recent_single_username_candidate)),
-                    _, ServerFieldTypeSet{field_type}, _, _, _, _));
+    std::optional<bool> most_recent;
+    if (is_most_recent_single_username_candidate !=
+        IsMostRecentSingleUsernameCandidate::kNotPartOfUsernameFirstFlow) {
+      most_recent = is_most_recent_single_username_candidate ==
+                    IsMostRecentSingleUsernameCandidate::kMostRecentCandidate;
+    }
+    auto upload_contents_matcher = IsPasswordUpload(
+        FormSignatureIs(form_signature),
+        FieldsContain(
+            AllOf(FieldAutofillTypeIs({field_type}),
+                  FieldSingleUsernameVoteTypeIs(vote_type),
+                  FieldIsMostRecentSingleUsernameCandidateIs(most_recent))));
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(upload_contents_matcher, _, _, _, _));
   }
 
   // Creates LRU cache simulating user modifying non-password field outside of
@@ -591,6 +603,40 @@
     }
     return cache;
   }
+
+  autofill::MockAutofillCrowdsourcingManager& crowdsourcing_manager() {
+    return mock_autofill_crowdsourcing_manager_;
+  }
+
+  FormData observed_form_;
+  FormData submitted_form_;
+  FormData observed_form_only_password_fields_;
+  FormData non_password_form_;
+  FormData submitted_non_password_form_;
+  PasswordForm saved_match_;
+  PasswordForm psl_saved_match_;
+  PasswordForm parsed_observed_form_;
+  PasswordForm parsed_submitted_form_;
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  signin::IdentityTestEnvironment identity_test_env_;
+  TestingPrefServiceSimple pref_service_;
+  NiceMock<MockPasswordManagerClient> client_;
+  NiceMock<MockPasswordManagerDriver> driver_;
+  NiceMock<MockWebAuthnCredentialsDelegate> webauthn_credentials_delegate_;
+  std::unique_ptr<FieldInfoManager> field_info_manager_;
+  scoped_refptr<TestMockTimeTaskRunner> task_runner_;
+  std::optional<std::vector<PasskeyCredential>> passkeys_;
+
+  // Define |fetcher_| before |form_manager_|, because the former needs to
+  // outlive the latter.
+  std::unique_ptr<FakeFormFetcher> fetcher_;
+  std::unique_ptr<PasswordFormManager> form_manager_;
+
+ private:
+  autofill::test::AutofillUnitTestEnvironment autofill_test_environment_;
+  NiceMock<autofill::MockAutofillCrowdsourcingManager>
+      mock_autofill_crowdsourcing_manager_{/*client=*/nullptr};
 };
 
 TEST_P(PasswordFormManagerTest, DoesManage) {
@@ -1221,19 +1267,15 @@
     EXPECT_TRUE(
         form_manager_->ProvisionallySave(submitted_form, &driver_, nullptr));
 
-    std::map<std::u16string, autofill::ServerFieldType> expected_types;
-    expected_types[u"password"] = autofill::PASSWORD;
-    expected_types[u"password2"] = expected_vote;
-
     testing::InSequence in_sequence;
-    EXPECT_CALL(
-        mock_autofill_crowdsourcing_manager_,
-        StartUploadRequest(UploadedAutofillTypesAre(expected_types), false, _,
-                           _, true, nullptr, /*observer=*/IsNull()));
+    auto upload_contents_matcher = IsPasswordUpload(FieldsContain(
+        UploadFieldIs(submitted_form.fields[0], ServerFieldType::PASSWORD),
+        UploadFieldIs(submitted_form.fields[1], expected_vote)));
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(upload_contents_matcher, _, _, _, _));
     if (expected_vote == autofill::NEW_PASSWORD) {
       // An unrelated |FIRST_USE| vote.
-      EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                  StartUploadRequest(_, _, _, _, _, _, /*observer=*/IsNull()));
+      EXPECT_CALL(crowdsourcing_manager(), StartUploadRequest(_, _, _, _, _));
     }
 
     if (expected_vote == autofill::NEW_PASSWORD)
@@ -1242,7 +1284,7 @@
       form_manager_->OnNoInteraction(true /* is_update */);
     else
       form_manager_->OnNopeUpdateClicked();
-    Mock::VerifyAndClearExpectations(&mock_autofill_crowdsourcing_manager_);
+    Mock::VerifyAndClearExpectations(&crowdsourcing_manager());
   }
 }
 
@@ -1268,6 +1310,8 @@
       {AlternativeElement::Value(u"+1(650)000-0000"),
        autofill::FieldRendererId(), AlternativeElement::Name(u"phone_field")}};
   // Add fields because it is necessary for vote uploading.
+  size_t alternative_username_field_index =
+      saved_match_.form_data.fields.size();
   for (const AlternativeElement& alternative :
        saved_match_.all_alternative_usernames) {
     FormFieldData text_field;
@@ -1300,30 +1344,24 @@
 
   testing::InSequence in_sequence;
   // Unrelated regular PASSWORD vote.
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, _));
-  std::map<std::u16string, autofill::ServerFieldType> expected_types;
-  expected_types[saved_match_.all_alternative_usernames[0].name] =
-      autofill::USERNAME;
-  expected_types[saved_match_.password_element] =
-      autofill::ACCOUNT_CREATION_PASSWORD;
+  EXPECT_CALL(crowdsourcing_manager(), StartUploadRequest(_, _, _, _, _));
 
   // The first key in the map should be
   // `saved_match_.form_data.fields[0].unique_renderer_id`, but the new
   // `unique_renderer_id` of value 1 should be assigned in
   // `GenerateSyntheticRenderIdsAndAssignThem()` in the flow
   // of `Save()`.
-  VoteTypeMap expected_vote_types = {
-      {autofill::FieldRendererId(1),
-       AutofillUploadContents::Field::USERNAME_OVERWRITTEN}};
-
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIs(CalculateFormSignature(saved_match_.form_data)),
-                UploadedAutofillTypesAre(expected_types),
-                VoteTypesAre(expected_vote_types)),
-          _, _, _, _, _, _));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(saved_match_.form_data)),
+      FieldsContain(
+          UploadFieldIs(
+              saved_match_.form_data.fields[alternative_username_field_index],
+              ServerFieldType::USERNAME,
+              FieldVoteTypeIs(Field::USERNAME_OVERWRITTEN)),
+          UploadFieldIs(password_field,
+                        ServerFieldType::ACCOUNT_CREATION_PASSWORD)));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
   form_manager_->Save();
 }
@@ -1367,32 +1405,30 @@
 
   // Credentials saved on the signup form were reused on a login form. The vote
   // applies to the first (signup) form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIs(CalculateFormSignature(saved_match_.form_data)),
-                VoteTypesAre(
-                    {{saved_match_.form_data.fields[kUsernameFieldIndex]
-                          .unique_renderer_id,
-                      AutofillUploadContents::Field::CREDENTIALS_REUSED},
-                     {saved_match_.form_data.fields[kPasswordFieldIndex]
-                          .unique_renderer_id,
-                      AutofillUploadContents::Field::CREDENTIALS_REUSED}})),
-          _, _, _, _, _, _));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(saved_match_.form_data)),
+      FieldsContain(
+          AllOf(FieldSignatureIs(CalculateFieldSignatureForField(
+                    saved_match_.form_data.fields[kUsernameFieldIndex])),
+                FieldVoteTypeIs(Field::CREDENTIALS_REUSED)),
+          AllOf(FieldSignatureIs(CalculateFieldSignatureForField(
+                    saved_match_.form_data.fields[kPasswordFieldIndex])),
+                FieldVoteTypeIs(Field::CREDENTIALS_REUSED))));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
   // Saved credentials from the signup form were used for the first time on a
   // submitted form. The vote applies to the new form being submitted.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIs(CalculateFormSignature(submitted_form_)),
-                VoteTypesAre({{submitted_form_.fields[kPasswordFieldIndex]
-                                   .unique_renderer_id,
-                               AutofillUploadContents::Field::FIRST_USE},
-                              {submitted_form_.fields[kUsernameFieldIndex]
-                                   .unique_renderer_id,
-                               AutofillUploadContents::Field::FIRST_USE}})),
-          _, _, _, _, _, _));
+  upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_)),
+      FieldsContain(AllOf(FieldSignatureIs(CalculateFieldSignatureForField(
+                              submitted_form_.fields[kUsernameFieldIndex])),
+                          FieldVoteTypeIs(Field::FIRST_USE)),
+                    AllOf(FieldSignatureIs(CalculateFieldSignatureForField(
+                              submitted_form_.fields[kPasswordFieldIndex])),
+                          FieldVoteTypeIs(Field::FIRST_USE))));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
   form_manager_->Save();
 }
@@ -1422,26 +1458,21 @@
   submitted_form_.fields[0].value = user_chosen_username;
   submitted_form_.fields[1].value = automatically_chosen_username;
   form_manager_->ProvisionallySave(submitted_form_, &driver_, nullptr);
-
   EXPECT_EQ(automatically_chosen_username,
             form_manager_->GetPendingCredentials().username_value);
 
   form_manager_->OnUpdateUsernameFromPrompt(user_chosen_username);
-
   EXPECT_EQ(user_chosen_username,
             form_manager_->GetPendingCredentials().username_value);
 
-  std::map<std::u16string, ServerFieldType> expected_types = {
-      {u"firstname", autofill::USERNAME}, {u"password", autofill::PASSWORD}};
-  VoteTypeMap expected_vote_types = {
-      {submitted_form_.fields[0].unique_renderer_id,
-       AutofillUploadContents::Field::USERNAME_EDITED}};
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(AllOf(UploadedAutofillTypesAre(expected_types),
-                                       HasGenerationVote(false),
-                                       VoteTypesAre(expected_vote_types)),
-                                 _, Contains(autofill::USERNAME), _, _, nullptr,
-                                 /*observer=*/IsNull()));
+  auto upload_contents_matcher = IsPasswordUpload(FieldsContain(
+      UploadFieldIs(submitted_form_.fields[0], ServerFieldType::USERNAME,
+                    FieldVoteTypeIs(Field::USERNAME_EDITED)),
+      UploadFieldIs(submitted_form_.fields[kPasswordFieldIndex],
+                    ServerFieldType::PASSWORD,
+                    FieldGenerationTypeIs(Field::NO_GENERATION))));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
   form_manager_->Save();
 }
 
@@ -1479,9 +1510,7 @@
 
   // TODO(https://crbug.com/928690): implement not sending incorrect votes and
   // check that StartUploadRequest is not called.
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, /*observer=*/IsNull()))
-      .Times(1);
+  EXPECT_CALL(crowdsourcing_manager(), StartUploadRequest(_, _, _, _, _));
   form_manager_->Save();
 }
 
@@ -1521,10 +1550,14 @@
   // Since the user has modified the password value, the password field was
   // likely picked wrong. Make sure votes for password field and password
   // generation attributes are not uploaded.
-  ServerFieldTypeSet expected_types = {autofill::USERNAME};
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(HasPasswordAttributesVote(false), _,
-                                 expected_types, _, _, _, _));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FieldsContain(UploadFieldIs(submitted_form_.fields[kUsernameFieldIndex],
+                                  ServerFieldType::USERNAME),
+                    AllOf(FieldSignatureIs(CalculateFieldSignatureForField(
+                              submitted_form_.fields[kPasswordFieldIndex])),
+                          FieldGenerationTypeIs(Field::NO_GENERATION))));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
   form_manager_->Save();
 }
 
@@ -1555,18 +1588,15 @@
 
   // Check that a vote is sent for the field with the value which is chosen by
   // the user.
-  std::map<std::u16string, ServerFieldType> expected_types;
-  expected_types[expected.password_element] = autofill::PASSWORD;
-
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(UploadedAutofillTypesAre(expected_types), false, _, _,
-                         true, nullptr, /*observer=*/IsNull()));
+  auto upload_contents_matcher = IsPasswordUpload(FieldsContain(UploadFieldIs(
+      submitted_form_.fields[kPasswordFieldIndex], ServerFieldType::PASSWORD)));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
   // Check that the password which was chosen by the user is saved.
   MockFormSaver& form_saver = MockFormSaver::Get(form_manager_.get());
   PasswordForm saved_form;
-  EXPECT_CALL(form_saver, Save(_, _, _)).WillOnce(SaveArg<0>(&saved_form));
+  EXPECT_CALL(form_saver, Save).WillOnce(SaveArg<0>(&saved_form));
 
   form_manager_->Save();
   CheckPendingCredentials(expected, saved_form);
@@ -2266,12 +2296,12 @@
     if (password_revealed)
       form_manager_->OnPasswordsRevealed();
 
-    EXPECT_CALL(
-        mock_autofill_crowdsourcing_manager_,
-        StartUploadRequest(PasswordsWereRevealed(password_revealed), false, _,
-                           _, true, nullptr, /*observer=*/IsNull()));
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(
+                    IsPasswordUpload(PasswordsRevealedIs(password_revealed)), _,
+                    _, _, _));
     form_manager_->Save();
-    Mock::VerifyAndClearExpectations(&mock_autofill_crowdsourcing_manager_);
+    Mock::VerifyAndClearExpectations(&crowdsourcing_manager());
   }
 }
 
@@ -2290,12 +2320,15 @@
     EXPECT_TRUE(
         form_manager_->ProvisionallySave(submitted_form_, &driver_, nullptr));
 
-    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                StartUploadRequest(HasGenerationVote(true), false, _, _, true,
-                                   nullptr, /*observer=*/IsNull()))
+    auto upload_contents_matcher = IsPasswordUpload(FieldsContain(
+        AllOf(FieldSignatureIs(CalculateFieldSignatureForField(
+                  submitted_form_.fields[kPasswordFieldIndex])),
+              FieldGenerationTypeIs(Field::IGNORED_GENERATION_POPUP))));
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(upload_contents_matcher, _, _, _, _))
         .Times(generation_popup_shown ? 1 : 0);
     form_manager_->OnNoInteraction(false /*is_update */);
-    Mock::VerifyAndClearExpectations(&mock_autofill_crowdsourcing_manager_);
+    Mock::VerifyAndClearExpectations(&crowdsourcing_manager());
   }
 }
 
@@ -2314,12 +2347,16 @@
     EXPECT_TRUE(
         form_manager_->ProvisionallySave(submitted_form_, &driver_, nullptr));
 
-    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                StartUploadRequest(HasGenerationVote(true), false, _, _, true,
-                                   nullptr, /*observer=*/IsNull()))
+    auto upload_contents_matcher = IsPasswordUpload(FieldsContain(
+        AllOf(FieldSignatureIs(CalculateFieldSignatureForField(
+                  submitted_form_.fields[kPasswordFieldIndex])),
+              FieldGenerationTypeIs(Field::IGNORED_GENERATION_POPUP))));
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(upload_contents_matcher, _, _, _, _))
         .Times(generation_popup_shown ? 1 : 0);
+
     form_manager_->OnNeverClicked();
-    Mock::VerifyAndClearExpectations(&mock_autofill_crowdsourcing_manager_);
+    Mock::VerifyAndClearExpectations(&crowdsourcing_manager());
   }
 }
 
@@ -2680,8 +2717,8 @@
   PasswordFieldPrediction field_prediction;
   field_prediction.renderer_id = kUsernameFieldRendererId;
   field_prediction.signature =
-      CalculateFieldSignatureForField(observed_form_.fields[0]);
-  field_prediction.type = autofill::UNKNOWN_TYPE;
+      CalculateFieldSignatureForField(observed_form_.fields[1]);
+  field_prediction.type = ServerFieldType::UNKNOWN_TYPE;
   predictions.fields.push_back(field_prediction);
   possible_username_data.form_predictions = predictions;
   base::LRUCache<PossibleUsernameFieldIdentifier, PossibleUsernameData>
@@ -2694,12 +2731,15 @@
   ASSERT_TRUE(form_manager_->ProvisionallySave(submitted_form, &driver_,
                                                &possible_usernames));
 
-  // Check that no SINGLE_USERNAME vote is sent (PASSWORD != SINGLE_USERNAME).
-  auto expected_votes = ServerFieldTypeSet{autofill::PASSWORD};
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form)), _,
-                         expected_votes, _, _, _, _));
+  // Check that no SINGLE_USERNAME vote is sent.
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form)),
+      FieldsContain(
+          UploadFieldIs(submitted_form.fields[1],
+                        ServerFieldType::UNKNOWN_TYPE),
+          UploadFieldIs(submitted_form.fields[2], ServerFieldType::PASSWORD)));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
   form_manager_->Save();
 }
 
@@ -2751,39 +2791,34 @@
     testing::InSequence in_sequence;
 
     // Upload username first flow votes on the username form.
-#if !BUILDFLAG(IS_ANDROID)
-    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                StartUploadRequest(SignatureIs(kSingleUsernameFormSignature),
-                                   false, ServerFieldTypeSet{SINGLE_USERNAME},
-                                   _, true, nullptr, /*observer=*/IsNull()));
-#endif  // !BUILDFLAG(IS_ANDROID)
+    if constexpr (!BUILDFLAG(IS_ANDROID)) {
+      EXPECT_CALL(crowdsourcing_manager(),
+                  StartUploadRequest(IsSingleUsernameUpload(), _, _, _, _));
+    }
 
     // Upload username first flow votes on the password form.
-    autofill::AutofillUploadContents::SingleUsernameData
-        expected_single_username_data;
+    AutofillUploadContents::SingleUsernameData expected_single_username_data;
     expected_single_username_data.set_username_form_signature(
         kSingleUsernameFormSignature.value());
     expected_single_username_data.set_username_field_signature(
         kSingleUsernameFieldSignature.value());
     expected_single_username_data.set_value_type(
-        is_password_update
-            ? autofill::AutofillUploadContents::STORED_FOR_CURRENT_DOMAIN
-            : autofill::AutofillUploadContents::USERNAME_LIKE);
+        is_password_update ? AutofillUploadContents::STORED_FOR_CURRENT_DOMAIN
+                           : AutofillUploadContents::USERNAME_LIKE);
     expected_single_username_data.set_prompt_edit(
-        autofill::AutofillUploadContents::EDITED_POSITIVE);
-    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                StartUploadRequest(
-                    AllOf(SignatureIs(CalculateFormSignature(submitted_form)),
-                          UploadedSingleUsernameDataIs(
-                              {expected_single_username_data})),
-                    _, _, _, _, _, /*observer=*/IsNull()));
+        AutofillUploadContents::EDITED_POSITIVE);
+    auto upload_contents_matcher = IsPasswordUpload(
+        FormSignatureIs(CalculateFormSignature(submitted_form)),
+        SingleUsernameDataIs(
+            EqualsSingleUsernameDataVector({expected_single_username_data})));
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
     if (is_password_update) {
-      // Expect another upload for first login votes. This upload is not related
-      // to UFF, so it should not contain single username data.
-      EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                  StartUploadRequest(SingleUsernameDataNotUploaded(), _, _, _,
-                                     _, _, /*observer=*/IsNull()));
+      EXPECT_CALL(
+          crowdsourcing_manager(),
+          StartUploadRequest(IsPasswordUpload(SingleUsernameDataIs(IsEmpty())),
+                             _, _, _, _));
     }
 
     base::HistogramTester histogram_tester;
@@ -2800,12 +2835,12 @@
     histogram_tester.ExpectTotalCount(
         "PasswordManager.SingleUsername.PasswordFormHadUsernameField", 0);
 #endif
-    Mock::VerifyAndClearExpectations(&mock_autofill_crowdsourcing_manager_);
+    Mock::VerifyAndClearExpectations(&crowdsourcing_manager());
   }
 }
 
-// Tests that if username matches with single username from previous form, vote
-// is set.
+// Tests that if the username matches the single username from the previous
+// form, a vote is set.
 TEST_P(PasswordFormManagerTest, UsernameFirstFlowWithPrefilledUsername) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
@@ -2834,36 +2869,31 @@
   testing::InSequence in_sequence;
 
   // Upload username first flow vote on the single username form.
-#if !BUILDFLAG(IS_ANDROID)
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(SignatureIs(kSingleUsernameFormSignature),
-                                 false, ServerFieldTypeSet{SINGLE_USERNAME}, _,
-                                 true, nullptr, /*observer=*/IsNull()));
-#endif  // !BUILDFLAG(IS_ANDROID)
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(IsSingleUsernameUpload(), _, _, _, _));
+  }
 
   // Upload username first flow vote on the sign-up form.
-  autofill::AutofillUploadContents::SingleUsernameData
-      expected_single_username_data;
+  AutofillUploadContents::SingleUsernameData expected_single_username_data;
   expected_single_username_data.set_username_form_signature(
       kSingleUsernameFormSignature.value());
   expected_single_username_data.set_username_field_signature(
       kSingleUsernameFieldSignature.value());
   expected_single_username_data.set_value_type(
-      autofill::AutofillUploadContents::VALUE_WITH_NO_WHITESPACE);
+      AutofillUploadContents::VALUE_WITH_NO_WHITESPACE);
   expected_single_username_data.set_prompt_edit(
-      autofill::AutofillUploadContents::NOT_EDITED_POSITIVE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIs(CalculateFormSignature(submitted_form_)),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
+      AutofillUploadContents::NOT_EDITED_POSITIVE);
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
   // Simulate showing the prompt and saving the suggested value.
   form_manager_->SaveSuggestedUsernameValueToVotesUploader();
-
   base::HistogramTester histogram_tester;
-
   form_manager_->Save();
 
 #if !BUILDFLAG(IS_ANDROID)
@@ -2873,7 +2903,7 @@
   histogram_tester.ExpectTotalCount(
       "PasswordManager.SingleUsername.PasswordFormHadUsernameField", 0);
 #endif
-  Mock::VerifyAndClearExpectations(&mock_autofill_crowdsourcing_manager_);
+  Mock::VerifyAndClearExpectations(&crowdsourcing_manager());
 }
 
 // Tests that when the save/update prompt suggests single username value and the
@@ -2917,18 +2947,18 @@
 
 #if !BUILDFLAG(IS_ANDROID)
   // Expect a negative `IN_FORM_OVERRULE` vote on the username form.
-  ExpectSingleUsernameUpload(kSingleUsernameFormSignature,
-                             AutofillUploadContents::Field::IN_FORM_OVERRULE,
-                             autofill::NOT_USERNAME);
+  ExpectIsSingleUsernameUpload(
+      kSingleUsernameFormSignature, Field::IN_FORM_OVERRULE,
+      ServerFieldType::NOT_USERNAME,
+      IsMostRecentSingleUsernameCandidate::kMostRecentCandidate);
 #endif
 
   // Expect upload for the password form. This upload is unrelated to UFF: it
   // is a result of saving a new password on the password form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form_)),
-                         _, _, _, _, _, _));
-
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(IsPasswordUpload(FormSignatureIs(
+                                     CalculateFormSignature(submitted_form_))),
+                                 _, _, _, _));
   form_manager_->Save();
 }
 
@@ -2977,18 +3007,18 @@
 
 #if !BUILDFLAG(IS_ANDROID)
   // Expect a positive `IN_FORM_OVERRULE` vote on the username form.
-  ExpectSingleUsernameUpload(kSingleUsernameFormSignature,
-                             AutofillUploadContents::Field::IN_FORM_OVERRULE,
-                             autofill::SINGLE_USERNAME);
+  ExpectIsSingleUsernameUpload(
+      kSingleUsernameFormSignature, Field::IN_FORM_OVERRULE,
+      ServerFieldType::SINGLE_USERNAME,
+      IsMostRecentSingleUsernameCandidate::kMostRecentCandidate);
 #endif
 
   // Expect upload for the password form. This upload is unrelated to UFF: it
   // is a result of saving a new password on the password form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form_)),
-                         _, _, _, _, _, _));
-
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(IsPasswordUpload(FormSignatureIs(
+                                     CalculateFormSignature(submitted_form_))),
+                                 _, _, _, _));
   form_manager_->Save();
 }
 
@@ -3031,18 +3061,19 @@
   form_manager_->SaveSuggestedUsernameValueToVotesUploader();
 
   // Expect no upload on single text field.
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(SignatureIs(kSingleUsernameFormSignature), _,
-                                 _, _, _, _, _))
+  EXPECT_CALL(
+      crowdsourcing_manager(),
+      StartUploadRequest(
+          IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature)), _, _,
+          _, _))
       .Times(0);
 
   // Expect upload for the password form. This upload is unrelated to UFF: it
   // is a result of saving a new password on the password form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form_)),
-                         _, _, _, _, _, _));
-
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(IsPasswordUpload(FormSignatureIs(
+                                     CalculateFormSignature(submitted_form_))),
+                                 _, _, _, _));
   form_manager_->Save();
 }
 
@@ -3096,30 +3127,27 @@
   testing::InSequence in_sequence;
 
   // Upload username first flow vote on the single username form.
-#if !BUILDFLAG(IS_ANDROID)
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(SignatureIs(kSingleUsernameFormSignature),
-                                 false, ServerFieldTypeSet{SINGLE_USERNAME}, _,
-                                 true, nullptr, /*observer=*/IsNull()));
-#endif  // !BUILDFLAG(IS_ANDROID)
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(IsSingleUsernameUpload(), _, _, _, _));
+  }
 
   // Upload username first flow vote on the sign-up form.
-  autofill::AutofillUploadContents::SingleUsernameData
-      expected_single_username_data;
+  AutofillUploadContents::SingleUsernameData expected_single_username_data;
   expected_single_username_data.set_username_form_signature(
       kSingleUsernameFormSignature.value());
   expected_single_username_data.set_username_field_signature(
       kSingleUsernameFieldSignature.value());
   expected_single_username_data.set_value_type(
-      autofill::AutofillUploadContents::VALUE_WITH_NO_WHITESPACE);
+      AutofillUploadContents::VALUE_WITH_NO_WHITESPACE);
   expected_single_username_data.set_prompt_edit(
-      autofill::AutofillUploadContents::NOT_EDITED_POSITIVE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIs(CalculateFormSignature(submitted_form_)),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
+      AutofillUploadContents::NOT_EDITED_POSITIVE);
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
   // Simulate showing the prompt and saving the suggested value.
   form_manager_->SaveSuggestedUsernameValueToVotesUploader();
@@ -3135,7 +3163,7 @@
   histogram_tester.ExpectTotalCount(
       "PasswordManager.SingleUsername.PasswordFormHadUsernameField", 0);
 #endif
-  Mock::VerifyAndClearExpectations(&mock_autofill_crowdsourcing_manager_);
+  Mock::VerifyAndClearExpectations(&crowdsourcing_manager());
 }
 
 // Tests that when the user edits the username value in the save prompt
@@ -3206,24 +3234,23 @@
 
 #if !BUILDFLAG(IS_ANDROID)
   // Expect a strong positive vote on the single username form.
-  ExpectSingleUsernameUpload(
-      kSingleUsernameFormSignature, AutofillUploadContents::Field::STRONG,
-      autofill::SINGLE_USERNAME,
+  ExpectIsSingleUsernameUpload(
+      kSingleUsernameFormSignature, Field::STRONG,
+      ServerFieldType::SINGLE_USERNAME,
       IsMostRecentSingleUsernameCandidate::kMostRecentCandidate);
 
   // Expect a strong negative vote on another single text field form.
-  ExpectSingleUsernameUpload(
-      kOtherFormSignature, autofill::AutofillUploadContents::Field::STRONG,
-      autofill::NOT_USERNAME,
+  ExpectIsSingleUsernameUpload(
+      kOtherFormSignature, Field::STRONG, ServerFieldType::NOT_USERNAME,
       IsMostRecentSingleUsernameCandidate::kHasIntermediateValuesInBetween);
 #endif
 
   // Expect upload for the password form. This upload is unrelated to UFF: it
   // is a result of saving a new password on the password form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form)), _,
-                         _, _, _, _, _));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(IsPasswordUpload(FormSignatureIs(
+                                     CalculateFormSignature(submitted_form))),
+                                 _, _, _, _));
 
   form_manager_->Save();
 }
@@ -3340,37 +3367,36 @@
 
   // Upload for the username form. Ensure that we send `NOT_USERNAME` for the
   // username field.
-#if !BUILDFLAG(IS_ANDROID)
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(SignatureIs(kUsernameFormSignature), false,
-                                 ServerFieldTypeSet{NOT_USERNAME}, _, true,
-                                 nullptr, /*observer=*/IsNull()));
-#else
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, _))
-      .Times(0);
-#endif  // !BUILDFLAG(IS_ANDROID)
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    auto upload_contents_matcher = IsPasswordUpload(
+        FormSignatureIs(kUsernameFormSignature),
+        FieldsContain(
+            AllOf(FieldSignatureIs(kUsernameFieldSignature),
+                  FieldAutofillTypeIs({ServerFieldType::NOT_USERNAME}))));
+    EXPECT_CALL(crowdsourcing_manager(),
+                StartUploadRequest(upload_contents_matcher, _, _, _, _));
+  } else {
+    EXPECT_CALL(crowdsourcing_manager(), StartUploadRequest(_, _, _, _, _))
+        .Times(0);
+  }
 
   // Upload for the password form.
-  autofill::AutofillUploadContents::SingleUsernameData
-      expected_single_username_data;
+  AutofillUploadContents::SingleUsernameData expected_single_username_data;
   expected_single_username_data.set_username_form_signature(
       kUsernameFormSignature.value());
   expected_single_username_data.set_username_field_signature(
       kUsernameFieldSignature.value());
   expected_single_username_data.set_value_type(
-      autofill::AutofillUploadContents::USERNAME_LIKE);
+      AutofillUploadContents::USERNAME_LIKE);
   expected_single_username_data.set_prompt_edit(
-      autofill::AutofillUploadContents::EDITED_NEGATIVE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIs(CalculateFormSignature(submitted_form)),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
-
+      AutofillUploadContents::EDITED_NEGATIVE);
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
   base::HistogramTester histogram_tester;
-
   form_manager_->Save();
 
 #if !BUILDFLAG(IS_ANDROID)
@@ -3414,23 +3440,23 @@
   // Check vote uploads.
   testing::InSequence in_sequence;
   // No single username upload for the OTP field.
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(SignatureIs(kSingleUsernameFormSignature), _,
-                                 _, _, _, _, /*observer=*/IsNull()))
+  EXPECT_CALL(
+      crowdsourcing_manager(),
+      StartUploadRequest(
+          IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature)), _, _,
+          _, _))
       .Times(0);
 
   // Upload single username data for the password form.
-  autofill::AutofillUploadContents::SingleUsernameData
-      expected_single_username_data;
+  AutofillUploadContents::SingleUsernameData expected_single_username_data;
   expected_single_username_data.set_value_type(
-      autofill::AutofillUploadContents::NO_VALUE_TYPE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIs(CalculateFormSignature(submitted_form)),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
-
+      AutofillUploadContents::NO_VALUE_TYPE);
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
   form_manager_->Save();
 }
 
@@ -3834,24 +3860,22 @@
   form_manager_->OnUpdateUsernameFromPrompt(kPossibleUsername);
 
   // Expect a strong positive vote on the username form.
-  ExpectSingleUsernameUpload(
-      kSingleUsernameFormSignature,
-      AutofillUploadContents::Field::STRONG_FORGOT_PASSWORD,
-      autofill::SINGLE_USERNAME_FORGOT_PASSWORD);
+  ExpectIsSingleUsernameUpload(
+      kSingleUsernameFormSignature, Field::STRONG_FORGOT_PASSWORD,
+      ServerFieldType::SINGLE_USERNAME_FORGOT_PASSWORD);
 
   // Expect a strong negative vote on another single text field form, unrelated
   // to FPF.
-  ExpectSingleUsernameUpload(
-      kOtherFormSignature,
-      autofill::AutofillUploadContents::Field::STRONG_FORGOT_PASSWORD,
-      autofill::NOT_USERNAME);
+  ExpectIsSingleUsernameUpload(kOtherFormSignature,
+                               Field::STRONG_FORGOT_PASSWORD,
+                               ServerFieldType::NOT_USERNAME);
 
   // Expect upload for the password form. This upload is unrelated to FPF: it
   // is a result of saving a new password on the password form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form)), _,
-                         _, _, _, _, _));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(IsPasswordUpload(FormSignatureIs(
+                                     CalculateFormSignature(submitted_form))),
+                                 _, _, _, _));
 
   form_manager_->Save();
 }
@@ -3889,24 +3913,21 @@
   form_manager_->SaveSuggestedUsernameValueToVotesUploader();
 
   // Expect a weak positive vote on the username form.
-  ExpectSingleUsernameUpload(
-      kSingleUsernameFormSignature,
-      AutofillUploadContents::Field::WEAK_FORGOT_PASSWORD,
-      autofill::SINGLE_USERNAME_FORGOT_PASSWORD);
+  ExpectIsSingleUsernameUpload(
+      kSingleUsernameFormSignature, Field::WEAK_FORGOT_PASSWORD,
+      ServerFieldType::SINGLE_USERNAME_FORGOT_PASSWORD);
 
   // Expect a weak negative vote on another single text field form, unrelated to
   // FPF.
-  ExpectSingleUsernameUpload(
-      kOtherFormSignature,
-      autofill::AutofillUploadContents::Field::WEAK_FORGOT_PASSWORD,
-      autofill::NOT_USERNAME);
+  ExpectIsSingleUsernameUpload(kOtherFormSignature, Field::WEAK_FORGOT_PASSWORD,
+                               ServerFieldType::NOT_USERNAME);
 
   // Expect upload for the password form. This upload is unrelated to FPF: it
   // is a result of saving a new password on the password form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form)), _,
-                         _, _, _, _, _));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(IsPasswordUpload(FormSignatureIs(
+                                     CalculateFormSignature(submitted_form))),
+                                 _, _, _, _));
 
   form_manager_->Save();
 }
@@ -3944,30 +3965,30 @@
   form_manager_->SaveSuggestedUsernameValueToVotesUploader();
 
   // Expect a weak positive vote on the username form.
-  ExpectSingleUsernameUpload(
-      kSingleUsernameFormSignature,
-      AutofillUploadContents::Field::WEAK_FORGOT_PASSWORD,
-      autofill::SINGLE_USERNAME_FORGOT_PASSWORD);
+  ExpectIsSingleUsernameUpload(kSingleUsernameFormSignature,
+                               Field::WEAK_FORGOT_PASSWORD,
+                               autofill::SINGLE_USERNAME_FORGOT_PASSWORD);
 
   // Expect no vote on another single text field form, unrelated to FPF.
   EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(kOtherFormSignature), _, _, _, _, _, _))
+      crowdsourcing_manager(),
+      StartUploadRequest(IsPasswordUpload(FormSignatureIs(kOtherFormSignature)),
+                         _, _, _, _))
       .Times(0);
 
   // Expect upload for the password form. This upload is unrelated to FPF: it
   // is a result of saving a new password on the password form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form)), _,
-                         _, _, _, _, _));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(IsPasswordUpload(FormSignatureIs(
+                                     CalculateFormSignature(submitted_form))),
+                                 _, _, _, _));
 
   form_manager_->Save();
 }
 
 // Tests that no vote is sent for the OTP field, unless there is a server
 // prediction confirming it's a single username field.
-TEST_P(PasswordFormManagerTest, ForgotPasswordFormVotesOnLiklelyOTPField) {
+TEST_P(PasswordFormManagerTest, ForgotPasswordFormVotesOnLikelyOTPField) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       /*enabled_features=*/{features::kForgotPasswordFormSupport},
@@ -4001,30 +4022,27 @@
   submitted_form.fields[0].value = u"strongpassword";
   ASSERT_TRUE(form_manager_->ProvisionallySave(submitted_form, &driver_,
                                                /*possible_username=*/nullptr));
+  // kPossibleUsername is suggested in the prompt, because the field has a
+  // single username prediction.
   form_manager_->SaveSuggestedUsernameValueToVotesUploader();
 
-  // Simulate the user modifying the username in the prompt.
-  form_manager_->OnUpdateUsernameFromPrompt(kPossibleUsername);
-
-  // Expect a strong positive vote on the single text field in a forgot password
-  // form.
-  ExpectSingleUsernameUpload(
-      kSingleUsernameFormSignature,
-      AutofillUploadContents::Field::STRONG_FORGOT_PASSWORD,
-      autofill::SINGLE_USERNAME_FORGOT_PASSWORD);
+  ExpectIsSingleUsernameUpload(
+      kSingleUsernameFormSignature, Field::WEAK_FORGOT_PASSWORD,
+      ServerFieldType::SINGLE_USERNAME_FORGOT_PASSWORD);
 
   // Expect no vote on another single text field form, unrelated to FPF.
   EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(kOtherFormSignature), _, _, _, _, _, _))
+      crowdsourcing_manager(),
+      StartUploadRequest(IsPasswordUpload(FormSignatureIs(kOtherFormSignature)),
+                         _, _, _, _))
       .Times(0);
 
   // Expect upload for the password form. This upload is unrelated to FPF: it
   // is a result of saving a new password on the password form.
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(SignatureIs(CalculateFormSignature(submitted_form)), _,
-                         _, _, _, _, _));
+  EXPECT_CALL(crowdsourcing_manager(),
+              StartUploadRequest(IsPasswordUpload(FormSignatureIs(
+                                     CalculateFormSignature(submitted_form))),
+                                 _, _, _, _));
 
   form_manager_->Save();
 }
diff --git a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
index 7e6de17..32a41d8 100644
--- a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
@@ -34,20 +34,27 @@
 using ::autofill::FormFieldData;
 using ::autofill::FormStructure;
 using ::autofill::PasswordFormFillData;
+using ::autofill::ServerFieldType;
 using ::autofill::mojom::SubmissionIndicatorEvent;
+using ::autofill::upload_contents_matchers::FieldAutofillTypeIs;
+using ::autofill::upload_contents_matchers::FieldsContain;
+using ::autofill::upload_contents_matchers::FieldSignatureIs;
 using ::base::TestMockTimeTaskRunner;
 using ::testing::_;
 using ::testing::AllOf;
 using ::testing::Contains;
 using ::testing::DoAll;
 using ::testing::ElementsAre;
+using ::testing::Field;
 using ::testing::IsEmpty;
+using ::testing::IsNull;
 using ::testing::Mock;
 using ::testing::NiceMock;
 using ::testing::Pointee;
 using ::testing::Return;
 using ::testing::SaveArg;
 using ::testing::UnorderedElementsAre;
+using upload_contents_matchers::IsPasswordUpload;
 
 // Indices of username and password fields in the observed form.
 constexpr int kUsernameFieldIndex = 1;
@@ -61,6 +68,15 @@
   return arg.username_value == username && arg.password_value == password;
 }
 
+// Creates a matcher for an `autofill::AutofillUploadContents::Field` that
+// checks that the field's signature matches that of `field` and its predicted
+// type is `type`.
+auto UploadFieldIs(const FormFieldData& field, ServerFieldType type) {
+  return AllOf(
+      FieldSignatureIs(autofill::CalculateFieldSignatureForField(field)),
+      FieldAutofillTypeIs({type}));
+}
+
 const auto kTrigger = metrics_util::MoveToAccountStoreTrigger::
     kSuccessfulLoginWithProfileStorePassword;
 
@@ -282,7 +298,7 @@
     ON_CALL(client_, GetAutofillCrowdsourcingManager())
         .WillByDefault(Return(&mock_autofill_crowdsourcing_manager_));
     ON_CALL(mock_autofill_crowdsourcing_manager_,
-            StartUploadRequest(_, _, _, _, _, _, _))
+            StartUploadRequest(_, _, _, _, _))
         .WillByDefault(Return(true));
     ON_CALL(*client_.GetPasswordFeatureManager(), GetDefaultPasswordStore)
         .WillByDefault(Return(PasswordForm::Store::kProfileStore));
@@ -893,7 +909,7 @@
   // TODO(https://crbug.com/928690): implement not sending incorrect votes and
   // check that StartUploadRequest is not called.
   EXPECT_CALL(*mock_autofill_crowdsourcing_manager(),
-              StartUploadRequest(_, _, _, _, _, _, _))
+              StartUploadRequest(_, _, _, _, _))
       .Times(1);
   password_save_manager_impl()->Save(&observed_form_, parsed_submitted_form);
 }
@@ -974,12 +990,10 @@
 
   // Check that a vote is sent for the field with the value which is chosen by
   // the user.
-  std::map<std::u16string, autofill::ServerFieldType> expected_types;
-  expected_types[expected.password_element] = autofill::PASSWORD;
-
+  auto upload_contents_matcher = IsPasswordUpload(FieldsContain(
+      UploadFieldIs(submitted_form.fields[0], ServerFieldType::PASSWORD)));
   EXPECT_CALL(*mock_autofill_crowdsourcing_manager(),
-              StartUploadRequest(UploadedAutofillTypesAre(expected_types),
-                                 false, _, _, true, nullptr, _));
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
   // Check that the password which was chosen by the user is saved.
   PasswordForm saved_form;
@@ -1279,26 +1293,28 @@
 TEST_P(PasswordSaveManagerImplTest, UsernameCorrectionVote) {
   // Setup a matched form in the storage for the currently submitted form.
   const std::u16string matched_form_username_field_name = u"new_username_id";
-  FormFieldData field;
-  field.name = matched_form_username_field_name;
-  field.id_attribute = field.name;
-  field.name_attribute = field.name;
-  field.form_control_type = autofill::FormControlType::kInputText;
-  saved_match_.form_data.fields.push_back(field);
+  FormFieldData field1;
+  field1.name = matched_form_username_field_name;
+  field1.id_attribute = field1.name;
+  field1.name_attribute = field1.name;
+  field1.form_control_type = autofill::FormControlType::kInputText;
+  saved_match_.form_data.fields.push_back(field1);
 
-  field.name = u"firstname";
-  field.id_attribute = field.name;
-  field.name_attribute = field.name;
-  field.form_control_type = autofill::FormControlType::kInputText;
-  saved_match_.form_data.fields.push_back(field);
-  saved_match_.username_element = field.name;
+  FormFieldData field2;
+  field2.name = u"firstname";
+  field2.id_attribute = field2.name;
+  field2.name_attribute = field2.name;
+  field2.form_control_type = autofill::FormControlType::kInputText;
+  saved_match_.form_data.fields.push_back(field2);
+  saved_match_.username_element = field2.name;
 
-  field.name = u"password";
-  field.id_attribute = field.name;
-  field.name_attribute = field.name;
-  field.form_control_type = autofill::FormControlType::kInputPassword;
-  saved_match_.form_data.fields.push_back(field);
-  saved_match_.password_element = field.name;
+  FormFieldData field3;
+  field3.name = u"password";
+  field3.id_attribute = field3.name;
+  field3.name_attribute = field3.name;
+  field3.form_control_type = autofill::FormControlType::kInputPassword;
+  saved_match_.form_data.fields.push_back(field3);
+  saved_match_.password_element = field3.name;
 
   const std::u16string username = u"user1";
   saved_match_.all_alternative_usernames.emplace_back(
@@ -1320,25 +1336,17 @@
       /*is_credential_api_save=*/false);
 
   // Check that a vote is sent for the password field.
-  std::map<std::u16string, autofill::ServerFieldType> expected_types;
-  expected_types[submitted_form_.fields[kPasswordFieldIndex].name] =
-      autofill::PASSWORD;
-
+  auto upload_contents_matcher = IsPasswordUpload(FieldsContain(UploadFieldIs(
+      submitted_form_.fields[kPasswordFieldIndex], ServerFieldType::PASSWORD)));
   EXPECT_CALL(*mock_autofill_crowdsourcing_manager(),
-              StartUploadRequest(UploadedAutofillTypesAre(expected_types),
-                                 false, _, _, true, nullptr, _));
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
-  // Check that correction vote is sent for the earlier saved form.
-  std::map<std::u16string, autofill::ServerFieldType>
-      correction_upload_expected_types;
-  correction_upload_expected_types[matched_form_username_field_name] =
-      autofill::USERNAME;
-  correction_upload_expected_types[u"password"] =
-      autofill::ACCOUNT_CREATION_PASSWORD;
+  // Check that a correction vote is sent for the earlier saved form.
+  upload_contents_matcher = IsPasswordUpload(FieldsContain(
+      UploadFieldIs(field1, ServerFieldType::USERNAME),
+      UploadFieldIs(field3, ServerFieldType::ACCOUNT_CREATION_PASSWORD)));
   EXPECT_CALL(*mock_autofill_crowdsourcing_manager(),
-              StartUploadRequest(
-                  UploadedAutofillTypesAre(correction_upload_expected_types),
-                  false, _, _, true, nullptr, _));
+              StartUploadRequest(upload_contents_matcher, _, _, _, _));
 
   password_save_manager_impl()->Save(&observed_form_, parsed_submitted_form);
 }
diff --git a/components/password_manager/core/browser/vote_uploads_test_matchers.h b/components/password_manager/core/browser/vote_uploads_test_matchers.h
index babd876..a2a34d8a 100644
--- a/components/password_manager/core/browser/vote_uploads_test_matchers.h
+++ b/components/password_manager/core/browser/vote_uploads_test_matchers.h
@@ -5,166 +5,126 @@
 #ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_VOTE_UPLOADS_TEST_MATCHERS_H_
 #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_VOTE_UPLOADS_TEST_MATCHERS_H_
 
-#include "components/autofill/core/browser/autofill_field.h"
-#include "components/autofill/core/browser/form_structure.h"
+#include <optional>
+#include <string>
+#include <vector>
+
+#include "components/autofill/core/browser/proto/server.pb.h"
 #include "components/autofill/core/browser/test_utils/vote_uploads_test_matchers.h"
 #include "components/autofill/core/common/signatures.h"
-#include "components/password_manager/core/browser/password_form.h"
-#include "components/password_manager/core/browser/votes_uploader.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace password_manager {
 
-using ::testing::AllOf;
-using ::testing::ContainerEq;
-using ::testing::Field;
-using ::testing::IsFalse;
-using ::testing::Optional;
-using ::testing::Property;
-using ::testing::ResultOf;
+namespace upload_contents_matchers {
 
-inline auto SignatureIsSameAs(const PasswordForm& form) {
-  return autofill::SignatureIsSameAs(form.form_data);
+// Returns a matcher that checks whether the `AutofillUploadContents` has a
+// `password_length` field that was set.
+inline ::testing::Matcher<autofill::AutofillUploadContents>
+HasPasswordLength() {
+  return ::testing::Property(
+      "has_password_length",
+      &autofill::AutofillUploadContents::has_password_length, true);
 }
 
-MATCHER_P(HasGenerationVote, expect_generation_vote, "") {
-  bool found_generation_vote = false;
-  for (const auto& field : arg) {
-    if (field->generation_type() !=
-        autofill::AutofillUploadContents::Field::NO_GENERATION) {
-      found_generation_vote = true;
-      break;
-    }
+inline ::testing::Matcher<autofill::AutofillUploadContents>
+LoginFormSignatureIs(const std::string& signature) {
+  uint64_t signature_int;
+  if (!base::StringToUint64(signature, &signature_int)) {
+    signature_int = 0;
   }
-  return found_generation_vote == expect_generation_vote;
+  return ::testing::Property(
+      "login_form_signature",
+      &autofill::AutofillUploadContents::login_form_signature, signature_int);
 }
 
-inline auto VoteTypesAre(VoteTypeMap expected) {
-  static constexpr auto kNoInformation =
-      autofill::AutofillUploadContents::Field::NO_INFORMATION;
-  auto get_vote_types = [](const autofill::FormStructure& actual) {
-    VoteTypeMap vote_types;
-    for (const auto& field : actual) {
-      if (field->vote_type() != kNoInformation) {
-        vote_types[field->unique_renderer_id] = field->vote_type();
-      }
-    }
-    return vote_types;
-  };
-  base::EraseIf(expected,
-                [](const auto& p) { return p.second == kNoInformation; });
-  return ResultOf("get_vote_types", get_vote_types, ContainerEq(expected));
+inline ::testing::Matcher<autofill::AutofillUploadContents> PasswordsRevealedIs(
+    bool revealed) {
+  return ::testing::Property(
+      "passwords_revealed",
+      &autofill::AutofillUploadContents::passwords_revealed, revealed);
 }
 
-MATCHER_P(UploadedSingleUsernameVoteTypeIs, expected_type, "") {
-  for (const auto& field : arg) {
-    autofill::ServerFieldType vote = field->possible_types().empty()
-                                         ? autofill::UNKNOWN_TYPE
-                                         : *field->possible_types().begin();
-    if ((vote == autofill::SINGLE_USERNAME || vote == autofill::NOT_USERNAME) &&
-        expected_type != field->single_username_vote_type()) {
-      // Wrong vote type.
-      *result_listener << "Expected vote type for the field " << field->name
-                       << " is " << expected_type << ", but found "
-                       << field->single_username_vote_type().value();
-      return false;
-    }
-  }
-  return true;
+inline ::testing::Matcher<autofill::AutofillUploadContents>
+SingleUsernameDataIs(auto matcher) {
+  return ::testing::Property(
+      "single_username_data",
+      &autofill::AutofillUploadContents::single_username_data, matcher);
 }
 
-MATCHER_P(UploadedSingleUsernameVoteIsMostRecentCandidate,
-          is_most_recent_single_username_candidate,
-          "") {
-  if (is_most_recent_single_username_candidate ==
-      autofill::IsMostRecentSingleUsernameCandidate::
-          kNotPartOfUsernameFirstFlow) {
-    // Variable not set - don't check if the flag is set.
-    return true;
-  }
-  for (const auto& field : arg) {
-    autofill::ServerFieldType vote = field->possible_types().empty()
-                                         ? autofill::UNKNOWN_TYPE
-                                         : *field->possible_types().begin();
-    if (vote == autofill::SINGLE_USERNAME || vote == autofill::NOT_USERNAME) {
-      // `is_most_recent_single_username_candidate` is not set.
-      if (field->is_most_recent_single_username_candidate() ==
-          autofill::IsMostRecentSingleUsernameCandidate::
-              kNotPartOfUsernameFirstFlow) {
-        *result_listener
-            << "Expected vote is_most_recent_single_username_candidate for the "
-               "field "
-            << field->name << " is "
-            << static_cast<int>(is_most_recent_single_username_candidate)
-            << ", but it was not set.";
-        return false;
-      }
-      // `is_most_recent_single_username_candidate` is incorrect.
-      if (field->is_most_recent_single_username_candidate() !=
-          is_most_recent_single_username_candidate) {
-        *result_listener
-            << "Expected vote is_most_recent_single_username_candidate for the "
-               "field "
-            << field->name << " is "
-            << static_cast<int>(is_most_recent_single_username_candidate)
-            << ", but found "
-            << static_cast<int>(
-                   field->is_most_recent_single_username_candidate());
-        return false;
-      }
-    }
-  }
-  return true;
+// Matchers for `AutofillUploadContents::Field`.
+inline ::testing::Matcher<autofill::AutofillUploadContents::Field>
+FieldGenerationTypeIs(
+    autofill::AutofillUploadContents::Field::PasswordGenerationType type) {
+  return ::testing::Property(
+      "generation_type",
+      &autofill::AutofillUploadContents::Field::generation_type, type);
 }
 
+inline ::testing::Matcher<autofill::AutofillUploadContents::Field>
+FieldIsMostRecentSingleUsernameCandidateIs(std::optional<bool> value) {
+  return ::testing::AllOf(
+      ::testing::Property("has_is_most_recent_single_username_candidate",
+                          &autofill::AutofillUploadContents::Field::
+                              has_is_most_recent_single_username_candidate,
+                          value.has_value()),
+      ::testing::Property("is_most_recent_single_username_candidate",
+                          &autofill::AutofillUploadContents::Field::
+                              is_most_recent_single_username_candidate,
+                          value.value_or(false)));
+}
+
+inline ::testing::Matcher<autofill::AutofillUploadContents::Field>
+FieldSingleUsernameVoteTypeIs(
+    autofill::AutofillUploadContents::Field::SingleUsernameVoteType vote_type) {
+  return ::testing::Property(
+      "single_username_vote_type",
+      &autofill::AutofillUploadContents::Field::single_username_vote_type,
+      vote_type);
+}
+
+inline ::testing::Matcher<autofill::AutofillUploadContents::Field>
+FieldVoteTypeIs(autofill::AutofillUploadContents::Field::VoteType vote_type) {
+  return ::testing::Property(
+      "vote_type", &autofill::AutofillUploadContents::Field::vote_type,
+      vote_type);
+}
+
+// Creates a matcher for the type of
+// `std::vector<autofill::AutofillUploadContents>` that is expected from
+// password manager calls to `AutofillCrowdsourceManager::StartUploadRequest`.
+inline ::testing::Matcher<std::vector<autofill::AutofillUploadContents>>
+IsPasswordUpload(auto... matchers) {
+  return FirstElementIs(::testing::AllOf(
+      autofill::upload_contents_matchers::AutofillUsedIs(false),
+      autofill::upload_contents_matchers::ObservedSubmissionIs(true),
+      matchers...));
+}
+
+}  // namespace upload_contents_matchers
+
 inline auto EqualsSingleUsernameDataVector(
     std::vector<autofill::AutofillUploadContents::SingleUsernameData>
         expected_data) {
+  using ::testing::Property;
   using SingleUsernameData =
       autofill::AutofillUploadContents::SingleUsernameData;
   std::vector<testing::Matcher<SingleUsernameData>> matchers;
   for (auto& expected_form : expected_data) {
-    matchers.push_back(
-        AllOf(Property("username_form_signature",
-                       &SingleUsernameData::username_form_signature,
-                       expected_form.username_form_signature()),
-              Property("username_field_signature",
-                       &SingleUsernameData::username_field_signature,
-                       expected_form.username_field_signature()),
-              Property("value_type", &SingleUsernameData::value_type,
-                       expected_form.value_type()),
-              Property("prompt_edit", &SingleUsernameData::prompt_edit,
-                       expected_form.prompt_edit())));
+    matchers.push_back(::testing::AllOf(
+        Property("username_form_signature",
+                 &SingleUsernameData::username_form_signature,
+                 expected_form.username_form_signature()),
+        Property("username_field_signature",
+                 &SingleUsernameData::username_field_signature,
+                 expected_form.username_field_signature()),
+        Property("value_type", &SingleUsernameData::value_type,
+                 expected_form.value_type()),
+        Property("prompt_edit", &SingleUsernameData::prompt_edit,
+                 expected_form.prompt_edit())));
   }
-  return testing::ElementsAreArray(matchers);
-}
-
-inline auto UploadedSingleUsernameDataIs(
-    std::vector<autofill::AutofillUploadContents::SingleUsernameData>
-        expected_data) {
-  return Property("single_username_data",
-                  &autofill::FormStructure::single_username_data,
-                  EqualsSingleUsernameDataVector(expected_data));
-}
-
-inline auto SingleUsernameDataNotUploaded() {
-  return Property("single_username_data",
-                  &autofill::FormStructure::single_username_data,
-                  testing::IsEmpty());
-}
-
-inline auto PasswordsWereRevealed(bool passwords_were_revealed) {
-  return Property("passwords_were_revealed",
-                  &autofill::FormStructure::passwords_were_revealed,
-                  passwords_were_revealed);
-}
-
-MATCHER_P(HasPasswordAttributesVote, is_vote_expected, "") {
-  std::optional<std::pair<autofill::PasswordAttribute, bool>> vote =
-      arg.get_password_attributes_vote();
-  EXPECT_EQ(is_vote_expected, vote.has_value());
-  return true;
+  return ::testing::ElementsAreArray(matchers);
 }
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/votes_uploader.cc b/components/password_manager/core/browser/votes_uploader.cc
index 06face0..74ae27d69 100644
--- a/components/password_manager/core/browser/votes_uploader.cc
+++ b/components/password_manager/core/browser/votes_uploader.cc
@@ -38,6 +38,7 @@
 using autofill::AutofillUploadContents;
 using autofill::FieldRendererId;
 using autofill::FieldSignature;
+using autofill::FieldTypeSet;
 using autofill::FormData;
 using autofill::FormFieldData;
 using autofill::FormSignature;
@@ -45,7 +46,6 @@
 using autofill::IsMostRecentSingleUsernameCandidate;
 using autofill::RandomizedEncoder;
 using autofill::ServerFieldType;
-using autofill::ServerFieldTypeSet;
 using password_manager_util::FindFormByUsername;
 
 using Logger = autofill::SavePasswordProgressLogger;
@@ -132,7 +132,7 @@
                  const bool field_name_collision,
                  const VoteTypeMap& vote_types,
                  FormStructure* form_structure,
-                 ServerFieldTypeSet* available_field_types) {
+                 FieldTypeSet* available_field_types) {
   UMA_HISTOGRAM_BOOLEAN("PasswordManager.FieldNameCollisionInVotes",
                         field_name_collision);
   for (size_t i = 0; i < form_structure->field_count(); ++i) {
@@ -151,7 +151,7 @@
     }
     CHECK(type != autofill::USERNAME ||
           field->vote_type() != AutofillUploadContents::Field::NO_INFORMATION);
-    ServerFieldTypeSet types;
+    FieldTypeSet types;
     types.insert(type);
     field->set_possible_types(types);
   }
@@ -451,7 +451,7 @@
   FormStructure form_structure(form_to_upload.form_data);
   form_structure.set_submission_event(submitted_form.submission_event);
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   // A map from field names to field types.
   FieldTypeMap field_types;
   // Used to detect whether the vote is corrupted because of duplicate field
@@ -583,7 +583,7 @@
         AutofillUploadContents::Field::FIRST_USE;
   }
 
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   LabelFields(field_types, field_name_collision, vote_types, &form_structure,
               &available_field_types);
   SetKnownValueFlag(pending_credentials, best_matches, &form_structure);
@@ -889,7 +889,7 @@
 
 bool VotesUploader::StartUploadRequest(
     autofill::FormStructure& form_to_upload,
-    const ServerFieldTypeSet& available_field_types,
+    const FieldTypeSet& available_field_types,
     const std::string& login_form_signature) {
   AutofillCrowdsourcingManager* crowdsourcing_manager =
       client_->GetAutofillCrowdsourcingManager();
@@ -900,9 +900,10 @@
   form_to_upload.set_randomized_encoder(
       RandomizedEncoder::Create(client_->GetPrefs()));
   return crowdsourcing_manager->StartUploadRequest(
-      form_to_upload, /*form_was_autofilled=*/false, available_field_types,
-      /*login_form_signature=*/login_form_signature,
-      /*observed_submission=*/true,
+      form_to_upload.EncodeUploadRequest(
+          available_field_types, /*form_was_autofilled=*/false,
+          login_form_signature, /*observed_submission=*/true),
+      form_to_upload.submission_source(), form_to_upload.active_field_count(),
       /*pref_service=*/nullptr,
       /*observer=*/nullptr);
 }
@@ -910,7 +911,7 @@
 bool VotesUploader::SetSingleUsernameVoteOnUsernameForm(
     AutofillField* field,
     const SingleUsernameVoteData& single_username,
-    ServerFieldTypeSet* available_field_types,
+    FieldTypeSet* available_field_types,
     FormSignature form_signature,
     IsMostRecentSingleUsernameCandidate
         is_most_recent_single_username_candidate,
@@ -1056,7 +1057,7 @@
                                                     field_signatures);
 
   // Label the username field with a SINGLE_USERNAME or NOT_USERNAME vote.
-  ServerFieldTypeSet available_field_types;
+  FieldTypeSet available_field_types;
   for (size_t i = 0; i < form_to_upload->field_count(); ++i) {
     AutofillField* field = form_to_upload->field(i);
     FieldRendererId field_renderer_id = predictions.fields[i].renderer_id;
diff --git a/components/password_manager/core/browser/votes_uploader.h b/components/password_manager/core/browser/votes_uploader.h
index 71d3d00..1a589fb7 100644
--- a/components/password_manager/core/browser/votes_uploader.h
+++ b/components/password_manager/core/browser/votes_uploader.h
@@ -290,7 +290,7 @@
 
   bool StartUploadRequest(
       autofill::FormStructure& form_to_upload,
-      const autofill::ServerFieldTypeSet& available_field_types,
+      const autofill::FieldTypeSet& available_field_types,
       const std::string& login_form_signature = std::string());
 
   // On username first and forgot password flows votes are uploaded both for the
@@ -301,7 +301,7 @@
   bool SetSingleUsernameVoteOnUsernameForm(
       autofill::AutofillField* field,
       const SingleUsernameVoteData& single_username,
-      autofill::ServerFieldTypeSet* available_field_types,
+      autofill::FieldTypeSet* available_field_types,
       autofill::FormSignature form_signature,
       autofill::IsMostRecentSingleUsernameCandidate
           is_most_recent_single_username_candidate,
diff --git a/components/password_manager/core/browser/votes_uploader_unittest.cc b/components/password_manager/core/browser/votes_uploader_unittest.cc
index ccf94aa..fe91b0d7 100644
--- a/components/password_manager/core/browser/votes_uploader_unittest.cc
+++ b/components/password_manager/core/browser/votes_uploader_unittest.cc
@@ -36,32 +36,37 @@
 namespace {
 
 using ::autofill::AutofillCrowdsourcingManager;
-using ::autofill::CONFIRMATION_PASSWORD;
+using ::autofill::CalculateFormSignature;
 using ::autofill::FieldRendererId;
 using ::autofill::FieldSignature;
+using ::autofill::FieldTypeSet;
 using ::autofill::FormData;
 using ::autofill::FormFieldData;
 using ::autofill::FormSignature;
 using ::autofill::FormStructure;
-using ::autofill::NEW_PASSWORD;
-using ::autofill::NOT_USERNAME;
-using ::autofill::PASSWORD;
 using ::autofill::PasswordAttribute;
 using ::autofill::ServerFieldType;
-using ::autofill::ServerFieldTypeSet;
-using ::autofill::SignatureIsSameAs;
-using ::autofill::SINGLE_USERNAME;
-using ::autofill::SubmissionEventIsSameAs;
-using ::autofill::UNKNOWN_TYPE;
 using ::autofill::mojom::SubmissionIndicatorEvent;
-using ::base::ASCIIToUTF16;
+using ::autofill::upload_contents_matchers::AutofillUsedIs;
+using ::autofill::upload_contents_matchers::FieldAutofillTypeIs;
+using ::autofill::upload_contents_matchers::FieldsContain;
+using ::autofill::upload_contents_matchers::FieldSignatureIs;
+using ::autofill::upload_contents_matchers::FormSignatureIs;
+using ::autofill::upload_contents_matchers::ObservedSubmissionIs;
+using ::autofill::upload_contents_matchers::SubmissionIndicatorEventIs;
 using ::testing::_;
 using ::testing::AllOf;
-using ::testing::AnyNumber;
 using ::testing::IsNull;
 using ::testing::NiceMock;
+using ::testing::Not;
 using ::testing::Return;
-using ::testing::SaveArg;
+using upload_contents_matchers::FieldSingleUsernameVoteTypeIs;
+using upload_contents_matchers::FieldVoteTypeIs;
+using upload_contents_matchers::HasPasswordLength;
+using upload_contents_matchers::IsPasswordUpload;
+using upload_contents_matchers::LoginFormSignatureIs;
+using upload_contents_matchers::SingleUsernameDataIs;
+using Field = ::autofill::AutofillUploadContents::Field;
 
 constexpr int kNumberOfPasswordAttributes =
     static_cast<int>(PasswordAttribute::kPasswordAttributesCount);
@@ -91,10 +96,19 @@
   return single_username_data;
 }
 
+auto SingleUsernameUploadField(ServerFieldType type,
+                               Field::SingleUsernameVoteType vote_type) {
+  return AllOf(FieldSignatureIs(kSingleUsernameFieldSignature),
+               FieldAutofillTypeIs({type}),
+               FieldSingleUsernameVoteTypeIs(vote_type));
+}
+
 class MockPasswordManagerClient : public StubPasswordManagerClient {
  public:
-  MOCK_METHOD0(GetAutofillCrowdsourcingManager,
-               AutofillCrowdsourcingManager*());
+  MOCK_METHOD(AutofillCrowdsourcingManager*,
+              GetAutofillCrowdsourcingManager,
+              (),
+              (override));
 };
 
 }  // namespace
@@ -106,14 +120,14 @@
         .WillRepeatedly(Return(&mock_autofill_crowdsourcing_manager_));
 
     ON_CALL(mock_autofill_crowdsourcing_manager_,
-            StartUploadRequest(_, _, _, _, _, _, _))
+            StartUploadRequest(_, _, _, _, _))
         .WillByDefault(Return(true));
 
     // Create |fields| in |form_to_upload_| and |submitted_form_|. Only |name|
     // field in FormFieldData is important. Set them to the unique values based
     // on index.
-    const size_t kNumberOfFields = 20;
-    for (size_t i = 0; i < kNumberOfFields; ++i) {
+    const int kNumberOfFields = 20;
+    for (int i = 0; i < kNumberOfFields; ++i) {
       FormFieldData field;
       field.name = GetFieldNameByIndex(i);
       field.unique_renderer_id = FieldRendererId(i);
@@ -126,10 +140,24 @@
   }
 
  protected:
-  std::u16string GetFieldNameByIndex(size_t index) {
+  std::u16string GetFieldNameByIndex(int index) {
     return u"field" + base::NumberToString16(index);
   }
 
+  FieldSignature GetFieldSignatureByIndex(int index) {
+    return autofill::CalculateFieldSignatureForField(
+        form_to_upload_.form_data.fields[index]);
+  }
+
+  // Creates a matcher for an `autofill::AutofillUploadContents::Field` that
+  // compares that the field's signature has the same signature as the field
+  // with `index` and its predicted type is `type`. If additional `matchers` are
+  // specified, these are also checked.
+  auto UploadField(int index, ServerFieldType type, auto... matchers) {
+    return AllOf(FieldSignatureIs(GetFieldSignatureByIndex(index)),
+                 FieldAutofillTypeIs({type}), matchers...);
+  }
+
   base::test::TaskEnvironment task_environment_;
   NiceMock<autofill::MockAutofillCrowdsourcingManager>
       mock_autofill_crowdsourcing_manager_{/*client=*/nullptr};
@@ -143,8 +171,6 @@
 
 TEST_F(VotesUploaderTest, UploadPasswordVoteUpdate) {
   VotesUploader votes_uploader(&client_, true);
-  std::u16string new_password_element = GetFieldNameByIndex(3);
-  std::u16string confirmation_element = GetFieldNameByIndex(11);
   form_to_upload_.new_password_element_renderer_id = FieldRendererId(3);
   submitted_form_.new_password_element_renderer_id = FieldRendererId(3);
   form_to_upload_.confirmation_password_element_renderer_id =
@@ -155,24 +181,21 @@
   submitted_form_.new_password_value = u"new_password_value";
   submitted_form_.submission_event =
       SubmissionIndicatorEvent::HTML_FORM_SUBMISSION;
-  ServerFieldTypeSet expected_field_types = {NEW_PASSWORD,
-                                             CONFIRMATION_PASSWORD};
-  std::map<std::u16string, ServerFieldType> expected_types = {
-      {new_password_element, NEW_PASSWORD},
-      {confirmation_element, CONFIRMATION_PASSWORD}};
-  SubmissionIndicatorEvent expected_submission_event =
-      SubmissionIndicatorEvent::HTML_FORM_SUBMISSION;
 
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+      SubmissionIndicatorEventIs(
+          SubmissionIndicatorEvent::HTML_FORM_SUBMISSION),
+      LoginFormSignatureIs(login_form_signature_),
+      FieldsContain(UploadField(3, ServerFieldType::NEW_PASSWORD),
+                    UploadField(11, ServerFieldType::CONFIRMATION_PASSWORD)));
   EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  AllOf(SignatureIsSameAs(form_to_upload_),
-                        UploadedAutofillTypesAre(expected_types),
-                        SubmissionEventIsSameAs(expected_submission_event)),
-                  false, expected_field_types, login_form_signature_, true,
-                  nullptr, /*observer=*/IsNull()));
-
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   EXPECT_TRUE(votes_uploader.UploadPasswordVote(
-      form_to_upload_, submitted_form_, NEW_PASSWORD, login_form_signature_));
+      form_to_upload_, submitted_form_, ServerFieldType::NEW_PASSWORD,
+      login_form_signature_));
 }
 
 TEST_F(VotesUploaderTest, UploadPasswordVoteSave) {
@@ -185,18 +208,21 @@
       FieldRendererId(12);
   submitted_form_.submission_event =
       SubmissionIndicatorEvent::HTML_FORM_SUBMISSION;
-  ServerFieldTypeSet expected_field_types = {PASSWORD, CONFIRMATION_PASSWORD};
-  SubmissionIndicatorEvent expected_submission_event =
-      SubmissionIndicatorEvent::HTML_FORM_SUBMISSION;
 
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+      SubmissionIndicatorEventIs(
+          SubmissionIndicatorEvent::HTML_FORM_SUBMISSION),
+      LoginFormSignatureIs(login_form_signature_),
+      FieldsContain(UploadField(5, ServerFieldType::PASSWORD),
+                    UploadField(12, ServerFieldType::CONFIRMATION_PASSWORD)));
   EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  SubmissionEventIsSameAs(expected_submission_event), false,
-                  expected_field_types, login_form_signature_, true,
-                  /* pref_service= */ nullptr, /*observer=*/IsNull()));
-
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   EXPECT_TRUE(votes_uploader.UploadPasswordVote(
-      form_to_upload_, submitted_form_, PASSWORD, login_form_signature_));
+      form_to_upload_, submitted_form_, ServerFieldType::PASSWORD,
+      login_form_signature_));
 }
 
 // Checks votes uploading when
@@ -205,27 +231,22 @@
 // 2. The user modifies the username on login form before submission.
 TEST_F(VotesUploaderTest, UploadUsernameOverwrittenVote) {
   VotesUploader votes_uploader(&client_, false);
-
   form_to_upload_.username_element_renderer_id = FieldRendererId(6);
   form_to_upload_.password_element_renderer_id = FieldRendererId(5);
 
-  std::map<std::u16string, ServerFieldType> expected_types = {
-      {GetFieldNameByIndex(6), autofill::USERNAME},
-      {GetFieldNameByIndex(5), autofill::ACCOUNT_CREATION_PASSWORD}};
-  ServerFieldTypeSet expected_field_types = {
-      autofill::ACCOUNT_CREATION_PASSWORD, autofill::USERNAME};
-
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(UploadedAutofillTypesAre(expected_types),
-                UsernameVoteTypeIsSameAs(autofill::AutofillUploadContents::
-                                             Field::USERNAME_OVERWRITTEN)),
-          false, expected_field_types, login_form_signature_, true, nullptr,
-          /*observer=*/IsNull()));
-
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+      LoginFormSignatureIs(login_form_signature_),
+      FieldsContain(
+          UploadField(6, ServerFieldType::USERNAME,
+                      FieldVoteTypeIs(Field::USERNAME_OVERWRITTEN)),
+          UploadField(5, ServerFieldType::ACCOUNT_CREATION_PASSWORD)));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   EXPECT_TRUE(votes_uploader.UploadPasswordVote(
-      form_to_upload_, submitted_form_, autofill::USERNAME,
+      form_to_upload_, submitted_form_, ServerFieldType::USERNAME,
       login_form_signature_));
 }
 
@@ -252,25 +273,21 @@
   }
   std::vector<const PasswordForm*> matches = {&match_form};
 
-  ServerFieldTypeSet expected_field_types = {autofill::USERNAME};
-
   EXPECT_TRUE(votes_uploader.FindCorrectedUsernameElement(
       matches, u"correct_username", u"password_value"));
 
   // SendVotesOnSave should call UploadPasswordVote and StartUploadRequest
   // twice. The first call is not the one that should be tested.
-  testing::Expectation first_call =
-      EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                  StartUploadRequest(_, _, _, _, _, _, _));
-
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          UsernameVoteTypeIsSameAs(
-              autofill::AutofillUploadContents::Field::USERNAME_OVERWRITTEN),
-          false, expected_field_types, _, true, nullptr, /*observer=*/IsNull()))
+  testing::Expectation first_call = EXPECT_CALL(
+      mock_autofill_crowdsourcing_manager_, StartUploadRequest(_, _, _, _, _));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FieldsContain(UploadField(6, ServerFieldType::USERNAME,
+                                FieldVoteTypeIs(Field::USERNAME_OVERWRITTEN))));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()))
       .After(first_call);
-
   votes_uploader.SendVotesOnSave(form_to_upload_.form_data, submitted_form_,
                                  matches, &form_to_upload_);
 }
@@ -285,25 +302,20 @@
   form_to_upload_.username_value = u"username_value";
   submitted_form_.username_value = u"username_value";
 
-  std::map<std::u16string, ServerFieldType> expected_types = {
-      {GetFieldNameByIndex(6), autofill::USERNAME},
-      {GetFieldNameByIndex(5), autofill::ACCOUNT_CREATION_PASSWORD}};
-  ServerFieldTypeSet expected_field_types = {
-      autofill::ACCOUNT_CREATION_PASSWORD, autofill::USERNAME};
-
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(
-              UploadedAutofillTypesAre(expected_types),
-              UsernameVoteTypeIsSameAs(
-                  autofill::AutofillUploadContents::Field::CREDENTIALS_REUSED)),
-          false, expected_field_types, login_form_signature_, true, nullptr,
-          /*observer=*/IsNull()));
-
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+      LoginFormSignatureIs(login_form_signature_),
+      FieldsContain(
+          UploadField(6, ServerFieldType::USERNAME,
+                      FieldVoteTypeIs(Field::CREDENTIALS_REUSED)),
+          UploadField(5, ServerFieldType::ACCOUNT_CREATION_PASSWORD)));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   EXPECT_TRUE(votes_uploader.UploadPasswordVote(
-      form_to_upload_, submitted_form_, autofill::ACCOUNT_CREATION_PASSWORD,
-      login_form_signature_));
+      form_to_upload_, submitted_form_,
+      ServerFieldType::ACCOUNT_CREATION_PASSWORD, login_form_signature_));
 }
 
 // Checks votes uploading when user reuses credentials on login form.
@@ -323,15 +335,13 @@
   pending.form_data.fields.push_back(field);
   pending.username_value = u"username_value";
 
-  ServerFieldTypeSet expected_field_types = {autofill::USERNAME};
-
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          UsernameVoteTypeIsSameAs(
-              autofill::AutofillUploadContents::Field::CREDENTIALS_REUSED),
-          false, expected_field_types, _, true, nullptr,
-          /*observer=*/IsNull()));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FieldsContain(UploadField(6, ServerFieldType::USERNAME,
+                                FieldVoteTypeIs(Field::CREDENTIALS_REUSED))));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.SendVoteOnCredentialsReuse(form_to_upload_.form_data,
                                             submitted_form_, &pending);
 }
@@ -344,28 +354,23 @@
   form_to_upload_.password_element_renderer_id = FieldRendererId(5);
   form_to_upload_.username_value = u"new_username_value";
 
-  std::map<std::u16string, ServerFieldType> expected_types = {
-      {GetFieldNameByIndex(6), autofill::USERNAME},
-      {GetFieldNameByIndex(5), autofill::PASSWORD}};
-  ServerFieldTypeSet expected_field_types = {autofill::PASSWORD,
-                                             autofill::USERNAME};
-
   // A user changes the username in a save prompt to the value of
   // another field of the observed form.
   votes_uploader.set_username_change_state(
       VotesUploader::UsernameChangeState::kChangedToKnownValue);
 
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(UploadedAutofillTypesAre(expected_types),
-                UsernameVoteTypeIsSameAs(
-                    autofill::AutofillUploadContents::Field::USERNAME_EDITED)),
-          false, expected_field_types, login_form_signature_, true, nullptr,
-          /*observer=*/IsNull()));
-
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+      LoginFormSignatureIs(login_form_signature_),
+      FieldsContain(UploadField(6, ServerFieldType::USERNAME,
+                                FieldVoteTypeIs(Field::USERNAME_EDITED)),
+                    UploadField(5, ServerFieldType::PASSWORD)));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   EXPECT_TRUE(votes_uploader.UploadPasswordVote(
-      form_to_upload_, submitted_form_, autofill::PASSWORD,
+      form_to_upload_, submitted_form_, ServerFieldType::PASSWORD,
       login_form_signature_));
 }
 
@@ -382,20 +387,20 @@
   form_to_upload_.password_element_renderer_id = FieldRendererId(5);
   form_to_upload_.username_value = u"new_username_value";
 
-  ServerFieldTypeSet expected_field_types = {autofill::PASSWORD,
-                                             autofill::USERNAME};
-
   // A user changes the username in a save prompt to the value of
   // another field of the observed form.
   votes_uploader.set_username_change_state(
       VotesUploader::UsernameChangeState::kChangedToKnownValue);
 
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+      FieldsContain(UploadField(6, ServerFieldType::USERNAME,
+                                FieldVoteTypeIs(Field::USERNAME_EDITED)),
+                    UploadField(5, ServerFieldType::PASSWORD)));
   EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  UsernameVoteTypeIsSameAs(
-                      autofill::AutofillUploadContents::Field::USERNAME_EDITED),
-                  false, expected_field_types, _, true, nullptr,
-                  /*observer=*/IsNull()));
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.SendVotesOnSave(form_to_upload_.form_data, submitted_form_, {},
                                  &form_to_upload_);
 }
@@ -450,32 +455,35 @@
 // password updated.
 TEST_F(VotesUploaderTest, UploadPasswordAttributes) {
   for (const ServerFieldType autofill_type :
-       {autofill::PASSWORD, autofill::ACCOUNT_CREATION_PASSWORD,
-        autofill::NOT_ACCOUNT_CREATION_PASSWORD, autofill::NEW_PASSWORD,
-        autofill::PROBABLY_NEW_PASSWORD, autofill::NOT_NEW_PASSWORD,
-        autofill::USERNAME}) {
+       {ServerFieldType::PASSWORD, ServerFieldType::ACCOUNT_CREATION_PASSWORD,
+        ServerFieldType::NOT_ACCOUNT_CREATION_PASSWORD,
+        ServerFieldType::NEW_PASSWORD, ServerFieldType::PROBABLY_NEW_PASSWORD,
+        ServerFieldType::NOT_NEW_PASSWORD, ServerFieldType::USERNAME}) {
     SCOPED_TRACE(testing::Message() << "autofill_type=" << autofill_type);
     VotesUploader votes_uploader(&client_, false);
-    if (autofill_type == autofill::NEW_PASSWORD ||
-        autofill_type == autofill::PROBABLY_NEW_PASSWORD ||
-        autofill_type == autofill::NOT_NEW_PASSWORD) {
+    if (autofill_type == ServerFieldType::NEW_PASSWORD ||
+        autofill_type == ServerFieldType::PROBABLY_NEW_PASSWORD ||
+        autofill_type == ServerFieldType::NOT_NEW_PASSWORD) {
       form_to_upload_.new_password_element_renderer_id = FieldRendererId(11);
       form_to_upload_.new_password_value = u"new_password_value";
     }
 
-    bool expect_password_attributes = autofill_type == autofill::PASSWORD ||
-                                      autofill_type == autofill::NEW_PASSWORD;
+    const bool expect_password_attributes =
+        autofill_type == ServerFieldType::PASSWORD ||
+        autofill_type == ServerFieldType::NEW_PASSWORD;
+    // The password length is set iff password attributes were passed.
+    auto upload_contents_matcher = IsPasswordUpload(
+        FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+        LoginFormSignatureIs(login_form_signature_),
+        expect_password_attributes ? HasPasswordLength()
+                                   : Not(HasPasswordLength()));
     EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-                StartUploadRequest(
-                    HasPasswordAttributesVote(expect_password_attributes),
-                    false, _, login_form_signature_, true,
-                    /* pref_service= */ nullptr,
-                    /*observer=*/IsNull()));
-
+                StartUploadRequest(upload_contents_matcher, _, _,
+                                   /*pref_service=*/IsNull(),
+                                   /*observer=*/IsNull()));
     EXPECT_TRUE(votes_uploader.UploadPasswordVote(
         form_to_upload_, submitted_form_, autofill_type,
         login_form_signature_));
-
     testing::Mock::VerifyAndClearExpectations(
         &mock_autofill_crowdsourcing_manager_);
   }
@@ -493,7 +501,7 @@
     for (int i = 0; i < kNumberOfPasswordAttributes; ++i) {
       has_password_attribute[i] = base::RandGenerator(2);
       if (has_password_attribute[i])
-        password_value += ASCIIToUTF16(kPasswordSnippets[i]);
+        password_value += base::ASCIIToUTF16(kPasswordSnippets[i]);
     }
     if (password_value.empty())
       continue;
@@ -680,21 +688,21 @@
       /*all_alternative_usernames=*/{});
   votes_uploader.set_should_send_username_first_flow_votes(true);
 
-#if !BUILDFLAG(IS_ANDROID)
   // Upload on the username form.
-  ServerFieldTypeSet expected_types = {SINGLE_USERNAME};
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  AllOf(SignatureIs(kSingleUsernameFormSignature),
-                        UploadedSingleUsernameVoteTypeIs(
-                            autofill::AutofillUploadContents::Field::WEAK)),
-                  false, expected_types, std::string(), true,
-                  /* pref_service= */ nullptr, /*observer=*/IsNull()));
-#else
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, _))
-      .Times(0);
-#endif  // !BUILDFLAG(IS_ANDROID)
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    auto upload_contents_matcher =
+        IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature),
+                         FieldsContain(SingleUsernameUploadField(
+                             ServerFieldType::SINGLE_USERNAME, Field::WEAK)));
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(upload_contents_matcher, _, _,
+                                   /*pref_service=*/IsNull(),
+                                   /*observer=*/IsNull()));
+  } else {
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(_, _, _, _, _))
+        .Times(0);
+  }
 
   base::HistogramTester histogram_tester;
   votes_uploader.MaybeSendSingleUsernameVotes();
@@ -723,21 +731,21 @@
       /*saved_username=*/u"saved_value", /*all_alternative_usernames=*/{});
   votes_uploader.set_should_send_username_first_flow_votes(true);
 
-#if !BUILDFLAG(IS_ANDROID)
-  // Upload on the username form.
-  ServerFieldTypeSet expected_types = {NOT_USERNAME};
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  AllOf(SignatureIs(kSingleUsernameFormSignature),
-                        UploadedSingleUsernameVoteTypeIs(
-                            autofill::AutofillUploadContents::Field::STRONG)),
-                  false, expected_types, std::string(), true,
-                  /* pref_service= */ nullptr, /*observer=*/IsNull()));
-#else
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, _))
-      .Times(0);
-#endif  // !BUILDFLAG(IS_ANDROID)
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    // Upload on the username form.
+    auto upload_contents_matcher =
+        IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature),
+                         FieldsContain(SingleUsernameUploadField(
+                             ServerFieldType::NOT_USERNAME, Field::STRONG)));
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(upload_contents_matcher, _, _,
+                                   /*pref_service=*/IsNull(),
+                                   /*observer=*/IsNull()));
+  } else {
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(_, _, _, _, _))
+        .Times(0);
+  }
 
   votes_uploader.MaybeSendSingleUsernameVotes();
 
@@ -748,15 +756,16 @@
       autofill::AutofillUploadContents::VALUE_WITH_WHITESPACE);
   expected_single_username_data.set_prompt_edit(
       autofill::AutofillUploadContents::EDITED_NEGATIVE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIsSameAs(submitted_form_),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
-
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_.form_data)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.UploadPasswordVote(submitted_form_, submitted_form_,
-                                    autofill::PASSWORD, std::string());
+                                    ServerFieldType::PASSWORD, std::string());
 }
 
 // Verifies that SINGLE_USERNAME vote and NOT_EDITED_IN_PROMPT vote type
@@ -778,24 +787,21 @@
       /*all_alternative_usernames=*/{});
   votes_uploader.set_should_send_username_first_flow_votes(true);
 
-#if !BUILDFLAG(IS_ANDROID)
-  // Upload on the username form.
-  ServerFieldTypeSet expected_types = {SINGLE_USERNAME};
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  AllOf(SignatureIs(kSingleUsernameFormSignature),
-                        UploadedSingleUsernameVoteTypeIs(
-                            autofill::AutofillUploadContents::Field::WEAK)),
-                  /*form_was_autofilled=*/false, expected_types,
-                  /*login_form_signature=*/"",
-                  /*observed_submission=*/true,
-                  /*pref_service=*/nullptr,
-                  /*observer=*/IsNull()));
-#else
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, _))
-      .Times(0);
-#endif  // !BUILDFLAG(IS_ANDROID)
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    // Upload on the username form.
+    auto upload_contents_matcher =
+        IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature),
+                         FieldsContain(SingleUsernameUploadField(
+                             ServerFieldType::SINGLE_USERNAME, Field::WEAK)));
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(upload_contents_matcher, _, _,
+                                   /*pref_service=*/IsNull(),
+                                   /*observer=*/IsNull()));
+  } else {
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(_, _, _, _, _))
+        .Times(0);
+  }
 
   votes_uploader.MaybeSendSingleUsernameVotes();
 
@@ -804,13 +810,14 @@
       expected_single_username_data = MakeSimpleSingleUsernameData();
   expected_single_username_data.set_prompt_edit(
       autofill::AutofillUploadContents::NOT_EDITED_POSITIVE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIsSameAs(submitted_form_),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
-
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_.form_data)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.UploadPasswordVote(submitted_form_, submitted_form_,
                                     autofill::PASSWORD, std::string());
 }
@@ -835,25 +842,21 @@
       /*saved_username=*/suggested_value, /*all_alternative_usernames=*/{});
   votes_uploader.set_should_send_username_first_flow_votes(true);
 
-#if !BUILDFLAG(IS_ANDROID)
-  // Upload on the username form.
-  ServerFieldTypeSet expected_types = {NOT_USERNAME};
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  AllOf(SignatureIs(kSingleUsernameFormSignature),
-                        UploadedSingleUsernameVoteTypeIs(
-                            autofill::AutofillUploadContents::Field::WEAK)),
-                  /*form_was_autofilled=*/false, expected_types,
-                  /*login_form_signature=*/"",
-                  /*observed_submission=*/true,
-                  /*pref_service=*/nullptr,
-                  /*observer=*/IsNull()));
-#else
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, _))
-      .Times(0);
-#endif  // !BUILDFLAG(IS_ANDROID)
-
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    // Upload on the username form.
+    auto upload_contents_matcher =
+        IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature),
+                         FieldsContain(SingleUsernameUploadField(
+                             ServerFieldType::NOT_USERNAME, Field::WEAK)));
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(upload_contents_matcher, _, _,
+                                   /*pref_service=*/IsNull(),
+                                   /*observer=*/IsNull()));
+  } else {
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(_, _, _, _, _))
+        .Times(0);
+  }
   votes_uploader.MaybeSendSingleUsernameVotes();
 
   // Upload on the password form for the fallback classifier.
@@ -861,12 +864,14 @@
       expected_single_username_data = MakeSimpleSingleUsernameData();
   expected_single_username_data.set_prompt_edit(
       autofill::AutofillUploadContents::NOT_EDITED_NEGATIVE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIsSameAs(submitted_form_),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_.form_data)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.UploadPasswordVote(submitted_form_, submitted_form_,
                                     autofill::PASSWORD, std::string());
 }
@@ -892,24 +897,21 @@
       /*all_alternative_usernames=*/{});
   votes_uploader.set_should_send_username_first_flow_votes(true);
 
-#if !BUILDFLAG(IS_ANDROID)
-  ServerFieldTypeSet expected_types = {SINGLE_USERNAME};
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  AllOf(SignatureIs(kSingleUsernameFormSignature),
-                        UploadedSingleUsernameVoteTypeIs(
-                            autofill::AutofillUploadContents::Field::STRONG)),
-                  /*form_was_autofilled=*/false, expected_types,
-                  /*login_form_signature=*/"",
-                  /*observed_submission=*/true,
-                  /*pref_service=*/nullptr,
-                  /*observer=*/IsNull()));
-#else
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, _))
-      .Times(0);
-#endif  // !BUILDFLAG(IS_ANDROID)
-
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    // Upload on the username form.
+    auto upload_contents_matcher =
+        IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature),
+                         FieldsContain(SingleUsernameUploadField(
+                             ServerFieldType::SINGLE_USERNAME, Field::STRONG)));
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(upload_contents_matcher, _, _,
+                                   /*pref_service=*/IsNull(),
+                                   /*observer=*/IsNull()));
+  } else {
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(_, _, _, _, _))
+        .Times(0);
+  }
   votes_uploader.MaybeSendSingleUsernameVotes();
 
   // Upload on the password form for the fallback classifier.
@@ -917,12 +919,14 @@
       expected_single_username_data = MakeSimpleSingleUsernameData();
   expected_single_username_data.set_prompt_edit(
       autofill::AutofillUploadContents::EDITED_POSITIVE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIsSameAs(submitted_form_),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_.form_data)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.UploadPasswordVote(submitted_form_, submitted_form_,
                                     autofill::PASSWORD, std::string());
 }
@@ -946,25 +950,21 @@
       /*saved_username=*/u"", /*all_alternative_usernames=*/{});
   votes_uploader.set_should_send_username_first_flow_votes(true);
 
-#if !BUILDFLAG(IS_ANDROID)
-  // Upload on the username form.
-  ServerFieldTypeSet expected_types = {NOT_USERNAME};
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(
-                  AllOf(SignatureIs(kSingleUsernameFormSignature),
-                        UploadedSingleUsernameVoteTypeIs(
-                            autofill::AutofillUploadContents::Field::STRONG)),
-                  /*form_was_autofilled=*/false, expected_types,
-                  /*login_form_signature=*/"",
-                  /*observed_submission=*/true,
-                  /*pref_service=*/nullptr,
-                  /*observer=*/IsNull()));
-#else
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, _, _, _, _, _, _))
-      .Times(0);
-#endif  // !BUILDFLAG(IS_ANDROID)
-
+  if constexpr (!BUILDFLAG(IS_ANDROID)) {
+    // Upload on the username form.
+    auto upload_contents_matcher =
+        IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature),
+                         FieldsContain(SingleUsernameUploadField(
+                             ServerFieldType::NOT_USERNAME, Field::STRONG)));
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(upload_contents_matcher, _, _,
+                                   /*pref_service=*/IsNull(),
+                                   /*observer=*/IsNull()));
+  } else {
+    EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+                StartUploadRequest(_, _, _, _, _))
+        .Times(0);
+  }
   votes_uploader.MaybeSendSingleUsernameVotes();
 
   // Expect upload for the password form for the fallback classifier.
@@ -972,12 +972,14 @@
       expected_single_username_data = MakeSimpleSingleUsernameData();
   expected_single_username_data.set_prompt_edit(
       autofill::AutofillUploadContents::EDITED_NEGATIVE);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIsSameAs(submitted_form_),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_.form_data)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.UploadPasswordVote(submitted_form_, submitted_form_,
                                     autofill::PASSWORD, std::string());
 }
@@ -1002,10 +1004,12 @@
       /*saved_username=*/u"", /*all_alternative_usernames=*/{});
   votes_uploader.set_should_send_username_first_flow_votes(true);
 
-  // Expect no upload on username form, as th signal is not informative to us.
-  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(SignatureIs(kSingleUsernameFormSignature), _,
-                                 _, _, _, _, /*observer=*/IsNull()))
+  // Expect no upload on username form, as the signal is not informative to us.
+  EXPECT_CALL(
+      mock_autofill_crowdsourcing_manager_,
+      StartUploadRequest(
+          IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature)), _, _,
+          _, _))
       .Times(0);
   votes_uploader.MaybeSendSingleUsernameVotes();
 
@@ -1014,12 +1018,14 @@
       expected_single_username_data = MakeSimpleSingleUsernameData();
   expected_single_username_data.set_prompt_edit(
       autofill::AutofillUploadContents::EDIT_UNSPECIFIED);
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIsSameAs(submitted_form_),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_.form_data)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.UploadPasswordVote(submitted_form_, submitted_form_,
                                     autofill::PASSWORD, std::string());
 }
@@ -1047,13 +1053,14 @@
   expected_single_username_data.set_username_field_signature(0);
   expected_single_username_data.set_value_type(
       autofill::AutofillUploadContents::NO_VALUE_TYPE);
-
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(
-          AllOf(SignatureIsSameAs(submitted_form_),
-                UploadedSingleUsernameDataIs({expected_single_username_data})),
-          _, _, _, _, _, /*observer=*/IsNull()));
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(submitted_form_.form_data)),
+      SingleUsernameDataIs(
+          EqualsSingleUsernameDataVector({expected_single_username_data})));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
   votes_uploader.UploadPasswordVote(submitted_form_, submitted_form_,
                                     autofill::PASSWORD, std::string());
 }
@@ -1073,17 +1080,20 @@
   submitted_form_.confirmation_password_element = password_element;
   submitted_form_.confirmation_password_element_renderer_id =
       FieldRendererId(11);
-  ServerFieldTypeSet expected_field_types = {PASSWORD, CONFIRMATION_PASSWORD};
 
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+      LoginFormSignatureIs(login_form_signature_),
+      FieldsContain(UploadField(5, ServerFieldType::PASSWORD),
+                    UploadField(11, ServerFieldType::CONFIRMATION_PASSWORD)));
   EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, false, expected_field_types,
-                                 login_form_signature_, true,
-                                 /* pref_service= */ nullptr,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
                                  /*observer=*/IsNull()));
   base::HistogramTester histogram_tester;
-
   EXPECT_TRUE(votes_uploader.UploadPasswordVote(
-      form_to_upload_, submitted_form_, PASSWORD, login_form_signature_));
+      form_to_upload_, submitted_form_, ServerFieldType::PASSWORD,
+      login_form_signature_));
 
   histogram_tester.ExpectUniqueSample(
       "PasswordManager.FieldNameCollisionInVotes", false, 1);
@@ -1099,17 +1109,20 @@
       FieldRendererId(12);
   submitted_form_.confirmation_password_element_renderer_id =
       FieldRendererId(12);
-  ServerFieldTypeSet expected_field_types = {PASSWORD, CONFIRMATION_PASSWORD};
 
+  auto upload_contents_matcher = IsPasswordUpload(
+      FormSignatureIs(CalculateFormSignature(form_to_upload_.form_data)),
+      LoginFormSignatureIs(login_form_signature_),
+      FieldsContain(UploadField(5, ServerFieldType::PASSWORD),
+                    UploadField(12, ServerFieldType::CONFIRMATION_PASSWORD)));
   EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
-              StartUploadRequest(_, false, expected_field_types,
-                                 login_form_signature_, true,
-                                 /* pref_service= */ nullptr,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
                                  /*observer=*/IsNull()));
   base::HistogramTester histogram_tester;
-
   EXPECT_TRUE(votes_uploader.UploadPasswordVote(
-      form_to_upload_, submitted_form_, PASSWORD, login_form_signature_));
+      form_to_upload_, submitted_form_, ServerFieldType::PASSWORD,
+      login_form_signature_));
 
   histogram_tester.ExpectUniqueSample(
       "PasswordManager.FieldNameCollisionInVotes", false, 1);
@@ -1127,20 +1140,16 @@
       /*saved_username=*/single_username_candidate_value,
       /*all_alternative_usernames=*/{});
 
-  // Upload on the username form.
-  ServerFieldTypeSet expected_types = {
-      autofill::SINGLE_USERNAME_FORGOT_PASSWORD};
-  EXPECT_CALL(
-      mock_autofill_crowdsourcing_manager_,
-      StartUploadRequest(AllOf(SignatureIs(kSingleUsernameFormSignature),
-                               UploadedSingleUsernameVoteTypeIs(
-                                   autofill::AutofillUploadContents::Field::
-                                       WEAK_FORGOT_PASSWORD)),
-                         /*form_was_autofilled=*/false, expected_types,
-                         /*login_form_signature=*/"",
-                         /*observed_submission=*/true,
-                         /*pref_service=*/nullptr,
-                         /*observer=*/IsNull()));
+  // // Upload on the username form.
+  auto upload_contents_matcher =
+      IsPasswordUpload(FormSignatureIs(kSingleUsernameFormSignature),
+                       FieldsContain(SingleUsernameUploadField(
+                           ServerFieldType::SINGLE_USERNAME_FORGOT_PASSWORD,
+                           Field::WEAK_FORGOT_PASSWORD)));
+  EXPECT_CALL(mock_autofill_crowdsourcing_manager_,
+              StartUploadRequest(upload_contents_matcher, _, _,
+                                 /*pref_service=*/IsNull(),
+                                 /*observer=*/IsNull()));
 
   base::HistogramTester histogram_tester;
   votes_uploader.MaybeSendSingleUsernameVotes();
diff --git a/components/performance_manager/decorators/process_priority_aggregator.cc b/components/performance_manager/decorators/process_priority_aggregator.cc
index 4862350..71b56dd 100644
--- a/components/performance_manager/decorators/process_priority_aggregator.cc
+++ b/components/performance_manager/decorators/process_priority_aggregator.cc
@@ -166,7 +166,6 @@
     const ProcessNode* process_node) {
   auto* process_node_impl = ProcessNodeImpl::FromNode(process_node);
   DCHECK(!DataImpl::Get(process_node_impl));
-  DCHECK_EQ(base::TaskPriority::HIGHEST, process_node_impl->GetPriority());
 }
 
 void ProcessPriorityAggregator::OnBeforeProcessNodeRemoved(
diff --git a/components/performance_manager/graph/process_node_impl.cc b/components/performance_manager/graph/process_node_impl.cc
index 754b3ce..e00758b 100644
--- a/components/performance_manager/graph/process_node_impl.cc
+++ b/components/performance_manager/graph/process_node_impl.cc
@@ -43,20 +43,27 @@
 
 ProcessNodeImpl::ProcessNodeImpl(BrowserProcessNodeTag tag)
     : ProcessNodeImpl(content::PROCESS_TYPE_BROWSER,
-                      AnyChildProcessHostProxy{}) {}
+                      AnyChildProcessHostProxy{},
+                      base::TaskPriority::HIGHEST) {}
 
-ProcessNodeImpl::ProcessNodeImpl(RenderProcessHostProxy proxy)
+ProcessNodeImpl::ProcessNodeImpl(RenderProcessHostProxy proxy,
+                                 base::TaskPriority priority)
     : ProcessNodeImpl(content::PROCESS_TYPE_RENDERER,
-                      AnyChildProcessHostProxy(std::move(proxy))) {}
+                      AnyChildProcessHostProxy(std::move(proxy)),
+                      priority) {}
 
 ProcessNodeImpl::ProcessNodeImpl(content::ProcessType process_type,
                                  BrowserChildProcessHostProxy proxy)
     : ProcessNodeImpl(ValidateBrowserChildProcessType(process_type),
-                      AnyChildProcessHostProxy(std::move(proxy))) {}
+                      AnyChildProcessHostProxy(std::move(proxy)),
+                      base::TaskPriority::HIGHEST) {}
 
 ProcessNodeImpl::ProcessNodeImpl(content::ProcessType process_type,
-                                 AnyChildProcessHostProxy proxy)
-    : process_type_(process_type), child_process_host_proxy_(std::move(proxy)) {
+                                 AnyChildProcessHostProxy proxy,
+                                 base::TaskPriority priority)
+    : process_type_(process_type),
+      child_process_host_proxy_(std::move(proxy)),
+      priority_(priority) {
   // Nodes are created on the UI thread, then accessed on the PM sequence.
   // `weak_this_` can be returned from GetWeakPtrOnUIThread() and dereferenced
   // on the PM sequence.
diff --git a/components/performance_manager/graph/process_node_impl.h b/components/performance_manager/graph/process_node_impl.h
index 4182607..9f54b60 100644
--- a/components/performance_manager/graph/process_node_impl.h
+++ b/components/performance_manager/graph/process_node_impl.h
@@ -61,7 +61,7 @@
   explicit ProcessNodeImpl(BrowserProcessNodeTag tag);
 
   // Constructor for a renderer process.
-  explicit ProcessNodeImpl(RenderProcessHostProxy proxy);
+  ProcessNodeImpl(RenderProcessHostProxy proxy, base::TaskPriority priority);
 
   // Constructor for a non-renderer child process.
   ProcessNodeImpl(content::ProcessType process_type,
@@ -168,7 +168,8 @@
 
   // Shared constructor for all process types.
   ProcessNodeImpl(content::ProcessType process_type,
-                  AnyChildProcessHostProxy proxy);
+                  AnyChildProcessHostProxy proxy,
+                  base::TaskPriority priority);
 
   // Rest of ProcessNode implementation. These are private so that users of the
   // impl use the private getters rather than the public interface.
@@ -223,8 +224,7 @@
       base::TaskPriority,
       base::TaskPriority,
       &ProcessNodeObserver::OnPriorityChanged>
-      priority_ GUARDED_BY_CONTEXT(sequence_checker_){
-          base::TaskPriority::HIGHEST};
+      priority_ GUARDED_BY_CONTEXT(sequence_checker_);
 
   // A bit field that indicates which type of content this process has hosted,
   // either currently or in the past.
diff --git a/components/performance_manager/graph/process_node_impl_unittest.cc b/components/performance_manager/graph/process_node_impl_unittest.cc
index 35ba9118..a407300 100644
--- a/components/performance_manager/graph/process_node_impl_unittest.cc
+++ b/components/performance_manager/graph/process_node_impl_unittest.cc
@@ -152,7 +152,7 @@
   process_node->SetMainThreadTaskLoadIsLow(true);
   EXPECT_EQ(raw_process_node, obs.TakeNotifiedProcessNode());
 
-  // This call does nothing as the priority is always initialized at HIGHEST.
+  // This call does nothing as the priority is initialized at HIGHEST.
   EXPECT_EQ(base::TaskPriority::HIGHEST, process_node->GetPriority());
   process_node->set_priority(base::TaskPriority::HIGHEST);
 
diff --git a/components/performance_manager/performance_manager_impl.cc b/components/performance_manager/performance_manager_impl.cc
index 281c4c20..97590fc 100644
--- a/components/performance_manager/performance_manager_impl.cc
+++ b/components/performance_manager/performance_manager_impl.cc
@@ -169,10 +169,11 @@
 
 // static
 std::unique_ptr<ProcessNodeImpl> PerformanceManagerImpl::CreateProcessNode(
-    RenderProcessHostProxy render_process_host_proxy) {
+    RenderProcessHostProxy render_process_host_proxy,
+    base::TaskPriority priority) {
   return CreateNodeImpl<ProcessNodeImpl>(
       base::OnceCallback<void(ProcessNodeImpl*)>(),
-      std::move(render_process_host_proxy));
+      std::move(render_process_host_proxy), priority);
 }
 
 // static
diff --git a/components/performance_manager/performance_manager_impl.h b/components/performance_manager/performance_manager_impl.h
index 606fade..8d8c027d 100644
--- a/components/performance_manager/performance_manager_impl.h
+++ b/components/performance_manager/performance_manager_impl.h
@@ -116,7 +116,8 @@
   static std::unique_ptr<ProcessNodeImpl> CreateProcessNode(
       BrowserProcessNodeTag tag);
   static std::unique_ptr<ProcessNodeImpl> CreateProcessNode(
-      RenderProcessHostProxy proxy);
+      RenderProcessHostProxy proxy,
+      base::TaskPriority priority);
   static std::unique_ptr<ProcessNodeImpl> CreateProcessNode(
       content::ProcessType process_type,
       BrowserChildProcessHostProxy proxy);
diff --git a/components/performance_manager/performance_manager_impl_unittest.cc b/components/performance_manager/performance_manager_impl_unittest.cc
index e31c10a3..70985e3 100644
--- a/components/performance_manager/performance_manager_impl_unittest.cc
+++ b/components/performance_manager/performance_manager_impl_unittest.cc
@@ -62,7 +62,8 @@
 
   std::unique_ptr<ProcessNodeImpl> process_node =
       PerformanceManagerImpl::CreateProcessNode(
-          RenderProcessHostProxy::CreateForTesting(render_process_host_id));
+          RenderProcessHostProxy::CreateForTesting(render_process_host_id),
+          base::TaskPriority::HIGHEST);
   EXPECT_NE(nullptr, process_node.get());
   std::unique_ptr<PageNodeImpl> page_node =
       PerformanceManagerImpl::CreatePageNode(
@@ -86,8 +87,8 @@
 
 TEST_F(PerformanceManagerImplDeathTest, InvalidProcessHostProxies) {
   const auto browser_child_process_host_id = BrowserChildProcessHostId(1);
-  EXPECT_CHECK_DEATH(
-      PerformanceManagerImpl::CreateProcessNode(RenderProcessHostProxy()));
+  EXPECT_CHECK_DEATH(PerformanceManagerImpl::CreateProcessNode(
+      RenderProcessHostProxy(), base::TaskPriority::HIGHEST));
   EXPECT_CHECK_DEATH(PerformanceManagerImpl::CreateProcessNode(
       content::PROCESS_TYPE_UTILITY, BrowserChildProcessHostProxy()));
 
@@ -108,7 +109,8 @@
   // Create a page node and a small hierarchy of frames.
   std::unique_ptr<ProcessNodeImpl> process_node =
       PerformanceManagerImpl::CreateProcessNode(
-          RenderProcessHostProxy::CreateForTesting(render_process_host_id));
+          RenderProcessHostProxy::CreateForTesting(render_process_host_id),
+          base::TaskPriority::HIGHEST);
   std::unique_ptr<PageNodeImpl> page_node =
       PerformanceManagerImpl::CreatePageNode(
           WebContentsProxy(), std::string(), GURL(), PagePropertyFlags{},
diff --git a/components/performance_manager/render_process_user_data.cc b/components/performance_manager/render_process_user_data.cc
index 85ad55b7..b7d0827 100644
--- a/components/performance_manager/render_process_user_data.cc
+++ b/components/performance_manager/render_process_user_data.cc
@@ -31,8 +31,12 @@
     content::RenderProcessHost* render_process_host)
     : host_(render_process_host) {
   host_->AddObserver(this);
+  base::TaskPriority initial_priority = host_->IsSpare()
+                                            ? base::TaskPriority::LOWEST
+                                            : base::TaskPriority::HIGHEST;
   process_node_ = PerformanceManagerImpl::CreateProcessNode(
-      RenderProcessHostProxy(RenderProcessHostId(host_->GetID())));
+      RenderProcessHostProxy(RenderProcessHostId(host_->GetID())),
+      initial_priority);
 }
 
 RenderProcessUserData::~RenderProcessUserData() {
diff --git a/components/performance_manager/test_support/graph_test_harness.h b/components/performance_manager/test_support/graph_test_harness.h
index 318ff6159..dbcb727 100644
--- a/components/performance_manager/test_support/graph_test_harness.h
+++ b/components/performance_manager/test_support/graph_test_harness.h
@@ -142,7 +142,8 @@
       proxy = RenderProcessHostProxy::CreateForTesting(
           NextTestRenderProcessHostId());
     }
-    return std::make_unique<ProcessNodeImpl>(std::move(proxy));
+    return std::make_unique<ProcessNodeImpl>(std::move(proxy),
+                                             base::TaskPriority::HIGHEST);
   }
 
   // Creates a ProcessNode for a non-renderer child process.
diff --git a/components/performance_manager/test_support/mock_graphs.cc b/components/performance_manager/test_support/mock_graphs.cc
index a933c60..818ebb0 100644
--- a/components/performance_manager/test_support/mock_graphs.cc
+++ b/components/performance_manager/test_support/mock_graphs.cc
@@ -25,7 +25,8 @@
 
 TestProcessNodeImpl::TestProcessNodeImpl()
     : ProcessNodeImpl(RenderProcessHostProxy::CreateForTesting(
-          NextTestRenderProcessHostId())) {}
+                          NextTestRenderProcessHostId()),
+                      base::TaskPriority::HIGHEST) {}
 
 TestProcessNodeImpl::TestProcessNodeImpl(content::ProcessType process_type)
     : ProcessNodeImpl(process_type,
diff --git a/components/performance_manager/worker_watcher_unittest.cc b/components/performance_manager/worker_watcher_unittest.cc
index c529505d..e3530cb 100644
--- a/components/performance_manager/worker_watcher_unittest.cc
+++ b/components/performance_manager/worker_watcher_unittest.cc
@@ -542,7 +542,8 @@
 
   // Create the process node and insert it into the map.
   auto process_node = PerformanceManagerImpl::CreateProcessNode(
-      RenderProcessHostProxy::CreateForTesting(render_process_id));
+      RenderProcessHostProxy::CreateForTesting(render_process_id),
+      base::TaskPriority::HIGHEST);
   bool inserted =
       process_node_map_
           .insert({render_process_id.value(), std::move(process_node)})
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 178cd994..7b3a3404 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -1510,6 +1510,7 @@
       Ist sie auf „true“ festgelegt oder nicht konfiguriert, wird der Netzwerkstatus des Geräts ausgegeben.</translation>
 <translation id="2223393221350938149">Ausführung von JavaScript JIT für keine Website zulassen</translation>
 <translation id="2223598546285729819">Standardeinstellung für Benachrichtigungen</translation>
+<translation id="2224706708550115831">Nutzer-Browserzugriff auf eine Liste von URLs zulassen, während sich das durchgehend aktive VPN im strikten Modus mit aktivierter Sperrfunktion befindet und nicht verbunden ist</translation>
 <translation id="222673035924187991">TLS Encrypted ClientHello aktivieren</translation>
 <translation id="2231817271680715693">Browserverlauf bei erster Ausführung aus Standardbrowser importieren</translation>
 <translation id="2231962946025538735">Diese Richtlinie ist veraltet. Du kannst mit <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> die Verfügbarkeit des Flash-Plug-ins definieren und über <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> festlegen, ob der integrierte PDF-Viewer zum Öffnen von PDF-Dateien verwendet werden soll.
@@ -1648,6 +1649,8 @@
 
       Sie wirkt sich nur auf den Zugriff auf USB-Geräte über die WebUSB API aus. Für die Gewährung des Zugriffs auf USB-Geräte über die Web Serial API siehe Richtlinie <ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
 <translation id="2318583605563438459">Eltern dürfen gemeinsam verwaltete Konten hinzufügen</translation>
+<translation id="2319139030891093109">Eine Liste der TLS-Zertifikate, die von <ph name="PRODUCT_NAME" /> als vertrauenswürdig eingestuft werden sollen.
+Zertifikate müssen mit Base64 codiert sein.</translation>
 <translation id="2326031114717677574">Häufigkeit, mit der Audiodaten analysiert und erhoben werden. Die geringste zulässige Häufigkeit beträgt 1 Minute.
 
       Wenn die Richtlinie nicht konfiguriert ist, beträgt die Häufigkeit standardmäßig 15 Minuten.</translation>
@@ -2877,6 +2880,15 @@
 <translation id="3398051852031115795">Standardmäßiges Systemverhalten (abhängig von der Bildschirmgröße)</translation>
 <translation id="3399859571630358395">Deaktivierung von schnellem Pairing (schnellem Bluetooth-Koppeln) erzwingen.</translation>
 <translation id="3404681701763345449">Dadurch wird die <ph name="GOOGLE_CALENDAR_NAME" />-Integration aktiviert.</translation>
+<translation id="3405361833556012520">Diese Richtlinie gilt nur für Webtraffic. Für den Play Store, die Webnavigation von Android-Apps und anderen Nutzertraffic wie Linux-VM-Traffic oder Druckaufträge gelten weiterhin die Einschränkungen, die vom durchgehend aktiven VPN auferlegt werden. Die Richtlinie wird nur erzwungen, solange das VPN nicht verbunden ist, und gilt nur für den Webtraffic von Nutzern. Während die Richtlinie erzwungen wird, kann der Systemtraffic das durchgehend aktive VPN umgehen, um bestimmte Aufgaben wie das Abrufen von Richtlinien oder das Synchronisieren der Systemzeit auszuführen.
+
+Mit dieser Richtlinie lassen sich bei Verwendung des unter https://support.google.com/chrome/a?p=url_blocklist_filter_format angegebenen Formats Ausnahmen für bestimmte Schemas, Subdomains anderer Domains, Ports oder bestimmte Pfade festlegen. Mit dem spezifischsten Filter wird festgelegt, ob eine URL blockiert oder zulässig ist.
+
+Wenn „<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" />“ festgelegt, ein durchgehend aktives VPN konfiguriert und dieses VPN nicht verbunden ist, wird die Navigation zu allen Hosts blockiert. Eine Ausnahme bilden solche Hosts, die gemäß der Richtlinie „<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" />“ zulässig sind. Bei diesem Gerätestatus werden „<ph name="URL_BLOCKLIST_POLICY_NAME" />“ und „<ph name="URL_ALLOWLIST_POLICY_NAME" />“ ignoriert. Wenn eine Verbindung zum durchgehend aktiven VPN hergestellt wird, werden die Richtlinien „<ph name="URL_BLOCKLIST_POLICY_NAME" />“ und „<ph name="URL_ALLOWLIST_POLICY_NAME" />“ angewendet und die Richtlinie „<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" />“ wird ignoriert.
+
+Diese Richtlinie ist auf 1.000 Einträge beschränkt.
+
+Wenn die Richtlinie nicht konfiguriert ist, wird die Browsernavigation verhindert, wenn für das durchgehend aktive VPN der strikte Modus aktiviert und das VPN nicht verbunden ist.</translation>
 <translation id="3405997282295704902">Nutzern nicht erlauben, <ph name="PRODUCT_NAME" /> zu verwenden</translation>
 <translation id="3406122462682235653">Nutzer nicht fragen (Downloads werden sofort gestartet)</translation>
 <translation id="3408078762098350617">Diese Richtlinie steuert die Nutzereinstellungen für die in <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" /> aufgelisteten deaktivierten Funktionen.
@@ -3185,7 +3197,6 @@
 
 Diese Richtlinie wird nur angewendet, wenn das Gerät für <ph name="PRODUCT_NAME" /> mit <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> registriert ist.
 Für <ph name="PRODUCT_OS_NAME" /> wird diese Richtlinie immer angewendet.</translation>
-<translation id="3642557248926713561">Safe Browsing-Erweiterungsschutz deaktivieren</translation>
 <translation id="3644735978203799620">Aktiviert die automatische Auswahl für Aufnahmen auf mehreren Bildschirmen</translation>
 <translation id="3646859102161347133">Lupentyp festlegen</translation>
 <translation id="3647212518036289905">Wenn diese Richtlinie konfiguriert ist, wird festgelegt, welche GSSAPI-Bibliothek für die HTTP-Authentifizierung verwendet werden soll. Gib entweder nur den Namen einer Bibliothek oder einen vollständigen Pfad an.
@@ -4545,6 +4556,7 @@
 <translation id="4802905909524200151">Updateverhalten von <ph name="TPM_FIRMWARE_UPDATE_TPM" />-Firmware konfigurieren</translation>
 <translation id="4804828344300125154">Nach Nutzerabmeldung immer neu starten.</translation>
 <translation id="4807950475297505572">Die am längsten nicht verwendeten Nutzer werden entfernt, bis genügend freier Speicherplatz vorhanden ist.</translation>
+<translation id="4808396444416188826">TLS-Serverzertifikate, die von <ph name="PRODUCT_NAME" /> als vertrauenswürdig eingestuft werden sollen</translation>
 <translation id="4812270373673968774">Wenn die Richtlinie auf "Always" gesetzt ist, wird die Ablage von <ph name="PRODUCT_OS_NAME" /> automatisch ausgeblendet. Ist sie auf "Never" gesetzt, wird die Ablage nie automatisch ausgeblendet.
 
       Wenn du diese Richtlinie konfigurierst, kann sie von Nutzern nicht geändert werden. Falls die Richtlinie nicht konfiguriert ist, können Nutzer selbst entscheiden, ob die Ablage automatisch ausgeblendet werden soll.</translation>
@@ -5618,8 +5630,6 @@
       Ist sie auf "False" gesetzt oder nicht konfiguriert, sind die Funktionen von Web Components v0 ab M80 standardmäßig deaktiviert.
 
       Diese Richtlinie wird nach Chrome 84 entfernt.</translation>
-<translation id="5755149423476170868">Wenn diese Richtlinie aktiviert oder nicht konfiguriert ist, wird der <ph name="SAFE_BROWSING_NAME" />-Erweiterungsschutz für <ph name="PRODUCT_NAME" /> durch <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> gesteuert. Wenn <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> auf <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> oder <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" /> gesetzt ist, werden schädliche Erweiterungen in <ph name="PRODUCT_NAME" /> schneller deaktiviert. <ph name="PRODUCT_NAME" /> sendet eine Anfrage an den Google Safe Browsing-Server, um zu prüfen, ob eine Erweiterung aus dem Chrome Web Store entfernt wurde, weil sie als problematisch, d. h. schädlich, angreifbar, unerwünscht oder gegen die Chrome Web Store-Richtlinien (CWS) verstoßend eingestuft wird. Wenn eine Erweiterung aus dem Store entfernt wurde, hindert <ph name="PRODUCT_NAME" /> die Nutzer daran, sie zu installieren. Wurde sie bereits installiert, wird sie deaktiviert.
-Wenn die Richtlinie deaktiviert ist, ist auch der <ph name="SAFE_BROWSING_NAME" />-Erweiterungsschutz deaktiviert und schädliche Erweiterungen werden über das <ph name="GOOGLE_UPDATE_NAME" /> unregelmäßiger überprüft und entfernt. Es werden keine Daten zur Überprüfung an Google <ph name="SAFE_BROWSING_NAME" /> gesendet.</translation>
 <translation id="575647238840663288">Standardmäßig werden Dokumente zu an Ursprüngen gebundene Agent-Cluster hinzugefügt – die Funktion „document.domain“ kann für solche Dokumente nicht konfiguriert werden.</translation>
 <translation id="5756680608782814094">VPD-Informationen zu einem Gerät melden.
 
@@ -5736,7 +5746,6 @@
 <translation id="5883754873839596178">Wenn diese Richtlinie konfiguriert ist, legt sie die maximale Anzahl gleichzeitiger Verbindungen zum Proxyserver fest. Einige Proxyserver können eine hohe Anzahl gleichzeitiger Verbindungen pro Client nicht verarbeiten. Dieses Problem kann umgangen werden, indem für diese Richtlinie ein niedrigerer Wert festgelegt wird. Der Wert sollte kleiner als 100 und größer als 6 sein. Einige Web-Apps nutzen viele Verbindungen mit hängenden GETs. Daher kann ein Wert unter 32 dazu führen, dass der Browser hängt, wenn zu viele solcher Web-Apps geöffnet sind. Wenn du einen Wert unter dem Standardwert festlegst, geschieht dies auf eigenes Risiko.
 
       Ist diese Richtlinie nicht konfiguriert, so kommt der Standardwert von 32 zum Einsatz.</translation>
-<translation id="5885770645815872943">Safe Browsing-Erweiterungsschutz zulassen</translation>
 <translation id="5887414688706570295">Konfiguriert das TalkGadget-Präfix, das von Remotezugriff-Hosts verwendet wird, und verhindert, dass dieses von Nutzern geändert werden kann.
 
           Wenn dieses Präfix angegeben wird, wird es dem TalkGadget-Basisnamen vorangestellt, um einen vollständigen Domainnamen für das TalkGadget zu erstellen. Der Basisname der TalkGadget-Domain lautet ".talkgadget.google.com".
@@ -6375,7 +6384,6 @@
           Wenn diese Richtlinie deaktiviert ist, kann das <ph name="PRODUCT_OS_NAME" />-Gerät keine <ph name="GOOGLE_CALENDAR_NAME" />-Termine abrufen und im <ph name="PRODUCT_OS_NAME" />-Kalenderwidget in der Systemstatusleiste des angemeldeten Nutzers anzeigen.
 
           Ist die Richtlinie nicht konfiguriert, ist die <ph name="GOOGLE_CALENDAR_NAME" />-Funktion für Unternehmensnutzer standardmäßig aktiviert.</translation>
-<translation id="6450607392928079050">Der Safe Browsing-Erweiterungsschutz wird durch die <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />-Richtlinie gesteuert</translation>
 <translation id="6452882999388592166">Wenn diese Richtlinie aktiviert ist, wird die integrierte Komponentenerweiterung „CryptoToken“ beim Start geladen. Ist sie deaktiviert oder nicht konfiguriert, wird „CryptoToken“ beim Browserstart nicht geladen. Diese Richtlinie ist als vorübergehende Behelfslösung für Websites gedacht, die nicht funktionieren, weil „chrome.runtime“ als Nebeneffekt der Entfernung von „CryptoToken“ in Version M106 nicht definiert wird. Websites dürfen nicht davon abhängen, ob „chrome.runtime“ uneingeschränkt definiert ist.</translation>
 <translation id="6453641799812499182">Einschränkungen bei <ph name="CORS" />-Prüfungen in der neuen <ph name="CORS" />-Implementierung aktivieren</translation>
 <translation id="645425387487868471">Erzwungene Anmeldung für <ph name="PRODUCT_NAME" /> aktivieren</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index ff615b7e..64a3f2d 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -3276,7 +3276,6 @@
 
 Esta política solo será válida si la máquina está inscrita en <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> para <ph name="PRODUCT_NAME" />.
 Esta política siempre será válida para <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="3642557248926713561">Inhabilitar la protección para extensiones que otorga Navegación segura</translation>
 <translation id="3644735978203799620">Habilitar la selección automática para capturas de pantallas múltiples</translation>
 <translation id="3646859102161347133">Establece el tipo de lupa.</translation>
 <translation id="3647212518036289905">Si estableces la política, esta especificará qué biblioteca GSSAPI se debe usar para la autenticación HTTP. Puedes establecerla asignándole un nombre de biblioteca o una ruta completa.
@@ -5810,8 +5809,6 @@
       Si se establece como falsa o no se establece, se inhabilitarán las funciones de Web Components v0 de forma predeterminada, a partir de la versión M80.
 
       Después de Chrome 84, se quitará esta política.</translation>
-<translation id="5755149423476170868">Si habilitas esta política o no la estableces, <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> controlará la protección para extensiones que otorga <ph name="SAFE_BROWSING_NAME" /> en <ph name="PRODUCT_NAME" />. Si estableces <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> como <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> o <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, las extensiones maliciosas se inhabilitarán más rápido en <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> envía una solicitud al servidor de Navegación segura de Google para verificar si se eliminó una extensión de Chrome Web Store por considerarse problemática, es decir, por software malicioso, vulnerable o no deseado, o por incumplir las políticas de Chrome Web Store (CWS). Si se elimina una extensión, <ph name="PRODUCT_NAME" /> impedirá que los usuarios la instalen y la inhabilitará si ya está instalada.
-Si inhabilitas esta política, se inhabilitará la protección para extensiones que otorga <ph name="SAFE_BROWSING_NAME" />, y las extensiones maliciosas se revisarán y quitarán con menos frecuencia mediante <ph name="GOOGLE_UPDATE_NAME" />. No se envían datos a <ph name="SAFE_BROWSING_NAME" /> de Google para obtener veredictos.</translation>
 <translation id="575647238840663288">De forma predeterminada, es posible que los documentos se ubiquen en clústeres de agentes con clave de origen . document.domain no puede establecerse para esos documentos.</translation>
 <translation id="5756680608782814094">Envía información sobre los VPD de un dispositivo.
 
@@ -5929,7 +5926,6 @@
 <translation id="5883754873839596178">Si estableces la política, se especificará la cantidad máxima de conexiones en simultáneo al servidor proxy. Algunos servidores proxy no pueden soportar una gran cantidad de conexiones en simultáneo por cliente. Para solucionar este problema, establece un valor más bajo para esta política. El valor debe ser menor a 100 y mayor a 6. Algunas apps web son conocidas por utilizar muchas conexiones con solicitudes GET pendientes. Por lo tanto, si estableces un valor menor a 32 es posible que la red del navegador quede pendiente si hay demasiadas apps web con conexiones pendientes abiertas. Usa un valor menor al valor predeterminado bajo tu responsabilidad.
 
       Si no estableces la política, se usará el valor predeterminado de 32.</translation>
-<translation id="5885770645815872943">Permitir la protección para extensiones que otorga Navegación segura</translation>
 <translation id="5887414688706570295">Configura el prefijo TalkGadget que será utilizado por los hosts de acceso remoto y que evita que los usuarios lo cambien.
 
           Si se especifica, este prefijo se antepone al nombre base de TalkGadget para crear un nombre de dominio completo para TalkGadget. El nombre de dominio base de TalkGadget es ".talkgadget.google.com".
@@ -6624,7 +6620,6 @@
           Si inhabilitas esta política, el dispositivo <ph name="PRODUCT_OS_NAME" /> no podrá recuperar los eventos de <ph name="GOOGLE_CALENDAR_NAME" /> a fin de propagar el widget del calendario de <ph name="PRODUCT_OS_NAME" /> en la barra de estado del sistema para el usuario que accedió.
 
           Si no la estableces, la función <ph name="GOOGLE_CALENDAR_NAME" /> estará habilitada de forma predeterminada para los usuarios empresariales.</translation>
-<translation id="6450607392928079050">La política de <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> controla la protección para extensiones que otorga Navegación segura</translation>
 <translation id="6452882999388592166">Si habilitas la política, la extensión del componente CryptoToken integrada se cargará al iniciar el navegador. Si la inhabilitas o no la estableces, CryptoToken no se cargará al iniciar el navegador. Esta política es una solución temporal para los sitios que se inhabilitaron porque "chrome.runtime" quedó indefinido como efecto secundario de la eliminación de CryptoToken en M106. Los sitios web no deben depender de la definición incondicional de "chrome.runtime".</translation>
 <translation id="6453641799812499182">Permite que <ph name="CORS" /> revise las mitigaciones en la nueva implementación de <ph name="CORS" /></translation>
 <translation id="645425387487868471">Permitir forzar el acceso para <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 9022a45a..12572fc 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -3197,7 +3197,6 @@
 
 En el caso de <ph name="PRODUCT_NAME" />, esta política solo es efectiva si el equipo está registrado en <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" />.
 En el caso de <ph name="PRODUCT_OS_NAME" />, esta política siempre es efectiva.</translation>
-<translation id="3642557248926713561">Inhabilitar protección de extensiones de Navegación segura</translation>
 <translation id="3644735978203799620">Habilita la selección automática para capturas de multipantalla</translation>
 <translation id="3646859102161347133">Establecer el tipo de lupa</translation>
 <translation id="3647212518036289905">Si se define esta política, especificará qué biblioteca GSSAPI se debe usar para la autenticación HTTP. Puedes definirla como un nombre de biblioteca o una ruta completa.
@@ -5661,8 +5660,6 @@
       Si no se establece esta política o se le asigna el valor "false", las funciones v0 de los componentes web se inhabilitarán de forma predeterminada desde M80.
 
       Esta política se eliminará después de la versión 84 de Chrome.</translation>
-<translation id="5755149423476170868">Si esta política se habilita o no se define, <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> controlará la protección de extensiones de <ph name="SAFE_BROWSING_NAME" /> en <ph name="PRODUCT_NAME" />. Si se asigna el valor <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> o <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" /> a <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />, las extensiones maliciosas se inhabilitarán más rápido en <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> enviará una solicitud al servidor de Navegación segura de Google para comprobar si una extensión se ha retirado de Chrome Web Store por considerarse problemática (es decir, software malicioso, vulnerable o no deseado, o que infringe las políticas de Chrome Web Store). Si se ha retirado dicha extensión, <ph name="PRODUCT_NAME" /> impedirá que los usuarios la instalen y, si ya se ha instalado, la inhabilitará.
-Si se inhabilita esta política, se inhabilitará la protección de extensiones de <ph name="SAFE_BROWSING_NAME" />. Además, se comprobarán y se retirarán con menos frecuencia las extensiones malintencionadas mediante <ph name="GOOGLE_UPDATE_NAME" />. No se enviarán datos a <ph name="SAFE_BROWSING_NAME" /> de Google para obtener veredictos.</translation>
 <translation id="575647238840663288">De manera predeterminada, los documentos se pueden incluir en clústeres de agentes con clave de origen. El descriptor de acceso document.domain no podrá establecerse para esos documentos.</translation>
 <translation id="5756680608782814094">Envía información sobre VPD del dispositivo.
 
@@ -5780,7 +5777,6 @@
 <translation id="5883754873839596178">Establecer esta política permite especificar el número máximo de conexiones simultáneas al servidor proxy. Algunos servidores proxy no son capaces de gestionar un número elevado de conexiones simultáneas por cliente, lo que se puede solucionar estableciendo un valor inferior para esta política. El valor debe ser inferior a 100 y superior a 6. Algunas aplicaciones web consumen muchas conexiones con las solicitudes GET pendientes, por lo que un valor inferior a 32 puede hacer que la red del navegador se bloquee si se abren muchas aplicaciones web de este tipo. Si estableces un valor inferior al predeterminado, debes hacerlo bajo tu propia responsabilidad.
 
       Si no se establece esta política, se utilizará el valor predeterminado (32).</translation>
-<translation id="5885770645815872943">Permitir protección de extensiones de Navegación segura</translation>
 <translation id="5887414688706570295">Permite configurar el prefijo TalkGadget que utilizarán los hosts de acceso remoto y evita que los usuarios lo modifiquen.
 
          Si se especifica, este prefijo se antepone al nombre TalkGadget básico para crear un nombre de dominio completo para TalkGadget. El nombre de dominio TalkGadget básico es ".talkgadget.google.com".
@@ -6434,7 +6430,6 @@
           Si se inhabilita esta política, el dispositivo <ph name="PRODUCT_OS_NAME" /> no podrá recuperar eventos de <ph name="GOOGLE_CALENDAR_NAME" /> para rellenar el widget de calendario de <ph name="PRODUCT_OS_NAME" /> en la barra de estado del sistema del usuario que ha iniciado sesión.
 
           Si no se establece esta política, la función <ph name="GOOGLE_CALENDAR_NAME" /> estará habilitada de forma predeterminada para los usuarios de empresa.</translation>
-<translation id="6450607392928079050">La política <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> controla la protección de extensiones de Navegación segura</translation>
 <translation id="6452882999388592166">Si se habilita, la extensión del componente CryptoToken integrada se cargará al iniciar el navegador. Si se inhabilita o no se le asigna ningún valor, CryptoToken no se cargará cuando se inicie el navegador. Esta política está pensada como una solución temporal para los sitios que no funcionan por no haber definido `chrome.runtime`, que es un efecto secundario de haber eliminado CryptoToken en M106. Los sitios web no deben depender de que `chrome.runtime` se defina incondicionalmente.</translation>
 <translation id="6453641799812499182">Permite habilitar las mitigaciones de comprobación de <ph name="CORS" /> en la nueva implementación de <ph name="CORS" /></translation>
 <translation id="645425387487868471">Habilitar el inicio de sesión forzoso de <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 7fcd593..4f20ed71 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -3189,7 +3189,6 @@
 
 Cette règle n'est appliquée que si l'ordinateur est enregistré avec la règle <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> pour <ph name="PRODUCT_NAME" />.
 Elle est toujours appliquée pour <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="3642557248926713561">Désactiver la protection des extensions de la navigation sécurisée</translation>
 <translation id="3644735978203799620">Activer la sélection automatique de captures d'écran multiples</translation>
 <translation id="3646859102161347133">Définir le type de loupe</translation>
 <translation id="3647212518036289905">Permet de spécifier la bibliothèque GSSAPI à utiliser pour l'authentification HTTP. Vous pouvez indiquer le nom de la bibliothèque ou son chemin d'accès complet.
@@ -5646,8 +5645,6 @@
       Si elle est définie sur "False" ou si elle n'est pas définie, les fonctionnalités de Web Components v0 seront désactivées par défaut à compter de la version M80.
 
       Cette règle sera supprimée après Chrome 84.</translation>
-<translation id="5755149423476170868">Si cette règle est activée ou n'est pas configurée, la protection des extensions de la <ph name="SAFE_BROWSING_NAME" /> est contrôlée par <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> pour <ph name="PRODUCT_NAME" />. Si <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> est défini sur <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> ou <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, les extensions malveillantes sont désactivées plus rapidement dans <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> envoie une demande au serveur de navigation sécurisée Google pour vérifier si une extension a été retirée du Chrome Web Store car considérée comme un logiciel malveillant ou comme une extension problématique, malveillante ou vulnérable, ou ne respectant pas les règles du Chrome Web Store. Si une extension a été retirée, <ph name="PRODUCT_NAME" /> empêche les utilisateurs de l'installer et la désactive si elle est déjà installée.
-Si cette règle est désactivée, la protection des extensions de la <ph name="SAFE_BROWSING_NAME" /> est désactivée, et les extensions malveillantes sont vérifiées et supprimées moins régulièrement via <ph name="GOOGLE_UPDATE_NAME" />. Aucune donnée n'est envoyée à la <ph name="SAFE_BROWSING_NAME" /> Google pour les verdicts.</translation>
 <translation id="575647238840663288">Par défaut, les documents peuvent être placés dans des clusters d'agents selon l'origine. L'accesseur document.domain n'est pas configurable pour ces documents.</translation>
 <translation id="5756680608782814094">Transmet des informations sur les données VPD de l'appareil.
 
@@ -5764,7 +5761,6 @@
 <translation id="5883754873839596178">Cette règle permet de spécifier le nombre maximal de connexions simultanées au serveur proxy. Toutefois, certains serveurs proxy ne peuvent pas gérer de nombreuses connexions simultanées par client. Pour résoudre ce problème, il suffit de diminuer la valeur de cette règle, laquelle doit être supérieure à 6 et inférieure à 100. Certaines applications Web sont connues pour utiliser de nombreuses connexions avec des requêtes GET en attente. Par conséquent, si vous définissez une valeur inférieure à 32, le réseau du navigateur risque de se bloquer si trop d'applications Web avec des connexions de ce type sont ouvertes. Toute diminution de la valeur par défaut est effectuée à vos propres risques.
 
       Si cette règle n'est pas configurée, la valeur par défaut (32) est utilisée.</translation>
-<translation id="5885770645815872943">Autoriser la protection des extensions de la navigation sécurisée</translation>
 <translation id="5887414688706570295">Configure le préfixe TalkGadget utilisé par les hôtes d'accès à distance et empêche les utilisateurs de le modifier.
 
           S'il est défini, ce préfixe est ajouté au nom TalkGadget de base afin de créer un nom de domaine TalkGadget complet. Le nom de domaine TalkGadget de base est ".talkgadget.google.com".
@@ -6402,7 +6398,6 @@
           Si elle est désactivée, l'appareil <ph name="PRODUCT_OS_NAME" /> ne peut pas récupérer les événements <ph name="GOOGLE_CALENDAR_NAME" /> pour remplir le widget d'agenda <ph name="PRODUCT_OS_NAME" /> dans la barre d'état système pour l'utilisateur connecté.
 
           Si elle n'est pas configurée, la fonctionnalité <ph name="GOOGLE_CALENDAR_NAME" /> est activée par défaut pour les utilisateurs de la version Enterprise.</translation>
-<translation id="6450607392928079050">La protection des extensions de la navigation sécurisée est contrôlée par la règle <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">Si cette règle est activée, l'extension de composant CryptoToken intégrée sera chargée au démarrage. Si elle est désactivée ou n'est pas configurée, CryptoToken ne sera pas chargée au démarrage du navigateur. Cette règle est une solution temporaire pour les sites qui ne fonctionnent pas lorsque `chrome.runtime` n'est pas défini à la suite de la suppression de CryptoToken dans M106. Les sites Web ne doivent pas compter sur le fait que `chrome.runtime` soit défini sans conditions.</translation>
 <translation id="6453641799812499182">Atténuer les vérifications <ph name="CORS" /> dans la nouvelle mise en œuvre de <ph name="CORS" /></translation>
 <translation id="645425387487868471">Activer la connexion forcée pour <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 31daacc4..d2c7044 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -1540,6 +1540,7 @@
       Jika kebijakan disetel ke benar (true) atau tidak disetel, status jaringan perangkat akan dilaporkan.</translation>
 <translation id="2223393221350938149">Jangan izinkan situs apa pun menjalankan JIT JavaScript</translation>
 <translation id="2223598546285729819">Setelan pemberitahuan default</translation>
+<translation id="2224706708550115831">Mengizinkan browser pengguna mengakses daftar URL saat VPN Selalu Aktif diaktifkan dalam mode ketat dengan mengaktifkan kunci total dan saat VPN tidak terhubung</translation>
 <translation id="222673035924187991">Mengaktifkan Encrypted ClientHello TLS</translation>
 <translation id="2231817271680715693">Impor histori browseran dari browser default saat pertama kali dijalankan</translation>
 <translation id="2231962946025538735">Kebijakan ini tidak digunakan lagi. Gunakan kebijakan <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> untuk mengontrol ketersediaan plugin Flash dan <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> untuk mengontrol apakah penampil PDF yang terintegrasi akan digunakan untuk membuka file PDF atau tidak.
@@ -1678,6 +1679,8 @@
 
       Kebijakan ini hanya memengaruhi akses ke perangkat USB melalui WebUSB API. Untuk memberikan akses ke perangkat USB melalui Web Serial API, lihat kebijakan <ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" />.</translation>
 <translation id="2318583605563438459">Izinkan orang tua menambahkan akun yang diawasi</translation>
+<translation id="2319139030891093109">Daftar sertifikat TLS yang harus dipercaya oleh <ph name="PRODUCT_NAME" />.
+Sertifikat harus dienkode dengan base64.</translation>
 <translation id="2326031114717677574">Interval pada saat data audio diambil sampelnya dan dikumpulkan. Batas minimum yang diizinkan adalah 1 menit.
 
       Jika tidak disetel, interval default 15 menit akan berlaku.</translation>
@@ -2954,6 +2957,15 @@
 <translation id="3398051852031115795">Perilaku sistem default (bergantung pada ukuran layar)</translation>
 <translation id="3399859571630358395">Paksa penonaktifan Sambungan Cepat (penyambungan Bluetooth cepat).</translation>
 <translation id="3404681701763345449">Aktifkan Integrasi <ph name="GOOGLE_CALENDAR_NAME" />.</translation>
+<translation id="3405361833556012520">Kebijakan ini hanya berlaku untuk traffic browser. Play Store, navigasi web aplikasi Android, dan traffic pengguna lainnya seperti traffic VM Linux atau tugas pencetakan masih mematuhi batasan yang diberlakukan oleh VPN Selalu Aktif. Kebijakan ini hanya diterapkan saat VPN tidak terhubung dan hanya untuk traffic browser pengguna. Meskipun kebijakan ini diterapkan, traffic sistem juga dapat tidak menggunakan VPN Selalu Aktif untuk melakukan tugas seperti pengambilan kebijakan dan sinkronisasi jam sistem.
+
+Gunakan kebijakan ini untuk membuka pengecualian untuk skema tertentu, subdomain dari domain lain, port, atau jalur khusus, menggunakan format yang ditentukan di https://support.google.com/chrome/a?p=url_blocklist_filter_format. Filter yang paling spesifik akan menentukan apakah URL diblokir atau diizinkan.
+
+Jika <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> disetel, VPN Selalu Aktif dikonfigurasi, dan VPN Selalu Aktif tidak terhubung, navigasi ke semua host akan diblokir, kecuali yang diizinkan oleh kebijakan <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" />. Dalam status perangkat ini, <ph name="URL_BLOCKLIST_POLICY_NAME" /> dan <ph name="URL_ALLOWLIST_POLICY_NAME" /> diabaikan. Jika VPN Selalu Aktif terhubung, kebijakan <ph name="URL_BLOCKLIST_POLICY_NAME" /> dan <ph name="URL_ALLOWLIST_POLICY_NAME" /> diterapkan dan kebijakan <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> diabaikan.
+
+Kebijakan ini terbatas untuk 1.000 entri.
+
+Jika kebijakan tidak disetel, navigasi browser apa pun akan dicegah saat VPN Selalu Aktif dengan mode ketat diaktifkan dan VPN tidak terhubung.</translation>
 <translation id="3405997282295704902">Jangan izinkan pengguna menggunakan <ph name="PRODUCT_NAME" /></translation>
 <translation id="3406122462682235653">Jangan tanya pengguna (download langsung dimulai)</translation>
 <translation id="3408078762098350617">Mengontrol pengalaman pengguna fitur yang dinonaktifkan yang tercantum di <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />.
@@ -3282,7 +3294,6 @@
 
 Kebijakan ini hanya berlaku saat perangkat didaftarkan dengan <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> untuk <ph name="PRODUCT_NAME" />.
 Kebijakan ini selalu berlaku untuk <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="3642557248926713561">Nonaktifkan Perlindungan Ekstensi Safe Browsing</translation>
 <translation id="3644735978203799620">Mengaktifkan pemilihan otomatis untuk multi-screenshot</translation>
 <translation id="3646859102161347133">Menyetel jenis lup</translation>
 <translation id="3647212518036289905">Menyetel kebijakan akan menentukan library GSSAPI mana yang akan digunakan untuk autentikasi HTTP. Setel kebijakan ke nama library atau jalur lengkap.
@@ -4716,6 +4727,7 @@
 <translation id="4802905909524200151">Mengonfigurasi perilaku update firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" /></translation>
 <translation id="4804828344300125154">Selalu reboot saat pengguna logout.</translation>
 <translation id="4807950475297505572">Pengguna yang paling jarang digunakan dihapus sampai terdapat cukup ruang kosong</translation>
+<translation id="4808396444416188826">Sertifikat server TLS yang harus dipercaya oleh <ph name="PRODUCT_NAME" /></translation>
 <translation id="4812270373673968774">Jika kebijakan ditetapkan ke Selalu (Always), rak <ph name="PRODUCT_OS_NAME" /> akan disembunyikan secara otomatis. Jika kebijakan ditetapkan ke Tidak Pernah (Never), rak tidak akan pernah disembunyikan secara otomatis.
 
       Jika Anda menetapkan kebijakan, pengguna tidak dapat mengubahnya. Jika tidak ditetapkan, pengguna akan menentukan untuk menyembunyikan rak secara otomatis atau tidak.</translation>
@@ -5819,8 +5831,6 @@
       Jika kebijakan ini ditetapkan ke False atau tidak ditetapkan, fitur Web Components v0 akan dinonaktifkan secara default, mulai dari M80.
 
       Kebijakan ini akan dihapus setelah Chrome 84.</translation>
-<translation id="5755149423476170868">Jika kebijakan ini disetel ke aktif atau tidak disetel, perlindungan ekstensi <ph name="SAFE_BROWSING_NAME" /> untuk <ph name="PRODUCT_NAME" /> akan dikontrol oleh <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />. Jika <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> disetel ke <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> atau <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, ekstensi berbahaya akan dinonaktifkan lebih cepat di <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> mengirim permintaan ke server Google Safe Browsing untuk memeriksa apakah ekstensi telah dihapus dari Chrome Web Store karena dianggap bermasalah, yaitu software berbahaya, rentan, tidak diinginkan, atau melanggar kebijakan Chrome Web Store (CWS). Jika ekstensi dihapus, <ph name="PRODUCT_NAME" /> akan memblokir pengguna agar tidak menginstal ekstensi dan akan menonaktifkan ekstensi tersebut jika sudah diinstal.
-Jika kebijakan ini dinonaktifkan, perlindungan ekstensi <ph name="SAFE_BROWSING_NAME" /> akan dinonaktifkan dan ekstensi berbahaya akan diperiksa dan dihapus lebih jarang melalui <ph name="GOOGLE_UPDATE_NAME" />. Tidak ada data yang dikirim ke Google <ph name="SAFE_BROWSING_NAME" /> untuk meminta keputusan.</translation>
 <translation id="575647238840663288">Secara default, dokumen dapat ditempatkan di cluster agen dengan kunci asal. document.domain tidak dapat disetel untuk dokumen semacam ini.</translation>
 <translation id="5756680608782814094">Melaporkan informasi VPD perangkat.
 
@@ -5938,7 +5948,6 @@
 <translation id="5883754873839596178">Menyetel kebijakan akan menentukan jumlah maksimal koneksi simultan ke server proxy. Beberapa server proxy tidak dapat menangani koneksi serentak tiap klien dalam jumlah besar, yang dapat diselesaikan dengan menyetel kebijakan ini ke nilai yang lebih rendah. Nilai harus lebih rendah dari 100 dan lebih tinggi dari 6. Beberapa aplikasi web diketahui menggunakan banyak koneksi dengan GET yang macet, jadi dengan menyetel nilai lebih rendah dari 32 dapat menyebabkan jaringan browser menjadi macet jika terlalu banyak aplikasi web dengan jaringan macet terbuka. Turunkan di bawah nilai default dengan menanggung sendiri risikonya.
 
       Tidak menyetel kebijakan berarti nilai default 32 akan digunakan.</translation>
-<translation id="5885770645815872943">Izinkan Perlindungan Ekstensi Safe Browsing</translation>
 <translation id="5887414688706570295">Mengonfigurasi awalan TalkGadget yang akan digunakan oleh hosting akses jarak jauh dan mencegah pengguna mengubahnya.
 
           Jika ditentukan, awalan ini ditambahkan di depan nama TalkGadget dasar untuk membuat nama domain TalkGadget lengkap. Nama domain TalkGadget dasar adalah '.talkgadget.google.com'.
@@ -6634,7 +6643,6 @@
           Jika kebijakan ini disetel ke nonaktif, perangkat <ph name="PRODUCT_OS_NAME" /> tidak dapat mengambil acara <ph name="GOOGLE_CALENDAR_NAME" /> untuk mengisi widget kalender <ph name="PRODUCT_OS_NAME" /> di status bar sistem bagi pengguna yang login.
 
           Jika kebijakan ini tidak disetel, fitur <ph name="GOOGLE_CALENDAR_NAME" /> akan dinonaktifkan secara default bagi pengguna versi bisnis.</translation>
-<translation id="6450607392928079050">Perlindungan Ekstensi Safe Browsing dikontrol oleh kebijakan <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">Jika disetel ke Aktif, ekstensi komponen CryptoToken bawaan akan dimuat saat browser dimulai. Jika disetel ke Nonaktif atau tidak disetel, CryptoToken tidak akan dimuat saat browser dimulai. Kebijakan ini dimaksudkan sebagai solusi sementara untuk situs yang rusak karena `chrome.runtime` tidak ditentukan sebagai efek samping penghapusan CryptoToken di M106. Situs tidak boleh bergantung pada `chrome.runtime` yang ditentukan tanpa syarat.</translation>
 <translation id="6453641799812499182">Mengaktifkan mitigasi pemeriksaan <ph name="CORS" /> dalam implementasi <ph name="CORS" /> yang baru</translation>
 <translation id="645425387487868471">Aktifkan login paksa untuk <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 7b6f1bff..a12d90a 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -3193,7 +3193,6 @@
 
 Questo criterio viene applicato soltanto se la macchina viene registrata con <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> per <ph name="PRODUCT_NAME" />.
 Questo criterio viene sempre applicato per <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="3642557248926713561">Disattiva la protezione delle estensioni di Navigazione sicura</translation>
 <translation id="3644735978203799620">Consente di attivare la selezione automatica per le acquisizioni multischermo</translation>
 <translation id="3646859102161347133">Impostazione tipo di ingrandimento dello schermo</translation>
 <translation id="3647212518036289905">La configurazione del criterio consente di specificare quale libreria GSSAPI utilizzare per l'autenticazione HTTP. Imposta il criterio sul nome di una libreria o su un percorso completo.
@@ -5652,8 +5651,6 @@
       Se questo criterio viene impostato su False o non viene impostato, le funzionalità Web Components v0 verranno disattivate per impostazione predefinita a partire dalla versione M80.
 
       Questo criterio verrà rimosso nelle versioni successive alla versione 84 di Chrome.</translation>
-<translation id="5755149423476170868">Se questo criterio viene attivato o se non viene configurato, la protezione delle estensioni di <ph name="SAFE_BROWSING_NAME" /> verrà controllata da <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> per<ph name="PRODUCT_NAME" />. Se <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> viene impostato su <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> o <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, le estensioni dannose verranno disattivate più velocemente in <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> invia una richiesta al server di Google Navigazione sicura per verificare se un'estensione è stata rimossa dal Chrome Web Store per essere considerata software problematico, ovvero dannoso, vulnerabile o indesiderato o per violazione dei criteri del Chrome Web Store (CWS). Se un'estensione è stata rimossa, <ph name="PRODUCT_NAME" /> impedirà agli utenti di installarla e, se è già installata, la disattiverà.
-Se questo criterio viene disattivato, la protezione delle estensioni di <ph name="SAFE_BROWSING_NAME" /> verrà disattivata e le estensioni dannose verranno controllate e rimosse meno regolarmente tramite <ph name="GOOGLE_UPDATE_NAME" />. Nessun dato viene inviato a Google<ph name="SAFE_BROWSING_NAME" /> per gli esiti.</translation>
 <translation id="575647238840663288">Per impostazione predefinita, i documenti potrebbero essere inseriti in cluster di agenti in base all'origine. La funzione di accesso document.domain non è configurabile per questi documenti.</translation>
 <translation id="5756680608782814094">Segnala informazioni sui VPD di un dispositivo.
 
@@ -5770,7 +5767,6 @@
 <translation id="5883754873839596178">La configurazione del criterio consente di specificare il numero massimo di connessioni simultanee al server proxy. Alcuni server proxy non riescono a gestire un numero elevato di connessioni contemporanee per client, ma è sufficiente impostare il criterio su un numero inferiore per risolvere questo problema. Il valore deve essere inferiore a 100 e superiore a 6. Alcune app web sono note per richiedere molte connessioni con Hanging-GET, pertanto impostare un valore inferiore a 32 potrebbe causare interruzioni di rete del browser se sono aperte troppe app web di questo tipo. È sconsigliato utilizzare un valore inferiore a quello predefinito.
 
       Se il criterio non viene configurato, viene utilizzato il valore predefinito 32.</translation>
-<translation id="5885770645815872943">Consenti la protezione delle estensioni di Navigazione sicura</translation>
 <translation id="5887414688706570295">Consente di configurare il prefisso TalkGadget che verrà utilizzato dagli host di accesso remoto e impedisce agli utenti di modificarlo.
 
           Se specificato, questo prefisso viene anteposto al nome TalkGadget di base per creare un nome di dominio completo per TalkGadget. Il nome TalkGadget di base del dominio è "Talkgadget.google.com".
@@ -6431,7 +6427,6 @@
           Se questo criterio viene disattivato, il dispositivo <ph name="PRODUCT_OS_NAME" /> non può recuperare eventi <ph name="GOOGLE_CALENDAR_NAME" /> per completare il widget calendario di <ph name="PRODUCT_OS_NAME" /> nella barra di stato del sistema per l'utente che ha eseguito l'accesso.
 
           Se questo criterio non viene configurato, la funzionalità <ph name="GOOGLE_CALENDAR_NAME" /> è attiva per impostazione predefinita per gli utenti aziendali.</translation>
-<translation id="6450607392928079050">La protezione delle estensioni di Navigazione sicura viene controllata dal criterio <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">Se impostato su Attivato, l'estensione del componente CryptoToken integrata viene caricata all'avvio. Se impostato su Disattivato o se non viene configurato, CryptoToken non viene caricato all'avvio del browser. Questo criterio è inteso come soluzione alternativa temporanea per i siti non funzionanti perché "chrome.runtime" non è definito come effetto collaterale della rimozione di CryptoToken nella versione M106. I siti web non devono dipendere dalla definizione senza condizioni di "chrome.runtime".</translation>
 <translation id="6453641799812499182">Attiva le mitigazioni dei controlli <ph name="CORS" /> nella nuova implementazione <ph name="CORS" /></translation>
 <translation id="645425387487868471">Attiva l'accesso forzato per <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 9fe224f..70780b1 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1478,6 +1478,7 @@
       このポリシーを true に設定するか未設定のままにした場合、デバイスのネットワークのステータスが報告されます。</translation>
 <translation id="2223393221350938149">どのサイトにも JavaScript JIT の実行を許可しない</translation>
 <translation id="2223598546285729819">デフォルトの通知設定</translation>
+<translation id="2224706708550115831">ロックダウンが有効になっている厳格モードの常時接続 VPN が有効で接続されていないときに、ユーザーのブラウザにリストの URL へのアクセスを許可する</translation>
 <translation id="222673035924187991">TLS 暗号化 ClientHello を有効にする</translation>
 <translation id="2231817271680715693">初回実行時にデフォルトのブラウザから閲覧履歴をインポートする</translation>
 <translation id="2231962946025538735">このポリシーはサポートを終了しました。Flash プラグインを使用できるかどうかを管理するには <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> を使用してください。また、PDF ファイルを開く際に組み込みの PDF ビューアを使用するかどうかを管理するには <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> を使用してください。
@@ -1592,6 +1593,8 @@
 パスワードの同期が(ユーザー設定または <ph name="SYNC_DISABLED" /> ポリシーの有効化により)無効になっている場合、この機能は使用できません。</translation>
 <translation id="2316700579410680894">このポリシーでは、特定のベンダー ID と製品 ID の USB デバイスへのアクセスを自動的に許可するサイトの URL パターンリストを指定できます。ポリシーを有効にするには、リストの各項目で「<ph name="DEVICES_FIELD_NAME" />」フィールドと「<ph name="URLS_FIELD_NAME" />」フィールドの両方を指定する必要があります。「<ph name="DEVICES_FIELD_NAME" />」フィールドの各項目には、「<ph name="VENDOR_ID_FIELD_NAME" />」フィールドと「<ph name="PRODUCT_ID_FIELD_NAME" />」フィールドを指定できます。「<ph name="VENDOR_ID_FIELD_NAME" />」フィールドを省略した場合、あらゆるデバイスに一致するポリシーが作成されます。「<ph name="PRODUCT_ID_FIELD_NAME" />」フィールドを省略した場合、指定したベンダー ID のあらゆるデバイスに一致するポリシーが作成されます。「<ph name="PRODUCT_ID_FIELD_NAME" />」フィールドを指定して「<ph name="VENDOR_ID_FIELD_NAME" />」フィールドは指定しなかった場合、ポリシーは無効になります。USB のアクセス許可モデルでは、指定した URL に最上位のオリジンとして USB デバイスへのアクセスを許可します。埋め込みフレームから USB デバイスにアクセスする必要がある場合は、「usb」<ph name="FEATURE_POLICY_HEADER_NAME" /> ヘッダーを使用してアクセスを許可します。必ず有効な URL を指定してください。無効な URL を指定した場合、このポリシーは無視されます。サポートの終了: USB のアクセス許可モデルでは、以前はリクエスト元 URL と埋め込み元 URL の両方を指定してアクセスを許可することができました。現在このサポートは終了し、次の方法による下位互換のみがサポートされています。リクエスト元 URL と埋め込み元 URL の両方を指定した場合、埋め込み元 URL は最上位のオリジンとしてアクセスが許可され、リクエスト元 URL は完全に無視されます。このポリシーは、<ph name="DEFAULT_WEB_USB_GUARD_SETTING_POLICY_NAME" />、<ph name="WEB_USB_ASK_FOR_URLS_POLICY_NAME" />、<ph name="WEB_USB_BLOCKED_FOR_URLS_POLICY_NAME" />、ユーザーの設定をオーバーライドします。このポリシーは、WebUSB API 経由での USB デバイスへのアクセスのみに影響を与えます。Web Serial API 経由での USB デバイスへのアクセスを許可するには、<ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" /> ポリシーを参照してください。</translation>
 <translation id="2318583605563438459">保護者による管理対象のアカウントの追加を許可する</translation>
+<translation id="2319139030891093109"><ph name="PRODUCT_NAME" /> が信頼する TLS 証明書のリスト。
+証明書は Base64 でエンコードする必要があります。</translation>
 <translation id="2326031114717677574">オーディオ データをサンプリングして収集する間隔です。指定できる最小値は 1 分です。
 
       設定しない場合は、デフォルトの 15 分が適用されます。</translation>
@@ -2774,6 +2777,15 @@
 <translation id="3398051852031115795">システムのデフォルトの挙動(画面サイズによって異なる)</translation>
 <translation id="3399859571630358395">ファスト ペアリング(ファスト Bluetooth ペアリング)を強制的に無効にする。</translation>
 <translation id="3404681701763345449"><ph name="GOOGLE_CALENDAR_NAME" /> 統合を有効にする。</translation>
+<translation id="3405361833556012520">このポリシーはブラウザのトラフィック(Google Play ストア、Android アプリのウェブ ナビゲーション、その他 Linux VM トラフィックや印刷ジョブなどのユーザー トラフィック)にのみ適用され、常時接続 VPN による制限は引き続き適用されます。このポリシーは、VPN に接続されていないときに、ユーザーのブラウザ トラフィックにのみ適用されます。このポリシーを適用した場合、システム トラフィックは常時接続 VPN をバイパスして、ポリシーの取得やシステム クロックの同期などのタスクを実行することもできます。
+
+このポリシーは、特定のスキームや、他のドメインのサブドメイン、ポート、特定のパスに例外を設定する場合に使用します。設定の際は、https://support.google.com/chrome/a?p=url_blocklist_filter_format で指定された形式を使用します。URL のブロックや許可は、最も具体的なフィルタによって決定されます。
+
+<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> を設定した場合、常時接続 VPN が設定済みで、接続されていないときは、すべてのホストへのナビゲーションがブロックされます(ただし、<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> ポリシーで許可されているホストを除きます)。このデバイス状態では、<ph name="URL_BLOCKLIST_POLICY_NAME" /> と <ph name="URL_ALLOWLIST_POLICY_NAME" /> は無視されます。常時接続 VPN に接続されているときは、<ph name="URL_BLOCKLIST_POLICY_NAME" /> と <ph name="URL_ALLOWLIST_POLICY_NAME" /> ポリシーが適用され、<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> ポリシーは無視されます。
+
+このポリシーで指定できる URL は最大 1,000 件です。
+
+このポリシーを未設定のままにした場合、厳格モードの常時接続 VPN が有効で接続されていないとき、ブラウザ ナビゲーションはブロックされます。</translation>
 <translation id="3405997282295704902">ユーザーに <ph name="PRODUCT_NAME" /> の使用を許可しない</translation>
 <translation id="3406122462682235653">ユーザーに確認しない(すぐにダウンロードを開始する)</translation>
 <translation id="3408078762098350617"><ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" /> で指定し無効にした機能のユーザー エクスペリエンスを管理します。
@@ -3095,7 +3107,6 @@
 
 <ph name="PRODUCT_NAME" /> の場合、このポリシーは <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> で登録されたマシンでのみ有効です。
 <ph name="PRODUCT_OS_NAME" /> の場合、このポリシーは常に有効です。</translation>
-<translation id="3642557248926713561">セーフ ブラウジングによる拡張機能の保護を無効にする</translation>
 <translation id="3644735978203799620">マルチ スクリーン キャプチャの自動選択を有効にする</translation>
 <translation id="3646859102161347133">画面拡大鏡のタイプを設定する</translation>
 <translation id="3647212518036289905">このポリシーでは、HTTP 認証で使用する GSSAPI ライブラリを指定できます。ポリシーには、ライブラリ名またはフルパスのいずれかを指定します。
@@ -4427,6 +4438,7 @@
 <translation id="4802905909524200151"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> ファームウェア アップデートの動作を設定する</translation>
 <translation id="4804828344300125154">ユーザーがログアウトするたびに再起動します。</translation>
 <translation id="4807950475297505572">十分な空き容量に達するまで、前回のログインから時間が経っているユーザーを順に削除する</translation>
+<translation id="4808396444416188826"><ph name="PRODUCT_NAME" /> が信頼する TLS サーバー証明書</translation>
 <translation id="4812270373673968774">このポリシーを [常に使用] に設定した場合、<ph name="PRODUCT_OS_NAME" /> シェルフが自動的に非表示になります。このポリシーを [使用しない] に設定した場合、シェルフが非表示になることがなくなります。このポリシーを設定した場合、ユーザーは設定を変更できません。設定しない場合、シェルフが自動的に非表示になるかどうかをユーザーが指定します。</translation>
 <translation id="4812309945046430049">赤色のキーボード バックライト</translation>
 <translation id="4812714598405913256">DeviceMinimumVersion ポリシー用の自動更新の有効期限に関するメッセージを設定する</translation>
@@ -5434,8 +5446,6 @@
       このポリシーを True に設定した場合、Web Components v0 の機能はすべてのサイトで有効になります。このポリシーを False に設定するか未設定のままにした場合、Web Components v0 の機能は M80 以降においてデフォルトで無効になります。
 
       このポリシーは、Chrome 84 以降で削除されます。</translation>
-<translation id="5755149423476170868">このポリシーを有効にするか未設定のままにした場合、<ph name="PRODUCT_NAME" /> の <ph name="SAFE_BROWSING_NAME" /> による拡張機能の保護は <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> によって管理されます。<ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> を <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> または <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" /> に設定した場合、不正な拡張機能は <ph name="PRODUCT_NAME" /> でただちに無効になります。<ph name="PRODUCT_NAME" /> は Google セーフ ブラウジング サーバーにリクエストを送信し、Chrome ウェブストアで該当の拡張機能に問題(不正、脆弱、望ましくないソフトウェア、Chrome ウェブストア(CWS)のポリシー違反など)があると判断され、削除されているかどうか確認します。削除されている場合は、<ph name="PRODUCT_NAME" /> で拡張機能をインストールできないようブロックし、すでにインストールされている場合は拡張機能を無効にします。
-このポリシーを無効にした場合、<ph name="SAFE_BROWSING_NAME" /> による拡張機能の保護は無効になり、<ph name="GOOGLE_UPDATE_NAME" /> で不正な拡張機能のチェックと削除は行われますが、頻度は低くなります。検証データが Google <ph name="SAFE_BROWSING_NAME" /> に送信されることはありません。</translation>
 <translation id="575647238840663288">デフォルトで、必要に応じてドキュメントをオリジンキー エージェント クラスタに割り当てる(対象のドキュメントでは document.domain は設定不可能)。</translation>
 <translation id="5756680608782814094">デバイスの VPD に関する情報を報告します。
 
@@ -5547,7 +5557,6 @@
 <translation id="5883754873839596178">このポリシーでは、プロキシ サーバーへの最大同時接続数を指定できます。プロキシ サーバーによっては 1 クライアントに対して多数の同時接続を処理できない場合があります。この問題を解決するには、このポリシーを小さい値に設定します。この値は 7 以上 100 未満の間で指定する必要があります。一部のウェブアプリは、GET がハングした接続を複数同時に行う場合があります。そのため、32 より小さい値を設定した場合、接続がハングしているウェブアプリを多く開きすぎると、ブラウザのネットワーク接続が異常停止する可能性があります。なお、デフォルト値より小さい値を設定する場合は、ご自身の責任において行ってください。
 
       このポリシーを未設定のままにした場合、デフォルト値の 32 が使用されます。</translation>
-<translation id="5885770645815872943">セーフ ブラウジングによる拡張機能の保護を許可する</translation>
 <translation id="5887414688706570295">リモート アクセス ホストが使用する TalkGadget プレフィックスを設定し、ユーザーが変更できないようにします。
 
           これを指定すると、ベースとなる TalkGadget 名の前にこのプレフィックスが付いて、TalkGadget のフルドメイン名となります。ベースとなる TalkGadget ドメイン名は「.talkgadget.google.com」です。
@@ -6152,7 +6161,6 @@
           このポリシーを無効にした場合、<ph name="PRODUCT_OS_NAME" /> デバイスでは <ph name="GOOGLE_CALENDAR_NAME" /> の予定を取得し、ユーザーがログインしているときにシステム ステータスバーの <ph name="PRODUCT_OS_NAME" /> カレンダー ウィジェットに表示することはできません。
 
           このポリシーを未設定のままにした場合、<ph name="GOOGLE_CALENDAR_NAME" /> 機能は企業ユーザーに対してデフォルトで有効になります。</translation>
-<translation id="6450607392928079050">セーフ ブラウジングによる拡張機能の保護を <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> ポリシーで制御する</translation>
 <translation id="6452882999388592166">有効に設定すると、起動時に組み込みの CryptoToken コンポーネント拡張機能が読み込まれます。無効に設定するか未設定のままにした場合、ブラウザの起動時に CryptoToken は読み込まれません。このポリシーは、M106 での CryptoToken 削除の副作用である、「chrome.runtime」が定義されていないため動作しないサイトに一時的に対応するためのものです。ウェブサイトは、「chrome.runtime」が無条件に定義されている状態を前提としないよう設定する必要があります。</translation>
 <translation id="6453641799812499182">新しい <ph name="CORS" /> の実装で <ph name="CORS" /> チェックの緩和措置を有効にする</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> への強制ログインを有効にする</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 4c9e0882..43454dc 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1514,6 +1514,7 @@
       정책을 True로 설정하거나 설정하지 않으면 기기의 네트워크 상태가 보고됩니다.</translation>
 <translation id="2223393221350938149">모든 사이트에서 자바스크립트 JIT를 실행하도록 허용 안함</translation>
 <translation id="2223598546285729819">기본 알림 설정</translation>
+<translation id="2224706708550115831">잠금이 사용 설정되고 VPN이 연결되지 않은 상태에서 상시 사용 설정 VPN이 엄격 모드로 활성화되어 있는 동안 URL 목록에 대한 사용자 브라우저 액세스 허용</translation>
 <translation id="222673035924187991">TLS Encrypted ClientHello 사용</translation>
 <translation id="2231817271680715693">처음 실행 시 기본 브라우저에서 인터넷 사용기록 가져오기</translation>
 <translation id="2231962946025538735">지원 중단된 정책입니다. <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" />을 사용하여 Flash 플러그인의 사용 가능 여부를 제어하고 <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" />를 사용하여 PDF 파일을 열 때 통합 PDF 뷰어를 사용할지 선택하세요.
@@ -1652,6 +1653,8 @@
 
       이 정책은 WebUSB API를 통한 USB 기기 액세스에만 영향을 미칩니다. Web Serial API를 통한 USB 기기 액세스 권한을 부여하려면 <ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" /> 정책을 확인하세요.</translation>
 <translation id="2318583605563438459">부모가 감독 대상 계정을 추가하도록 허용</translation>
+<translation id="2319139030891093109"><ph name="PRODUCT_NAME" />에서 신뢰할 수 있는 TLS 인증서 목록입니다.
+인증서는 base64로 인코딩되어야 합니다.</translation>
 <translation id="2326031114717677574">오디오 데이터가 샘플링 및 수집되는 속도입니다. 허용되는 최솟값은 1분입니다.
 
       정책을 설정하지 않으면 기본 속도인 15분이 적용됩니다.</translation>
@@ -2882,6 +2885,15 @@
 <translation id="3398051852031115795">기본 시스템 동작(화면 크기에 따라 다름)</translation>
 <translation id="3399859571630358395">빠른 페어링(빠른 블루투스 페어링)이 사용 중지되도록 강제 적용</translation>
 <translation id="3404681701763345449"><ph name="GOOGLE_CALENDAR_NAME" /> 통합을 사용 설정합니다.</translation>
+<translation id="3405361833556012520">이 정책은 브라우저 트래픽에만 적용됩니다. Play 스토어, Android 앱의 웹 탐색, 기타 사용자 트래픽(예: Linux VM 트래픽 또는 인쇄 작업)은 상시 사용 설정 VPN에서 부과하는 제한사항을 여전히 준수합니다. 이 정책은 VPN이 연결되지 않은 상태에서 사용자 브라우저 트래픽에 대해서만 시행됩니다. 이 정책이 시행되는 동안 시스템 트래픽은 상시 사용 설정 VPN을 우회하여 정책 가져오기 및 시스템 시계 동기화와 같은 작업을 수행할 수도 있습니다.
+
+이 정책을 사용하면 https://support.google.com/chrome/a?p=url_blocklist_filter_format에 지정된 형식을 통해 특정 스키마, 다른 도메인의 하위 도메인, 포트 또는 특정 경로에 대한 예외 목록을 열 수 있습니다. 가장 구체적인 필터에 따라 URL 차단 또는 허용 여부가 결정됩니다.
+
+<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 정책이 설정되어 있으면 상시 사용 설정 VPN이 구성되고, 상시 사용 설정 VPN이 연결되지 않으며, <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 정책에서 허용하는 호스트를 제외한 모든 호스트로의 이동이 차단됩니다. 이 기기 상태에서 <ph name="URL_BLOCKLIST_POLICY_NAME" /> 및 <ph name="URL_ALLOWLIST_POLICY_NAME" /> 정책은 무시됩니다. 상시 사용 설정 VPN이 연결되면, <ph name="URL_BLOCKLIST_POLICY_NAME" /> 및 <ph name="URL_ALLOWLIST_POLICY_NAME" /> 정책이 적용되고 <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 정책은 무시됩니다.
+
+정책의 항목은 1,000개로 제한됩니다.
+
+정책을 설정하지 않으면 엄격 모드에서 상시 사용 설정 VPN이 활성화되고 VPN이 연결되지 않은 동안 브라우저 탐색이 차단됩니다.</translation>
 <translation id="3405997282295704902">사용자가 <ph name="PRODUCT_NAME" />을(를) 사용하도록 허용 안함</translation>
 <translation id="3406122462682235653">사용자에게 확인하지 않음(다운로드 즉시 시작)</translation>
 <translation id="3408078762098350617"><ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" /> 목록에 있는 사용 중지된 기능의 사용자 환경을 제어합니다.
@@ -3192,7 +3204,6 @@
 
 <ph name="PRODUCT_NAME" />의 경우 이 정책은 기기가 <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" />에 등록되어 있을 때만 적용됩니다.
 <ph name="PRODUCT_OS_NAME" />의 경우 이 정책이 항상 적용됩니다.</translation>
-<translation id="3642557248926713561">세이프 브라우징 확장 프로그램 보호 사용 중지</translation>
 <translation id="3644735978203799620">다중 화면 캡처를 위한 자동 선택 사용</translation>
 <translation id="3646859102161347133">화면 돋보기 유형 설정</translation>
 <translation id="3647212518036289905">정책을 설정하면 HTTP 인증에 사용할 GSSAPI 라이브러리가 지정됩니다. 정책을 라이브러리 이름 또는 전체 경로 중 하나로 설정합니다.
@@ -4576,6 +4587,7 @@
 <translation id="4802905909524200151"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> 펌웨어 업데이트 동작 설정</translation>
 <translation id="4804828344300125154">사용자 로그아웃 시 항상 재부팅합니다.</translation>
 <translation id="4807950475297505572">충분한 공간을 확보할 때까지 가장 오래된 사용자가 삭제됩니다.</translation>
+<translation id="4808396444416188826"><ph name="PRODUCT_NAME" />에서 신뢰할 수 있는 TLS 서버 인증서</translation>
 <translation id="4812270373673968774">정책을 Always로 설정하면 <ph name="PRODUCT_OS_NAME" /> 앱 표시줄이 자동 숨김됩니다. 정책을 Never로 설정하면 앱 표시줄이 자동 숨김되지 않습니다.
 
       정책을 설정하면 사용자가 변경할 수 없습니다. 정책을 설정하지 않으면 사용자가 앱 표시줄의 자동 숨김 여부를 결정합니다.</translation>
@@ -5668,8 +5680,6 @@
       False로 설정되어 있거나 설정되어 있지 않은 경우 Web Components v0 기능이 M80에서부터 기본적으로 사용 중지됩니다.
 
       이 정책은 Chrome 84 이후 삭제됩니다.</translation>
-<translation id="5755149423476170868">정책을 사용 설정하거나 설정하지 않으면 <ph name="SAFE_BROWSING_NAME" /> 확장 프로그램 보호를 <ph name="PRODUCT_NAME" />용 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />에서 제어합니다. <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />을 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> 또는 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />으로 설정하면 <ph name="PRODUCT_NAME" />에서 악성 확장 프로그램이 더 빠르게 사용 중지됩니다. <ph name="PRODUCT_NAME" />에서는 악성 소프트웨어, 취약한 소프트웨어, 원치 않는 소프트웨어, Chrome 웹 스토어(CWS) 정책을 위반하는 소프트웨어 등 문제가 있는 것으로 간주되어 확장 프로그램이 Chrome 웹 스토어에서 게시 중단되었는지 확인하기 위해 요청을 Google 세이프 브라우징 서버로 전송합니다. 확장 프로그램이 게시 중단된 경우 <ph name="PRODUCT_NAME" />에서 사용자가 확장 프로그램을 설치하지 못하도록 차단하고 이미 설치된 경우 확장 프로그램을 사용 중지합니다.
-정책을 사용 중지하면 <ph name="SAFE_BROWSING_NAME" /> 확장 프로그램 보호가 사용 중지되며 <ph name="GOOGLE_UPDATE_NAME" />을 통해 확인 및 삭제 빈도가 줄어듭니다. 판단을 위해 데이터가 Google <ph name="SAFE_BROWSING_NAME" />으로 전송되지도 않습니다.</translation>
 <translation id="575647238840663288">기본적으로 문서를 출처 관련 에이전트 클러스터에 배치할 수 있고 이러한 문서에 대해 document.domain을 설정할 수 없습니다.</translation>
 <translation id="5756680608782814094">기기의 VPD 정보를 보고합니다.
 
@@ -5786,7 +5796,6 @@
 <translation id="5883754873839596178">정책을 설정하면 프록시 서버에 동시 연결할 수 있는 최대 대수가 지정됩니다. 일부 프록시 서버는 클라이언트당 많은 수의 동시 연결을 처리할 수 없으며 정책을 더 낮은 값으로 설정하여 해결할 수 있습니다. 값은 6보다 크고 100보다 작아야 합니다. 일부 웹 앱은 중지 상태인 GET에 너무 많은 연결을 사용하는 것으로 알려져 있으므로 32 밑으로 낮추면 연결이 중지 상태인 웹 앱이 여러 개 열려 있을 때 브라우저 네트워크가 끊길 수 있습니다. 기본값 밑으로 낮추는 데 따르는 위험은 사용자가 감수해야 합니다.
 
       정책을 설정하지 않으면 기본값 32가 사용됩니다.</translation>
-<translation id="5885770645815872943">세이프 브라우징 확장 프로그램 보호 사용</translation>
 <translation id="5887414688706570295">원격 액세스 호스트가 사용할 TalkGadget 프리픽스를 구성하여 사용자가 변경하지 못하게 합니다.
 
           이 설정을 지정하면 TalkGadget에 대한 전체 도메인 이름을 만들 수 있는 기본 TalkGadget 이름에 이 프리픽스가 추가됩니다. 기본 TalkGadget 이름은 '.talkgadget.google.com'입니다.
@@ -6427,7 +6436,6 @@
           정책을 사용 중지하면 <ph name="PRODUCT_OS_NAME" /> 기기에서 <ph name="GOOGLE_CALENDAR_NAME" /> 이벤트를 검색하여 로그인한 사용자의 시스템 상태 표시줄에 있는 <ph name="PRODUCT_OS_NAME" /> 캘린더 위젯을 채울 수 없습니다.
 
           정책을 설정하지 않으면 기업 사용자의 경우 <ph name="GOOGLE_CALENDAR_NAME" /> 기능이 기본적으로 사용 설정됩니다.</translation>
-<translation id="6450607392928079050">세이프 브라우징 확장 프로그램 보호가 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> 정책에 의해 제어됩니다.</translation>
 <translation id="6452882999388592166">정책을 사용으로 설정하면 브라우저 시작 시 내장된 CryptoToken 구성요소 확장 프로그램이 로드됩니다. 사용 안함으로 설정하거나 설정하지 않으면 시작 시 CryptoToken이 로드되지 않습니다. 이 정책은 M106에서 CryptoToken이 삭제되면서 발생한 부작용으로 `chrome.runtime`이 정의되지 않음에 따라 손상된 사이트를 수정하기 위한 임시방편입니다. 웹사이트에서는 무조건적으로 정의되는 `chrome.runtime`에 의존해서는 안 됩니다.</translation>
 <translation id="6453641799812499182">새로운 <ph name="CORS" /> 구현에서 <ph name="CORS" /> 확인 완화를 사용 설정</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> 강제 로그인 사용</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 3b79042..78fedd95 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1515,6 +1515,7 @@
       Als je het beleid instelt op True of niet instelt, wordt de netwerkstatus van het apparaat gerapporteerd.</translation>
 <translation id="2223393221350938149">Niet toestaan dat sites JavaScript JIT uitvoeren</translation>
 <translation id="2223598546285729819">Standaardinstelling voor meldingen</translation>
+<translation id="2224706708550115831">Toestaan dat de browser van de gebruiker toegang krijgt tot een lijst met URL's terwijl het Always-on VPN actief is in de strikte modus, lockdown aanstaat en het VPN niet is verbonden</translation>
 <translation id="222673035924187991">ClientHallo met TLS-versleuteling aanzetten</translation>
 <translation id="2231817271680715693">Browsegeschiedenis importeren uit standaardbrowser bij eerste uitvoering</translation>
 <translation id="2231962946025538735">Dit beleid is beëindigd. Gebruik het beleid <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> om de beschikbaarheid van de Flash-plug-in te beheren en het beleid <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> om aan te geven of de geïntegreerde pdf-viewer moet worden gebruikt om pdf-bestanden te openen.
@@ -1653,6 +1654,8 @@
 
       Dit beleid heeft alleen effect op USB-apparaten via de WebUSB API. Zie het beleid <ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" /> als je USB-apparaten toegang wilt geven via de Web Serial API.</translation>
 <translation id="2318583605563438459">Toestaan dat ouders accounts toevoegen die onder toezicht staan</translation>
+<translation id="2319139030891093109">Een lijst met TLS-certificaten die <ph name="PRODUCT_NAME" /> moet vertrouwen.
+Certificaten moeten base64-gecodeerd zijn.</translation>
 <translation id="2326031114717677574">Snelheid waarmee audiogegevens worden bemonsterd en verzameld. Het toegestane minimum is 1 minuut.
 
       Als je dit beleid niet instelt, is de standaardsnelheid van 15 minuten van toepassing.</translation>
@@ -2878,6 +2881,15 @@
 <translation id="3398051852031115795">Standaard systeemgedrag (afhankelijk van schermgrootte)</translation>
 <translation id="3399859571630358395">Snel koppelen (snelle bluetooth-koppeling) geforceerd uitzetten.</translation>
 <translation id="3404681701763345449"><ph name="GOOGLE_CALENDAR_NAME" />-integratie aanzetten.</translation>
+<translation id="3405361833556012520">Dit beleid is alleen van toepassing op browserverkeer: de Play Store, webnavigatie in Android-apps en ander gebruikersverkeer (zoals Linux VM-verkeer of afdruktaken) voldoen nog steeds aan de beperkingen die worden opgelegd door het Always-on VPN. Dit beleid wordt alleen afgedwongen als het VPN niet is verbonden en alleen voor browserverkeer van gebruikers. Als dit beleid wordt afgedwongen, kan systeemverkeer het Always-on VPN ook overslaan om taken uit te voeren zoals beleid ophalen en de systeemklok synchroniseren.
+
+Gebruik dit beleid om uitzonderingen voor bepaalde schema's, subdomeinen van andere domeinen, poorten of specifieke paden te openen met de indeling die wordt gespecificeerd op https://support.google.com/chrome/a?p=url_blocklist_filter_format. Het meest specifieke filter bepaalt of een URL wordt geblokkeerd of toegestaan.
+
+Als het <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> is ingesteld, is er een Always-on VPN ingesteld en is het Always-on VPN niet verbonden. Navigatie naar alle hosts wordt geblokkeerd, behalve naar hosts die zijn toegestaan door het beleid <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" />. In deze apparaatstatus worden de beleidsregels <ph name="URL_BLOCKLIST_POLICY_NAME" /> en <ph name="URL_ALLOWLIST_POLICY_NAME" /> genegeerd. Als een Always-on VPN verbinding maakt, worden de beleidsregels <ph name="URL_BLOCKLIST_POLICY_NAME" /> en <ph name="URL_ALLOWLIST_POLICY_NAME" /> toegepast en wordt het beleid <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> genegeerd.
+
+Dit beleid is beperkt tot 1000 items.
+
+Als je het beleid niet instelt, wordt browsernavigatie voorkomen als het Always-on VPN met strikte modus actief is en het VPN geen verbinding heeft.</translation>
 <translation id="3405997282295704902">Niet toestaan dat gebruikers <ph name="PRODUCT_NAME" /> gebruiken</translation>
 <translation id="3406122462682235653">De gebruiker niet vragen (downloads beginnen meteen)</translation>
 <translation id="3408078762098350617">Hiermee beheer je de gebruikerservaring voor uitgezette functies die worden vermeld in <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />.
@@ -3183,7 +3195,6 @@
 
 Dit beleid is alleen van kracht als de machine is ingeschreven met <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> voor <ph name="PRODUCT_NAME" />.
 Dit beleid is altijd van kracht voor <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="3642557248926713561">Safe Browsing-extensiebeveiliging uitzetten</translation>
 <translation id="3644735978203799620">Zet automatisch selecteren aan voor opnamen van meerdere schermen</translation>
 <translation id="3646859102161347133">Het type vergrootglas instellen</translation>
 <translation id="3647212518036289905">Als je het beleid instelt, geef je aan welke GSSAPI-bibliotheek moet worden gebruikt voor HTTP-verificatie. Stel het beleid in op een bibliotheeknaam of een volledig pad.
@@ -4542,6 +4553,7 @@
 <translation id="4802905909524200151">Updategedrag voor <ph name="TPM_FIRMWARE_UPDATE_TPM" />-firmware configureren</translation>
 <translation id="4804828344300125154">Altijd opnieuw opstarten na uitloggen gebruiker.</translation>
 <translation id="4807950475297505572">De gebruikers die het langst geleden gebruikt zijn, worden verwijderd totdat er voldoende vrije ruimte is</translation>
+<translation id="4808396444416188826">TLS-servercertificaten die <ph name="PRODUCT_NAME" /> moet vertrouwen</translation>
 <translation id="4812270373673968774">Als je het beleid instelt op 'Always', wordt de <ph name="PRODUCT_OS_NAME" />-plank automatisch verborgen. Als je het beleid instelt op 'Never', wordt de plank nooit automatisch verborgen.
 
       Als je het beleid instelt, kunnen gebruikers het niet wijzigen. Als je het beleid niet instelt, kunnen gebruikers zelf aangeven of de plank automatisch moet worden verborgen.</translation>
@@ -5615,8 +5627,6 @@
       Als dit beleid is ingesteld op False of niet is ingesteld, worden de functies van Web Components v0 standaard uitgezet, vanaf M80.
 
       Dit beleid wordt na Chrome 84 verwijderd.</translation>
-<translation id="5755149423476170868">Als je dit beleid toepast of niet instelt, wordt de <ph name="SAFE_BROWSING_NAME" />-extensiebeveiliging voor <ph name="PRODUCT_NAME" /> beheerd door <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />. Als <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> is ingesteld op <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> of <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, worden schadelijke extensies sneller uitgezet in <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> stuurt een verzoek naar de Google Safe Browsing-server om te checken of een extensie is verwijderd uit de Chrome Web Store vanwege problemen (dat wil zeggen, schadelijke, kwetsbare of ongewenste software) of vanwege een schending van het Chrome Web Store-beleid (CWS). Als een extensie is verwijderd, voorkomt <ph name="PRODUCT_NAME" /> dat gebruikers de extensie installeren en wordt de extensie uitgezet als deze al is geïnstalleerd.
-Als je dit beleid niet toepast, wordt <ph name="SAFE_BROWSING_NAME" />-extensiebeveiliging uitgezet en worden schadelijke extensies minder regelmatig gecheckt en verwijderd via <ph name="GOOGLE_UPDATE_NAME" />. Er worden geen gegevens naar Google <ph name="SAFE_BROWSING_NAME" /> gestuurd voor beoordelingen.</translation>
 <translation id="575647238840663288">Documenten kunnen standaard in origin-keyed agentclusters worden geplaatst. document.domain is niet instelbaar voor dergelijke documenten.</translation>
 <translation id="5756680608782814094">Rapporteer de VPD-gegevens van een apparaat.
 
@@ -5733,7 +5743,6 @@
 <translation id="5883754873839596178">Als je het beleid instelt, kun je het maximale aantal gelijktijdige verbindingen met de proxyserver opgeven. Bepaalde proxyservers kunnen niet een groot aantal gelijktijdige verbindingen per client verwerken. Dit kan worden opgelost door dit beleid op een lagere waarde in te stellen. De waarde moet lager dan 100 en hoger dan 6 zijn. Het is bekend dat sommige web-apps veel verbindingen gebruiken voor openstaande GET-verzoeken. Als je een waarde lager dan 32 instelt, lopen netwerkprocessen van de browser daarom mogelijk vast als er te veel web-apps met openstaande verbindingen zijn geopend. Het tot onder de standaardwaarde verlagen van deze waarde is daarom op eigen risico.
 
       Als je het beleid niet instelt, wordt de standaardwaarde 32 gebruikt.</translation>
-<translation id="5885770645815872943">Safe Browsing-extensiebeveiliging toestaan</translation>
 <translation id="5887414688706570295">Hiermee configureer je het voorvoegsel voor het TalkGadget dat wordt gebruikt door hosts voor externe toegang en voorkom je dat gebruikers dit wijzigen.
 
           Als dit voorvoegsel is opgegeven, wordt het toegevoegd aan het begin van de basisnaam voor het TalkGadget om een volledige domeinnaam voor het TalkGadget te maken. De basisdomeinnaam voor het TalkGadget is '.talkgadget.google.com'.
@@ -6370,7 +6379,6 @@
           Als je dit beleid niet toepast, kan het <ph name="PRODUCT_OS_NAME" />-apparaat <ph name="GOOGLE_CALENDAR_NAME" />-afspraken niet ophalen om de <ph name="PRODUCT_OS_NAME" />-agendawidget in de systeemstatusbalk in te vullen voor de ingelogde gebruiker.
 
           Als je dit beleid niet instelt, staat de <ph name="GOOGLE_CALENDAR_NAME" />-functie standaard aan voor zakelijke gebruikers.</translation>
-<translation id="6450607392928079050">Safe Browsing-extensiebeveiliging wordt beheerd door het beleid <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">Als je dit beleid toepast, wordt de ingebouwde componentextensie CryptoToken geladen bij het opstarten. Als je het beleid niet toepast of niet instelt, wordt CryptoToken niet geladen als de browser opstart. Dit beleid is bedoeld als tijdelijke oplossing voor sites die problemen hebben doordat 'chrome.runtime' niet gedefinieerd is als gevolg van de verwijdering van CryptoToken in M106. Websites mogen niet afhankelijk zijn van een zonder voorwaarden gedefinieerde 'chrome.runtime'.</translation>
 <translation id="6453641799812499182"><ph name="CORS" />-controlebeperkingen voor de nieuwe <ph name="CORS" />-implementatie aanzetten</translation>
 <translation id="645425387487868471">Inloggen voor <ph name="PRODUCT_NAME" /> verplichten</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 2fc43aa6..e2848ec6 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -3271,7 +3271,6 @@
 
 Esta política só é eficaz quando a máquina está registrada na <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> do <ph name="PRODUCT_NAME" />.
 Para o <ph name="PRODUCT_OS_NAME" />, ela sempre é eficaz.</translation>
-<translation id="3642557248926713561">Desativar a proteção de extensões pelo recurso Navegação segura</translation>
 <translation id="3644735978203799620">Permite a seleção automática de várias capturas de tela</translation>
 <translation id="3646859102161347133">Definir tipo de lupa</translation>
 <translation id="3647212518036289905">Definir a política especifica qual biblioteca GSSAPI será usada para a autenticação HTTP. Defina a política como um nome de biblioteca ou um caminho completo.
@@ -5803,8 +5802,6 @@
       Se esta política for definida como falsa ou não for definida, os recursos da Web Components v0 ficarão desativados por padrão, a partir do M80.
 
       Esta política será removida após o Chrome 84.</translation>
-<translation id="5755149423476170868">Quando esta política for ativada ou deixada sem definição, a proteção de extensões pelo recurso <ph name="SAFE_BROWSING_NAME" /> será controlada pela <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> para o <ph name="PRODUCT_NAME" />. Se a <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> for definida como <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> ou <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, as extensões maliciosas serão desativadas mais rapidamente no <ph name="PRODUCT_NAME" />. O <ph name="PRODUCT_NAME" /> envia uma solicitação ao servidor da Navegação segura do Google para verificar se uma extensão foi removida da Chrome Web Store (CWS) por ser considerada problemática, ou seja, um software malicioso, vulnerável, indesejado ou que viola as políticas da CWS. Se uma extensão for removida, o <ph name="PRODUCT_NAME" /> vai impedir que os usuários a instalem. Caso já tenha sido instalada, ela será desativada.
-Se a política for desativada, a proteção de extensões pelo recurso <ph name="SAFE_BROWSING_NAME" /> será desativada e as extensões maliciosas serão verificadas e removidas com menos frequência pelo <ph name="GOOGLE_UPDATE_NAME" />. Nenhum dado é enviado ao recurso <ph name="SAFE_BROWSING_NAME" /> do Google para vereditos.</translation>
 <translation id="575647238840663288">Por padrão, os documentos podem ser colocados em clusters de agente com origin-key. Nesses casos, o document.domain não é definível.</translation>
 <translation id="5756680608782814094">Envia informações sobre os dados vitais do produto (VPD, na sigla em inglês) de um dispositivo.
 
@@ -5922,7 +5919,6 @@
 <translation id="5883754873839596178">Se a política for definida, o número máximo de conexões simultâneas ao servidor proxy será especificado. Alguns servidores proxy não podem administrar um grande número de conexões simultâneas por cliente, o que pode ser resolvido com a definição de um número menor para esta política. Defina um valor inferior a 100 e superior a 6. Alguns apps da Web são conhecidos por consumir muitas conexões com GETs irresponsivos, então definir um valor inferior a 32 pode gerar deslocamentos na rede do navegador caso haja muitos apps da Web com conexões deslocadas abertas. A definição de valores inferiores ao padrão fica por sua conta e risco.
 
       Se a política não for definida, o valor padrão de 32 será usado.</translation>
-<translation id="5885770645815872943">Permitir a proteção de extensões pelo recurso Navegação segura</translation>
 <translation id="5887414688706570295">Configura o prefixo TalkGadget que será usado pelos hosts de acesso remoto e impede os usuários de alterá-lo.
 
           Se for especificado, esse prefixo é anexado ao nome básico do TalkGadget para criar um nome de domínio completo para o TalkGadget. O nome de domínio básico do TalkGadget é ".talkgadget.google.com".
@@ -6614,7 +6610,6 @@
           Se a política for desativada, o dispositivo <ph name="PRODUCT_OS_NAME" /> não vai poder buscar eventos do <ph name="GOOGLE_CALENDAR_NAME" /> para preencher o widget da agenda do <ph name="PRODUCT_OS_NAME" /> na barra de status do sistema para o usuário conectado.
 
           Se a política não for definida, o <ph name="GOOGLE_CALENDAR_NAME" /> vai ser ativado por padrão para os usuários corporativos.</translation>
-<translation id="6450607392928079050">A proteção de extensões pelo recurso Navegação segura é controlada pela política <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">Quando a política está ativada, a extensão do componente do CryptoToken integrada é carregada na inicialização. Se ela for desativada ou deixada sem definição, o CryptoToken não vai ser carregado na inicialização do navegador. Esta política é apenas uma solução temporária para sites corrompidos por chrome.runtime indefinido como um efeito colateral da remoção de CryptoToken no M106. Os sites não podem depender da definição incondicional de chrome.runtime.</translation>
 <translation id="6453641799812499182">Ativar as mitigações de verificação de <ph name="CORS" /> na nova implementação de <ph name="CORS" /></translation>
 <translation id="645425387487868471">Ativar login forçado no <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index d7adf85b9..a61cb46 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -3184,7 +3184,6 @@
 
 Правило действует, только если компьютер зарегистрирован с помощью токена <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> для <ph name="PRODUCT_NAME" />.
 Для <ph name="PRODUCT_OS_NAME" /> это правило применяется всегда.</translation>
-<translation id="3642557248926713561">Отключить защиту от небезопасных расширений с помощью Безопасного просмотра</translation>
 <translation id="3644735978203799620">Включает автоматический выбор для записи изображения с нескольких экранов</translation>
 <translation id="3646859102161347133">Настройка типа экранной лупы</translation>
 <translation id="3647212518036289905">Правило определяет, какую библиотеку GSSAPI использовать для HTTP-аутентификации. В правиле нужно указать название библиотеки или полный путь к ней.
@@ -5625,8 +5624,6 @@
 Если установлено значение False или правило не настроено, указанные функции будут по умолчанию отключены (начиная с версии M80).
 
 Правило будет удалено из Chrome после версии 84.</translation>
-<translation id="5755149423476170868">Если это правило включено или не настроено, то защитой от небезопасных расширений с помощью сервиса "<ph name="SAFE_BROWSING_NAME" />" будет управлять правило <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> для <ph name="PRODUCT_NAME" />. Если для правила <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> установлено значение <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> или <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, вредоносные расширения будут быстрее отключаться в <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> отправляет запрос на сервер Google Безопасного просмотра, чтобы проверить, было ли расширение удалено из интернет-магазина Chrome, так как считалось проблематичным, то есть вредоносным, уязвимым или нежелательным, или нарушало правила. Если расширение удалено, <ph name="PRODUCT_NAME" /> блокирует его установку пользователями или отключает его, если оно уже установлено.
-Когда правило отключено, защита от небезопасных расширений с помощью сервиса "<ph name="SAFE_BROWSING_NAME" />" не выполняется. Вредоносные расширения проверяются и удаляются с помощью <ph name="GOOGLE_UPDATE_NAME" />, но не так часто. При принятии решения никакие данные в сервис "Google <ph name="SAFE_BROWSING_NAME" />" не отправляются.</translation>
 <translation id="575647238840663288">По умолчанию документы могут быть помещены в кластеры агента с ключом источника. Для них нельзя настроить метод доступа document.domain.</translation>
 <translation id="5756680608782814094">Передача информации об основных данных о продукте (VPD).
 
@@ -5744,7 +5741,6 @@
 <translation id="5883754873839596178">Правило позволяет задать максимальное количество одновременных подключений к прокси-серверу. Некоторые прокси-серверы не могут обработать множество одновременных подключений к одному клиенту. Чтобы решить эту проблему, необходимо установить более низкое значение. Значение должно быть меньше 100 и больше 6. Некоторые веб-приложения используют сразу несколько подключений с ожидающими выполнения GET-запросами, поэтому при установке значения ниже 32 возможно зависание браузера, если таких веб-приложений слишком много. Если выбрано значение ниже значения по умолчанию, мы не отвечаем за последствия.
 
       Если правило не настроено, используется значение по умолчанию – 32.</translation>
-<translation id="5885770645815872943">Включить защиту от небезопасных расширений с помощью Безопасного просмотра</translation>
 <translation id="5887414688706570295">Настраивает префикс TalkGadget для хостов удаленного доступа и запрещает пользователям его менять.
 
           Если значение этого параметра задано, к базовому имени TalkGadget добавляется префикс, в результате чего получается полное имя домена TalkGadget. Базовое имя домена TalkGadget – .talkgadget.google.com.
@@ -6395,7 +6391,6 @@
           Если правило отключено, устройство c <ph name="PRODUCT_OS_NAME" /> не сможет получать данные из сервиса "<ph name="GOOGLE_CALENDAR_NAME" />" и указывать их в виджете календаря <ph name="PRODUCT_OS_NAME" />.
 
           Если правило не настроено, то по умолчанию <ph name="GOOGLE_CALENDAR_NAME" /> недоступен для корпоративных пользователей.</translation>
-<translation id="6450607392928079050">Защита от небезопасных расширений с помощью Безопасного просмотра контролируется правилом <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">Если правило включено, встроенное расширение CryptoToken будет загружаться при запуске браузера. Если правило отключено или не настроено, встроенное расширение CryptoToken загружаться не будет. Мы добавили это правило временно, потому что API chrome.runtime не определялось на некоторых сайтах и приводило к ошибкам после удаления расширения CryptoToken из версии M106. Доступ к сайтам не должен зависеть от безусловного определения chrome.runtime.</translation>
 <translation id="6453641799812499182">Смягчение проверки <ph name="CORS" /> в новой реализации <ph name="CORS" /></translation>
 <translation id="645425387487868471">Включить обязательный вход в <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 874dc0ec..e64fb9ef 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -3194,7 +3194,6 @@
 
 นโยบายนี้จะมีผลเมื่อลงทะเบียนเครื่องกับ <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> สำหรับ <ph name="PRODUCT_NAME" /> เท่านั้น
 และจะมีผลเสมอสำหรับ <ph name="PRODUCT_OS_NAME" /></translation>
-<translation id="3642557248926713561">ปิดใช้การป้องกันส่วนขยายของ Google Safe Browsing</translation>
 <translation id="3644735978203799620">เปิดใช้การเลือกอัตโนมัติสำหรับการจับภาพหลายหน้าจอ</translation>
 <translation id="3646859102161347133">ตั้งค่าประเภทของแว่นขยายหน้าจอ</translation>
 <translation id="3647212518036289905">การตั้งค่านโยบายจะระบุไลบรารี GSSAPI ที่จะใช้สำหรับการตรวจสอบสิทธิ์ HTTP จะตั้งค่านโยบายเป็นชื่อไลบรารีหรือเส้นทางแบบเต็มก็ได้
@@ -5637,8 +5636,6 @@
       หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้ตั้งค่า จะปิดใช้ฟีเจอร์ Web Components v0 โดยค่าเริ่มต้นเริ่มตั้งแต่ในเวอร์ชัน M80
 
       เราจะนำนโยบายนี้ออกหลังจาก Chrome 84</translation>
-<translation id="5755149423476170868">เมื่อเปิดใช้หรือไม่ได้ตั้งค่านโยบายนี้ <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> จะควบคุมการป้องกันส่วนขยาย <ph name="SAFE_BROWSING_NAME" /> สำหรับ <ph name="PRODUCT_NAME" /> หากตั้งค่า <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> เป็น <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> หรือ <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" /> ระบบจะปิดใช้ส่วนขยายที่เป็นอันตรายของ <ph name="PRODUCT_NAME" /> ได้เร็วขึ้น <ph name="PRODUCT_NAME" /> จะส่งคําขอไปยังเซิร์ฟเวอร์ Google Safe Browsing เพื่อตรวจสอบว่ามีการนำส่วนขยายออกจาก Chrome เว็บสโตร์เพราะมีปัญหา อาทิ เป็นซอฟต์แวร์ไม่พึงประสงค์ เป็นอันตราย มีความเสี่ยง หรือละเมิดนโยบาย Chrome เว็บสโตร์ (CWS) หรือไม่ หากส่วนขยายใดถูกลบออกไป <ph name="PRODUCT_NAME" /> จะบล็อกผู้ใช้ไม่ให้ติดตั้งส่วนขยายนั้นและจะปิดใช้ส่วนขยายดังกล่าวหากได้ติดตั้งไว้แล้ว
-เมื่อปิดใช้นโยบายนี้ ระบบจะปิดใช้การป้องกันส่วนขยายของ <ph name="SAFE_BROWSING_NAME" /> รวมทั้งตรวจสอบและนําส่วนขยายที่เป็นอันตรายออกผ่าน <ph name="GOOGLE_UPDATE_NAME" /> ด้วยความถี่ที่น้อยลง ระบบจะไม่ส่งข้อมูลเพื่อรับคำตัดสินไปยัง <ph name="SAFE_BROWSING_NAME" /> ของ Google</translation>
 <translation id="575647238840663288">เอกสารอาจอยู่ในคลัสเตอร์ Agent ที่ผูกกับต้นทางโดยค่าเริ่มต้นและ document.domain จะตั้งค่าไม่ได้สำหรับเอกสารดังกล่าว</translation>
 <translation id="5756680608782814094">รายงานข้อมูล VPD ของอุปกรณ์
 
@@ -5755,7 +5752,6 @@
 <translation id="5883754873839596178">การตั้งค่านโยบายจะระบุจำนวนการเชื่อมต่อพร็อกซีเซิร์ฟเวอร์พร้อมกันสูงสุด บางพร็อกซีเซิร์ฟเวอร์จัดการการเชื่อมต่อที่เกิดขึ้นพร้อมกันจำนวนมากต่อไคลเอ็นต์ไม่ได้ ปัญหานี้แก้ไขได้โดยการตั้งค่านโยบายนี้ให้มีค่าต่ำลง ค่าไม่ควรเกิน 100 แต่สูงกว่า 6 เว็บแอปบางรายการนั้นเป็นที่ทราบว่าต้องใช้การเชื่อมต่อจำนวนมากเนื่องจากใช้ Hanging GET การตั้งค่าที่ต่ำกว่า 32 จึงอาจส่งผลให้การเชื่อมโยงเครือข่ายของเบราว์เซอร์ค้างได้ในกรณีที่เปิดเว็บแอปที่ใช้การเชื่อมต่อ Hanging เป็นจำนวนมากเกินไป คุณต้องยอมรับความเสี่ยงเองหากตั้งค่าต่ำกว่าค่าเริ่มต้น
 
       การไม่ตั้งค่านโยบายจะทำให้ระบบใช้ค่าเริ่มต้นที่ 32</translation>
-<translation id="5885770645815872943">อนุญาตการป้องกันส่วนขยายของ Google Safe Browsing</translation>
 <translation id="5887414688706570295">กำหนดค่าส่วนนำหน้าของ TalkGadget ที่จะถูกใช้โดยโฮสต์การเข้าถึงระยะไกลและป้องกันไม่ให้ผู้ใช้ทำการเปลี่ยนแปลง
 
           หากมีการระบุไว้ ส่วนนำหน้านี้จะถูกนำมาวางไว้ข้างหน้าชื่อ TalkGadget ที่เป็นส่วนหลักเพื่อสร้างชื่อโดเมนเต็มสำหรับ TalkGadget ชื่อโดเมน TalkGadget ที่เป็นส่วนหลักนี้คือ '.talkgadget.google.com'
@@ -6393,7 +6389,6 @@
           หากปิดใช้นโยบายนี้ อุปกรณ์ "<ph name="PRODUCT_OS_NAME" />" จะไม่สามารถเรียกดูกิจกรรม "<ph name="GOOGLE_CALENDAR_NAME" />" เพื่อป้อนข้อมูลวิดเจ็ตปฏิทินของ "<ph name="PRODUCT_OS_NAME" />" ในแถบสถานะของระบบสำหรับผู้ใช้ที่เข้าสู่ระบบ
 
           หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะเปิดใช้ฟีเจอร์ "<ph name="GOOGLE_CALENDAR_NAME" />" โดยค่าเริ่มต้นสำหรับผู้ใช้ระดับองค์กร</translation>
-<translation id="6450607392928079050">การป้องกันส่วนขยายของ Google Safe Browsing ควบคุมโดยนโยบาย <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">หากตั้งค่าเป็น "เปิดใช้" ระบบจะโหลดส่วนขยายคอมโพเนนต์ CryptoToken ในตัวเมื่อเริ่มต้นระบบ หากตั้งค่าเป็น "ปิดใช้" หรือไม่ได้ตั้งค่า ระบบจะไม่โหลด CryptoToken เมื่อเริ่มต้นเบราว์เซอร์ นโยบายนี้มีไว้เพื่อเป็นวิธีแก้ปัญหาชั่วคราวสำหรับเว็บไซต์ที่ไม่ทำงานเนื่องจากไม่ได้ระบุ "chrome.runtime" ซึ่งเป็นผลข้างเคียงจากการนำ CryptoToken ออกใน M106 เว็บไซต์ต้องไม่ใช้ "chrome.runtime" ที่กำหนดไว้อย่างไม่มีเงื่อนไข</translation>
 <translation id="6453641799812499182">เปิดใช้การลดการตรวจสอบ <ph name="CORS" /> ในการนำ <ph name="CORS" /> ใหม่ไปใช้</translation>
 <translation id="645425387487868471">เปิดใช้การบังคับลงชื่อเข้าใช้สำหรับ <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index c7296fc..2ace504 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -3244,7 +3244,6 @@
 
 Bu politika yalnızca <ph name="PRODUCT_NAME" /> için makinenin <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> kaydı yapıldığında geçerli olur.
 <ph name="PRODUCT_OS_NAME" /> için bu politika her zaman geçerlidir.</translation>
-<translation id="3642557248926713561">Güvenli Tarama Uzantı Korumasını Devre Dışı Bırak</translation>
 <translation id="3644735978203799620">Çoklu ekran görüntüleri için otomatik seçimi etkinleştirir</translation>
 <translation id="3646859102161347133">Ekran büyüteci türünü ayarla</translation>
 <translation id="3647212518036289905">Politikanın ayarlanması, HTTP kimlik doğrulaması için hangi GSSAPI kitaplığının kullanılacağını belirtir. Politikayı bir kitaplık adı veya tam yol olarak ayarlayın.
@@ -5720,8 +5719,6 @@
       Bu politika False (Yanlış) değerine ayarlanır veya hiç ayarlanmazsa Web Bileşenleri v0 özellikleri, M80 düzeyinden itibaren varsayılan olarak devre dışı bırakılır.
 
       Bu politika Chrome 84'ten sonra kaldırılacaktır.</translation>
-<translation id="5755149423476170868">Bu politika etkinleştirildiğinde veya ayarlanmadan bırakıldığında<ph name="SAFE_BROWSING_NAME" /> uzantı koruması <ph name="PRODUCT_NAME" /> için <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> tarafından kontrol edilecektir. <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />, <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> veya <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" /> değerine ayarlanırsa kötü amaçlı uzantılar <ph name="PRODUCT_NAME" /> ürününde daha hızlı devre dışı bırakılır. <ph name="PRODUCT_NAME" />, bir uzantının sorunlu olması (ör. kötü amaçlı, güvenlik açığına neden olma, istenmeyen yazılım) veya Chrome Web Mağazası (CWS) politikalarını ihlal etmesi nedeniyle Chrome Web Mağazası'ndan kaldırılıp kaldırılmadığını kontrol etmek için Google Güvenli Tarama sunucusuna bir istek gönderir. Bir uzantı kaldırıldıysa <ph name="PRODUCT_NAME" /> kullanıcıların uzantıyı yüklemesini engeller ve uzantı önceden yüklenmişse devre dışı bırakır.
-Bu politika devre dışı bırakılırsa <ph name="SAFE_BROWSING_NAME" /> uzantısı koruması da devre dışı bırakılır ve kötü amaçlı uzantılar <ph name="GOOGLE_UPDATE_NAME" /> tarihine kadar kontrol edilerek daha az sıklıkta kaldırılır. Google <ph name="SAFE_BROWSING_NAME" /> ürününe sonuçlarla ilgili veri gönderilmez.</translation>
 <translation id="575647238840663288">Dokümanlar varsayılan olarak kaynak içeren veya kaynaklarla ilişkili aracı kümelerine yerleştirilebilir ve document.domain bu tarz dokümanlar için ayarlanamaz.</translation>
 <translation id="5756680608782814094">Cihazın VPD bilgilerini raporlar.
 
@@ -5838,7 +5835,6 @@
 <translation id="5883754873839596178">Politika ayarlanırsa proxy sunucuyla yapılabilecek maksimum eşzamanlı bağlantı sayısı belirtilir. Bazı proxy sunucular istemci başına çok sayıda eşzamanlı bağlantıyı işleyemez. Bu sorun, bu politikanın daha düşük bir değere ayarlanmasıyla çözülür. Değer, 100'den küçük, 6'dan büyük olmalıdır. Bazı web uygulamalarının askıda kalan GET'lerle çok fazla bağlantı kullandığı bilinmektedir. Bu nedenle, 32'den küçük bir değerin ayarlanması, askıda bağlantısı olan çok fazla web uygulamasının açık olması halinde tarayıcı bağlantılarının yavaşlamasına neden olabilir. Varsayılanın altında bir değer ayarlayacaksanız bunun tüm riski size aittir.
 
       Politika ayarlanmadan bırakılırsa, varsayılan değer olarak 32 kullanılır.</translation>
-<translation id="5885770645815872943">Güvenli Tarama Uzantı Korumasına İzin Ver</translation>
 <translation id="5887414688706570295">Uzaktan erişim ana makineleri tarafından kullanılacak olan TalkGadget önekini yapılandırır ve kullanıcıların bunu değiştirmesini önler.
 
           Bu önek belirtilirse, TalkGadget'a ilişkin tam bir alan adı oluşturmak üzere temel TalkGadget adının başına eklenir. Temel TalkGadget alan adı '.talkgadget.google.com'dur.
@@ -6494,7 +6490,6 @@
           Bu politika devre dışı bırakılırsa <ph name="PRODUCT_OS_NAME" /> cihazı, giriş yapmış kullanıcının sistem durum çubuğundaki <ph name="PRODUCT_OS_NAME" /> takvim widget'ını doldurmak için <ph name="GOOGLE_CALENDAR_NAME" /> etkinliklerini alamaz.
 
           Bu politika ayarlanmadan bırakılırsa <ph name="GOOGLE_CALENDAR_NAME" /> özelliği, kurumsal kullanıcılar için varsayılan olarak etkinleştirilir.</translation>
-<translation id="6450607392928079050">Güvenli Tarama Uzantı Koruması <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> politikasına tabidir.</translation>
 <translation id="6452882999388592166">Yerleşik CryptoToken bileşen uzantısı, Etkin değerine ayarlanırsa başlangıçta yüklenir. CryptoToken, Devre Dışı değerine ayarlanırsa veya ayarlanmadan bırakılırsa tarayıcı başlatılırken yüklenmez. Bu politika, M106 sürümünden CryptoToken'in kaldırılmasının yan etkisi olarak tanımlanmayan "chrome.runtime" nedeniyle bozulmuş siteler için geçici bir çözümdür. Web siteleri, "chrome.runtime"ın koşulsuz olarak tanımlanacağını düşünmemelidir.</translation>
 <translation id="6453641799812499182">Yeni <ph name="CORS" /> uygulamasındaki azaltmaların <ph name="CORS" /> tarafından kontrol edilmesini etkinleştir</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> için oturum açmaya zorlamayı etkinleştir</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index e55fad6d..0e230e4e 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -3207,7 +3207,6 @@
 
 Це правило працює, лише коли комп’ютер зареєстровано відповідно до правила <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> для <ph name="PRODUCT_NAME" />.
 Для <ph name="PRODUCT_OS_NAME" /> це правило діє завжди.</translation>
-<translation id="3642557248926713561">Вимкнути захист від шкідливих розширень за допомогою Безпечного перегляду</translation>
 <translation id="3644735978203799620">Вмикає автоматичний вибір для записів екрана на різних пристроях</translation>
 <translation id="3646859102161347133">Установити тип лупи</translation>
 <translation id="3647212518036289905">Налаштування цього правила визначають, яку бібліотеку GSSAPI використовувати для автентифікації HTTP. Для цього правила можна вказати назву бібліотеки або повний шлях.
@@ -5667,8 +5666,6 @@
       Якщо для цього правила вибрано значення false або його не налаштовано, функції веб-компонентів версії v0 буде вимкнено за умовчанням у M80 і новіших версіях.
 
       Це правило буде вилучено у версіях після Chrome 84.</translation>
-<translation id="5755149423476170868">Якщо це правило ввімкнути або не налаштувати, захистом від шкідливих розширень за допомогою сервісу <ph name="SAFE_BROWSING_NAME" /> керуватиме правило <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> для <ph name="PRODUCT_NAME" />. Якщо для правила <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> вибрати значення <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> або <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, шкідливі розширення в <ph name="PRODUCT_NAME" /> вимикатимуться швидше. <ph name="PRODUCT_NAME" /> надсилає запит на сервер Безпечного перегляду Google, щоб перевірити, чи не було певне розширення видалено з Веб-магазину Chrome як проблемне (тобто шкідливе, уразливе або небажане) програмне забезпечення або через порушення правил Веб-магазину Chrome. Якщо розширення видалено, <ph name="PRODUCT_NAME" /> заблокує його встановлення. Якщо користувач уже встановив розширення, веб-переглядач вимкне його.
-Якщо вимкнути це правило, захист від шкідливих розширень за допомогою сервісу <ph name="SAFE_BROWSING_NAME" /> буде вимкнено. Розширення перевірятимуться і видалятимуться рідше через <ph name="GOOGLE_UPDATE_NAME" />. Дані не надсилатимуться в <ph name="SAFE_BROWSING_NAME" /> Google для перевірки.</translation>
 <translation id="575647238840663288">За умовчанням документи можуть включатися в кластери агентів із ключем джерела. Метод доступу document.domain для таких документів не можна налаштувати.</translation>
 <translation id="5756680608782814094">Повідомляти дані VPD пристрою.
 
@@ -5786,7 +5783,6 @@
 <translation id="5883754873839596178">За допомогою цього правила можна вказати максимальну кількість одночасних підключень до проксі-сервера. Деякі проксі-сервери не можуть обробляти велику кількість паралельних підключень для одного клієнта. Щоб вирішити таку проблему, укажіть для цього правила менше значення. Значення має бути більшим ніж 6 і меншим ніж 100. Деякі веб-додатки використовують багато підключень із запитами GET, які очікують виконання, тому значення, нижче ніж 32, може спричинити "зависання" мережі веб-переглядача, якщо відкрито забагато веб-додатків. Встановлюйте менше значення, ніж значення за умовчанням, на власний ризик.
 
       Якщо це правило не налаштовано, використовується значення за умовчанням (32).</translation>
-<translation id="5885770645815872943">Увімкнути захист від шкідливих розширень за допомогою Безпечного перегляду</translation>
 <translation id="5887414688706570295">Налаштовує префікс TalkGadget, який використовується хостами віддаленого доступу, і не дозволяє користувачам змінювати його.
 
           Якщо вказано префікс, він прикріпляється до основи імені TalkGadget, щоб створити повне ім’я домену для TalkGadget. Основа імені домену TalkGadget – ".talkgadget.google.com".
@@ -6453,7 +6449,6 @@
           Якщо це правило вимкнути, пристрій із <ph name="PRODUCT_OS_NAME" /> не зможе отримувати дані про події із сервісу <ph name="GOOGLE_CALENDAR_NAME" />, щоб заповнювати віджет календаря <ph name="PRODUCT_OS_NAME" /> у рядку стану системи користувача, який увійшов в обліковий запис.
 
           Якщо це правило не налаштувати, функцію <ph name="GOOGLE_CALENDAR_NAME" /> буде за умовчанням увімкнено для корпоративних користувачів.</translation>
-<translation id="6450607392928079050">Захист від шкідливих розширень за допомогою Безпечного перегляду керується правилом <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">Якщо ввімкнути це правило, вбудоване розширення компонента CryptoToken буде завантажуватися під час запуску веб-переглядача. Якщо його вимкнути або не налаштувати, CryptoToken не буде завантажуватися під час запуску. Це правило діє як тимчасове рішення для сайтів, які не працюють через те, що метод chrome.runtime не визначається як побічна дія вилучення CryptoToken у версії M106. Доступ до веб-сайтів не має залежати від безумовного визначення методу chrome.runtime.</translation>
 <translation id="6453641799812499182">Увімкнути для <ph name="CORS" /> зменшення кількості перевірок у новому застосуванні <ph name="CORS" /></translation>
 <translation id="645425387487868471">Увімкнути примусовий вхід в обліковий запис у <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 046450dc..dc491bc 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -3230,7 +3230,6 @@
 
 Chính sách này chỉ có hiệu lực khi máy đã đăng ký bằng <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> đối với <ph name="PRODUCT_NAME" />.
 Chính sách này luôn có hiệu lực đối với <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="3642557248926713561">Không cho phép biện pháp bảo vệ tiện ích của tính năng Duyệt web an toàn</translation>
 <translation id="3644735978203799620">Cho phép tự động chọn để chụp ảnh nhiều màn hình</translation>
 <translation id="3646859102161347133">Đặt loại kính lúp màn hình</translation>
 <translation id="3647212518036289905">Nếu bạn đặt chính sách này, hệ thống sẽ chỉ định thư viện GSSAPI dùng để xác thực HTTP. Hãy đặt chính sách này thành tên thư viện hoặc đường dẫn đầy đủ.
@@ -5755,8 +5754,6 @@
       Nếu bạn đặt chính sách này thành False hoặc không đặt, thì các tính năng của Thành phần web phiên bản 0 sẽ tắt theo mặc định kể từ M80.
 
       Chính sách này sẽ bị xóa sau Chrome 84.</translation>
-<translation id="5755149423476170868">Khi bạn đặt chính sách này thành bật hoặc không đặt, biện pháp bảo vệ tiện ích của <ph name="SAFE_BROWSING_NAME" /> sẽ do <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> kiểm soát đối với <ph name="PRODUCT_NAME" />. Nếu bạn đặt <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> thành <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" /> hoặc <ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />, thì các tiện ích độc hại sẽ bị tắt nhanh hơn trong <ph name="PRODUCT_NAME" />. <ph name="PRODUCT_NAME" /> gửi yêu cầu tới máy chủ Duyệt web An toàn của Google để kiểm tra xem tiện ích đã bị gỡ khỏi Cửa hàng Chrome trực tuyến do bị coi là có vấn đề hay chưa (ví dụ như phần mềm độc hại, dễ bị tấn công, không mong muốn hoặc vi phạm chính sách của Cửa hàng Chrome trực tuyến (CWS)). Nếu một tiện ích đã bị gỡ bỏ, <ph name="PRODUCT_NAME" /> sẽ ngăn người dùng cài đặt tiện ích và sẽ vô hiệu hoá tiện ích nếu người dùng đã cài đặt.
-Khi bạn tắt chính sách này, hệ thống sẽ tắt biện pháp bảo vệ tiện ích của <ph name="SAFE_BROWSING_NAME" />, đồng thời sẽ giảm tần suất kiểm tra và gỡ bỏ tiện ích độc hại thông qua <ph name="GOOGLE_UPDATE_NAME" />. Không có dữ liệu nào được gửi đến Google <ph name="SAFE_BROWSING_NAME" /> để nhận kết quả.</translation>
 <translation id="575647238840663288">Theo mặc định, có thể tài liệu sẽ được phân vào các cụm tác nhân theo khoá nguồn gốc. document.domain sẽ không thiết lập được cho những tài liệu như vậy.</translation>
 <translation id="5756680608782814094">Báo cáo thông tin về VPD của thiết bị.
 
@@ -5873,7 +5870,6 @@
 <translation id="5883754873839596178">Nếu bạn đặt chính sách này, số lượng tối đa lượt kết nối đồng thời đến máy chủ proxy sẽ được chỉ định. Một số máy chủ proxy không thể xử lý lượng lớn lượt kết nối đồng thời trên mỗi máy khách. Tuy nhiên, bạn có thể giải quyết vấn đề đó bằng cách đặt chính sách này về giá trị thấp hơn. Bạn nên đặt giá trị cao hơn 6 và thấp hơn 100. Một số ứng dụng web tiêu hao lượng lớn lượt kết nối khi có các lệnh GET bị treo. Vì vậy, việc đặt giá trị dưới 32 có thể khiến mạng của trình duyệt bị treo nếu có quá nhiều ứng dụng web (với các lượt kết nối bị treo) đang mở. Bạn phải tự chịu rủi ro khi đặt giá trị thấp hơn giá trị mặc định.
 
       Nếu bạn không đặt chính sách này, giá trị mặc định được dùng sẽ là 32.</translation>
-<translation id="5885770645815872943">Cho phép biện pháp bảo vệ tiện ích của tính năng Duyệt web an toàn</translation>
 <translation id="5887414688706570295">Định cấu hình tiền tố TalkGadget sẽ được máy chủ truy cập từ xa sử dụng và ngăn người dùng thay đổi tiền tố này.
 
           Nếu được chỉ định, tiền tố này sẽ được thêm vào đầu tên gốc của TalkGadget để tạo tên miền đầy đủ cho TalkGadget. Tên miền gốc của TalkGadget là '.talkgadget.google.com'.
@@ -6543,7 +6539,6 @@
           Nếu bạn tắt chính sách này thì thiết bị <ph name="PRODUCT_OS_NAME" /> không thể truy xuất các sự kiện <ph name="GOOGLE_CALENDAR_NAME" /> để điền sẵn vào tiện ích lịch <ph name="PRODUCT_OS_NAME" /> trong thanh trạng thái hệ thống cho người dùng đã đăng nhập.
 
           Nếu bạn không đặt chính sách này thì theo mặc định, tính năng <ph name="GOOGLE_CALENDAR_NAME" /> sẽ bật đối với người dùng doanh nghiệp.</translation>
-<translation id="6450607392928079050">Biện pháp bảo vệ tiện ích của tính năng Duyệt web an toàn chịu sự kiểm soát của chính sách <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /></translation>
 <translation id="6452882999388592166">Nếu bạn bật chính sách này, thì tiện ích thành phần CryptoToken tích hợp sẵn sẽ được tải khi khởi động. Nếu bạn tắt hoặc không đặt chính sách này, thì CryptoToken sẽ không được tải khi khởi động trình duyệt. Chính sách này là giải pháp tạm thời cho những trang web không hoạt động do việc không xác định `chrome.runtime`, là tác dụng phụ của việc xoá CryptoToken trong M106. Các trang web không được phụ thuộc vô điều kiện vào việc xác định `chrome.runtime`.</translation>
 <translation id="6453641799812499182">Bật tùy chọn giảm thiểu kiểm tra <ph name="CORS" /> trong quy trình triển khai <ph name="CORS" /> mới</translation>
 <translation id="645425387487868471">Bật bắt buộc đăng nhập cho <ph name="PRODUCT_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 507dee0..cc26dbb 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1508,6 +1508,7 @@
       如果此政策设为 true 或未设置,系统将会报告设备的网络状态。</translation>
 <translation id="2223393221350938149">不允许任何网站运行 JavaScript JIT</translation>
 <translation id="2223598546285729819">默认通知设置</translation>
+<translation id="2224706708550115831">当在严格模式下激活始终开启的 VPN 并启用“锁定模式”,而且未连接 VPN 时,允许用户浏览器访问特定列表中的网址。</translation>
 <translation id="222673035924187991">启用经过 TLS 加密的 ClientHello</translation>
 <translation id="2231817271680715693">首次运行时,从默认浏览器导入浏览记录</translation>
 <translation id="2231962946025538735">此政策已被弃用。请使用 <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> 控制 Flash 插件的可用性,并使用 <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> 控制是否应使用集成式 PDF 查看器打开 PDF 文件。
@@ -1646,6 +1647,8 @@
 
       此政策仅会对通过 WebUSB API 访问 USB 设备产生影响。若要通过 Web Serial API 授权访问 USB 设备,请参见 <ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" /> 政策。</translation>
 <translation id="2318583605563438459">允许家长添加受监督的账号</translation>
+<translation id="2319139030891093109">应被 <ph name="PRODUCT_NAME" /> 信任的 TLS 证书的列表。
+证书应采用 base64 编码。</translation>
 <translation id="2326031114717677574">音频数据的取样和收集时间间隔。所允许的最短时间间隔为 1 分钟。
 
       如果此政策未设置,系统会应用默认时间间隔(15 分钟)。</translation>
@@ -2870,6 +2873,15 @@
 <translation id="3398051852031115795">默认的系统行为(具体取决于屏幕大小)</translation>
 <translation id="3399859571630358395">强制停用快速配对(快速蓝牙配对)。</translation>
 <translation id="3404681701763345449">启用 <ph name="GOOGLE_CALENDAR_NAME" />集成。</translation>
+<translation id="3405361833556012520">此政策仅适用于浏览器流量。Play 商店流量、Android 应用网页导航流量和其他用户流量(例如 Linux 虚拟机流量或打印任务)仍需满足由始终开启的 VPN 施加的限制。此政策仅在未连接 VPN 时才会执行,而且仅对用户浏览器流量有效。即使是在执行此政策的情况下,系统流量也可以绕过始终开启的 VPN,执行政策提取和系统时钟同步等任务。
+
+您可借助此政策为某些 scheme、其他网域的子网域、端口或特定路径设置例外情况(需使用指定格式,详见 https://support.google.com/chrome/a?p=url_blocklist_filter_format)。某个网址是否会遭到屏蔽取决于最具体的过滤条件。
+
+如果设置了 <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 并配置了始终开启的 VPN,但是未连接始终开启的 VPN,系统会阻止导航到所有主机(<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 政策允许的主机除外)。在此设备状态下,<ph name="URL_BLOCKLIST_POLICY_NAME" /> 和 <ph name="URL_ALLOWLIST_POLICY_NAME" /> 会被忽略。当连接始终开启的 VPN 时,系统会使用 <ph name="URL_BLOCKLIST_POLICY_NAME" /> 和 <ph name="URL_ALLOWLIST_POLICY_NAME" /> 政策,而 <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 政策会被忽略。
+
+此政策最多只能包含 1,000 个条目。
+
+如果未设置此政策,当在严格模式下激活始终开启的 VPN,而且未连接 VPN 时,系统会阻止所有浏览器导航。</translation>
 <translation id="3405997282295704902">不允许用户使用 <ph name="PRODUCT_NAME" /></translation>
 <translation id="3406122462682235653">不询问用户(直接开始下载)</translation>
 <translation id="3408078762098350617">此政策用于控制 <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" /> 中所列的已停用功能的用户体验。
@@ -3175,7 +3187,6 @@
 
 对于 <ph name="PRODUCT_NAME" />,此政策仅在已使用 <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> 注册相应设备后才有效。
 对于 <ph name="PRODUCT_OS_NAME" />,此政策一直有效。</translation>
-<translation id="3642557248926713561">停用安全浏览扩展程序保护功能</translation>
 <translation id="3644735978203799620">允许自动选择多个屏幕截图</translation>
 <translation id="3646859102161347133">设置放大镜类型</translation>
 <translation id="3647212518036289905">通过设置此政策,您可以指定要用于 HTTP 身份验证的 GSSAPI 库。您可以将此政策设为库名称或完整路径。
@@ -4534,6 +4545,7 @@
 <translation id="4802905909524200151">配置 <ph name="TPM_FIRMWARE_UPDATE_TPM" /> 固件更新行为</translation>
 <translation id="4804828344300125154">在用户退出后一律重新启动。</translation>
 <translation id="4807950475297505572">删除最近使用最少的用户,直到有足够的可用空间</translation>
+<translation id="4808396444416188826">应被 <ph name="PRODUCT_NAME" /> 信任的 TLS 服务器证书</translation>
 <translation id="4812270373673968774">将此政策设为“始终”会自动隐藏 <ph name="PRODUCT_OS_NAME" />工具栏。将此政策设为“永不”可确保工具栏一律不会自动隐藏。
 
       如果您设置了此政策,用户便无法更改它。如果您不设置此政策,用户可以决定是否让工具栏自动隐藏。</translation>
@@ -5605,8 +5617,6 @@
       如果此政策设为 False 或未设置,那么从 M80 起,系统会默认停用 Web Components v0 功能。
 
       在 Chrome 84 之后,此政策将被移除。</translation>
-<translation id="5755149423476170868">如果此政策已启用或未设置,<ph name="SAFE_BROWSING_NAME" />扩展程序保护功能将由 <ph name="PRODUCT_NAME" /> 的 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> 控制。如果 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> 设为“<ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" />”或“<ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />”,系统会在 <ph name="PRODUCT_NAME" /> 中更快地停用恶意扩展程序。<ph name="PRODUCT_NAME" /> 会向 Google 安全浏览服务器发送请求,以检查某个扩展程序是否已因以下原因而从 Chrome 应用商店下架:被视为存在问题,即存在恶意、有漏洞、属于垃圾软件,或违反了 Chrome 应用商店 (CWS) 政策。如果某个扩展程序已被下架,<ph name="PRODUCT_NAME" /> 会禁止用户安装该扩展程序;如果用户已安装该扩展程序,则会停用它。
-如果此政策已停用,系统会停用<ph name="SAFE_BROWSING_NAME" />扩展程序保护功能,并会降低通过 <ph name="GOOGLE_UPDATE_NAME" />定期检查和移除恶意扩展程序的频率。系统不会向 Google <ph name="SAFE_BROWSING_NAME" />发送数据来请求判定。</translation>
 <translation id="575647238840663288">默认情况下,文档可能会被放入以源为键的代理集群中。无法为此类文档设置 document.domain。</translation>
 <translation id="5756680608782814094">报告设备的 VPD 信息。
 
@@ -5723,7 +5733,6 @@
 <translation id="5883754873839596178">通过设置此政策,您可以指定可同时连接到代理服务器的连接数上限。某些代理服务器无法处理由同一客户端同时发出的大量连接,您只需将此政策设为较小的值即可解决该问题。此政策的值应大于 6 且小于 100。众所周知,某些 Web 应用采用了挂起 GET,这样会消耗大量连接,因此如果打开的此类 Web 应用过多,将政策值设为小于 32 就可能会导致浏览器网络连接挂起。如果所设的政策值小于默认值,您需自担风险。
 
       如果您未设置此政策,系统将使用默认值 32。</translation>
-<translation id="5885770645815872943">允许使用安全浏览扩展程序保护功能</translation>
 <translation id="5887414688706570295">配置供远程访问主机使用的 TalkGadget 前缀,并禁止用户更改此设置。
 
           如果指定的话,该前缀将附加到 TalkGadge 基本名称之前,两者共同构成 TalkGadget 的完整域名。TalkGadget 基本域名为.talkgadget.google.com。
@@ -6362,7 +6371,6 @@
           如果此政策已停用,<ph name="PRODUCT_OS_NAME" /> 设备将无法检索 <ph name="GOOGLE_CALENDAR_NAME" />活动来为已登录用户填充系统状态栏中的 <ph name="PRODUCT_OS_NAME" /> 日历微件。
 
           如果未设置此政策,则默认情况下,系统会为企业用户启用 <ph name="GOOGLE_CALENDAR_NAME" />功能。</translation>
-<translation id="6450607392928079050">安全浏览扩展程序保护功能由 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> 政策控制</translation>
 <translation id="6452882999388592166">如果此政策已启用,系统会在浏览器启动时加载内置的 CryptoToken 组件扩展程序。如果此政策已停用或未设置,系统不会在浏览器启动时加载 CryptoToken。此政策旨在作为一种临时的变通方案,用于处理因未定义“chrome.runtime”(这是由于在 M106 中移除 CryptoToken 所致的不良后果)而无法正常运行的网站。网站不得依赖于无条件定义的“chrome.runtime”。</translation>
 <translation id="6453641799812499182">在新版 <ph name="CORS" /> 实现方案中启用 <ph name="CORS" /> 检查缓解功能</translation>
 <translation id="645425387487868471">为 <ph name="PRODUCT_NAME" /> 启用强制登录功能</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index f7830a0..c2f8d24 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1498,6 +1498,7 @@
       如果設為 True 或未設定,則系統會回報裝置的網路狀態。</translation>
 <translation id="2223393221350938149">禁止任何網站執行 JavaScript JIT</translation>
 <translation id="2223598546285729819">預設通知設定</translation>
+<translation id="2224706708550115831">如果「永久連線的 VPN」處於嚴格模式、封鎖功能已啟用,但裝置未連上該 VPN,系統就會允許使用者的瀏覽器存取網址清單</translation>
 <translation id="222673035924187991">啟用經過 TLS 加密的 ClientHello</translation>
 <translation id="2231817271680715693">第一次執行時從預設瀏覽器匯入瀏覽記錄</translation>
 <translation id="2231962946025538735">這項政策已淘汰,請使用 <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> 控管是否要提供 Flash 外掛程式,並使用 <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> 指定是否要使用整合式 PDF 檢視器開啟 PDF 檔案。
@@ -1635,6 +1636,8 @@
 
       這項政策只會影響透過 WebUSB API 存取 USB 裝置的權限。如要授予透過 Web Serial API 存取 USB 裝置的權限,請參閱 <ph name="SERIAL_ALLOW_USB_DEVICES_FOR_URLS_POLICY_NAME" /> 政策。</translation>
 <translation id="2318583605563438459">允許家長新增受監督的帳戶</translation>
+<translation id="2319139030891093109"><ph name="PRODUCT_NAME" /> 應信任的 TLS 憑證清單。
+憑證必須採用 base64 編碼。</translation>
 <translation id="2326031114717677574">系統取樣和收集音訊資料的頻率。下限值是 1 分鐘。
 
       如果未設定,系統會套用 15 分鐘的預設頻率。</translation>
@@ -2842,6 +2845,15 @@
 <translation id="3398051852031115795">系統預設行為 (視螢幕大小而定)</translation>
 <translation id="3399859571630358395">強制停用快速配對功能 (快速藍牙配對)。</translation>
 <translation id="3404681701763345449">啟用 <ph name="GOOGLE_CALENDAR_NAME" />整合。</translation>
+<translation id="3405361833556012520">這項政策僅適用於瀏覽器流量。Play 商店、Android 應用程式網頁瀏覽和其他使用者流量 (例如 Linux VM 流量或列印工作) 仍會適用「永久連線的 VPN」所設定的限制。這項政策只會在未連上 VPN 的情況強制執行,而且只適用於使用者的瀏覽器流量。這項政策強制執行時,系統流量也可以略過「永久連線的 VPN」,執行擷取政策和同步處理系統時鐘等工作。
+
+請使用 https://support.google.com/chrome/a?p=url_blocklist_filter_format 網頁中指定的格式,透過這項政策將特定的網路協定、其他網域的子網域、通訊埠或特定路徑設為例外。如要判定是否封鎖某個網址,系統會以條件最精確的篩選器做為判定依據。
+
+設定 <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 後,如果「永久連線的 VPN」已完成設定但未連線,系統將封鎖與所有主機的連線 (<ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 政策允許的連線除外)。在這個裝置狀態中,系統會忽略 <ph name="URL_BLOCKLIST_POLICY_NAME" /> 和 <ph name="URL_ALLOWLIST_POLICY_NAME" />。「永久連線的 VPN」連線時,系統會套用 <ph name="URL_BLOCKLIST_POLICY_NAME" /> 和 <ph name="URL_ALLOWLIST_POLICY_NAME" /> 政策並忽略 <ph name="ALWAYSON_VPN_PRE_CONNECT_URL_ALLOWLIST_POLICY_NAME" /> 政策。
+
+這項政策最多只能有 1,000 個項目。
+
+如果不設定這項政策,只要「永久連線的 VPN」處於嚴格模式,但裝置未連上該 VPN,系統將禁止瀏覽器開啟網頁。</translation>
 <translation id="3405997282295704902">不允許使用者使用 <ph name="PRODUCT_NAME" /></translation>
 <translation id="3406122462682235653">不詢問使用者 (立即開始下載)</translation>
 <translation id="3408078762098350617">這項政策會控管 <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" /> 中已停用功能的使用者體驗。
@@ -3136,7 +3148,6 @@
 
 如果是 <ph name="PRODUCT_NAME" />,裝置必須使用 <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> 註冊,這項政策才會生效。
 如果是 <ph name="PRODUCT_OS_NAME" />,這項政策會一律生效。</translation>
-<translation id="3642557248926713561">停用安全瀏覽擴充功能防護功能</translation>
 <translation id="3644735978203799620">擷取多個螢幕畫面時啟用自動選取功能</translation>
 <translation id="3646859102161347133">設定螢幕放大鏡類型</translation>
 <translation id="3647212518036289905">你可以透過這項政策指定要用於 HTTP 驗證的 GSSAPI 程式庫。請將這項政策設為程式庫名稱或完整路徑。
@@ -4484,6 +4495,7 @@
 <translation id="4802905909524200151">設定 <ph name="TPM_FIRMWARE_UPDATE_TPM" /> 韌體更新行為</translation>
 <translation id="4804828344300125154">�在使用者登出時一律重新啟動。</translation>
 <translation id="4807950475297505572">移除近期登入次數最少的使用者,直到有足夠的可用空間</translation>
+<translation id="4808396444416188826"><ph name="PRODUCT_NAME" /> 應信任的 TLS 伺服器憑證</translation>
 <translation id="4812270373673968774">如果將這項政策設為 Always,系統會自動隱藏 <ph name="PRODUCT_OS_NAME" />檔案櫃。如果將這項政策設為 Never,系統一律不會自動隱藏檔案櫃。
 
       如果設定這項政策,使用者將無法變更。如果未設定,使用者可自行決定是否要自動隱藏檔案櫃。</translation>
@@ -5543,8 +5555,6 @@
       如果不設定這項政策或設為 False,那麼從 M80 版開始,系統在預設狀態下會停用 Web Components v0 功能。
 
       這項政策將在 Chrome 第 84 版後移除。</translation>
-<translation id="5755149423476170868">如果啟用或不設定這項政策,<ph name="PRODUCT_NAME" /> 的 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> 將控管<ph name="SAFE_BROWSING_NAME" />擴充功能防護功能。如果將 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> 設為「<ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_STANDARD" />」或「<ph name="SAFE_BROWSING_PROTECTION_LEVEL_VALUE_ENHANCED" />」,就能更快停用 <ph name="PRODUCT_NAME" /> 中的惡意擴充功能。<ph name="PRODUCT_NAME" /> 會傳送要求至 Google 安全瀏覽伺服器,檢查擴充功能是否因以下可能因素而從 Chrome 線上應用程式商店下架:惡意軟體、安全漏洞、垃圾軟體或違反 Chrome 線上應用程式商店 (CWS) 政策等。如果擴充功能已經下架,<ph name="PRODUCT_NAME" /> 會禁止使用者安裝該擴充功能;如果已安裝,系統會停用該擴充功能。
-如果停用這項政策,系統將停用<ph name="SAFE_BROWSING_NAME" />擴充功能防護功能,並透過 <ph name="GOOGLE_UPDATE_NAME" />不定期檢查及移除惡意擴充功能。系統不會傳送資料給 Google <ph name="SAFE_BROWSING_NAME" />進行評斷。</translation>
 <translation id="575647238840663288">根據預設,系統可能會將文件放置在 origin-keyed 代理程式叢集中。開發人員無法為這類文件設定 document.domain。</translation>
 <translation id="5756680608782814094">回報裝置的 VPD 資訊。
 
@@ -5661,7 +5671,6 @@
 <translation id="5883754873839596178">你可以透過這項政策設定 Proxy 伺服器的同時連線數量上限。部分 Proxy 伺服器無法處理單一用戶端的大量並行連線,你可以調降這項政策的值來解決這個問題。這項政策的值必須介於 6 到 100 之間。已知部分網頁應用程式會耗用許多連線來處理停滯的 GET 動作,因此如果設定低於 32 的值,當太多這類網頁應用程式開啟時,可能會導致瀏覽器網路當機。請自行承擔低於預設值的風險。
 
       如果未設定這項政策,系統將採用 32 做為預設值。</translation>
-<translation id="5885770645815872943">允許安全瀏覽擴充功能防護功能</translation>
 <translation id="5887414688706570295">設定遠端存取主機所要使用的 TalkGadget 前置詞,並且防止使用者變更這項設定。
 
           如果你已指定前置詞,則該前置詞將加在 TalkGadget 基礎名稱前方,以建立 TalkGadget 的完整網域名稱。TalkGadget 的基礎網域名稱為「.talkgadget.google.com」。
@@ -6287,7 +6296,6 @@
           如果停用這項政策,<ph name="PRODUCT_OS_NAME" /> 裝置就無法擷取已登入使用者的 <ph name="GOOGLE_CALENDAR_NAME" />活動,然後填入系統狀態列中的 <ph name="PRODUCT_OS_NAME" /> 日曆小工具。
 
           如果不設定這項政策,系統預設會為企業版使用者啟用 <ph name="GOOGLE_CALENDAR_NAME" />功能。</translation>
-<translation id="6450607392928079050">安全瀏覽擴充功能防護功能是由 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> 政策控管</translation>
 <translation id="6452882999388592166">如果設為啟用,系統會在啟動時載入內建的 CryptoToken 元件擴充功能。如果設為停用或不設定,瀏覽器啟動時就不會載入 CryptoToken。在 M106 中,我們移除了 CryptoToken,因而導致「chrome.runtime」呈現未定義的狀態。這項政策是用於處理網站因此故障的暫時性解決方案。網站不應無條件將「chrome.runtime」視為已定義。</translation>
 <translation id="6453641799812499182">在新版 <ph name="CORS" /> 模式中啟用 <ph name="CORS" /> 檢查安全防護措施</translation>
 <translation id="645425387487868471">啟用 <ph name="PRODUCT_NAME" /> 的強制登入功能</translation>
diff --git a/components/safe_browsing/core/common/safebrowsing_referral_methods.h b/components/safe_browsing/core/common/safebrowsing_referral_methods.h
index e4c9591..d27bb2b 100644
--- a/components/safe_browsing/core/common/safebrowsing_referral_methods.h
+++ b/components/safe_browsing/core/common/safebrowsing_referral_methods.h
@@ -14,8 +14,7 @@
   kSafetyCheck = 1,
   kPromoSlingerReferral = 2,
   kDownloadBubbleSubpage = 3,
-  kDownloadButtonIphPromo = 4,
-  kMaxValue = kDownloadButtonIphPromo,
+  kMaxValue = kDownloadBubbleSubpage,
 };
 
 }  // namespace safe_browsing
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 7647f7d..0a45687 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Избрана бе опцията за номер на сградата</translation>
 <translation id="1080116354587839789">Побиране на ширина</translation>
 <translation id="1081061862829655580">Тава 19</translation>
+<translation id="1082026381988252344">Превъртане и промяна на мащаба на съдържанието на споделения раздел</translation>
 <translation id="1089439967362294234">Промяна на паролата</translation>
 <translation id="1090629319939036170">Меню за VR</translation>
 <translation id="1094777233105318927">Информация за вашите браузър, операционна система, устройство, инсталиран софтуер и файлове</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">В момента не можете да посетите <ph name="SITE" />, защото уебсайтът използва метод за допълнително потвърждаване на сертификатите. Обикновено грешките в мрежата и атаките срещу нея са временни, така че тази страница вероятно ще работи по-късно.</translation>
 <translation id="6051898664905071243">Брой страници:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN се попълва</translation>
 <translation id="6053584886670442526">Можете да използвате запазените адреси в различни продукти на Google. Този адрес е запазен в профила ви в Google (<ph name="ACCOUNT" />).</translation>
 <translation id="6053735090575989697">В Декларацията ни за поверителност можете да научите повече за това как Google защитава данните ви.</translation>
 <translation id="6055888660316801977">Лист за несъответстващи идентификационни данни за сигурни плащания</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">Онлайн видео</translation>
 <translation id="6613866251791999074">Научете повече за търсещата си машина в Chrome</translation>
 <translation id="6615297766614333076">Стакер 2</translation>
+<translation id="6619496928666593220">IBAN номерът не бе попълнен</translation>
 <translation id="6624427990725312378">Информация за връзка</translation>
 <translation id="6628463337424475685">Търсене с/ъс <ph name="ENGINE" /></translation>
 <translation id="6629652037942826935">Луксозни пътувания</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index 75b346d..236869f45 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Die Option „Hausnummer“ wurde ausgewählt</translation>
 <translation id="1080116354587839789">An Breite anpassen</translation>
 <translation id="1081061862829655580">Fach 19</translation>
+<translation id="1082026381988252344">Inhalte im geteilten Tab scrollen und zoomen</translation>
 <translation id="1089439967362294234">Passwort ändern</translation>
 <translation id="1090629319939036170">VR-Menü</translation>
 <translation id="1094777233105318927">Informationen zu deinem Browser, Betriebssystem, Gerät, der installierten Software und den Dateien</translation>
@@ -2526,6 +2527,7 @@
 <translation id="6051221802930200923">Du kannst <ph name="SITE" /> zurzeit nicht aufrufen, weil die Website das Zertifikats-Pinning nutzt. Netzwerkfehler und Angriffe sind in der Regel nur vorübergehend, sodass die Seite wahrscheinlich später wieder funktioniert.</translation>
 <translation id="6051898664905071243">Seitenzahl:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN wird ausgefüllt</translation>
 <translation id="6053584886670442526">Du kannst gespeicherte Adressen in allen Google-Produkten verwenden. Diese Adresse ist in deinem Google-Konto <ph name="ACCOUNT" /> gespeichert.</translation>
 <translation id="6053735090575989697">Weitere Informationen dazu, wie Google zum Schutz deiner Daten beiträgt, findest du in unserer Datenschutzerklärung.</translation>
 <translation id="6055888660316801977">Sichere Anmeldedaten für Zahlungen – Tabellenblatt für nicht übereinstimmende sichere Anmeldedaten</translation>
@@ -2800,6 +2802,7 @@
 <translation id="6612010098632894193">Onlinevideos</translation>
 <translation id="6613866251791999074">Weitere Informationen zu deiner Suchmaschine in Chrome</translation>
 <translation id="6615297766614333076">Stapelfach 2</translation>
+<translation id="6619496928666593220">IBAN nicht ausgefüllt</translation>
 <translation id="6624427990725312378">Kontaktdaten</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" />-Suche</translation>
 <translation id="6629652037942826935">Luxusreisen</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index c0e663f..92e84aa4 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Tehti valik Majanumber</translation>
 <translation id="1080116354587839789">Sobita laiusesse</translation>
 <translation id="1081061862829655580">Salv 19</translation>
+<translation id="1082026381988252344">Teie jagatud vahelehe sisu kerimine ja suumimine</translation>
 <translation id="1089439967362294234">Parooli muutmine</translation>
 <translation id="1090629319939036170">VR-menüü</translation>
 <translation id="1094777233105318927">Teave teie brauseri, OS-i, seadme, installitud tarkvara ja failide kohta</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">Te ei saa saiti <ph name="SITE" /> praegu külastada, sest veebisait kasutab sertifikaadi kinnitamist. Võrguvead ja -rünnakud on tavaliselt ajutised, nii et leht tõenäoliselt hiljem töötab.</translation>
 <translation id="6051898664905071243">Lehtede arv:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN-i sisestamine</translation>
 <translation id="6053584886670442526">Salvestatud aadresse saate kasutada kõigis Google'i teenustes. See aadress salvestatakse teie Google'i kontole <ph name="ACCOUNT" />.</translation>
 <translation id="6053735090575989697">Vaadake meie privaatsuseeskirjadest lisateavet selle kohta, kuidas Google teie andmeid kaitseb.</translation>
 <translation id="6055888660316801977">Turvalise maksemandaadi leht selle kohta, et pole ühtegi sobivat mandaati</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">Veebipõhised videod</translation>
 <translation id="6613866251791999074">Lisateave otsingumootori kohta Chrome'is</translation>
 <translation id="6615297766614333076">Virnastaja 2</translation>
+<translation id="6619496928666593220">IBAN on sisestamata</translation>
 <translation id="6624427990725312378">Kontaktteave</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" />'i otsing</translation>
 <translation id="6629652037942826935">Luksusreisid</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index d0f7bc61..89d6327 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">گزینه شماره ساختمان انتخاب شد</translation>
 <translation id="1080116354587839789">متناسب با پهنا</translation>
 <translation id="1081061862829655580">سینی ۱۹</translation>
+<translation id="1082026381988252344">پیمایش و بزرگ‌نمایی محتوای برگه هم‌رسانی‌شده</translation>
 <translation id="1089439967362294234">تغییر گذرواژه</translation>
 <translation id="1090629319939036170">‏منو VR</translation>
 <translation id="1094777233105318927">اطلاعات مربوط به مرورگر، سیستم‌عامل، دستگاه، نرم‌افزار نصب‌شده، و فایل‌های شما</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">درحال‌حاضر نمی‌توانید از <ph name="SITE" /> دیدن کنید، زیرا وب‌سایت از سنجاق کردن گواهینامه استفاده می‌کند. خطاهای شبکه و حمله‌ها موقتی هستند، بنابراین احتمالاً این صفحه بعداً کار خواهد کرد.</translation>
 <translation id="6051898664905071243">تعداد صفحه:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">‏درحال تکمیل IBAN</translation>
 <translation id="6053584886670442526">‏می‌توانید از نشانی‌های ذخیره‌شده در محصولات Google استفاده کنید. این نشانی در «حساب Google» شما (<ph name="ACCOUNT" />) ذخیره شده است.</translation>
 <translation id="6053735090575989697">‏در «خط‌مشی رازداری» ما، اطلاعات بیشتری درباره اینکه Google چگونه از داده‌هایتان محافظت می‌کند کسب کنید.</translation>
 <translation id="6055888660316801977">برگ «اطلاعات کاربری مطابقت ندارد» در روند وارد کردن اطلاعات کاربری پرداخت امن</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">ویدیو  آنلاین</translation>
 <translation id="6613866251791999074">‏درباره موتور جستجویتان در Chrome بیشتر بدانید</translation>
 <translation id="6615297766614333076">پشته‌ساز ۲</translation>
+<translation id="6619496928666593220">‏IBAN تکمیل نشده است</translation>
 <translation id="6624427990725312378">اطلاعات تماس</translation>
 <translation id="6628463337424475685">جستجوی <ph name="ENGINE" /></translation>
 <translation id="6629652037942826935">سفر تجملی</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb
index 34eec08..70b4767 100644
--- a/components/strings/components_strings_fr-CA.xtb
+++ b/components/strings/components_strings_fr-CA.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Option Numéro de bâtiment sélectionnée</translation>
 <translation id="1080116354587839789">Adapter à la largeur</translation>
 <translation id="1081061862829655580">Bac 19</translation>
+<translation id="1082026381988252344">Faites défiler et zoomer le contenu de votre onglet partagé</translation>
 <translation id="1089439967362294234">Modifier le mot de passe</translation>
 <translation id="1090629319939036170">Menu RV</translation>
 <translation id="1094777233105318927">Renseignements à propos de votre navigateur, de votre système d'exploitation, de votre appareil, des logiciels installés et des fichiers</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">Vous ne pouvez pas consulter le site <ph name="SITE" /> pour le moment, car le site Web utilise l'épinglage de certificat. Les erreurs réseau et les attaques sont généralement temporaires. Vous devriez donc pouvoir accéder à cette page plus tard.</translation>
 <translation id="6051898664905071243">Nombre de pages :</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">Remplir l'IBAN</translation>
 <translation id="6053584886670442526">Vous pouvez utiliser les adresses enregistrées avec tous les produits Google. Cette adresse est enregistrée dans votre compte Google, <ph name="ACCOUNT" />.</translation>
 <translation id="6053735090575989697">Apprenez-en plus sur la façon dont Google protège vos données dans notre politique de confidentialité.</translation>
 <translation id="6055888660316801977">Feuille d'authentification pour l'authentifiant de paiement sécurisé qui ne correspond pas</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">Vidéo en ligne</translation>
 <translation id="6613866251791999074">En savoir plus sur votre moteur de recherche dans Chrome</translation>
 <translation id="6615297766614333076">Empileur 2</translation>
+<translation id="6619496928666593220">IBAN non rempli</translation>
 <translation id="6624427990725312378">Coordonnées</translation>
 <translation id="6628463337424475685">Recherche <ph name="ENGINE" /></translation>
 <translation id="6629652037942826935">Voyages de luxe</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 04d796440..0446d1d1 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">'बिल्डिंग नंबर' विकल्प चुना गया</translation>
 <translation id="1080116354587839789">चौड़ाई में फ़िट करें</translation>
 <translation id="1081061862829655580">ट्रे 19</translation>
+<translation id="1082026381988252344">शेयर किए गए आपके टैब के कॉन्टेंट को स्क्रोल और ज़ूम करें</translation>
 <translation id="1089439967362294234">पासवर्ड बदलें</translation>
 <translation id="1090629319939036170">वीआर मेन्यू</translation>
 <translation id="1094777233105318927">आपके ब्राउज़र, ओएस, डिवाइस, इंस्टॉल किए गए सॉफ़्टवेयर, और फ़ाइलों की जानकारी</translation>
@@ -1429,7 +1430,7 @@
 <translation id="3807366285948165054">इमेज X शिफ़्ट</translation>
 <translation id="3807873520724684969">खतरनाक सामग्री ब्लॉक की गई.</translation>
 <translation id="3810770279996899697">Password Manager को MacOS Keychain का ऐक्सेस चाहिए</translation>
-<translation id="3810973564298564668">प्रबंधित करें</translation>
+<translation id="3810973564298564668">मैनेज करें</translation>
 <translation id="3812398568375898177">यह एक ज़रूरी अपडेट है, जिससे ChromeOS पर Android ऐप्लिकेशन की परफ़ॉर्मेंस बेहतर होती है.</translation>
 <translation id="3815434930383843058">8 x 12 इंच</translation>
 <translation id="3816482573645936981">मान (इस मान की जगह लागू किया गया)</translation>
@@ -2358,7 +2359,7 @@
 <translation id="5699628521141772782">डेयरी प्रॉडक्ट और अंडे</translation>
 <translation id="5700761515355162635">तीसरे पक्ष की कुकी को अनुमति है</translation>
 <translation id="5701381305118179107">मध्य</translation>
-<translation id="570530837424789914">प्रबंधित करें...</translation>
+<translation id="570530837424789914">मैनेज करें...</translation>
 <translation id="5707154300732650394">'Chrome इतिहास' में, अपनी गतिविधियां फिर से शुरू करें</translation>
 <translation id="57094364128775171">मज़बूत पासवर्ड सुझाएं…</translation>
 <translation id="571403275720188526">(arm64)</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">आप इस समय <ph name="SITE" /> पर नहीं जा सकते क्योंकि वेबसाइट, प्रमाणपत्र पिनिंग का उपयोग करती है. नेटवर्क की गड़बड़ियां और हमले आमतौर पर कुछ समय के लिए होते हैं इसलिए यह पेज शायद बाद में ठीक से काम करेगा.</translation>
 <translation id="6051898664905071243">पेजों की संख्या:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN की जानकारी दी जा रही है</translation>
 <translation id="6053584886670442526">सेव किए गए पतों का इस्तेमाल, Google के सभी प्रॉडक्ट के लिए किया जा सकता है. यह पता आपके Google खाते <ph name="ACCOUNT" /> में सेव किया गया है.</translation>
 <translation id="6053735090575989697">हमारी निजता नीति को पढ़कर जानें कि Google आपके डेटा की सुरक्षा कैसे करता है.</translation>
 <translation id="6055888660316801977">मेल नहीं खाने वाले पेमेंट क्रेडेंशियल की शीट</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">ऑनलाइन वीडियो</translation>
 <translation id="6613866251791999074">Chrome में अपने सर्च इंजन के बारे में ज़्यादा जानें</translation>
 <translation id="6615297766614333076">स्टैकर 2</translation>
+<translation id="6619496928666593220">IBAN की जानकारी नहीं दी गई है</translation>
 <translation id="6624427990725312378">संपर्क जानकारी</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> सर्च</translation>
 <translation id="6629652037942826935">लग्ज़री ट्रैवल</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb
index 697adfe..5e5ea1e 100644
--- a/components/strings/components_strings_hy.xtb
+++ b/components/strings/components_strings_hy.xtb
@@ -58,6 +58,7 @@
 <translation id="1078033282564106222">Ընտրվել է տան համարի տարբերակը</translation>
 <translation id="1080116354587839789">Հարմարեցնել լայնությանը</translation>
 <translation id="1081061862829655580">Դարակ 19</translation>
+<translation id="1082026381988252344">Ոլորեք և խոշորացրեք ընդհանուր ներդիրի բովանդակությունը</translation>
 <translation id="1089439967362294234">Փոխել գաղտնաբառը</translation>
 <translation id="1090629319939036170">VR ընտրացանկ</translation>
 <translation id="1094777233105318927">Տեղեկություններ ձեր դիտարկիչի, օպերացիոն համակարգի, սարքի, տեղադրված ծրագրերի և ֆայլերի մասին</translation>
@@ -2539,6 +2540,7 @@
 <translation id="6051221802930200923">Այս պահին չեք կարող այցելել <ph name="SITE" /> կայք, քանի որ այն օգտագործում է հավաստագրի ամրացում։ Ցանցային սխալներն ու հարձակումները սովորաբար ժամանակավոր բնույթ են կրում, և հավանաբար այս էջը հասանելի կլինի ավելի ուշ:</translation>
 <translation id="6051898664905071243">Էջերի քանակը՝</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN համարը լրացվում է</translation>
 <translation id="6053584886670442526">Դուք կարող եք օգտագործել պահված հասցեները Google-ի արտադրանքներում։ Այս հասցեն պահված է ձեր Google հաշվում (<ph name="ACCOUNT" />)։</translation>
 <translation id="6053735090575989697">Լրացուցիչ տեղեկություններ այն մասին, թե ինչպես է Google-ը պաշտպանում ձեր տվյալները, կարող եք գտնել մեր Գաղտնիության քաղաքականության մեջ։</translation>
 <translation id="6055888660316801977">Անվտանգ վճարման տվյալները չեն համապատասխանում տվյալների աղյուսակին</translation>
@@ -2813,6 +2815,7 @@
 <translation id="6612010098632894193">Առցանց տեսանյութեր</translation>
 <translation id="6613866251791999074">Իմանալ ավելին իմ որոնողական համակարգի մասին Chrome-ում</translation>
 <translation id="6615297766614333076">Շեղջիչ 2</translation>
+<translation id="6619496928666593220">IBAN համարը լրացված չէ</translation>
 <translation id="6624427990725312378">Կոնտակտային տվյալներ</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Որոնում</translation>
 <translation id="6629652037942826935">Շքեղ ճանապարհորդություն</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index d664fc5..5452b2c 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Opsi nomor gedung dipilih</translation>
 <translation id="1080116354587839789">Paskan dengan lebar</translation>
 <translation id="1081061862829655580">Baki 19</translation>
+<translation id="1082026381988252344">Scroll dan zoom konten tab yang dibagikan</translation>
 <translation id="1089439967362294234">Ubah Sandi</translation>
 <translation id="1090629319939036170">Menu VR</translation>
 <translation id="1094777233105318927">Informasi tentang browser, OS, perangkat, software terinstal, dan file</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">Anda tidak dapat membuka <ph name="SITE" /> sekarang karena situs menggunakan penyematan sertifikat. Error jaringan dan serangan biasanya bersifat sementara, sehingga halaman ini mungkin akan berfungsi nanti.</translation>
 <translation id="6051898664905071243">Jumlah halaman:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">Mengisi IBAN</translation>
 <translation id="6053584886670442526">Anda dapat menggunakan alamat tersimpan di seluruh produk Google. Alamat ini disimpan di Akun Google Anda, <ph name="ACCOUNT" />.</translation>
 <translation id="6053735090575989697">Pelajari lebih lanjut cara Google melindungi data Anda dalam Kebijakan Privasi kami.</translation>
 <translation id="6055888660316801977">Sheet tidak ada kredensial yang cocok untuk Kredensial pembayaran aman</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">Video online</translation>
 <translation id="6613866251791999074">Pelajari lebih lanjut mesin telusur di Chrome</translation>
 <translation id="6615297766614333076">Tempat kertas 2</translation>
+<translation id="6619496928666593220">IBAN belum diisi</translation>
 <translation id="6624427990725312378">Info Kontak</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Penelusuran</translation>
 <translation id="6629652037942826935">Perjalanan Mewah</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index cf90059..5f74b8b2 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">建物番号のオプションが選択されました</translation>
 <translation id="1080116354587839789">ウィンドウ幅に合わせる</translation>
 <translation id="1081061862829655580">トレイ 19</translation>
+<translation id="1082026381988252344">共有タブの内容をスクロールしてズームする</translation>
 <translation id="1089439967362294234">パスワードを変更</translation>
 <translation id="1090629319939036170">VR メニュー</translation>
 <translation id="1094777233105318927">ブラウザ、OS、デバイス、インストール済みソフトウェア、ファイルに関する情報</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923"><ph name="SITE" /> では証明書ピンニングが使用されているため、現在アクセスできません。通常、ネットワーク エラーやネットワークへの攻撃は一時的なものです。しばらくするとページにアクセスできるようになります。</translation>
 <translation id="6051898664905071243">ページ数:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN の入力</translation>
 <translation id="6053584886670442526">この住所は Google アカウント(<ph name="ACCOUNT" />)に保存され、Google サービス全体で使用できます。</translation>
 <translation id="6053735090575989697">Google によるユーザーデータの保護について、詳しくはプライバシー ポリシーをご覧ください。</translation>
 <translation id="6055888660316801977">保護されたお支払い認証情報(認証情報の一致なし)シート</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">オンライン動画</translation>
 <translation id="6613866251791999074">Chrome で使用する検索エンジンについての詳細</translation>
 <translation id="6615297766614333076">スタッカー 2</translation>
+<translation id="6619496928666593220">IBAN が入力されていません</translation>
 <translation id="6624427990725312378">連絡先情報</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> 検索</translation>
 <translation id="6629652037942826935">ハイクラス旅行</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb
index 2e39460..b2338a1 100644
--- a/components/strings/components_strings_kk.xtb
+++ b/components/strings/components_strings_kk.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Ғимарат нөмірі опциясы таңдалды</translation>
 <translation id="1080116354587839789">Еніне сәйкестендіру</translation>
 <translation id="1081061862829655580">19-науа</translation>
+<translation id="1082026381988252344">Ортақ қойынды мазмұнын айналдыру және масштабтау</translation>
 <translation id="1089439967362294234">Құпия сөзді өзгерту</translation>
 <translation id="1090629319939036170">VR мәзірі</translation>
 <translation id="1094777233105318927">Браузер, операциялық жүйе, құрылғы, орнатылған бағдарламалық құрал және файлдар туралы ақпарат</translation>
@@ -2527,6 +2528,7 @@
 <translation id="6051221802930200923">Қазір <ph name="SITE" /> сайтына кіру мүмкін емес, себебі веб сайт сертификат бекітуді пайдаланады. Желі қателері мен шабуылдары әдетте уақытша болғандықтан, бұл бет кейінірек жұмыс істеуі мүмкін.</translation>
 <translation id="6051898664905071243">Бет саны:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN толтырылып жатыр</translation>
 <translation id="6053584886670442526">Google өнімдерінде сақталған мекенжайларды пайдалана аласыз. Бұл мекенжай Google аккаунтыңызда (<ph name="ACCOUNT" />) сақталады.</translation>
 <translation id="6053735090575989697">Құпиялық саясатымыздан Google-дың деректерді қалай қорғайтыны туралы толық ақпарат алыңыз.</translation>
 <translation id="6055888660316801977">Қауіпсіз төлемге арналған деректердің сәйкес келмейтіндігі көрсетілген парақ</translation>
@@ -2801,6 +2803,7 @@
 <translation id="6612010098632894193">Онлайн бейне</translation>
 <translation id="6613866251791999074">Chrome-дағы іздеу жүйесі туралы толық ақпарат</translation>
 <translation id="6615297766614333076">2-жинастырушы</translation>
+<translation id="6619496928666593220">IBAN толтырылмады</translation>
 <translation id="6624427990725312378">Байланыс ақпараты</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Search</translation>
 <translation id="6629652037942826935">Сәнді саяхат</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb
index 55b84fb..4950785 100644
--- a/components/strings/components_strings_ky.xtb
+++ b/components/strings/components_strings_ky.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Сунушталган имараттын номери тандалды</translation>
 <translation id="1080116354587839789">Терезенин туурасына чактоо</translation>
 <translation id="1081061862829655580">19-түпкүч</translation>
+<translation id="1082026381988252344">Жалпы өтмөктүн контентин чоңойтуп/кичирейтүү жана сыдыруу</translation>
 <translation id="1089439967362294234">Сызсөздү өзгөртүү</translation>
 <translation id="1090629319939036170">VR менюсу</translation>
 <translation id="1094777233105318927">Серепчиңиз, OS, түзмөк, орнотулган программа жана файлдар тууралуу маалымат</translation>
@@ -2527,6 +2528,7 @@
 <translation id="6051221802930200923">Вебсайт тастыктама бекиткичин колдонуп жаткандыктан азыр <ph name="SITE" /> сайтына өтө албайсыз. Адатта тармактагы каталар жана чабуулдар убактылуу көрүнүш болгондуктан, бул баракча кийинчерээк иштеп калышы мүмкүн.</translation>
 <translation id="6051898664905071243">Барактардын саны:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN кодун толтуруу</translation>
 <translation id="6053584886670442526">Сакталган даректериңизди Google кызматтарында колдоно аласыз. Бул дарек <ph name="ACCOUNT" /> Google аккаунтуңузга сакталды.</translation>
 <translation id="6053735090575989697">Google маалыматыңызды кандай коргой турганын билгиңиз келсе, Купуялык эрежелерибизге өтүңүз.</translation>
 <translation id="6055888660316801977">Коопсуз төлөө үчүн дал келбеген эсептик дайындар барагы</translation>
@@ -2801,6 +2803,7 @@
 <translation id="6612010098632894193">Онлайн видео</translation>
 <translation id="6613866251791999074">Chrome'догу издөө куралы жөнүндө кеңири маалымат</translation>
 <translation id="6615297766614333076">2-төшөгүч</translation>
+<translation id="6619496928666593220">IBAN коду толтурулган жок</translation>
 <translation id="6624427990725312378">Байланыш маалыматы</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Издөө</translation>
 <translation id="6629652037942826935">Кымбат баалуу саякат</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 33f436f2..573af4a 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">കെട്ടിട നമ്പർ ഓപ്‌ഷൻ തിരഞ്ഞെടുത്തു</translation>
 <translation id="1080116354587839789">അനുയോജ്യമായ വീതിയിലാക്കുക</translation>
 <translation id="1081061862829655580">ട്രേ 19</translation>
+<translation id="1082026381988252344">പങ്കിട്ട ടാബിലെ ഉള്ളടക്കം സ്ക്രോൾ ചെയ്യുക, സൂം ചെയ്യുക</translation>
 <translation id="1089439967362294234">പാസ്‌വേഡ് മാറ്റുക</translation>
 <translation id="1090629319939036170">VR മെനു</translation>
 <translation id="1094777233105318927">നിങ്ങളുടെ ബ്രൗസർ, OS, ഉപകരണം, ഇൻസ്റ്റാൾ ചെയ്ത സോഫ്റ്റ്‌വെയർ, ഫയലുകൾ എന്നിവയെ കുറിച്ചുള്ള വിവരങ്ങൾ</translation>
@@ -2527,6 +2528,7 @@
 <translation id="6051221802930200923"><ph name="SITE" /> എന്ന വെബ്‌സൈറ്റ് സർട്ടിഫിക്കറ്റ് പിന്നിംഗ് ഉപയോഗിക്കുന്നതിനാൽ നിങ്ങൾക്കിപ്പോൾ അത് സന്ദർശിക്കാനാകില്ല. നെറ്റ്‌വർക്ക് പിശകുകളും ആക്രമണങ്ങളും സാധാരണയായി താൽക്കാലികമായിരിക്കും, അതിനാൽ ഈ പേജ് മിക്കവാറും പിന്നീട് പ്രവർത്തിക്കും.</translation>
 <translation id="6051898664905071243">പേജിന്റെ എണ്ണം:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN പൂരിപ്പിക്കുന്നു</translation>
 <translation id="6053584886670442526">സംരക്ഷിച്ച വിലാസങ്ങൾ നിങ്ങൾക്ക് Google ഉൽപ്പന്നങ്ങളിലുടനീളം ഉപയോഗിക്കാം. ഈ വിലാസം നിങ്ങളുടെ <ph name="ACCOUNT" /> എന്ന Google Account-ൽ സംരക്ഷിച്ചിരിക്കുന്നു.</translation>
 <translation id="6053735090575989697">Google എങ്ങനെയാണ് നിങ്ങളുടെ ഡാറ്റ പരിരക്ഷിക്കുന്നത് എന്ന് ഞങ്ങളുടെ സ്വകാര്യതാ നയത്തിൽ കൂടുതലറിയുക.</translation>
 <translation id="6055888660316801977">സുരക്ഷിതമായ പേയ്‌മെന്റ് ക്രെഡൻഷ്യലുമായി പൊരുത്തമില്ലാത്ത ക്രെഡൻഷ്യൽ ഷീറ്റ്</translation>
@@ -2801,6 +2803,7 @@
 <translation id="6612010098632894193">ഓൺലൈൻ വീഡിയോ</translation>
 <translation id="6613866251791999074">Chrome-ലെ നിങ്ങളുടെ തിരയൽ യന്ത്രത്തെക്കുറിച്ച് കൂടുതലറിയുക</translation>
 <translation id="6615297766614333076">സ്റ്റാക്കർ 2</translation>
+<translation id="6619496928666593220">IBAN പൂരിപ്പിച്ചില്ല</translation>
 <translation id="6624427990725312378">കോണ്‍ടാക്റ്റ് വിവരം</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> തിരയൽ</translation>
 <translation id="6629652037942826935">ആഡംബര യാത്ര</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb
index aea8422..42f3f60 100644
--- a/components/strings/components_strings_mn.xtb
+++ b/components/strings/components_strings_mn.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Барилгын дугаарын сонголтыг сонгосон</translation>
 <translation id="1080116354587839789">Өргөний хэмжээнд тааруулах</translation>
 <translation id="1081061862829655580">Тавиур 19</translation>
+<translation id="1082026381988252344">Хуваалцсан табынхаа контентыг гүйлгэж, томруулна уу</translation>
 <translation id="1089439967362294234">Нууц үг солих</translation>
 <translation id="1090629319939036170">VR-н цэс</translation>
 <translation id="1094777233105318927">Таны хөтөч, OS, төхөөрөмж, суулгасан программ хангамж болон файлуудын талаарх мэдээлэл</translation>
@@ -2529,6 +2530,7 @@
 <translation id="6051221802930200923"><ph name="SITE" /> нь сертификат баталгаажуулалтыг ашигладаг тул тус вебсайтад одоогоор зочлох боломжгүй байна. Сүлжээний алдаа, халдлага нь ихэвчлэн түр зуурынх байдаг тул энэ хуудас удахгүй хэвийн ажиллана.</translation>
 <translation id="6051898664905071243">Хуудасны тоо:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">Олон улсын банк акаунтны дугаарыг бөглөж байна</translation>
 <translation id="6053584886670442526">Та Google-н бүтээгдэхүүнүүдэд хадгалсан хаягуудыг ашиглах боломжтой. Энэ хаягийг таны <ph name="ACCOUNT" /> Google Бүртгэлд хадгалсан.</translation>
 <translation id="6053735090575989697">Google таны өгөгдлийг хэрхэн хамгаалдаг талаарх нэмэлт мэдээллийг манай Нууцлалын бодлогоос авна уу.</translation>
 <translation id="6055888660316801977">Тохирох мандат үнэмлэхгүй аюулгүй төлбөрийн мандат үнэмлэхийн хүснэгт</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">Онлайн видео</translation>
 <translation id="6613866251791999074">Chrome-н хайлтын системийнхээ талаар нэмэлт мэдээлэл авах</translation>
 <translation id="6615297766614333076">Гарах цаасыг зэрэгцүүлэх тавцан 2</translation>
+<translation id="6619496928666593220">Олон улсын банк акаунтны дугаарыг бөглөөгүй</translation>
 <translation id="6624427990725312378">Харилцагчийн мэдээлэл</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Хайх</translation>
 <translation id="6629652037942826935">Тансаг аялал</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 6d5391fc..d188029 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">De optie Gebouwnummer is geselecteerd</translation>
 <translation id="1080116354587839789">Aanpassen aan breedte</translation>
 <translation id="1081061862829655580">Lade 19</translation>
+<translation id="1082026381988252344">Scroll en zoom de content van je gedeelde tabblad</translation>
 <translation id="1089439967362294234">Wachtwoord wijzigen</translation>
 <translation id="1090629319939036170">VR-menu</translation>
 <translation id="1094777233105318927">Informatie over je browser, OS, apparaat, geïnstalleerde software en bestanden</translation>
@@ -2523,6 +2524,7 @@
 <translation id="6051221802930200923">Je kunt <ph name="SITE" /> momenteel niet bezoeken, omdat de website gebruikmaakt van certificaatpinning. Netwerkfouten en aanvallen zijn doorgaans tijdelijk, dus deze pagina werkt later waarschijnlijk correct.</translation>
 <translation id="6051898664905071243">Aantal pagina's:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">IBAN invullen</translation>
 <translation id="6053584886670442526">Je kunt opgeslagen adressen gebruiken in meerdere Google-producten. Dit adres is opgeslagen in je Google-account (<ph name="ACCOUNT" />).</translation>
 <translation id="6053735090575989697">In ons Privacybeleid vind je meer informatie over hoe Google je gegevens beschermt.</translation>
 <translation id="6055888660316801977">Pagina waarop staat dat er geen overeenkomende inloggegevens zijn voor beveiligde betaling</translation>
@@ -2796,6 +2798,7 @@
 <translation id="6612010098632894193">Online video</translation>
 <translation id="6613866251791999074">Meer informatie over je zoekmachine in Chrome</translation>
 <translation id="6615297766614333076">Stapeleenheid 2</translation>
+<translation id="6619496928666593220">IBAN niet ingevuld</translation>
 <translation id="6624427990725312378">Contactgegevens</translation>
 <translation id="6628463337424475685">Zoeken via <ph name="ENGINE" /></translation>
 <translation id="6629652037942826935">Luxereizen</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 968c3c5..af1ad32 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Alternativet for bygningsnummer er valgt</translation>
 <translation id="1080116354587839789">Tilpass til vindusbredden</translation>
 <translation id="1081061862829655580">Skuff 19</translation>
+<translation id="1082026381988252344">Rull gjennom og zoom inn på innholdet på den delte fanen</translation>
 <translation id="1089439967362294234">Endre passord</translation>
 <translation id="1090629319939036170">VR-meny</translation>
 <translation id="1094777233105318927">Informasjon om nettleser, OS, enhet, installert programvare og filer.</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">Du kan ikke gå til <ph name="SITE" /> akkurat nå, siden nettstedet bruker sertifikatfesting. Nettverksfeil og -angrep er vanligvis midlertidige, så denne siden fungerer sannsynligvis senere.</translation>
 <translation id="6051898664905071243">Antall sider:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">Fyller ut IBAN</translation>
 <translation id="6053584886670442526">Du kan bruke lagrede adresser i flere Google-produkter. Denne adressen er lagret i Google-kontoen din <ph name="ACCOUNT" />.</translation>
 <translation id="6053735090575989697">Finn ut mer om hvordan Google beskytter dataene dine, i personvernreglene våre.</translation>
 <translation id="6055888660316801977">Ark for sikker betalingslegitimasjon uten samsvarende legitimasjon</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">Nettvideo</translation>
 <translation id="6613866251791999074">Finn ut mer om søkemotoren din i Chrome</translation>
 <translation id="6615297766614333076">Hylle 2</translation>
+<translation id="6619496928666593220">IBAN er ikke fylt ut</translation>
 <translation id="6624427990725312378">Kontaktinformasjon</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Søk</translation>
 <translation id="6629652037942826935">Luksusreiser</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 0a44c67..af08eae 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">A fost selectată opțiunea pentru numărul clădirii</translation>
 <translation id="1080116354587839789">Încadrează pe lățime</translation>
 <translation id="1081061862829655580">Tava 19</translation>
+<translation id="1082026381988252344">Să mărească și să deruleze în conținutul filei la care ai permis accesul</translation>
 <translation id="1089439967362294234">Schimbă parola</translation>
 <translation id="1090629319939036170">Meniu RV</translation>
 <translation id="1094777233105318927">Informații despre browserul, sistemul de operare, dispozitivul, software-ul instalat și fișierele tale</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">Nu poți accesa <ph name="SITE" /> acum, deoarece site-ul folosește fixarea certificatelor. Erorile de rețea și atacurile sunt de obicei temporare și probabil că această pagină va funcționa mai târziu.</translation>
 <translation id="6051898664905071243">Numărul de pagini:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">Se completează codul IBAN</translation>
 <translation id="6053584886670442526">Poți folosi adresele salvate în toate produsele Google. Această adresă se salvează în Contul tău Google (<ph name="ACCOUNT" />).</translation>
 <translation id="6053735090575989697">Află mai multe despre modul în care Google îți protejează datele din Politica de confidențialitate.</translation>
 <translation id="6055888660316801977">Foaia „Datele de conectare pentru plăți securizate nu corespund datelor de conectare”</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">Videoclipuri online</translation>
 <translation id="6613866251791999074">Află mai multe despre motorul tău de căutare din Chrome</translation>
 <translation id="6615297766614333076">Receptorul de hârtie 2</translation>
+<translation id="6619496928666593220">Codul IBAN nu este completat</translation>
 <translation id="6624427990725312378">Informații de contact</translation>
 <translation id="6628463337424475685">Căutare <ph name="ENGINE" /></translation>
 <translation id="6629652037942826935">Călătorii de lux</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index a93326e..58870a5 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Bola vybraná možnosť Číslo budovy</translation>
 <translation id="1080116354587839789">Prispôsobiť šírke</translation>
 <translation id="1081061862829655580">Zásobník č. 19</translation>
+<translation id="1082026381988252344">Posúvať a približovať či odďaľovať obsah vašej zdieľanej karty</translation>
 <translation id="1089439967362294234">Zmeniť heslo</translation>
 <translation id="1090629319939036170">Ponuka VR</translation>
 <translation id="1094777233105318927">Informácie o prehliadači, operačnom systéme, zariadení, nainštalovanom softvéri a súboroch</translation>
@@ -2524,6 +2525,7 @@
 <translation id="6051221802930200923">Web <ph name="SITE" /> momentálne nemôžete navštíviť, pretože používa pripínanie certifikátov. Chyby siete a útoky sú zvyčajne dočasné, takže by táto stránka mala neskôr pravdepodobne fungovať.</translation>
 <translation id="6051898664905071243">Počet strán:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">Vypĺňa sa číslo IBAN</translation>
 <translation id="6053584886670442526">V službách Googlu môžete používať uložené adresy. Táto adresa je uložená vo vašom účte Google <ph name="ACCOUNT" />.</translation>
 <translation id="6053735090575989697">Viac o tom, ako Google chráni vaše údaje, sa dozviete v našich pravidlách ochrany súkromia.</translation>
 <translation id="6055888660316801977">Hárok s nezodpovedajúcim poverením pre prihlasovací údaj zabezpečenej platby</translation>
@@ -2797,6 +2799,7 @@
 <translation id="6612010098632894193">Online video</translation>
 <translation id="6613866251791999074">Ďalšie informácie o vašom vyhľadávači v Chrome</translation>
 <translation id="6615297766614333076">Odkladač č. 2</translation>
+<translation id="6619496928666593220">Číslo IBAN nebolo vyplnené</translation>
 <translation id="6624427990725312378">Kontaktné údaje</translation>
 <translation id="6628463337424475685">Vyhľadávanie <ph name="ENGINE" /></translation>
 <translation id="6629652037942826935">Luxusné cestovanie</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index ea13a8bb..79c39d8c 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">Izbrana je bila možnost številke stavbe</translation>
 <translation id="1080116354587839789">Prilagoditev prikaza širini</translation>
 <translation id="1081061862829655580">Pladenj 19</translation>
+<translation id="1082026381988252344">Pomikanje in povečava/pomanjšava vsebine deljenega zavihka</translation>
 <translation id="1089439967362294234">Spremeni geslo</translation>
 <translation id="1090629319939036170">Meni VR</translation>
 <translation id="1094777233105318927">Podatki o brskalniku, operacijskem sistemu, napravi, nameščeni programski opremi in datotekah</translation>
@@ -2528,6 +2529,7 @@
 <translation id="6051221802930200923">Spletnega mesta <ph name="SITE" /> trenutno ni mogoče obiskati, ker uporablja pripenjanje potrdil. Napake omrežja in napadi na omrežje so običajno začasni, zato bo ta stran verjetno delovala pozneje.</translation>
 <translation id="6051898664905071243">Število strani:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">Izpolnjevanje številke IBAN</translation>
 <translation id="6053584886670442526">Shranjene naslove lahko uporabite v Googlovih izdelkih. Ta naslov je shranjen v računu Google, <ph name="ACCOUNT" />.</translation>
 <translation id="6053735090575989697">Več informacij o tem, kako Google varuje vaše podatke, najdete v našem pravilniku o zasebnosti.</translation>
 <translation id="6055888660316801977">Preglednica za neujemanje poverilnic poverilnice za varno plačilo</translation>
@@ -2802,6 +2804,7 @@
 <translation id="6612010098632894193">Spletni videoposnetki</translation>
 <translation id="6613866251791999074">Preberite več o iskalniku v Chromu</translation>
 <translation id="6615297766614333076">Zlagalnik 2</translation>
+<translation id="6619496928666593220">Številka IBAN ni izpolnjena</translation>
 <translation id="6624427990725312378">Podatki o stiku</translation>
 <translation id="6628463337424475685">Iskanje <ph name="ENGINE" /></translation>
 <translation id="6629652037942826935">Luksuzna potovanja</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb
index 5e1746c..43a83a8 100644
--- a/components/strings/components_strings_ur.xtb
+++ b/components/strings/components_strings_ur.xtb
@@ -55,6 +55,7 @@
 <translation id="1078033282564106222">بلڈنگ نمبر اختیار منتخب کیا گیا</translation>
 <translation id="1080116354587839789">چوڑائی میں فٹ کریں</translation>
 <translation id="1081061862829655580">ٹرے 19</translation>
+<translation id="1082026381988252344">اپنے مشترکہ ٹیب کے مواد کو اسکرول اور زوم کریں</translation>
 <translation id="1089439967362294234">پاس ورڈ تبدیل کریں</translation>
 <translation id="1090629319939036170">‏VR مینو</translation>
 <translation id="1094777233105318927">‏آپ کے براؤزر، OS، آلے، انسٹال کردہ سافٹ ویئر اور فائلز سے متعلق معلومات پڑھیں</translation>
@@ -2530,6 +2531,7 @@
 <translation id="6051221802930200923">آپ ابھی <ph name="SITE" /> ملاحظہ نہیں کر سکتے ہیں کیونکہ ویب سائٹ سرٹیفکیٹ پننگ کا استعمال کرتی ہے۔ نیٹ ورک کی خرابیاں اور حملے عام طور پر عارضی ہوتے ہیں، لہذا یہ صفحہ شاید بعد میں کام کرے گا۔</translation>
 <translation id="6051898664905071243">صفحے کی تعداد:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">‏IBAN پُر نہیں کیا گیا</translation>
 <translation id="6053584886670442526">‏آپ پورے Google پروڈکٹس میں محفوظ کردہ پتے استعمال کر سکتے ہیں۔ یہ پتہ آپ کے Google اکاؤنٹ میں محفوظ ہے، <ph name="ACCOUNT" />۔</translation>
 <translation id="6053735090575989697">‏ہماری رازداری کی پالیسی میں Google کے آپ کے ڈیٹا کی حفاظت کے طریقے کے بارے میں مزید جانیں۔</translation>
 <translation id="6055888660316801977">ادائیگی کی اسناد محفوظ کریں کوئی مماثل اسناد نہیں کی شیٹ</translation>
@@ -2805,6 +2807,7 @@
 <translation id="6612010098632894193">آن لائن ویڈیو</translation>
 <translation id="6613866251791999074">‏Chrome میں اپنے سرچ انجن کے بارے میں مزید جانیں</translation>
 <translation id="6615297766614333076">اسٹیکر 2</translation>
+<translation id="6619496928666593220">‏IBAN نہیں پُر کیا گیا</translation>
 <translation id="6624427990725312378">رابطے کی معلومات</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> تلاش</translation>
 <translation id="6629652037942826935">لگژری سفر</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index af70522..d0725af 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">已选择“门牌号”选项</translation>
 <translation id="1080116354587839789">适合窗口宽度</translation>
 <translation id="1081061862829655580">纸匣 19</translation>
+<translation id="1082026381988252344">滚动和缩放已分享的标签页中的内容</translation>
 <translation id="1089439967362294234">更改密码</translation>
 <translation id="1090629319939036170">VR 菜单</translation>
 <translation id="1094777233105318927">您的浏览器、操作系统、设备、已安装的软件以及文件的相关信息</translation>
@@ -2524,6 +2525,7 @@
 <translation id="6051221802930200923">您目前无法访问 <ph name="SITE" />,因为此网站使用了证书锁定。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。</translation>
 <translation id="6051898664905071243">页数:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">正在填充 IBAN</translation>
 <translation id="6053584886670442526">您可在各种 Google 产品中使用已保存的地址。此地址已保存到您的 Google 账号 (<ph name="ACCOUNT" />) 中。</translation>
 <translation id="6053735090575989697">如需详细了解 Google 如何保护您的数据,请参阅我们的隐私权政策。</translation>
 <translation id="6055888660316801977">“无匹配的安全付款凭据”表单</translation>
@@ -2797,6 +2799,7 @@
 <translation id="6612010098632894193">在线视频</translation>
 <translation id="6613866251791999074">详细了解 Chrome 中的搜索引擎</translation>
 <translation id="6615297766614333076">堆叠出纸器 2</translation>
+<translation id="6619496928666593220">IBAN 未填充</translation>
 <translation id="6624427990725312378">联系信息</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> 搜索</translation>
 <translation id="6629652037942826935">豪华旅游</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb
index aa5a4b8..68417da2 100644
--- a/components/strings/components_strings_zh-HK.xtb
+++ b/components/strings/components_strings_zh-HK.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">已選取門牌號碼選項</translation>
 <translation id="1080116354587839789">縮放至符合畫面寬度</translation>
 <translation id="1081061862829655580">紙匣 19</translation>
+<translation id="1082026381988252344">捲動及縮放已分享分頁的內容</translation>
 <translation id="1089439967362294234">變更密碼</translation>
 <translation id="1090629319939036170">VR 選單</translation>
 <translation id="1094777233105318927">瀏覽器、OS、裝置、已安裝的軟件和檔案的相關資料</translation>
@@ -2527,6 +2528,7 @@
 <translation id="6051221802930200923">您目前無法瀏覽 <ph name="SITE" />,因為此網站使用憑證固定功能。網絡錯誤和攻擊行為通常是暫時性問題,所以此網頁可能稍後就能正常使用。</translation>
 <translation id="6051898664905071243">頁數:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">正在填入 IBAN</translation>
 <translation id="6053584886670442526">您可在不同的 Google 產品中使用已儲存的地址。此地址已儲存在您的 Google 帳戶 (<ph name="ACCOUNT" />)。</translation>
 <translation id="6053735090575989697">請查看《私隱權政策》,進一步瞭解 Google 如何保護你的資料。</translation>
 <translation id="6055888660316801977">冇相符安全付款憑證工作表</translation>
@@ -2801,6 +2803,7 @@
 <translation id="6612010098632894193">網上影片</translation>
 <translation id="6613866251791999074">進一步了解你喺 Chrome 入面嘅搜尋引擎</translation>
 <translation id="6615297766614333076">堆疊器 2</translation>
+<translation id="6619496928666593220">未填入 IBAN</translation>
 <translation id="6624427990725312378">聯絡人資料</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> 搜尋</translation>
 <translation id="6629652037942826935">豪華旅遊</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 0f26ee8a7..1b59744 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -54,6 +54,7 @@
 <translation id="1078033282564106222">已選取「門牌號碼」選項</translation>
 <translation id="1080116354587839789">符合視窗寬度</translation>
 <translation id="1081061862829655580">紙匣 19</translation>
+<translation id="1082026381988252344">捲動及縮放已分享分頁的內容</translation>
 <translation id="1089439967362294234">變更密碼</translation>
 <translation id="1090629319939036170">VR 選單</translation>
 <translation id="1094777233105318927">瀏覽器、作業系統、裝置、已安裝軟體和檔案的相關資訊</translation>
@@ -2527,6 +2528,7 @@
 <translation id="6051221802930200923">目前無法造訪 <ph name="SITE" />,因為這個網站使用憑證鎖定功能。網路錯誤和攻擊行為通常是暫時性的,因此這個網頁可能稍後就會恢復正常狀態。</translation>
 <translation id="6051898664905071243">頁數:</translation>
 <translation id="6052284303005792909">•</translation>
+<translation id="605237284704429106">正在填入 IBAN</translation>
 <translation id="6053584886670442526">你可以在各項 Google 產品中使用已儲存的地址。系統會將這個地址儲存到 Google 帳戶 (<ph name="ACCOUNT" />) 中。</translation>
 <translation id="6053735090575989697">如要進一步瞭解 Google 如何保護你的資料,請參閱我們的《隱私權政策》。</translation>
 <translation id="6055888660316801977">無相符安全付款憑證表</translation>
@@ -2801,6 +2803,7 @@
 <translation id="6612010098632894193">線上影片</translation>
 <translation id="6613866251791999074">進一步瞭解你在 Chrome 中的搜尋引擎</translation>
 <translation id="6615297766614333076">堆疊出紙器 2</translation>
+<translation id="6619496928666593220">未填入 IBAN</translation>
 <translation id="6624427990725312378">聯絡資訊</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> 搜尋</translation>
 <translation id="6629652037942826935">奢華假期</translation>
diff --git a/components/subresource_filter/content/renderer/BUILD.gn b/components/subresource_filter/content/renderer/BUILD.gn
index 3cada4a..3e2b31a 100644
--- a/components/subresource_filter/content/renderer/BUILD.gn
+++ b/components/subresource_filter/content/renderer/BUILD.gn
@@ -4,8 +4,6 @@
 
 static_library("renderer") {
   sources = [
-    "ad_resource_tracker.cc",
-    "ad_resource_tracker.h",
     "subresource_filter_agent.cc",
     "subresource_filter_agent.h",
     "unverified_ruleset_dealer.cc",
diff --git a/components/subresource_filter/content/renderer/ad_resource_tracker.cc b/components/subresource_filter/content/renderer/ad_resource_tracker.cc
deleted file mode 100644
index 2f23418..0000000
--- a/components/subresource_filter/content/renderer/ad_resource_tracker.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "components/subresource_filter/content/renderer/ad_resource_tracker.h"
-#include "base/observer_list.h"
-
-namespace subresource_filter {
-
-AdResourceTracker::AdResourceTracker() {}
-
-AdResourceTracker::~AdResourceTracker() {
-  // Notify observers that the AdResourceTracker is being destroyed.
-  for (auto& obs : observers_) {
-    obs.OnAdResourceTrackerGoingAway();
-  }
-}
-
-void AdResourceTracker::AddObserver(
-    AdResourceTracker::Observer* ad_resource_observer) {
-  observers_.AddObserver(ad_resource_observer);
-}
-
-void AdResourceTracker::RemoveObserver(
-    AdResourceTracker::Observer* ad_resource_observer) {
-  observers_.RemoveObserver(ad_resource_observer);
-}
-
-void AdResourceTracker::NotifyAdResourceObserved(int request_id) {
-  for (auto& obs : observers_) {
-    obs.OnAdResourceObserved(request_id);
-  }
-}
-
-}  // namespace subresource_filter
diff --git a/components/subresource_filter/content/renderer/ad_resource_tracker.h b/components/subresource_filter/content/renderer/ad_resource_tracker.h
deleted file mode 100644
index 3d37998..0000000
--- a/components/subresource_filter/content/renderer/ad_resource_tracker.h
+++ /dev/null
@@ -1,45 +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.
-
-#ifndef COMPONENTS_SUBRESOURCE_FILTER_CONTENT_RENDERER_AD_RESOURCE_TRACKER_H_
-#define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_RENDERER_AD_RESOURCE_TRACKER_H_
-
-#include "base/observer_list.h"
-#include "base/observer_list_types.h"
-
-namespace subresource_filter {
-
-// This class tracks observers of resources that have been identified as ads in
-// blink.
-class AdResourceTracker {
- public:
-  AdResourceTracker();
-  ~AdResourceTracker();
-
-  // Observes resource loads that are identified as ad resources.
-  class Observer : public base::CheckedObserver {
-   public:
-    // This method is called when the subresource filter is notified of a
-    // new resource that is tagged as an ad.
-    virtual void OnAdResourceObserved(int request_id) = 0;
-
-    // Called before the AdResourceTracker is destroyed. Observers must
-    // unregister themselves by this point.
-    virtual void OnAdResourceTrackerGoingAway() = 0;
-  };
-
-  // Add an observer that will listen for ad resource request ids.
-  void AddObserver(Observer* ad_resource_observer);
-  void RemoveObserver(Observer* ad_resource_observer);
-
-  // Report the observed request_id as an ad resource.
-  void NotifyAdResourceObserved(int request_id);
-
- private:
-  base::ObserverList<Observer> observers_;
-};
-
-}  // namespace subresource_filter
-
-#endif  // COMPONENTS_SUBRESOURCE_FILTER_CONTENT_RENDERER_AD_RESOURCE_TRACKER_H_
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
index b0b5c06..d4c770d2 100644
--- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc
+++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
@@ -48,12 +48,10 @@
 
 SubresourceFilterAgent::SubresourceFilterAgent(
     content::RenderFrame* render_frame,
-    UnverifiedRulesetDealer* ruleset_dealer,
-    std::unique_ptr<AdResourceTracker> ad_resource_tracker)
+    UnverifiedRulesetDealer* ruleset_dealer)
     : content::RenderFrameObserver(render_frame),
       content::RenderFrameObserverTracker<SubresourceFilterAgent>(render_frame),
-      ruleset_dealer_(ruleset_dealer),
-      ad_resource_tracker_(std::move(ad_resource_tracker)) {
+      ruleset_dealer_(ruleset_dealer) {
   DCHECK(ruleset_dealer);
 }
 
@@ -122,11 +120,7 @@
   }
 }
 
-SubresourceFilterAgent::~SubresourceFilterAgent() {
-  // Filter may outlive us, so reset the ad tracker.
-  if (filter_for_last_created_document_)
-    filter_for_last_created_document_->set_ad_resource_tracker(nullptr);
-}
+SubresourceFilterAgent::~SubresourceFilterAgent() = default;
 
 GURL SubresourceFilterAgent::GetDocumentURL() {
   return render_frame()->GetWebFrame()->GetDocument().Url();
@@ -339,9 +333,6 @@
 void SubresourceFilterAgent::ConstructFilter(
     const mojom::ActivationState activation_state,
     const GURL& url) {
-  // Filter may outlive us, so reset the ad tracker.
-  if (filter_for_last_created_document_)
-    filter_for_last_created_document_->set_ad_resource_tracker(nullptr);
   filter_for_last_created_document_.reset();
 
   if (activation_state.activation_level == mojom::ActivationLevel::kDisabled ||
@@ -360,7 +351,6 @@
   auto filter = std::make_unique<WebDocumentSubresourceFilterImpl>(
       url::Origin::Create(url), activation_state, std::move(ruleset),
       std::move(first_disallowed_load_callback));
-  filter->set_ad_resource_tracker(ad_resource_tracker_.get());
   filter_for_last_created_document_ = filter->AsWeakPtr();
   SetSubresourceFilterForCurrentDocument(std::move(filter));
 }
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.h b/components/subresource_filter/content/renderer/subresource_filter_agent.h
index 4357962..114c694 100644
--- a/components/subresource_filter/content/renderer/subresource_filter_agent.h
+++ b/components/subresource_filter/content/renderer/subresource_filter_agent.h
@@ -10,7 +10,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "components/subresource_filter/content/mojom/subresource_filter.mojom.h"
-#include "components/subresource_filter/content/renderer/ad_resource_tracker.h"
 #include "components/subresource_filter/core/mojom/subresource_filter.mojom.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "content/public/renderer/render_frame_observer_tracker.h"
@@ -39,12 +38,9 @@
       public base::SupportsWeakPtr<SubresourceFilterAgent> {
  public:
   // The |ruleset_dealer| must not be null and must outlive this instance. The
-  // |render_frame| may be null in unittests. The |ad_resource_tracker| may be
-  // null.
-  explicit SubresourceFilterAgent(
-      content::RenderFrame* render_frame,
-      UnverifiedRulesetDealer* ruleset_dealer,
-      std::unique_ptr<AdResourceTracker> ad_resource_tracker);
+  // |render_frame| may be null in unittests.
+  explicit SubresourceFilterAgent(content::RenderFrame* render_frame,
+                                  UnverifiedRulesetDealer* ruleset_dealer);
 
   SubresourceFilterAgent(const SubresourceFilterAgent&) = delete;
   SubresourceFilterAgent& operator=(const SubresourceFilterAgent&) = delete;
@@ -153,9 +149,6 @@
 
   mojom::ActivationState activation_state_for_next_document_;
 
-  // Tracks all ad resource observers.
-  std::unique_ptr<AdResourceTracker> ad_resource_tracker_;
-
   // Use associated interface to make sure mojo messages are ordered with regard
   // to legacy IPC messages.
   mojo::AssociatedRemote<mojom::SubresourceFilterHost> subresource_filter_host_;
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
index 4a829a3c..178cb0de 100644
--- a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
+++ b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
@@ -45,9 +45,7 @@
       bool is_provisional,
       bool is_parent_ad_frame,
       bool is_frame_created_by_ad_script)
-      : SubresourceFilterAgent(nullptr /* RenderFrame */,
-                               ruleset_dealer,
-                               nullptr /* AdResourceTracker */),
+      : SubresourceFilterAgent(nullptr /* RenderFrame */, ruleset_dealer),
         is_subresource_filter_root_(is_subresource_filter_root),
         is_provisional_(is_provisional),
         is_parent_ad_frame_(is_parent_ad_frame),
diff --git a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc
index fec2000..3e89242 100644
--- a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc
+++ b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc
@@ -180,10 +180,4 @@
                      std::move(first_disallowed_load_callback_)));
 }
 
-void WebDocumentSubresourceFilterImpl::ReportAdRequestId(int request_id) {
-  if (!ad_resource_tracker_)
-    return;
-  ad_resource_tracker_->NotifyAdResourceObserved(request_id);
-}
-
 }  // namespace subresource_filter
diff --git a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h
index b6da15e55..996c279 100644
--- a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h
+++ b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h
@@ -10,7 +10,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task/single_thread_task_runner.h"
-#include "components/subresource_filter/content/renderer/ad_resource_tracker.h"
 #include "components/subresource_filter/core/common/document_subresource_filter.h"
 #include "components/url_pattern_index/proto/rules.pb.h"
 #include "third_party/blink/public/platform/web_document_subresource_filter.h"
@@ -78,16 +77,11 @@
       const blink::WebURL& url) override;
   void ReportDisallowedLoad() override;
   bool ShouldLogToConsole() override;
-  void ReportAdRequestId(int request_id) override;
 
   const mojom::ActivationState& activation_state() const {
     return filter_.activation_state();
   }
 
-  void set_ad_resource_tracker(AdResourceTracker* ad_resource_tracker) {
-    ad_resource_tracker_ = ad_resource_tracker;
-  }
-
  private:
   LoadPolicy getLoadPolicyImpl(
       const blink::WebURL& url,
@@ -96,11 +90,6 @@
   mojom::ActivationState activation_state_;
   DocumentSubresourceFilter filter_;
   base::OnceClosure first_disallowed_load_callback_;
-
-  // Manages all AdResource observers. Only non-null for the
-  // WebDocumentSubresourceFilter most recently created by the
-  // SubresourceFilterAgent.
-  raw_ptr<AdResourceTracker, ExperimentalRenderer> ad_resource_tracker_;
 };
 
 }  // namespace subresource_filter
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn
index 69d20479..f4ddc7d 100644
--- a/components/vector_icons/BUILD.gn
+++ b/components/vector_icons/BUILD.gn
@@ -212,8 +212,8 @@
     "sync_off_chrome_refresh.icon",
     "sync_problem_chrome_refresh.icon",
     "tenancy.icon",
-    "touchpad_mouse.icon",
     "troubleshoot.icon",
+    "touchpad_mouse.icon",
     "undo.icon",
     "usb.icon",
     "usb_chrome_refresh.icon",
@@ -264,7 +264,6 @@
       "google_chrome/google_sites.icon",
       "google_chrome/google_slides.icon",
       "google_chrome/google_super_g.icon",
-      "google_chrome/gshield.icon",
       "google_chrome/page_insights.icon",
       "google_chrome/page_insights_color.icon",
       "google_chrome/pen_spark.icon",
diff --git a/components/webauthn/DEPS b/components/webauthn/DEPS
index de618797..7db6dc1 100644
--- a/components/webauthn/DEPS
+++ b/components/webauthn/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+components/browser_ui/bottomsheet",
   "+components/keyed_service",
   "+components/payments/content/android/java/src/org/chromium/components/payments",
   "+components/sync",
diff --git a/components/webauthn/android/BUILD.gn b/components/webauthn/android/BUILD.gn
index 8a598eb..4d5573b 100644
--- a/components/webauthn/android/BUILD.gn
+++ b/components/webauthn/android/BUILD.gn
@@ -28,8 +28,8 @@
   sources = [
     "java/src/org/chromium/components/webauthn/AuthenticatorFactory.java",
     "java/src/org/chromium/components/webauthn/AuthenticatorImpl.java",
-    "java/src/org/chromium/components/webauthn/AuthenticatorIncognitoConfirmationBottomsheet.java",
     "java/src/org/chromium/components/webauthn/Barrier.java",
+    "java/src/org/chromium/components/webauthn/CreateConfirmationUiDelegate.java",
     "java/src/org/chromium/components/webauthn/CredManHelper.java",
     "java/src/org/chromium/components/webauthn/CredManMetricsHelper.java",
     "java/src/org/chromium/components/webauthn/CredManSupportProvider.java",
@@ -52,13 +52,11 @@
   jar_excluded_patterns = [ "*/CredManUiModeRecommender.class" ]
 
   deps = [
-    ":java_resources",
     "$google_play_services_package:google_play_services_base_java",
     "$google_play_services_package:google_play_services_basement_java",
     "$google_play_services_package:google_play_services_tasks_java",
     "//base:base_java",
     "//build/android:build_java",
-    "//components/browser_ui/bottomsheet/android:java",
     "//components/externalauth/android:java",
     "//components/payments/content/android:feature_list_java",
     "//components/version_info/android:version_constants_java",
@@ -159,40 +157,41 @@
   ]
 }
 
-android_resources("java_resources") {
-  sources = [
-    "java/res/drawable/webauthn_incognito_confirmation_icon.xml",
-    "java/res/layout/webauthn_incognito_confirmation.xml",
-  ]
-  deps = [
-    "//components/browser_ui/bottomsheet/android:java_resources",
-    "//components/strings:components_strings_grd",
-  ]
-}
-
 robolectric_library("junit") {
-  sources = [ "junit/src/org/chromium/components/webauthn/AuthenticatorIncognitoConfirmationBottomsheetTest.java" ]
+  sources = [
+    "junit/src/org/chromium/components/webauthn/BarrierTest.java",
+    "junit/src/org/chromium/components/webauthn/CredManHelperRobolectricTest.java",
+    "junit/src/org/chromium/components/webauthn/Fido2CredentialRequestRobolectricTest.java",
+    "junit/src/org/chromium/components/webauthn/ShadowCreateCredentialException.java",
+    "junit/src/org/chromium/components/webauthn/ShadowCreateCredentialRequest.java",
+    "junit/src/org/chromium/components/webauthn/ShadowCreateCredentialResponse.java",
+    "junit/src/org/chromium/components/webauthn/ShadowCredential.java",
+    "junit/src/org/chromium/components/webauthn/ShadowCredentialManager.java",
+    "junit/src/org/chromium/components/webauthn/ShadowCredentialOption.java",
+    "junit/src/org/chromium/components/webauthn/ShadowGetCredentialException.java",
+    "junit/src/org/chromium/components/webauthn/ShadowGetCredentialRequest.java",
+    "junit/src/org/chromium/components/webauthn/ShadowGetCredentialResponse.java",
+    "junit/src/org/chromium/components/webauthn/ShadowPrepareGetCredentialResponse.java",
+    "junit/src/org/chromium/components/webauthn/ShadowWebContentStatics.java",
+  ]
   deps = [
+    ":delegate_public_java",
     ":java",
+    ":test_support_java",
+    "$google_play_services_package:google_play_services_tasks_java",
     "//base:base_java",
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
-    "//components/browser_ui/bottomsheet/android:java",
-    "//components/payments/content/android:service_java",
-    "//components/payments/mojom:mojom_java",
-    "//components/url_formatter/android:url_formatter_java",
     "//content/public/android:content_java",
-    "//mojo/public/java:system_java",
-    "//third_party/android_deps:material_design_java",
-    "//third_party/androidx:androidx_collection_collection_java",
+    "//net/android:net_java",
+    "//services/device/public/java:device_feature_list_java",
+    "//third_party/androidx:androidx_test_runner_java",
     "//third_party/blink/public/mojom:android_mojo_bindings_java",
+    "//third_party/google-truth:google_truth_java",
     "//third_party/jni_zero:jni_zero_java",
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_no_recycler_view_java",
     "//url:gurl_java",
-    "//url:gurl_junit_test_support",
-    "//url/mojom:url_mojom_gurl_java",
-    "//url/mojom:url_mojom_origin_java",
   ]
 }
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorFactory.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorFactory.java
index cc1e379f..9e7a3c9 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorFactory.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorFactory.java
@@ -11,8 +11,6 @@
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsStatics;
-import org.chromium.device.DeviceFeatureList;
-import org.chromium.device.DeviceFeatureMap;
 import org.chromium.services.service_manager.InterfaceFactory;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.url.Origin;
@@ -20,9 +18,13 @@
 /** Factory class registered to create Authenticators upon request. */
 public class AuthenticatorFactory implements InterfaceFactory<Authenticator> {
     private final RenderFrameHost mRenderFrameHost;
+    private final CreateConfirmationUiDelegate.Factory mConfirmationFactory;
 
-    public AuthenticatorFactory(RenderFrameHost renderFrameHost) {
+    public AuthenticatorFactory(
+            RenderFrameHost renderFrameHost,
+            CreateConfirmationUiDelegate.Factory confirmationFactory) {
         mRenderFrameHost = renderFrameHost;
+        mConfirmationFactory = confirmationFactory;
     }
 
     @Override
@@ -44,16 +46,9 @@
         if (context == null) {
             context = ContextUtils.getApplicationContext();
         }
-        AuthenticatorImpl.CreateConfirmationUiDelegate createConfirmationUiDelegate = null;
-        if (webContents.isIncognito()
-                && DeviceFeatureMap.isEnabled(
-                        DeviceFeatureList.WEBAUTHN_ANDROID_INCOGNITO_CONFIRMATION)) {
-            createConfirmationUiDelegate =
-                    (accept, reject) -> {
-                        var sheet = new AuthenticatorIncognitoConfirmationBottomsheet(webContents);
-                        return sheet.show(accept, reject);
-                    };
-        }
+
+        CreateConfirmationUiDelegate createConfirmationUiDelegate =
+                mConfirmationFactory == null ? null : mConfirmationFactory.create(webContents);
         Origin topOrigin = webContents.getMainFrame().getLastCommittedOrigin();
         return new AuthenticatorImpl(
                 context,
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
index aba5fbc5..f610e8a 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
@@ -36,15 +36,6 @@
 
 /** Android implementation of the authenticator.mojom interface. */
 public final class AuthenticatorImpl implements Authenticator {
-    /**
-     * Interface for code that will show the user a confirmation before creating a credential.
-     *
-     * This is intended for use in Incognito mode.
-     **/
-    public interface CreateConfirmationUiDelegate {
-        boolean show(Runnable positiveCallback, Runnable negativeCallback);
-    }
-
     private static final String GMSCORE_PACKAGE_NAME = "com.google.android.gms";
     public static final int GMSCORE_MIN_VERSION = 16890000;
     public static final int GMSCORE_MIN_VERSION_GET_MATCHING_CRED_IDS = 223300000;
@@ -141,7 +132,7 @@
 
     /**
      * @param payment The payment information to be added to the "clientDataJson". Should be used
-     * only if the user has confirmed the payment information that was displayed to the user.
+     *     only if the user has confirmed the payment information that was displayed to the user.
      */
     public void setPaymentOptions(PaymentOptions payment) {
         mPayment = payment;
@@ -252,7 +243,7 @@
      * given input credential IDs. Optionally, may also filter the credentials to only return those
      * that are marked as third-party payment enabled.
      *
-     * Because this functionality does not participate in the normal WebAuthn UI flow and is
+     * <p>Because this functionality does not participate in the normal WebAuthn UI flow and is
      * idempotent at the Fido2 layer, it does not adhere to the 'one call at a time' logic used for
      * the create/get methods.
      */
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/CreateConfirmationUiDelegate.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/CreateConfirmationUiDelegate.java
new file mode 100644
index 0000000..4ac8468e
--- /dev/null
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/CreateConfirmationUiDelegate.java
@@ -0,0 +1,37 @@
+// 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.components.webauthn;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.content_public.browser.WebContents;
+
+/**
+ * Interface for code that will show the user a confirmation before creating a credential.
+ *
+ * <p>This is intended for use in Incognito mode.
+ */
+public interface CreateConfirmationUiDelegate {
+    interface Factory {
+        /**
+         * Creates a {@link CreateConfirmationUiDelegate} if required for a given {@link
+         * WebContents}
+         *
+         * @param webContents {@link WebContents} to create the UI delegate for.
+         * @return Returns null if CreateConfirmationUiDelegate is not required for the webContents
+         */
+        @Nullable
+        CreateConfirmationUiDelegate create(WebContents webContents);
+    }
+
+    /**
+     * Shows the UI delegate for creation confirmation.
+     *
+     * @param onUserAccept Callback to run if the user accepts.
+     * @param onUserReject Callback to run if the user rejects.
+     * @return true iff the UI delegate is shown
+     */
+    boolean show(Runnable onUserAccept, Runnable onUserReject);
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/BarrierTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/BarrierTest.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/BarrierTest.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/BarrierTest.java
index b01d5f75..f13472c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/BarrierTest.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/BarrierTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.times;
@@ -20,7 +20,6 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.BaseRobolectricTestRule;
-import org.chromium.components.webauthn.Barrier;
 
 import java.util.Arrays;
 import java.util.Collection;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/CredManHelperRobolectricTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/CredManHelperRobolectricTest.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/CredManHelperRobolectricTest.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/CredManHelperRobolectricTest.java
index 6cada13..78255f64 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/CredManHelperRobolectricTest.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/CredManHelperRobolectricTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -52,14 +52,9 @@
 import org.chromium.blink.mojom.PublicKeyCredentialDescriptor;
 import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
 import org.chromium.blink.mojom.ResidentKeyRequirement;
-import org.chromium.components.webauthn.Barrier;
-import org.chromium.components.webauthn.CredManHelper;
-import org.chromium.components.webauthn.CredManMetricsHelper;
 import org.chromium.components.webauthn.CredManMetricsHelper.CredManCreateRequestEnum;
 import org.chromium.components.webauthn.CredManMetricsHelper.CredManGetRequestEnum;
 import org.chromium.components.webauthn.CredManMetricsHelper.CredManPrepareRequestEnum;
-import org.chromium.components.webauthn.Fido2ApiTestHelper;
-import org.chromium.components.webauthn.WebAuthnBrowserBridge;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.WebContents;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestRobolectricTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/Fido2CredentialRequestRobolectricTest.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestRobolectricTest.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/Fido2CredentialRequestRobolectricTest.java
index 778ae37..176b0d82 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestRobolectricTest.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/Fido2CredentialRequestRobolectricTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -43,14 +43,6 @@
 import org.chromium.blink.mojom.PublicKeyCredentialDescriptor;
 import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
 import org.chromium.blink.mojom.ResidentKeyRequirement;
-import org.chromium.components.webauthn.Barrier;
-import org.chromium.components.webauthn.CredManHelper;
-import org.chromium.components.webauthn.CredManSupportProvider;
-import org.chromium.components.webauthn.Fido2ApiCallHelper;
-import org.chromium.components.webauthn.Fido2ApiTestHelper;
-import org.chromium.components.webauthn.Fido2CredentialRequest;
-import org.chromium.components.webauthn.WebAuthnBrowserBridge;
-import org.chromium.components.webauthn.WebAuthnCredentialDetails;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.RenderFrameHost.WebAuthSecurityChecksResults;
 import org.chromium.device.DeviceFeatureList;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialException.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialException.java
similarity index 93%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialException.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialException.java
index b99f1fb..749072d 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialException.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialException.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.credentials.CreateCredentialException;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialRequest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialRequest.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialRequest.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialRequest.java
index 14b8b5f..189782e7 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialRequest.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialRequest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.credentials.CreateCredentialRequest;
 import android.os.Bundle;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialResponse.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialResponse.java
similarity index 93%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialResponse.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialResponse.java
index bfe1b10..12b445e 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCreateCredentialResponse.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCreateCredentialResponse.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.credentials.CreateCredentialResponse;
 import android.os.Bundle;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredential.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredential.java
similarity index 96%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredential.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredential.java
index 7bc84894..1c389ad 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredential.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredential.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.credentials.Credential;
 import android.os.Bundle;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredentialManager.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredentialManager.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredentialManager.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredentialManager.java
index 19365ec..92581ec 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredentialManager.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredentialManager.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.content.Context;
 import android.credentials.CreateCredentialException;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredentialOption.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredentialOption.java
similarity index 97%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredentialOption.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredentialOption.java
index 53c06fd..7f49430 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowCredentialOption.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowCredentialOption.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.content.ComponentName;
 import android.credentials.CredentialOption;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialException.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialException.java
similarity index 93%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialException.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialException.java
index 73e6e26..ebabf82 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialException.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialException.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.credentials.GetCredentialException;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialRequest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialRequest.java
similarity index 97%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialRequest.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialRequest.java
index fdc2af5..6436a91 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialRequest.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialRequest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.credentials.CredentialOption;
 import android.credentials.GetCredentialRequest;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialResponse.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialResponse.java
similarity index 93%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialResponse.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialResponse.java
index f3c60052..df7c720 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowGetCredentialResponse.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowGetCredentialResponse.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.credentials.Credential;
 import android.credentials.GetCredentialResponse;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowPrepareGetCredentialResponse.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowPrepareGetCredentialResponse.java
similarity index 93%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowPrepareGetCredentialResponse.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowPrepareGetCredentialResponse.java
index f901de9..2b4b046d0 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowPrepareGetCredentialResponse.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowPrepareGetCredentialResponse.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import android.credentials.PrepareGetCredentialResponse;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowWebContentStatics.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowWebContentStatics.java
similarity index 93%
rename from chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowWebContentStatics.java
rename to components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowWebContentStatics.java
index cb49ce7..1be5cda 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webauth/ShadowWebContentStatics.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/ShadowWebContentStatics.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.webauth;
+package org.chromium.components.webauthn;
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
diff --git a/components/webauthn_strings.grdp b/components/webauthn_strings.grdp
deleted file mode 100644
index 7ef2b9b7..0000000
--- a/components/webauthn_strings.grdp
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
-    <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_TITLE" desc="The title of a bottomsheet that appears before the user saves passkey in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'.)" formatter_data="android_java">
-      Save passkey outside Incognito?
-    </message>
-    <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_BODY" desc="The body of a bottomsheet that appears before the user saves passkey in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'.)" formatter_data="android_java">
-      This passkey will be saved to your password manager. Anyone with access to it will be able to use this passkey.
-    </message>
-    <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_CONTINUE" desc="The text of a button that the user will click to continue creating a passkey in Incognito mode" formatter_data="android_java">
-      Continue
-    </message>
-
-    <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_DESCRIPTION" desc="Accessibility string that describes a bottomsheet that confirms with the user that they want to create passkey while in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'." formatter_data="android_java">
-      Passkey confirmation sheet
-    </message>
-    <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_OPENED" desc="Accessibility string that describes opening a bottomsheet that confirms with the user that they want to create passkey while in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'." formatter_data="android_java">
-      Passkey confirmation sheet opened
-    </message>
-    <message name="IDS_WEBAUTHN_INCOGNITO_CONFIRMATION_SHEET_CLOSED" desc="Accessibility string that describes closing a bottomsheet that confirms with the user that they want to create passkey while in Incognito mode. (See the glossary for translations of the word 'passkey'. Do not translate as 'password'." formatter_data="android_java">
-      Passkey confirmation sheet closed
-    </message>
-</grit-part>
diff --git a/components/webauthn_strings_grdp/DIR_METADATA b/components/webauthn_strings_grdp/DIR_METADATA
deleted file mode 100644
index 4717c96d..0000000
--- a/components/webauthn_strings_grdp/DIR_METADATA
+++ /dev/null
@@ -1,4 +0,0 @@
-monorail {
-  component: "Blink>WebAuthentication"
-}
-team_email: "identity-dev@chromium.org"
diff --git a/components/webauthn_strings_grdp/OWNERS b/components/webauthn_strings_grdp/OWNERS
deleted file mode 100644
index 0786f8e..0000000
--- a/components/webauthn_strings_grdp/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://components/webauthn/OWNERS
diff --git a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
index 81f7053..7ab8fc4 100644
--- a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
+++ b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
@@ -29,6 +29,7 @@
 #import "content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper.h"
 #include "content/common/features.h"
 #import "content/public/browser/render_widget_host_view_mac_delegate.h"
+#include "content/public/common/content_features.h"
 #include "skia/ext/skia_utils_mac.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/input/input_handler.mojom.h"
diff --git a/content/browser/DEPS b/content/browser/DEPS
index ab59308..a49a4fb 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -147,9 +147,6 @@
     "+services/network/transitional_url_loader_factory_owner.h",
     "+device/fido/hid/fido_hid_discovery.h",
   ],
-  "browser_main_loop\.h": [
-    "+ui/ozone/buildflags.h",
-  ],
   "browsing_data_(filter_builder|remover)_impl_unittest\.cc": [
     "+services/network/cookie_manager.h",
   ],
diff --git a/content/browser/android/content_feature_map.cc b/content/browser/android/content_feature_map.cc
index 32c81db..c0b4ac1 100644
--- a/content/browser/android/content_feature_map.cc
+++ b/content/browser/android/content_feature_map.cc
@@ -31,7 +31,6 @@
     &features::kOptimizeImmHideCalls,
     &features::kProcessSharingWithStrictSiteInstances,
     &features::kReduceGpuPriorityOnBackground,
-    &features::kRequestDesktopSiteAdditions,
     &features::kRequestDesktopSiteWindowSetting,
     &features::kSelectionMenuItemModification,
     &features::kSmartZoom,
diff --git a/content/browser/back_forward_cache_internal_browsertest.cc b/content/browser/back_forward_cache_internal_browsertest.cc
index eac3ab0..dcd798d2 100644
--- a/content/browser/back_forward_cache_internal_browsertest.cc
+++ b/content/browser/back_forward_cache_internal_browsertest.cc
@@ -536,8 +536,7 @@
   EXPECT_TRUE(NavigateToURL(
       shell(), embedded_test_server()->GetURL("b.com", "/title1.html")));
 
-  // 3) Post IPC tasks to the page, testing both mojo remote and associated
-  // remote objects.
+  // 3) Post IPC tasks to the page, testing mojo remote objects.
 
   // Send a message via an associated interface - which will post a task with an
   // IPC hash and will be routed to the per-thread task queue.
@@ -550,33 +549,16 @@
       1);
   run_loop.Run();
 
-  // Post a non-associated interface. Will be routed to a frame-specific task
-  // queue with IPC set in SimpleWatcher.
-  base::RunLoop run_loop2;
-  rfh_a->GetHighPriorityLocalFrame()->DispatchBeforeUnload(
-      false,
-      base::BindOnce([](base::RepeatingClosure quit_closure, bool proceed,
-                        base::TimeTicks start_time,
-                        base::TimeTicks end_time) { quit_closure.Run(); },
-                     run_loop2.QuitClosure()));
-  run_loop2.Run();
-
   // 4) Check the histogram.
-  std::vector<base::HistogramBase::Sample> samples = {
-      base::HistogramBase::Sample(
-          base::TaskAnnotator::ScopedSetIpcHash::MD5HashMetricName(
-              "blink.mojom.HighPriorityLocalFrame")),
-      base::HistogramBase::Sample(
-          base::TaskAnnotator::ScopedSetIpcHash::MD5HashMetricName(
-              "blink.mojom.LocalFrame"))};
+  base::HistogramBase::Sample sample = base::HistogramBase::Sample(
+      base::TaskAnnotator::ScopedSetIpcHash::MD5HashMetricName(
+          "blink.mojom.LocalFrame"));
 
-  for (base::HistogramBase::Sample sample : samples) {
-    FetchHistogramsFromChildProcesses();
-    EXPECT_TRUE(HistogramContainsIntValue(
-        sample, histogram_tester().GetAllSamples(
-                    "BackForwardCache.Experimental."
-                    "UnexpectedIPCMessagePostedToCachedFrame.MethodHash")));
-  }
+  FetchHistogramsFromChildProcesses();
+  EXPECT_TRUE(HistogramContainsIntValue(
+      sample, histogram_tester().GetAllSamples(
+                  "BackForwardCache.Experimental."
+                  "UnexpectedIPCMessagePostedToCachedFrame.MethodHash")));
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
diff --git a/content/browser/code_cache/generated_code_cache_browsertest.cc b/content/browser/code_cache/generated_code_cache_browsertest.cc
index 672b9bb1..2b84d4e 100644
--- a/content/browser/code_cache/generated_code_cache_browsertest.cc
+++ b/content/browser/code_cache/generated_code_cache_browsertest.cc
@@ -6,12 +6,17 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
 #include "content/browser/code_cache/generated_code_cache.h"
+#include "content/browser/code_cache/generated_code_cache_context.h"
+#include "content/browser/renderer_host/code_cache_host_impl.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/shell/browser/shell.h"
 #include "net/dns/mock_host_resolver.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/common/page/v8_compile_hints_histograms.h"
 
 namespace content {
 
@@ -427,4 +432,201 @@
   }
 }
 
+class LocalCompileHintsBrowserTest : public ContentBrowserTest {
+ public:
+  LocalCompileHintsBrowserTest() {
+    local_compile_hints_.InitAndEnableFeature(
+        blink::features::kLocalCompileHints);
+    interactive_detector_ignore_fcp_.InitAndEnableFeature(
+        blink::features::kInteractiveDetectorIgnoreFcp);
+  }
+
+  void SetUpOnMainThread() override {
+    host_resolver()->AddRule("*", "127.0.0.1");
+    embedded_test_server()->RegisterRequestHandler(
+        base::BindRepeating(&LocalCompileHintsBrowserTest::CachedScriptHandler,
+                            base::Unretained(this)));
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
+  std::unique_ptr<net::test_server::HttpResponse> CachedScriptHandler(
+      const net::test_server::HttpRequest& request) {
+    GURL absolute_url = embedded_test_server()->GetURL(request.relative_url);
+
+    // Returns a JavaScript file that should be cacheable by the
+    // GeneratedCodeCache (>1024 characters).
+    if (absolute_url.path() == "/cacheable.js") {
+      auto http_response =
+          std::make_unique<net::test_server::BasicHttpResponse>();
+      http_response->set_code(net::HTTP_OK);
+      http_response->AddCustomHeader("Cache-Control", "max-age=604800");
+
+      // The script has to include a function so that we can test compile hints
+      // with it.
+      std::string content = R"(
+        let variable = 'hello!';
+        function foo() {}
+        foo();
+        )";
+
+      // Make sure the script is long enough to be eligible for caching.
+      for (int i = 0; i < 16; i++) {
+        content += std::string(64, '/') + '\n';
+      }
+
+      http_response->set_content(content);
+      http_response->set_content_type("application/javascript");
+      return http_response;
+    }
+
+    // Returns an HTML file that will load /cacheable.js.
+    if (absolute_url.path() == "/cacheable.html") {
+      auto http_response =
+          std::make_unique<net::test_server::BasicHttpResponse>();
+      http_response->set_code(net::HTTP_OK);
+
+      std::string content =
+          "<html><head><title>Title</title></head>"
+          "<script src='/cacheable.js'></script></html>";
+
+      http_response->set_content(content);
+      return http_response;
+    }
+    return nullptr;
+  }
+
+ private:
+  base::test::ScopedFeatureList local_compile_hints_;
+  base::test::ScopedFeatureList interactive_detector_ignore_fcp_;
+};
+
+class CodeCacheSizeChecker {
+ public:
+  CodeCacheSizeChecker(GeneratedCodeCacheContext* cache_context,
+                       const GURL& url,
+                       const GURL& origin,
+                       size_t expected_size)
+      : cache_context_(cache_context),
+        url_(url),
+        origin_(origin),
+        expected_size_(expected_size) {}
+
+  void Wait() {
+    base::test::TestFuture<void> done;
+    done_callback_ = done.GetCallback();
+
+    GeneratedCodeCacheContext::GetTaskRunner(cache_context_)
+        ->PostTask(FROM_HERE,
+                   base::BindOnce(&CodeCacheSizeChecker::GetCodeCache,
+                                  base::Unretained(this)));
+    ASSERT_TRUE(done.Wait());
+  }
+
+ private:
+  void GetCodeCache() {
+    net::NetworkIsolationKey nik = net::NetworkIsolationKey(
+        net::SchemefulSite(origin_), net::SchemefulSite(origin_));
+    cache_context_->generated_js_code_cache()->FetchEntry(
+        url_, GURL(), nik,
+        base::BindOnce(&CodeCacheSizeChecker::FetchCallback,
+                       base::Unretained(this)));
+  }
+
+  void FetchCallback(const base::Time&, mojo_base::BigBuffer data) {
+    if (data.size() >= expected_size_) {
+      content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE,
+                                                   std::move(done_callback_));
+    }
+  }
+
+  scoped_refptr<GeneratedCodeCacheContext> cache_context_;
+  GURL url_;
+  GURL origin_;
+  size_t expected_size_;
+  base::OnceClosure done_callback_;
+};
+
+IN_PROC_BROWSER_TEST_F(LocalCompileHintsBrowserTest, LocalCompileHints) {
+  // TODO(chromium:1495723): Migrate this test to use use counters once we no
+  // longer have the histograms.
+
+  // With this, we can query the code cache in a unified way in platforms which
+  // use origin locks differently.
+  CodeCacheHostImpl::SetUseEmptySecondaryKeyForTesting();
+
+  GURL cacheable_page =
+      embedded_test_server()->GetURL("c.com", "/cacheable.html");
+  GURL other_page = embedded_test_server()->GetURL("a.com", "/empty.html");
+
+  {
+    // Navigate to the page which requests a cacheable
+    // javascript resource (/cacheable.js). Once the page is interactive, local
+    // compile hints will be generated.
+    base::HistogramTester histogram_tester;
+    EXPECT_TRUE(NavigateToURL(shell(), cacheable_page));
+
+    GeneratedCodeCacheContext* cache_context =
+        shell()
+            ->web_contents()
+            ->GetBrowserContext()
+            ->GetDefaultStoragePartition()
+            ->GetGeneratedCodeCacheContext();
+    // Wait until compile hints were written into the cache.
+    const GURL& cacheable_script =
+        embedded_test_server()->GetURL("c.com", "/cacheable.js");
+    constexpr int kCompileHintsCacheSize = 28;  // Tag + actual data.
+    CodeCacheSizeChecker code_cache_size_checker(
+        cache_context, cacheable_script, GURL("http://c.com/"),
+        kCompileHintsCacheSize);
+    code_cache_size_checker.Wait();
+
+    FetchHistogramsFromChildProcesses();
+    EXPECT_EQ(1, histogram_tester.GetBucketCount(
+                     blink::v8_compile_hints::kStatusHistogram,
+                     blink::v8_compile_hints::Status::
+                         kProduceCompileHintsClassicNonStreaming) +
+                     histogram_tester.GetBucketCount(
+                         blink::v8_compile_hints::kStatusHistogram,
+                         blink::v8_compile_hints::Status::
+                             kProduceCompileHintsStreaming));
+  }
+
+  // Navigate away.
+  EXPECT_TRUE(NavigateToURL(shell(), other_page));
+
+  {
+    // Navigate to the same test page again and check for a local compile hints
+    // hit.
+    base::HistogramTester histogram_tester;
+    EXPECT_TRUE(NavigateToURL(shell(), cacheable_page));
+
+    FetchHistogramsFromChildProcesses();
+
+    EXPECT_EQ(1, histogram_tester.GetBucketCount(
+                     blink::v8_compile_hints::kStatusHistogram,
+                     blink::v8_compile_hints::Status::
+                         kConsumeLocalCompileHintsClassicNonStreaming) +
+                     histogram_tester.GetBucketCount(
+                         blink::v8_compile_hints::kStatusHistogram,
+                         blink::v8_compile_hints::Status::
+                             kConsumeLocalCompileHintsStreaming));
+  }
+
+  // Navigate away.
+  EXPECT_TRUE(NavigateToURL(shell(), other_page));
+
+  {
+    // Navigate to the same test page again and check for a code cache hit.
+    base::HistogramTester histogram_tester;
+    EXPECT_TRUE(NavigateToURL(shell(), cacheable_page));
+
+    FetchHistogramsFromChildProcesses();
+
+    histogram_tester.ExpectBucketCount(
+        blink::v8_compile_hints::kStatusHistogram,
+        blink::v8_compile_hints::Status::kConsumeCodeCacheClassicNonStreaming,
+        1);
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/compositor/DEPS b/content/browser/compositor/DEPS
index fd82735e..71f69f19 100644
--- a/content/browser/compositor/DEPS
+++ b/content/browser/compositor/DEPS
@@ -1,6 +1,5 @@
 include_rules = [
  "+components/viz/common",
  "+components/viz/host",
- "+ui/ozone/buildflags.h",
  "+ui/platform_window",
 ]
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc
index e8c3a4e..e8e5aec 100644
--- a/content/browser/gpu/gpu_internals_ui.cc
+++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -50,6 +50,7 @@
 #include "skia/ext/skia_commit_hash.h"
 #include "third_party/angle/src/common/angle_version_info.h"
 #include "third_party/skia/include/core/SkMilestone.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/display/util/gpu_info_util.h"
@@ -348,7 +349,7 @@
   base::Value::List gpu_memory_buffer_info;
 
   gpu::GpuMemoryBufferConfigurationSet native_config;
-#if defined(USE_OZONE_PLATFORM_X11)
+#if BUILDFLAG(IS_OZONE_X11)
   if (ui::OzonePlatform::GetInstance()
           ->GetPlatformProperties()
           .fetch_buffer_formats_for_gmb_on_gpu) {
@@ -356,7 +357,7 @@
       native_config.emplace(config);
     }
   }
-#endif
+#endif  // BUILDFLAG(IS_OZONE_X11)
   if (native_config.empty()) {
     native_config =
         gpu::GpuMemoryBufferSupport::GetNativeGpuMemoryBufferConfigurations();
diff --git a/content/browser/gpu/gpu_memory_buffer_manager_singleton.cc b/content/browser/gpu/gpu_memory_buffer_manager_singleton.cc
index b3e46e9f..12d20c4 100644
--- a/content/browser/gpu/gpu_memory_buffer_manager_singleton.cc
+++ b/content/browser/gpu/gpu_memory_buffer_manager_singleton.cc
@@ -14,6 +14,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/base/ui_base_features.h"
 
 #if BUILDFLAG(IS_OZONE)
@@ -37,13 +38,13 @@
   return nullptr;
 }
 
-#if defined(USE_OZONE_PLATFORM_X11)
+#if BUILDFLAG(IS_OZONE_X11)
 bool ShouldSetBufferFormatsFromGpuExtraInfo() {
   return ui::OzonePlatform::GetInstance()
       ->GetPlatformProperties()
       .fetch_buffer_formats_for_gmb_on_gpu;
 }
-#endif
+#endif  // BUILDFLAG(IS_OZONE_X11)
 
 scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() {
 #if BUILDFLAG(IS_MAC)
@@ -105,7 +106,7 @@
 }
 
 void GpuMemoryBufferManagerSingleton::OnGpuExtraInfoUpdate() {
-#if defined(USE_OZONE_PLATFORM_X11)
+#if BUILDFLAG(IS_OZONE_X11)
   // X11 fetches buffer formats on gpu and passes them via gpu extra info.
   if (ShouldSetBufferFormatsFromGpuExtraInfo()) {
     gpu::GpuMemoryBufferConfigurationSet configs;
@@ -115,7 +116,7 @@
     }
     SetNativeConfigurations(std::move(configs));
   }
-#endif
+#endif  // BUILDFLAG(IS_OZONE_X11)
 #if BUILDFLAG(IS_LINUX)
   // Dynamic check whether the NV12 format is supported as it may be
   // inconsistent between the system GBM (Generic Buffer Management) and
diff --git a/content/browser/loader/resource_scheduler_browsertest.cc b/content/browser/loader/resource_scheduler_browsertest.cc
index a8618c3..4feecc7 100644
--- a/content/browser/loader/resource_scheduler_browsertest.cc
+++ b/content/browser/loader/resource_scheduler_browsertest.cc
@@ -55,68 +55,6 @@
   EXPECT_EQ(9, EvalJs(browser, "getResourceNumber()"));
 }
 
-// The following test doesn't work on Android or iOS.
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
-class VisibilityAwareResourceSchedulerBrowserTest : public ContentBrowserTest {
- public:
-  // TODO(https://crbug.com/1457817): Avoid relying on this histogram to test
-  // whether a request is deprioritized or not. Tests would not work if the
-  // histogram expired.
-  static constexpr char kDeprioritizedHistogramName[] =
-      "Network.VisibilityAwareResourceScheduler.Deprioritized";
-
-  VisibilityAwareResourceSchedulerBrowserTest() {
-    feature_list_.InitAndEnableFeature(
-        network::features::kVisibilityAwareResourceScheduler);
-  }
-  ~VisibilityAwareResourceSchedulerBrowserTest() override = default;
-
-  void SetUp() override {
-    ASSERT_TRUE(embedded_test_server()->Start());
-    ContentBrowserTest::SetUp();
-  }
-
-  bool FetchScript(GURL url) {
-    EvalJsResult result = EvalJs(shell(), JsReplace(R"(
-      new Promise(resolve => {
-        const script = document.createElement("script");
-        script.src = $1;
-        script.onerror = () => resolve("blocked");
-        script.onload = () => resolve("fetched");
-        document.body.appendChild(script);
-      });
-    )",
-                                                    url));
-    return result.ExtractString() == "fetched";
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
-IN_PROC_BROWSER_TEST_F(VisibilityAwareResourceSchedulerBrowserTest, Simple) {
-  base::HistogramTester histograms;
-
-  GURL url(embedded_test_server()->GetURL("/title1.html"));
-  ASSERT_TRUE(NavigateToURL(shell(), url));
-
-  shell()->web_contents()->UpdateWebContentsVisibility(Visibility::HIDDEN);
-  ASSERT_TRUE(FetchScript(embedded_test_server()->GetURL("/empty-script.js")));
-  FetchHistogramsFromChildProcesses();
-  // Navigation is not deprioritized, a script fetch is deprioritized.
-  EXPECT_THAT(histograms.GetAllSamples(kDeprioritizedHistogramName),
-              testing::ElementsAre(base::Bucket(0, 1), base::Bucket(1, 1)));
-
-  shell()->web_contents()->UpdateWebContentsVisibility(Visibility::VISIBLE);
-  ASSERT_TRUE(FetchScript(embedded_test_server()->GetURL("/empty-script.js")));
-  FetchHistogramsFromChildProcesses();
-  // Navigation is not deprioritized, the first script fetch is deprioritized,
-  // and the second script fetch is not deprioritized.
-  EXPECT_THAT(histograms.GetAllSamples(kDeprioritizedHistogramName),
-              testing::ElementsAre(base::Bucket(0, 2), base::Bucket(1, 1)));
-}
-#endif  // !BUILDFLAG(IS_ANDROID)
-
 }  // anonymous namespace
 
 }  // namespace content
diff --git a/content/browser/media/capture/DEPS b/content/browser/media/capture/DEPS
index be3b9e1..7d7899cd 100644
--- a/content/browser/media/capture/DEPS
+++ b/content/browser/media/capture/DEPS
@@ -11,7 +11,6 @@
   ],
   "desktop_capture_device_unittest.cc": [
     # Some test cases are not yet supported depending on platform.
-    "+ui/ozone/buildflags.h",
     "+ui/ozone/public/ozone_platform.h",
   ],
   "desktop_capturer_ash\.cc": [
diff --git a/content/browser/renderer_host/code_cache_host_impl.cc b/content/browser/renderer_host/code_cache_host_impl.cc
index 6b9e506..222b62b 100644
--- a/content/browser/renderer_host/code_cache_host_impl.cc
+++ b/content/browser/renderer_host/code_cache_host_impl.cc
@@ -35,14 +35,10 @@
 
 namespace {
 
-enum class Operation {
-  kRead,
-  kWrite,
-};
-
-bool CheckSecurityForAccessingCodeCacheData(const GURL& resource_url,
-                                            int render_process_id,
-                                            Operation operation) {
+bool CheckSecurityForAccessingCodeCacheData(
+    const GURL& resource_url,
+    int render_process_id,
+    CodeCacheHostImpl::Operation operation) {
   ProcessLock process_lock =
       ChildProcessSecurityPolicyImpl::GetInstance()->GetProcessLock(
           render_process_id);
@@ -61,7 +57,7 @@
     }
     if (process_lock.matches_scheme(url::kHttpScheme) ||
         process_lock.matches_scheme(url::kHttpsScheme)) {
-      if (operation == Operation::kWrite) {
+      if (operation == CodeCacheHostImpl::Operation::kWrite) {
         mojo::ReportBadMessage("HTTP(S) pages cannot cache WebUI code");
       }
       return false;
@@ -83,77 +79,12 @@
     return true;
   }
 
-  if (operation == Operation::kWrite) {
+  if (operation == CodeCacheHostImpl::Operation::kWrite) {
     mojo::ReportBadMessage("Invalid URL scheme for code cache.");
   }
   return false;
 }
 
-// Code caches use two keys: the URL of requested resource |resource_url|
-// as the primary key and the origin lock of the renderer that requested this
-// resource as secondary key. This function returns the origin lock of the
-// renderer that will be used as the secondary key for the code cache.
-// The secondary key is:
-// Case 0. absl::nullopt if the resource URL or origin lock have unsupported
-// schemes, or if they represent potentially dangerous combinations such as
-// WebUI code in an open-web page.
-// Case 1. an empty GURL if the render process is not locked to an origin. In
-// this case, code cache uses |resource_url| as the key.
-// Case 2. a absl::nullopt, if the origin lock is opaque (for ex: browser
-// initiated navigation to a data: URL). In these cases, the code should not be
-// cached since the serialized value of opaque origins should not be used as a
-// key.
-// Case 3: origin_lock if the scheme of origin_lock is
-// Http/Https/chrome/chrome-untrusted.
-// Case 4. absl::nullopt otherwise.
-absl::optional<GURL> GetSecondaryKeyForCodeCache(const GURL& resource_url,
-                                                 int render_process_id,
-                                                 Operation operation) {
-  // Case 0: check for invalid schemes.
-  if (!CheckSecurityForAccessingCodeCacheData(resource_url, render_process_id,
-                                              operation)) {
-    return absl::nullopt;
-  }
-  if (!resource_url.is_valid())
-    return absl::nullopt;
-
-  ProcessLock process_lock =
-      ChildProcessSecurityPolicyImpl::GetInstance()->GetProcessLock(
-          render_process_id);
-
-  // Case 1: If process is not locked to a site, it is safe to just use the
-  // |resource_url| of the requested resource as the key. Return an empty GURL
-  // as the second key.
-  if (!process_lock.is_locked_to_site())
-    return GURL::EmptyGURL();
-
-  // Case 2: Don't cache the code corresponding to opaque origins. The same
-  // origin checks should always fail for opaque origins but the serialized
-  // value of opaque origins does not ensure this.
-  // NOTE: HasOpaqueOrigin() will return true if the ProcessLock lock url is
-  // invalid, leading to a return value of absl::nullopt.
-  if (process_lock.HasOpaqueOrigin())
-    return absl::nullopt;
-
-  // Case 3: process_lock_url is used to enfore site-isolation in code caches.
-  // Http/https/chrome schemes are safe to be used as a secondary key. Other
-  // schemes could be enabled if they are known to be safe and if it is
-  // required to cache code from those origins.
-  //
-  // file:// URLs will have a "file:" process lock and would thus share a
-  // cache across all file:// URLs. That would likely be ok for security, but
-  // since this case is not performance sensitive we will keep things simple and
-  // limit the cache to http/https/chrome/chrome-untrusted processes.
-  if (process_lock.matches_scheme(url::kHttpScheme) ||
-      process_lock.matches_scheme(url::kHttpsScheme) ||
-      process_lock.matches_scheme(content::kChromeUIScheme) ||
-      process_lock.matches_scheme(content::kChromeUIUntrustedScheme)) {
-    return process_lock.lock_url();
-  }
-
-  return absl::nullopt;
-}
-
 void DidGenerateCacheableMetadataInCacheStorageOnUI(
     const GURL& url,
     base::Time expected_response_time,
@@ -238,6 +169,8 @@
 
 }  // namespace
 
+bool CodeCacheHostImpl::use_empty_secondary_key_for_testing_ = false;
+
 CodeCacheHostImpl::ReceiverSet::ReceiverSet(
     scoped_refptr<GeneratedCodeCacheContext> generated_code_cache_context)
     : generated_code_cache_context_(generated_code_cache_context),
@@ -314,12 +247,13 @@
   if (!code_cache)
     return;
 
-  absl::optional<GURL> origin_lock =
+  std::optional<GURL> secondary_key =
       GetSecondaryKeyForCodeCache(url, render_process_id_, Operation::kWrite);
-  if (!origin_lock)
+  if (!secondary_key) {
     return;
+  }
 
-  code_cache->WriteEntry(url, *origin_lock, network_isolation_key_,
+  code_cache->WriteEntry(url, *secondary_key, network_isolation_key_,
                          expected_response_time, std::move(data));
 }
 
@@ -333,9 +267,9 @@
     return;
   }
 
-  absl::optional<GURL> origin_lock =
+  std::optional<GURL> secondary_key =
       GetSecondaryKeyForCodeCache(url, render_process_id_, Operation::kRead);
-  if (!origin_lock) {
+  if (!secondary_key) {
     std::move(callback).Run(base::Time(), std::vector<uint8_t>());
     return;
   }
@@ -343,7 +277,7 @@
   auto read_callback = base::BindOnce(
       &CodeCacheHostImpl::OnReceiveCachedCode, weak_ptr_factory_.GetWeakPtr(),
       cache_type, base::TimeTicks::Now(), std::move(callback));
-  code_cache->FetchEntry(url, *origin_lock, network_isolation_key_,
+  code_cache->FetchEntry(url, *secondary_key, network_isolation_key_,
                          std::move(read_callback));
 }
 
@@ -355,12 +289,13 @@
   if (!code_cache)
     return;
 
-  absl::optional<GURL> origin_lock =
-      GetSecondaryKeyForCodeCache(url, render_process_id_, Operation::kWrite);
-  if (!origin_lock)
+  std::optional<GURL> secondary_key =
+      GetSecondaryKeyForCodeCache(url, render_process_id_, Operation::kRead);
+  if (!secondary_key) {
     return;
+  }
 
-  code_cache->DeleteEntry(url, *origin_lock, network_isolation_key_);
+  code_cache->DeleteEntry(url, *secondary_key, network_isolation_key_);
 }
 
 void CodeCacheHostImpl::DidGenerateCacheableMetadataInCacheStorage(
@@ -422,4 +357,76 @@
   std::move(callback).Run(response_time, std::move(data));
 }
 
+// Code caches use two keys: the URL of requested resource |resource_url|
+// as the primary key and the origin lock of the renderer that requested this
+// resource as secondary key. This function returns the origin lock of the
+// renderer that will be used as the secondary key for the code cache.
+// The secondary key is:
+// Case 0. absl::nullopt if the resource URL or origin lock have unsupported
+// schemes, or if they represent potentially dangerous combinations such as
+// WebUI code in an open-web page.
+// Case 1. an empty GURL if the render process is not locked to an origin. In
+// this case, code cache uses |resource_url| as the key.
+// Case 2. a absl::nullopt, if the origin lock is opaque (for ex: browser
+// initiated navigation to a data: URL). In these cases, the code should not be
+// cached since the serialized value of opaque origins should not be used as a
+// key.
+// Case 3: origin_lock if the scheme of origin_lock is
+// Http/Https/chrome/chrome-untrusted.
+// Case 4. absl::nullopt otherwise.
+std::optional<GURL> CodeCacheHostImpl::GetSecondaryKeyForCodeCache(
+    const GURL& resource_url,
+    int render_process_id,
+    CodeCacheHostImpl::Operation operation) {
+  if (use_empty_secondary_key_for_testing_) {
+    return GURL();
+  }
+  // Case 0: check for invalid schemes.
+  if (!CheckSecurityForAccessingCodeCacheData(resource_url, render_process_id,
+                                              operation)) {
+    return std::nullopt;
+  }
+  if (!resource_url.is_valid()) {
+    return std::nullopt;
+  }
+
+  ProcessLock process_lock =
+      ChildProcessSecurityPolicyImpl::GetInstance()->GetProcessLock(
+          render_process_id);
+
+  // Case 1: If process is not locked to a site, it is safe to just use the
+  // |resource_url| of the requested resource as the key. Return an empty GURL
+  // as the second key.
+  if (!process_lock.is_locked_to_site()) {
+    return GURL::EmptyGURL();
+  }
+
+  // Case 2: Don't cache the code corresponding to opaque origins. The same
+  // origin checks should always fail for opaque origins but the serialized
+  // value of opaque origins does not ensure this.
+  // NOTE: HasOpaqueOrigin() will return true if the ProcessLock lock url is
+  // invalid, leading to a return value of absl::nullopt.
+  if (process_lock.HasOpaqueOrigin()) {
+    return absl::nullopt;
+  }
+
+  // Case 3: process_lock_url is used to enfore site-isolation in code caches.
+  // Http/https/chrome schemes are safe to be used as a secondary key. Other
+  // schemes could be enabled if they are known to be safe and if it is
+  // required to cache code from those origins.
+  //
+  // file:// URLs will have a "file:" process lock and would thus share a
+  // cache across all file:// URLs. That would likely be ok for security, but
+  // since this case is not performance sensitive we will keep things simple and
+  // limit the cache to http/https/chrome/chrome-untrusted processes.
+  if (process_lock.matches_scheme(url::kHttpScheme) ||
+      process_lock.matches_scheme(url::kHttpsScheme) ||
+      process_lock.matches_scheme(content::kChromeUIScheme) ||
+      process_lock.matches_scheme(content::kChromeUIUntrustedScheme)) {
+    return process_lock.lock_url();
+  }
+
+  return std::nullopt;
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/code_cache_host_impl.h b/content/browser/renderer_host/code_cache_host_impl.h
index 2eadccd..e4069b98 100644
--- a/content/browser/renderer_host/code_cache_host_impl.h
+++ b/content/browser/renderer_host/code_cache_host_impl.h
@@ -96,6 +96,15 @@
   void SetCacheStorageControlForTesting(
       storage::mojom::CacheStorageControl* cache_storage_control);
 
+  static void SetUseEmptySecondaryKeyForTesting() {
+    use_empty_secondary_key_for_testing_ = true;
+  }
+
+  enum class Operation {
+    kRead,
+    kWrite,
+  };
+
  private:
   // blink::mojom::CodeCacheHost implementation.
   void DidGenerateCacheableMetadata(blink::mojom::CodeCacheType cache_type,
@@ -121,6 +130,11 @@
                            const base::Time& response_time,
                            mojo_base::BigBuffer data);
 
+  std::optional<GURL> GetSecondaryKeyForCodeCache(
+      const GURL& resource_url,
+      int render_process_id,
+      CodeCacheHostImpl::Operation operation);
+
   // Our render process host ID, used to bind to the correct render process.
   const int render_process_id_;
 
@@ -128,6 +142,8 @@
   raw_ptr<storage::mojom::CacheStorageControl>
       cache_storage_control_for_testing_ = nullptr;
 
+  static bool use_empty_secondary_key_for_testing_;
+
   scoped_refptr<GeneratedCodeCacheContext> generated_code_cache_context_;
 
   // The key used to partition code cached in the `GeneratedCodeCache`.
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 6bad112..1b7423c 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -13726,6 +13726,8 @@
          common_params->url.SchemeIs(url::kDataScheme));
   IncreaseCommitNavigationCounter();
   mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host;
+  mojo::PendingRemote<blink::mojom::CodeCacheHost>
+      code_cache_host_for_background;
   mojom::CookieManagerInfoPtr cookie_manager_info;
   mojom::StorageInfoPtr storage_info;
 
@@ -13739,6 +13741,13 @@
       navigation_request->isolation_info_for_subresources()
           .network_isolation_key(),
       code_cache_storage_key);
+  if (base::FeatureList::IsEnabled(blink::features::kBackgroundResourceFetch)) {
+    CreateCodeCacheHostWithKeys(
+        code_cache_host_for_background.InitWithNewPipeAndPassReceiver(),
+        navigation_request->isolation_info_for_subresources()
+            .network_isolation_key(),
+        code_cache_storage_key);
+  }
 
   url::Origin origin_to_commit =
       navigation_request->GetOriginToCommit().value();
@@ -13854,6 +13863,7 @@
         std::move(fetch_later_loader_factory), document_token,
         devtools_navigation_token, permissions_policy,
         std::move(policy_container), std::move(code_cache_host),
+        std::move(code_cache_host_for_background),
         std::move(resource_cache_remote), std::move(cookie_manager_info),
         std::move(storage_info),
         BuildCommitNavigationCallback(navigation_request));
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index efebe760..0ef4f3f7 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2222,8 +2222,9 @@
   if (HostHasNotBeenUsed())
     ret += " hnbu";
 
-  if (IsSpareProcessForCrashReporting(this))
+  if (IsSpare()) {
     ret += " spr";
+  }
 
   if (delayed_cleanup_needed_)
     ret += " dcn";
@@ -3163,13 +3164,6 @@
 }
 
 // static
-bool RenderProcessHostImpl::IsSpareProcessForCrashReporting(
-    RenderProcessHost* render_process_host) {
-  return render_process_host == SpareRenderProcessHostManager::GetInstance()
-                                    .spare_render_process_host();
-}
-
-// static
 void RenderProcessHostImpl::ClearAllResourceCaches() {
   for (iterator iter(AllHostsIterator()); !iter.IsAtEnd(); iter.Advance()) {
     mojom::Renderer* renderer_interface =
@@ -3183,6 +3177,11 @@
          pending_views_ == 0;
 }
 
+bool RenderProcessHostImpl::IsSpare() const {
+  return this == SpareRenderProcessHostManager::GetInstance()
+                     .spare_render_process_host();
+}
+
 void RenderProcessHostImpl::SetProcessLock(
     const IsolationContext& isolation_context,
     const ProcessLock& process_lock) {
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 02d360e01..56482f7 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -307,6 +307,7 @@
   void SetIsUsed() override;
 
   bool HostHasNotBeenUsed() override;
+  bool IsSpare() const override;
   void SetProcessLock(const IsolationContext& isolation_context,
                       const ProcessLock& process_lock) override;
   ProcessLock GetProcessLock() const override;
@@ -595,13 +596,6 @@
   // Iterate over all renderers and clear their in-memory resource cache.
   static void ClearAllResourceCaches();
 
-  // Helper method that allows crash reporting logic to determine if a
-  // specific RenderProcessHost is the current spare process.
-  // Returns true if |render_process_host| is the current spare
-  // RenderProcessHost.
-  static bool IsSpareProcessForCrashReporting(
-      RenderProcessHost* render_process_host);
-
   PermissionServiceContext& permission_service_context() {
     return *permission_service_context_;
   }
diff --git a/content/browser/service_worker/service_worker_test_utils.cc b/content/browser/service_worker/service_worker_test_utils.cc
index f9465e3..a985345 100644
--- a/content/browser/service_worker/service_worker_test_utils.cc
+++ b/content/browser/service_worker/service_worker_test_utils.cc
@@ -102,6 +102,8 @@
       const absl::optional<blink::ParsedPermissionsPolicy>& permissions_policy,
       blink::mojom::PolicyContainerPtr policy_container,
       mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host,
+      mojo::PendingRemote<blink::mojom::CodeCacheHost>
+          code_cache_host_for_background,
       mojo::PendingRemote<blink::mojom::ResourceCache> resource_cache,
       mojom::CookieManagerInfoPtr cookie_manager_info,
       mojom::StorageInfoPtr storage_info,
@@ -274,6 +276,7 @@
       blink::DocumentToken(), base::UnguessableToken::Create(),
       std::vector<blink::ParsedPermissionsPolicyDeclaration>(),
       CreateStubPolicyContainer(), /*code_cache_host=*/mojo::NullRemote(),
+      /*code_cache_host_for_background=*/mojo::NullRemote(),
       /*resource_cache=*/mojo::NullRemote(), /*cookie_manager_info=*/nullptr,
       /*storage_info=*/nullptr,
       base::BindOnce(
diff --git a/content/browser/smart_card/smart_card_browsertest.cc b/content/browser/smart_card/smart_card_browsertest.cc
index 7ca2d60..3a29f3fc 100644
--- a/content/browser/smart_card/smart_card_browsertest.cc
+++ b/content/browser/smart_card/smart_card_browsertest.cc
@@ -189,7 +189,7 @@
 class SmartCardTest : public ContentBrowserTest {
  public:
   GURL GetIsolatedContextUrl() {
-    return https_server_.GetURL(
+    return embedded_https_test_server().GetURL(
         "a.com",
         "/set-header?Cross-Origin-Opener-Policy: same-origin&"
         "Cross-Origin-Embedder-Policy: require-corp&"
@@ -250,7 +250,6 @@
  private:
   void SetUpCommandLine(base::CommandLine* command_line) override {
     ContentBrowserTest::SetUpCommandLine(command_line);
-    mock_cert_verifier_.SetUpCommandLine(command_line);
   }
 
   void SetUpOnMainThread() override {
@@ -260,40 +259,30 @@
     test_client_->SetSmartCardDelegate(
         std::make_unique<FakeSmartCardDelegate>());
 
-    mock_cert_verifier_.mock_cert_verifier()->set_default_result(net::OK);
-
     // Serve a.com (and any other domain).
     host_resolver()->AddRule("*", "127.0.0.1");
 
     // Add a handler for the "/set-header" page (among others)
-    https_server_.AddDefaultHandlers(GetTestDataFilePath());
+    embedded_https_test_server().AddDefaultHandlers(GetTestDataFilePath());
 
-    ASSERT_TRUE(https_server_.Start());
+    ASSERT_TRUE(embedded_https_test_server().Start());
   }
 
   void SetUpInProcessBrowserTestFixture() override {
     ContentBrowserTest::SetUpInProcessBrowserTestFixture();
-    mock_cert_verifier_.SetUpInProcessBrowserTestFixture();
   }
 
   void TearDownInProcessBrowserTestFixture() override {
     ContentBrowserTest::TearDownInProcessBrowserTestFixture();
-    mock_cert_verifier_.TearDownInProcessBrowserTestFixture();
   }
 
   void TearDown() override {
-    ASSERT_TRUE(https_server_.ShutdownAndWaitUntilComplete());
+    ASSERT_TRUE(embedded_https_test_server().ShutdownAndWaitUntilComplete());
     ContentBrowserTest::TearDown();
   }
 
   std::unique_ptr<SmartCardTestContentBrowserClient> test_client_;
 
-  // Need a mock CertVerifier for HTTPS connections to succeed with the test
-  // server.
-  ContentMockCertVerifier mock_cert_verifier_;
-
-  net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS};
-
   base::test::ScopedFeatureList scoped_feature_list_{
       blink::features::kSmartCard};
 };
diff --git a/content/browser/web_contents/DEPS b/content/browser/web_contents/DEPS
index 4668555..f3c2954 100644
--- a/content/browser/web_contents/DEPS
+++ b/content/browser/web_contents/DEPS
@@ -4,7 +4,6 @@
     "+content/app_shim_remote_cocoa",
   ],
   "web_contents_view_aura_unittest.cc": [
-    "+ui/ozone/buildflags.h",
     "+ui/ozone/public/ozone_platform.h",
   ],
   "view_structure_builder_android.h": [
diff --git a/content/common/features.cc b/content/common/features.cc
index e53c5a7..4fdee638 100644
--- a/content/common/features.cc
+++ b/content/common/features.cc
@@ -293,12 +293,6 @@
              "JavaScriptArrayGrouping",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enables a fix for a macOS IME Live Conversion issue. crbug.com/1328530 and
-// crbug.com/1342551
-BASE_FEATURE(kMacImeLiveConversionFix,
-             "MacImeLiveConversionFix",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Feature that controls whether WebContentsOcclusionChecker should handle
 // occlusion notifications.
 #if BUILDFLAG(IS_MAC)
diff --git a/content/common/features.h b/content/common/features.h
index 5daad89..17f5049 100644
--- a/content/common/features.h
+++ b/content/common/features.h
@@ -68,7 +68,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kIOSurfaceCapturer);
 #endif
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kJavaScriptArrayGrouping);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kMacImeLiveConversionFix);
 #if BUILDFLAG(IS_MAC)
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kMacWebContentsOcclusion);
 #endif
diff --git a/content/common/navigation_client.mojom b/content/common/navigation_client.mojom
index 8766c5f..0cf3248 100644
--- a/content/common/navigation_client.mojom
+++ b/content/common/navigation_client.mojom
@@ -302,6 +302,7 @@
       array<blink.mojom.ParsedPermissionsPolicyDeclaration>? permissions_policy,
       blink.mojom.PolicyContainer policy_container,
       pending_remote<blink.mojom.CodeCacheHost>? code_cache_host,
+      pending_remote<blink.mojom.CodeCacheHost>? code_cache_host_for_background,
       pending_remote<blink.mojom.ResourceCache>? resource_cache,
       CookieManagerInfo? cookie_manager_info,
       StorageInfo? storage_info)
diff --git a/content/common/service_worker/service_worker_router_evaluator.cc b/content/common/service_worker/service_worker_router_evaluator.cc
index 3da8247..d712039 100644
--- a/content/common/service_worker/service_worker_router_evaluator.cc
+++ b/content/common/service_worker/service_worker_router_evaluator.cc
@@ -4,11 +4,13 @@
 
 #include "content/common/service_worker/service_worker_router_evaluator.h"
 
+#include <limits>
 #include <memory>
 #include <tuple>
 
 #include "base/json/json_writer.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "services/network/public/cpp/request_destination.h"
@@ -646,7 +648,9 @@
 
 base::Value ServiceWorkerRouterEvaluator::ToValue() const {
   base::Value::List out;
-  for (const auto& r : rules_.rules) {
+  CHECK_EQ(rules_.rules.size(), compiled_rules_.size());
+  for (size_t idx = 0; idx < rules_.rules.size(); ++idx) {
+    const auto& r = rules_.rules[idx];
     base::Value::Dict rule;
     base::Value condition = ConditionToValue(r.condition);
     base::Value::List source;
@@ -675,6 +679,7 @@
     }
     rule.Set("condition", std::move(condition));
     rule.Set("source", std::move(source));
+    rule.Set("id", base::checked_cast<int>(compiled_rules_[idx]->id()));
     out.Append(std::move(rule));
   }
   return base::Value(std::move(out));
diff --git a/content/common/service_worker/service_worker_router_evaluator_unittest.cc b/content/common/service_worker/service_worker_router_evaluator_unittest.cc
index b14f23eb..535c2383 100644
--- a/content/common/service_worker/service_worker_router_evaluator_unittest.cc
+++ b/content/common/service_worker/service_worker_router_evaluator_unittest.cc
@@ -1275,6 +1275,7 @@
   {
     base::Value::Dict rule;
     {
+      rule.Set("id", 1);
       {
         base::Value::Dict condition;
         {
@@ -1343,6 +1344,7 @@
   {
     base::Value::Dict rule;
     {
+      rule.Set("id", 1);
       {
         base::Value::Dict condition;
         condition.Set("or", base::Value::List());
@@ -1396,6 +1398,7 @@
   base::Value::List expected_rules;
   {
     base::Value::Dict rule;
+    rule.Set("id", 1);
     {
       base::Value::Dict outer;
       {
@@ -1505,6 +1508,7 @@
   base::Value::List expected_rules;
   {
     base::Value::Dict rule;
+    rule.Set("id", 1);
     {
       base::Value::Dict condition;
       {
@@ -1554,6 +1558,7 @@
   base::Value::List expected_rules;
   {
     base::Value::Dict rule;
+    rule.Set("id", 1);
     {
       base::Value::Dict condition;
       {
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
index 6a155d31..dd8a74c 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
@@ -34,8 +34,6 @@
     public static final String PROCESS_SHARING_WITH_STRICT_SITE_INSTANCES =
             "ProcessSharingWithStrictSiteInstances";
 
-    public static final String REQUEST_DESKTOP_SITE_ADDITIONS = "RequestDesktopSiteAdditions";
-
     public static final String REQUEST_DESKTOP_SITE_WINDOW_SETTING =
             "RequestDesktopSiteWindowSetting";
 
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h
index 153c0d0..aa2042e 100644
--- a/content/public/browser/render_process_host.h
+++ b/content/public/browser/render_process_host.h
@@ -577,6 +577,9 @@
   // crbug.com/738634.
   virtual bool HostHasNotBeenUsed() = 0;
 
+  // Returns true if this is a spare RenderProcessHost.
+  virtual bool IsSpare() const = 0;
+
   // Locks this RenderProcessHost to documents compatible with |process_lock|.
   // This method is public so that it can be called from within //content, and
   // used by MockRenderProcessHost. It isn't meant to be called outside of
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 1702ade..7e8a614 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -1285,12 +1285,6 @@
              "MouseAndTrackpadDropdownMenu",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Request Desktop Site secondary settings for Android; including display
-// setting and peripheral setting.
-BASE_FEATURE(kRequestDesktopSiteAdditions,
-             "RequestDesktopSiteAdditions",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Request Desktop Site based on window width for Android.
 BASE_FEATURE(kRequestDesktopSiteWindowSetting,
              "RequestDesktopSiteWindowSetting",
@@ -1332,6 +1326,12 @@
              "MacAllowBackgroundingRenderProcesses",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Enables a fix for a macOS IME Live Conversion issue. crbug.com/1328530 and
+// crbug.com/1342551
+BASE_FEATURE(kMacImeLiveConversionFix,
+             "MacImeLiveConversionFix",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kMacSyscallSandbox,
              "MacSyscallSandbox",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 49d83f4..2f54f93 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -313,7 +313,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kGinJavaBridgeMojo);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kReduceGpuPriorityOnBackground);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kMouseAndTrackpadDropdownMenu);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kRequestDesktopSiteAdditions);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kRequestDesktopSiteWindowSetting);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kRequestDesktopSiteZoom);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kSelectionMenuItemModification);
@@ -325,6 +324,7 @@
 
 #if BUILDFLAG(IS_MAC)
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kMacAllowBackgroundingRenderProcesses);
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kMacImeLiveConversionFix);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kMacSyscallSandbox);
 #endif  // BUILDFLAG(IS_MAC)
 
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h
index c47b160..79162fa 100644
--- a/content/public/renderer/render_frame_observer.h
+++ b/content/public/renderer/render_frame_observer.h
@@ -277,7 +277,8 @@
       const url::SchemeHostPort& final_response_url,
       int request_id,
       const network::mojom::URLResponseHead& response_head,
-      network::mojom::RequestDestination request_destination) {}
+      network::mojom::RequestDestination request_destination,
+      bool is_ad_resource) {}
   virtual void DidCompleteResponse(
       int request_id,
       const network::URLLoaderCompletionStatus& status) {}
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc
index 96437ceb..312c0762 100644
--- a/content/public/test/mock_render_process_host.cc
+++ b/content/public/test/mock_render_process_host.cc
@@ -546,6 +546,10 @@
   return IsUnused() && listeners_.IsEmpty() && GetKeepAliveRefCount() == 0;
 }
 
+bool MockRenderProcessHost::IsSpare() const {
+  return this == RenderProcessHostImpl::GetSpareRenderProcessHostForTesting();
+}
+
 void MockRenderProcessHost::SetProcessLock(
     const IsolationContext& isolation_context,
     const ProcessLock& process_lock) {
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h
index ba776a8..b1fb42e 100644
--- a/content/public/test/mock_render_process_host.h
+++ b/content/public/test/mock_render_process_host.h
@@ -200,6 +200,7 @@
   void SetIsUsed() override;
 
   bool HostHasNotBeenUsed() override;
+  bool IsSpare() const override;
   void SetProcessLock(const IsolationContext& isolation_context,
                       const ProcessLock& process_lock) override;
   ProcessLock GetProcessLock() const override;
diff --git a/content/renderer/navigation_client.cc b/content/renderer/navigation_client.cc
index b07c4af5..48d4517 100644
--- a/content/renderer/navigation_client.cc
+++ b/content/renderer/navigation_client.cc
@@ -46,6 +46,8 @@
     const absl::optional<blink::ParsedPermissionsPolicy>& permissions_policy,
     blink::mojom::PolicyContainerPtr policy_container,
     mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host,
+    mojo::PendingRemote<blink::mojom::CodeCacheHost>
+        code_cache_host_for_background,
     mojo::PendingRemote<blink::mojom::ResourceCache> resource_cache,
     mojom::CookieManagerInfoPtr cookie_manager_info,
     mojom::StorageInfoPtr storage_info,
@@ -69,8 +71,9 @@
       std::move(fetch_later_loader_factory), document_token,
       devtools_navigation_token, permissions_policy,
       std::move(policy_container), std::move(code_cache_host),
-      std::move(resource_cache), std::move(cookie_manager_info),
-      std::move(storage_info), std::move(callback));
+      std::move(code_cache_host_for_background), std::move(resource_cache),
+      std::move(cookie_manager_info), std::move(storage_info),
+      std::move(callback));
 }
 
 void NavigationClient::CommitFailedNavigation(
diff --git a/content/renderer/navigation_client.h b/content/renderer/navigation_client.h
index b2b2aa88..7818437 100644
--- a/content/renderer/navigation_client.h
+++ b/content/renderer/navigation_client.h
@@ -46,6 +46,8 @@
       const absl::optional<blink::ParsedPermissionsPolicy>& permissions_policy,
       blink::mojom::PolicyContainerPtr policy_container,
       mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host,
+      mojo::PendingRemote<blink::mojom::CodeCacheHost>
+          code_cache_host_for_background,
       mojo::PendingRemote<blink::mojom::ResourceCache> resource_cache,
       mojom::CookieManagerInfoPtr cookie_manager_info,
       mojom::StorageInfoPtr storage_info,
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index edc151bd..c322e3d9 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1217,30 +1217,6 @@
   return pref.send_subresource_notification;
 }
 
-class WebURLLoaderThrottleProviderForFrameImpl
-    : public blink::WebURLLoaderThrottleProviderForFrame {
- public:
-  explicit WebURLLoaderThrottleProviderForFrameImpl(
-      const blink::LocalFrameToken& frame_token)
-      : frame_token_(frame_token) {}
-  ~WebURLLoaderThrottleProviderForFrameImpl() override = default;
-
-  WebVector<std::unique_ptr<blink::URLLoaderThrottle>> CreateThrottles(
-      const WebURLRequest& request) override {
-    RenderThreadImpl* render_thread = RenderThreadImpl::current();
-    // The RenderThreadImpl or its URLLoaderThrottleProvider member may not be
-    // valid in some tests.
-    if (!render_thread || !render_thread->url_loader_throttle_provider()) {
-      return {};
-    }
-    return render_thread->url_loader_throttle_provider()->CreateThrottles(
-        frame_token_, request);
-  }
-
- private:
-  const blink::LocalFrameToken frame_token_;
-};
-
 // Initialize the WebFrameWidget with compositing. Only local root frames
 // create a widget.
 // `previous_widget` indicates whether the compositor for the frame which
@@ -2472,7 +2448,8 @@
     int64_t request_id,
     const url::SchemeHostPort& final_response_url,
     network::mojom::URLResponseHeadPtr response_head,
-    network::mojom::RequestDestination request_destination) {
+    network::mojom::RequestDestination request_destination,
+    bool is_ad_resource) {
   if (!blink::IsRequestDestinationFrame(request_destination)) {
     bool notify = ShouldNotifySubresourceResponseStarted(
         GetWebView()->GetRendererPreferences());
@@ -2484,7 +2461,7 @@
     }
   }
   DidStartResponse(final_response_url, request_id, std::move(response_head),
-                   request_destination);
+                   request_destination, is_ad_resource);
 }
 
 void RenderFrameImpl::NotifyResourceTransferSizeUpdated(
@@ -2618,6 +2595,8 @@
     const absl::optional<blink::ParsedPermissionsPolicy>& permissions_policy,
     blink::mojom::PolicyContainerPtr policy_container,
     mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host,
+    mojo::PendingRemote<blink::mojom::CodeCacheHost>
+        code_cache_host_for_background,
     mojo::PendingRemote<blink::mojom::ResourceCache> resource_cache,
     mojom::CookieManagerInfoPtr cookie_manager_info,
     mojom::StorageInfoPtr storage_info,
@@ -2679,8 +2658,9 @@
       std::move(subresource_proxying_loader_factory),
       std::move(keep_alive_loader_factory),
       std::move(fetch_later_loader_factory), std::move(code_cache_host),
-      std::move(resource_cache), std::move(cookie_manager_info),
-      std::move(storage_info), std::move(document_state));
+      std::move(code_cache_host_for_background), std::move(resource_cache),
+      std::move(cookie_manager_info), std::move(storage_info),
+      std::move(document_state));
 
   // Handle a navigation that has a non-empty `data_url_as_string`, or perform
   // a "loadDataWithBaseURL" navigation, which is different from a normal data:
@@ -2739,7 +2719,7 @@
         std::move(url_loader_client_endpoints),
         GetTaskRunner(blink::TaskType::kInternalLoading),
         CreateResourceLoadInfoNotifierWrapper(), !frame_->Parent(),
-        navigation_params.get());
+        navigation_params.get(), frame_->IsAdFrame());
   }
 
   // The MHTML mime type should be same as the one we check in the browser
@@ -2802,6 +2782,8 @@
     mojo::PendingAssociatedRemote<blink::mojom::FetchLaterLoaderFactory>
         fetch_later_loader_factory,
     mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host,
+    mojo::PendingRemote<blink::mojom::CodeCacheHost>
+        code_cache_host_for_background,
     mojo::PendingRemote<blink::mojom::ResourceCache> resource_cache,
     mojom::CookieManagerInfoPtr cookie_manager_info,
     mojom::StorageInfoPtr storage_info,
@@ -2910,6 +2892,8 @@
   DCHECK(!pending_loader_factories_);
   pending_loader_factories_ = std::move(new_loader_factories);
   pending_code_cache_host_ = std::move(code_cache_host);
+  pending_code_cache_host_for_background_ =
+      std::move(code_cache_host_for_background);
   pending_resource_cache_ = std::move(resource_cache);
   pending_cookie_manager_info_ = std::move(cookie_manager_info);
   pending_storage_info_ = std::move(storage_info);
@@ -3819,7 +3803,9 @@
 
   // Set the code cache host earlier to allow fetching the code cache as soon as
   // possible.
-  document_loader->SetCodeCacheHost(std::move(pending_code_cache_host_));
+  document_loader->SetCodeCacheHost(
+      std::move(pending_code_cache_host_),
+      std::move(pending_code_cache_host_for_background_));
 }
 
 void RenderFrameImpl::DidCommitNavigation(
@@ -4463,10 +4449,11 @@
     const url::SchemeHostPort& final_response_url,
     int request_id,
     network::mojom::URLResponseHeadPtr response_head,
-    network::mojom::RequestDestination request_destination) {
+    network::mojom::RequestDestination request_destination,
+    bool is_ad_resource) {
   for (auto& observer : observers_) {
     observer.DidStartResponse(final_response_url, request_id, *response_head,
-                              request_destination);
+                              request_destination, is_ad_resource);
   }
 }
 
@@ -6236,10 +6223,12 @@
   return GetLoaderFactoryBundle();
 }
 
-std::unique_ptr<blink::WebURLLoaderThrottleProviderForFrame>
-RenderFrameImpl::CreateWebURLLoaderThrottleProviderForFrame() {
-  return std::make_unique<WebURLLoaderThrottleProviderForFrameImpl>(
-      frame_->GetLocalFrameToken());
+blink::URLLoaderThrottleProvider*
+RenderFrameImpl::GetURLLoaderThrottleProvider() {
+  RenderThreadImpl* render_thread = RenderThreadImpl::current();
+  // The RenderThreadImpl may not be valid in some tests.
+  return render_thread ? render_thread->url_loader_throttle_provider()
+                       : nullptr;
 }
 
 scoped_refptr<blink::WebBackgroundResourceFetchAssets>
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 05c969e..78ec171 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -425,7 +425,8 @@
       int64_t request_id,
       const url::SchemeHostPort& final_response_url,
       network::mojom::URLResponseHeadPtr head,
-      network::mojom::RequestDestination request_destination) override;
+      network::mojom::RequestDestination request_destination,
+      bool is_ad_resource) override;
   void NotifyResourceTransferSizeUpdated(int64_t request_id,
                                          int32_t transfer_size_diff) override;
   void NotifyResourceLoadCompleted(
@@ -470,6 +471,8 @@
       const absl::optional<blink::ParsedPermissionsPolicy>& permissions_policy,
       blink::mojom::PolicyContainerPtr policy_container,
       mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host,
+      mojo::PendingRemote<blink::mojom::CodeCacheHost>
+          code_cache_host_for_background,
       mojo::PendingRemote<blink::mojom::ResourceCache> resource_cache,
       mojom::CookieManagerInfoPtr cookie_manager_info,
       mojom::StorageInfoPtr storage_info,
@@ -639,8 +642,7 @@
       const blink::WebString& sink_id,
       blink::WebSetSinkIdCompleteCallback callback) override;
   scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
-  std::unique_ptr<blink::WebURLLoaderThrottleProviderForFrame>
-  CreateWebURLLoaderThrottleProviderForFrame() override;
+  blink::URLLoaderThrottleProvider* GetURLLoaderThrottleProvider() override;
   scoped_refptr<blink::WebBackgroundResourceFetchAssets>
   MaybeGetBackgroundResourceFetchAssets() override;
   void OnStopLoading() override;
@@ -772,7 +774,8 @@
   void DidStartResponse(const url::SchemeHostPort& final_response_url,
                         int request_id,
                         network::mojom::URLResponseHeadPtr response_head,
-                        network::mojom::RequestDestination request_destination);
+                        network::mojom::RequestDestination request_destination,
+                        bool is_ad_resource);
   void DidCompleteResponse(int request_id,
                            const network::URLLoaderCompletionStatus& status);
   void DidCancelResponse(int request_id);
@@ -1021,6 +1024,8 @@
       mojo::PendingAssociatedRemote<blink::mojom::FetchLaterLoaderFactory>
           fetch_later_loader_factory,
       mojo::PendingRemote<blink::mojom::CodeCacheHost> code_cache_host,
+      mojo::PendingRemote<blink::mojom::CodeCacheHost>
+          code_cache_host_for_background,
       mojo::PendingRemote<blink::mojom::ResourceCache> resource_cache,
       mojom::CookieManagerInfoPtr cookie_manager_info,
       mojom::StorageInfoPtr storage_info,
@@ -1468,6 +1473,8 @@
       background_resource_fetch_task_runner_;
 
   mojo::PendingRemote<blink::mojom::CodeCacheHost> pending_code_cache_host_;
+  mojo::PendingRemote<blink::mojom::CodeCacheHost>
+      pending_code_cache_host_for_background_;
   mojo::PendingRemote<blink::mojom::ResourceCache> pending_resource_cache_;
   mojom::CookieManagerInfoPtr pending_cookie_manager_info_;
   mojom::StorageInfoPtr pending_storage_info_;
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index 7dd5006d1..c4f4ab1 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -275,6 +275,7 @@
           blink::mojom::PolicyContainerPolicies::New(),
           mock_policy_container_host.BindNewEndpointAndPassDedicatedRemote()),
       /*code_cache_host=*/mojo::NullRemote(),
+      /*code_cache_host_for_background=*/mojo::NullRemote(),
       /*resource_cache=*/mojo::NullRemote(), /*cookie_manager_info=*/nullptr,
       /*storage_info=*/nullptr,
       base::BindOnce(&MockFrameHost::DidCommitProvisionalLoad,
diff --git a/docs/website b/docs/website
index c0140ef..b62ff6e 160000
--- a/docs/website
+++ b/docs/website
@@ -1 +1 @@
-Subproject commit c0140ef954e627a2b8b563a465c1518d7fb8e283
+Subproject commit b62ff6eb4a7f802e6bf27bb9e89248c94f095579
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 9b8500c..52490444 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1920,6 +1920,7 @@
   DOCUMENTSCAN_CANCELSCAN = 1858,
   DOCUMENTSCAN_READSCANDATA = 1859,
   DOCUMENTSCAN_SETOPTIONS = 1860,
+  DOCUMENTSCAN_GETOPTIONGROUPS = 1861,
   // Last entry: Add new entries above, then run:
   // tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/updater/extension_downloader.cc b/extensions/browser/updater/extension_downloader.cc
index b5e05fb..f7a43f41 100644
--- a/extensions/browser/updater/extension_downloader.cc
+++ b/extensions/browser/updater/extension_downloader.cc
@@ -32,6 +32,7 @@
 #include "extensions/browser/extension_file_task_runner.h"
 #include "extensions/browser/extensions_browser_client.h"
 #include "extensions/browser/updater/extension_cache.h"
+#include "extensions/browser/updater/extension_downloader_delegate.h"
 #include "extensions/browser/updater/extension_downloader_test_delegate.h"
 #include "extensions/browser/updater/request_queue_impl.h"
 #include "extensions/common/extension_updater_uma.h"
@@ -906,8 +907,14 @@
       if (update_version.CompareTo(existing_version) <= 0) {
         VLOG(2) << extension_id << " version is not older than '"
                 << update_version_str << "'";
-        has_noupdate = true;
-        continue;
+        bool can_rollback =
+            update_version.CompareTo(existing_version) < 0 &&
+            (delegate_->RequestRollback(extension_id) ==
+             ExtensionDownloaderDelegate::RequestRollbackResult::kAllowed);
+        if (!can_rollback) {
+          has_noupdate = true;
+          continue;
+        }
       }
     }
 
diff --git a/extensions/browser/updater/extension_downloader_delegate.cc b/extensions/browser/updater/extension_downloader_delegate.cc
index 741f980..52dc979 100644
--- a/extensions/browser/updater/extension_downloader_delegate.cc
+++ b/extensions/browser/updater/extension_downloader_delegate.cc
@@ -95,4 +95,9 @@
   return false;
 }
 
+ExtensionDownloaderDelegate::RequestRollbackResult
+ExtensionDownloaderDelegate::RequestRollback(const ExtensionId& id) {
+  return RequestRollbackResult::kDisallowed;
+}
+
 }  // namespace extensions
diff --git a/extensions/browser/updater/extension_downloader_delegate.h b/extensions/browser/updater/extension_downloader_delegate.h
index 5142b20..f73e020 100644
--- a/extensions/browser/updater/extension_downloader_delegate.h
+++ b/extensions/browser/updater/extension_downloader_delegate.h
@@ -143,6 +143,17 @@
     kMaxValue = CACHE_HIT_ON_MANIFEST_FETCH_FAILURE,
   };
 
+  // Enum that holds possible result values of RequestRollback().
+  enum class RequestRollbackResult {
+    // Rollback is not allowed.
+    kDisallowed,
+    // Can not rollback immediately, but cache invalidation is scheduled for the
+    // next run and rollback will be possible after cache invalidation.
+    kScheduledForNextRun,
+    // Cache was successfully invalidated and rollback is allowed now.
+    kAllowed,
+  };
+
   // Passed as an argument to the completion callbacks to signal whether
   // the extension update sent a ping.
   struct PingResult {
@@ -287,6 +298,12 @@
   // that extension is not installed.
   virtual bool GetExtensionExistingVersion(const ExtensionId& id,
                                            std::string* version) = 0;
+
+  // Invoked if update manifest specifies a lower version than existing.
+  // Returns RequestRollbackResult value that indicates whether higher version
+  // cache was successfully invalidated and rollback is allowed. Default
+  // implementation always disallows rollback.
+  virtual RequestRollbackResult RequestRollback(const ExtensionId& id);
 };
 
 }  // namespace extensions
diff --git a/gin/v8_platform_thread_isolated_allocator.cc b/gin/v8_platform_thread_isolated_allocator.cc
index e7318943..0de075ca 100644
--- a/gin/v8_platform_thread_isolated_allocator.cc
+++ b/gin/v8_platform_thread_isolated_allocator.cc
@@ -27,7 +27,6 @@
 void ThreadIsolatedAllocator::Initialize(int pkey) {
   pkey_ = pkey;
   partition_alloc::PartitionOptions opts;
-  opts.aligned_alloc = partition_alloc::PartitionOptions::kAllowed;
   opts.thread_isolation = partition_alloc::ThreadIsolationOption(pkey_);
   allocator_.init(opts);
 }
diff --git a/gpu/command_buffer/common/shared_image_usage.h b/gpu/command_buffer/common/shared_image_usage.h
index b835786..8e2a13ce 100644
--- a/gpu/command_buffer/common/shared_image_usage.h
+++ b/gpu/command_buffer/common/shared_image_usage.h
@@ -83,13 +83,6 @@
   LAST_SHARED_IMAGE_USAGE = SHARED_IMAGE_USAGE_CPU_UPLOAD
 };
 
-// Constant left in place while we transition the codebase to use GLES2_READ and
-// GLES2_WRITE.
-// TODO(crbug.com/1510440): Transition all usage of this constant and eliminate
-// the constant.
-inline constexpr uint32_t SHARED_IMAGE_USAGE_GLES2 =
-    SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE;
-
 // Returns true if usage is a valid client usage.
 GPU_EXPORT bool IsValidClientUsage(uint32_t usage);
 
diff --git a/gpu/command_buffer/service/gles2_external_framebuffer_unittest.cc b/gpu/command_buffer/service/gles2_external_framebuffer_unittest.cc
index 83f2888..ac7d364 100644
--- a/gpu/command_buffer/service/gles2_external_framebuffer_unittest.cc
+++ b/gpu/command_buffer/service/gles2_external_framebuffer_unittest.cc
@@ -132,7 +132,8 @@
     backing_factory_->CreateSharedImage(
         mailbox, format, gfx::Size(64, 64), gfx::ColorSpace::CreateSRGB(),
         kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SurfaceHandle(),
-        SHARED_IMAGE_USAGE_GLES2, "TestLabel");
+        SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+        "TestLabel");
     return mailbox;
   }
 
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc
index 809d223f..85e2430 100644
--- a/gpu/command_buffer/service/shared_context_state.cc
+++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -293,6 +293,7 @@
 bool SharedContextState::IsGraphiteDawnVulkan() const {
 #if BUILDFLAG(SKIA_USE_DAWN)
   return gr_context_type_ == GrContextType::kGraphiteDawn &&
+         dawn_context_provider_ &&
          dawn_context_provider_->backend_type() == wgpu::BackendType::Vulkan;
 #else
   return false;
@@ -302,6 +303,7 @@
 bool SharedContextState::IsGraphiteDawnVulkanSwiftShader() const {
 #if BUILDFLAG(SKIA_USE_DAWN)
   return gr_context_type_ == GrContextType::kGraphiteDawn &&
+         dawn_context_provider_ &&
          dawn_context_provider_->is_vulkan_swiftshader_adapter();
 #else
   return false;
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 fd16882b..06e9c471 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
@@ -144,10 +144,11 @@
 // TODO(vikassoni): In future we will need to expose the set of formats and
 // constraints (e.g. max size) to the clients somehow that are available for
 // certain combinations of SharedImageUsage flags (e.g. when Vulkan is on,
-// SHARED_IMAGE_USAGE_GLES2 + SHARED_IMAGE_USAGE_DISPLAY_READ implies AHB, so
-// those restrictions apply, but that's decided on the service side). For now
-// getting supported format is a static mechanism like this. We probably need
-// something like gpu::Capabilities.texture_target_exception_list.
+// (SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE) +
+// SHARED_IMAGE_USAGE_DISPLAY_READ implies AHB, so those restrictions apply, but
+// that's decided on the service side). For now getting supported format is a
+// static mechanism like this. We probably need something like
+// gpu::Capabilities.texture_target_exception_list.
 bool AHardwareBufferSupportedFormat(viz::SharedImageFormat format) {
   return base::Contains(kSupportedFormats, format);
 }
diff --git a/gpu/command_buffer/service/shared_image/android_video_image_backing.cc b/gpu/command_buffer/service/shared_image/android_video_image_backing.cc
index a0ca401..b60a95d 100644
--- a/gpu/command_buffer/service/shared_image/android_video_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/android_video_image_backing.cc
@@ -36,7 +36,8 @@
           color_space,
           surface_origin,
           alpha_type,
-          (SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_GLES2),
+          (SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_GLES2_READ |
+           SHARED_IMAGE_USAGE_GLES2_WRITE),
           viz::SinglePlaneFormat::kRGBA_8888.EstimatedSizeInBytes(size),
           is_thread_safe,
           base::ScopedFD()) {}
diff --git a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory_unittest.cc
index 79032df3..1f3d47c 100644
--- a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory_unittest.cc
+++ b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory_unittest.cc
@@ -34,9 +34,9 @@
 constexpr GrSurfaceOrigin kSurfaceOrigin = kTopLeft_GrSurfaceOrigin;
 constexpr SkAlphaType kAlphaType = kPremul_SkAlphaType;
 constexpr auto kColorSpace = gfx::ColorSpace::CreateSRGB();
-constexpr uint32_t kUsage = SHARED_IMAGE_USAGE_DISPLAY_READ |
-                            SHARED_IMAGE_USAGE_RASTER |
-                            SHARED_IMAGE_USAGE_GLES2;
+constexpr uint32_t kUsage =
+    SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_RASTER |
+    SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE;
 
 base::NoDestructor<base::test::ScopedFeatureList> g_scoped_feature_list;
 
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory_unittest.cc
index 6b6a20b2..bb731035 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory_unittest.cc
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory_unittest.cc
@@ -368,7 +368,9 @@
   auto color_space = gfx::ColorSpace::CreateSRGB();
   GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin;
   SkAlphaType alpha_type = kPremul_SkAlphaType;
-  uint32_t usage = SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_GLES2;
+  uint32_t usage = SHARED_IMAGE_USAGE_DISPLAY_READ |
+                   SHARED_IMAGE_USAGE_GLES2_READ |
+                   SHARED_IMAGE_USAGE_GLES2_WRITE;
 
   bool supported = backing_factory_->CanCreateSharedImage(
       usage, format, size, /*thread_safe=*/false, gfx::EMPTY_BUFFER,
diff --git a/gpu/command_buffer/service/shared_image/ozone_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/ozone_image_backing_factory_unittest.cc
index acda704..638a690 100644
--- a/gpu/command_buffer/service/shared_image/ozone_image_backing_factory_unittest.cc
+++ b/gpu/command_buffer/service/shared_image/ozone_image_backing_factory_unittest.cc
@@ -95,7 +95,9 @@
   auto backing = backing_factory_->CreateSharedImage(
       mailbox, viz::SinglePlaneFormat::kRGBA_8888, gpu::kNullSurfaceHandle,
       {100, 100}, gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
-      kPremul_SkAlphaType, SHARED_IMAGE_USAGE_GLES2, "TestLabel", false);
+      kPremul_SkAlphaType,
+      SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+      "TestLabel", false);
   EXPECT_TRUE(backing);
 
   auto* backing_ptr = static_cast<OzoneImageBacking*>(backing.get());
@@ -176,7 +178,9 @@
   auto backing = backing_factory_->CreateSharedImage(
       mailbox, viz::SinglePlaneFormat::kRGBA_8888, gpu::kNullSurfaceHandle,
       {100, 100}, gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
-      kPremul_SkAlphaType, SHARED_IMAGE_USAGE_GLES2, "TestLabel", false);
+      kPremul_SkAlphaType,
+      SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+      "TestLabel", false);
   EXPECT_TRUE(backing);
 
   auto* backing_ptr = static_cast<OzoneImageBacking*>(backing.get());
@@ -233,7 +237,9 @@
   auto backing = backing_factory_->CreateSharedImage(
       mailbox, viz::SinglePlaneFormat::kRGBA_8888, gpu::kNullSurfaceHandle,
       {100, 100}, gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
-      kPremul_SkAlphaType, SHARED_IMAGE_USAGE_GLES2, "TestLabel", false);
+      kPremul_SkAlphaType,
+      SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+      "TestLabel", false);
   EXPECT_TRUE(backing);
 
   auto* backing_ptr = static_cast<OzoneImageBacking*>(backing.get());
@@ -295,7 +301,9 @@
   auto backing = backing_factory_->CreateSharedImage(
       mailbox, viz::SinglePlaneFormat::kRGBA_8888, gpu::kNullSurfaceHandle,
       {100, 100}, gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
-      kPremul_SkAlphaType, SHARED_IMAGE_USAGE_GLES2, "TestLabel", false);
+      kPremul_SkAlphaType,
+      SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+      "TestLabel", false);
   EXPECT_TRUE(backing);
 
   auto* backing_ptr = static_cast<OzoneImageBacking*>(backing.get());
@@ -379,7 +387,9 @@
   auto backing = backing_factory_->CreateSharedImage(
       mailbox, viz::SinglePlaneFormat::kRGBA_8888, gpu::kNullSurfaceHandle,
       {100, 100}, gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
-      kPremul_SkAlphaType, SHARED_IMAGE_USAGE_GLES2, "TestLabel", false);
+      kPremul_SkAlphaType,
+      SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+      "TestLabel", false);
   EXPECT_TRUE(backing);
 
   auto* backing_ptr = static_cast<OzoneImageBacking*>(backing.get());
@@ -422,7 +432,9 @@
   auto backing = backing_factory_->CreateSharedImage(
       mailbox, viz::SinglePlaneFormat::kRGBA_8888, gpu::kNullSurfaceHandle,
       {100, 100}, gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
-      kPremul_SkAlphaType, SHARED_IMAGE_USAGE_GLES2, "TestLabel", false);
+      kPremul_SkAlphaType,
+      SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+      "TestLabel", false);
   EXPECT_TRUE(backing);
 
   auto shared_image =
@@ -471,7 +483,9 @@
   auto backing = backing_factory_->CreateSharedImage(
       mailbox, viz::SinglePlaneFormat::kRGBA_8888, gpu::kNullSurfaceHandle,
       {100, 100}, gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
-      kPremul_SkAlphaType, SHARED_IMAGE_USAGE_GLES2, "TestLabel", false);
+      kPremul_SkAlphaType,
+      SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+      "TestLabel", false);
   EXPECT_TRUE(backing);
 
   auto* backing_ptr = static_cast<OzoneImageBacking*>(backing.get());
@@ -573,7 +587,9 @@
   auto backing = backing_factory_->CreateSharedImage(
       mailbox, viz::SinglePlaneFormat::kRGBA_8888, gpu::kNullSurfaceHandle,
       {100, 100}, gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
-      kPremul_SkAlphaType, SHARED_IMAGE_USAGE_GLES2, "TestLabel", false);
+      kPremul_SkAlphaType,
+      SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+      "TestLabel", false);
   EXPECT_TRUE(backing);
 
   auto* backing_ptr = static_cast<OzoneImageBacking*>(backing.get());
diff --git a/gpu/command_buffer/tests/shared_image_gl_backing_produce_dawn_unittest.cc b/gpu/command_buffer/tests/shared_image_gl_backing_produce_dawn_unittest.cc
index 57b9c89..171d496 100644
--- a/gpu/command_buffer/tests/shared_image_gl_backing_produce_dawn_unittest.cc
+++ b/gpu/command_buffer/tests/shared_image_gl_backing_produce_dawn_unittest.cc
@@ -97,11 +97,12 @@
   // Create the shared image
   SharedImageInterface* sii = gl_context_->GetSharedImageInterface();
   Mailbox gl_mailbox =
-      sii->CreateSharedImage(viz::SinglePlaneFormat::kRGBA_8888, {1, 1},
-                             gfx::ColorSpace::CreateSRGB(),
-                             kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
-                             SHARED_IMAGE_USAGE_GLES2, "TestLabel",
-                             kNullSurfaceHandle)
+      sii->CreateSharedImage(
+             viz::SinglePlaneFormat::kRGBA_8888, {1, 1},
+             gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
+             kPremul_SkAlphaType,
+             SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE,
+             "TestLabel", kNullSurfaceHandle)
           ->mailbox();
   SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
   gl()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap.cc b/gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap.cc
index b339140..8b041ce 100644
--- a/gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap.cc
+++ b/gpu/ipc/service/gpu_memory_buffer_factory_native_pixmap.cc
@@ -13,7 +13,6 @@
 #include "ui/gfx/linux/native_pixmap_dmabuf.h"
 #include "ui/gfx/native_pixmap.h"
 #include "ui/gl/gl_implementation.h"
-#include "ui/ozone/buildflags.h"
 #include "ui/ozone/public/ozone_platform.h"
 #include "ui/ozone/public/surface_factory_ozone.h"
 
diff --git a/infra/config/generated/builders/build/android-build-perf-developer/gn-args.json b/infra/config/generated/builders/build/android-build-perf-developer/gn-args.json
index c48c7c6d..0b29a11 100644
--- a/infra/config/generated/builders/build/android-build-perf-developer/gn-args.json
+++ b/infra/config/generated/builders/build/android-build-perf-developer/gn-args.json
@@ -1,6 +1,18 @@
 {
   "phases": {
-    "builtin": {
+    "ninja": {
+      "gn_args": {
+        "enable_nacl": false,
+        "is_component_build": true,
+        "is_debug": true,
+        "symbol_level": 2,
+        "target_cpu": "arm64",
+        "target_os": "android",
+        "use_remoteexec": true,
+        "use_siso": false
+      }
+    },
+    "siso_native": {
       "gn_args": {
         "enable_nacl": false,
         "is_component_build": true,
@@ -11,7 +23,7 @@
         "use_siso": true
       }
     },
-    "reproxy": {
+    "siso_reproxy": {
       "gn_args": {
         "enable_nacl": false,
         "is_component_build": true,
@@ -19,7 +31,8 @@
         "symbol_level": 2,
         "target_cpu": "arm64",
         "target_os": "android",
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/build/build-perf-android-siso/gn-args.json b/infra/config/generated/builders/build/build-perf-android-siso/gn-args.json
index f68ed52d..f6f7ab4c 100644
--- a/infra/config/generated/builders/build/build-perf-android-siso/gn-args.json
+++ b/infra/config/generated/builders/build/build-perf-android-siso/gn-args.json
@@ -44,7 +44,8 @@
         "target_cpu": "arm64",
         "target_os": "android",
         "use_clang_coverage": true,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/build/build-perf-android/gn-args.json b/infra/config/generated/builders/build/build-perf-android/gn-args.json
index 2fd8939..6b178fa 100644
--- a/infra/config/generated/builders/build/build-perf-android/gn-args.json
+++ b/infra/config/generated/builders/build/build-perf-android/gn-args.json
@@ -18,6 +18,7 @@
     "target_cpu": "arm64",
     "target_os": "android",
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/build/build-perf-linux-siso/gn-args.json b/infra/config/generated/builders/build/build-perf-linux-siso/gn-args.json
index 8f715a8..2cff6e0 100644
--- a/infra/config/generated/builders/build/build-perf-linux-siso/gn-args.json
+++ b/infra/config/generated/builders/build/build-perf-linux-siso/gn-args.json
@@ -32,7 +32,8 @@
         "proprietary_codecs": true,
         "symbol_level": 0,
         "use_clang_coverage": true,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/build/build-perf-linux/gn-args.json b/infra/config/generated/builders/build/build-perf-linux/gn-args.json
index 330dc31a..8eca072 100644
--- a/infra/config/generated/builders/build/build-perf-linux/gn-args.json
+++ b/infra/config/generated/builders/build/build-perf-linux/gn-args.json
@@ -12,6 +12,7 @@
     "proprietary_codecs": true,
     "symbol_level": 0,
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/build/build-perf-windows-siso/gn-args.json b/infra/config/generated/builders/build/build-perf-windows-siso/gn-args.json
index 0e6fdfd..cbccf40c 100644
--- a/infra/config/generated/builders/build/build-perf-windows-siso/gn-args.json
+++ b/infra/config/generated/builders/build/build-perf-windows-siso/gn-args.json
@@ -13,7 +13,6 @@
         "proprietary_codecs": true,
         "symbol_level": 0,
         "use_clang_coverage": true,
-        "use_goma": false,
         "use_remoteexec": false,
         "use_siso": true
       }
@@ -31,7 +30,8 @@
         "proprietary_codecs": true,
         "symbol_level": 0,
         "use_clang_coverage": true,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/build/build-perf-windows/gn-args.json b/infra/config/generated/builders/build/build-perf-windows/gn-args.json
index bdeb53e7..7153fc0 100644
--- a/infra/config/generated/builders/build/build-perf-windows/gn-args.json
+++ b/infra/config/generated/builders/build/build-perf-windows/gn-args.json
@@ -11,6 +11,7 @@
     "proprietary_codecs": true,
     "symbol_level": 0,
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/build/linux-build-perf-developer/gn-args.json b/infra/config/generated/builders/build/linux-build-perf-developer/gn-args.json
index befd649..6e11295c 100644
--- a/infra/config/generated/builders/build/linux-build-perf-developer/gn-args.json
+++ b/infra/config/generated/builders/build/linux-build-perf-developer/gn-args.json
@@ -1,6 +1,16 @@
 {
   "phases": {
-    "builtin": {
+    "ninja": {
+      "gn_args": {
+        "enable_nacl": false,
+        "is_component_build": true,
+        "is_debug": true,
+        "symbol_level": 2,
+        "use_remoteexec": true,
+        "use_siso": false
+      }
+    },
+    "siso_native": {
       "gn_args": {
         "enable_nacl": false,
         "is_component_build": true,
@@ -9,13 +19,14 @@
         "use_siso": true
       }
     },
-    "reproxy": {
+    "siso_reproxy": {
       "gn_args": {
         "enable_nacl": false,
         "is_component_build": true,
         "is_debug": true,
         "symbol_level": 2,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/build/linux-chromeos-build-perf-siso/gn-args.json b/infra/config/generated/builders/build/linux-chromeos-build-perf-siso/gn-args.json
index 9de90d9..065e60e 100644
--- a/infra/config/generated/builders/build/linux-chromeos-build-perf-siso/gn-args.json
+++ b/infra/config/generated/builders/build/linux-chromeos-build-perf-siso/gn-args.json
@@ -16,7 +16,6 @@
         "target_os": "chromeos",
         "use_clang_coverage": true,
         "use_cups": true,
-        "use_goma": false,
         "use_remoteexec": false,
         "use_siso": true
       }
@@ -37,7 +36,8 @@
         "target_os": "chromeos",
         "use_clang_coverage": true,
         "use_cups": true,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/build/linux-chromeos-build-perf/gn-args.json b/infra/config/generated/builders/build/linux-chromeos-build-perf/gn-args.json
index 556e41e..48fea86 100644
--- a/infra/config/generated/builders/build/linux-chromeos-build-perf/gn-args.json
+++ b/infra/config/generated/builders/build/linux-chromeos-build-perf/gn-args.json
@@ -14,6 +14,7 @@
     "target_os": "chromeos",
     "use_clang_coverage": true,
     "use_cups": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/build/mac-build-perf-developer/gn-args.json b/infra/config/generated/builders/build/mac-build-perf-developer/gn-args.json
index befd649..6e11295c 100644
--- a/infra/config/generated/builders/build/mac-build-perf-developer/gn-args.json
+++ b/infra/config/generated/builders/build/mac-build-perf-developer/gn-args.json
@@ -1,6 +1,16 @@
 {
   "phases": {
-    "builtin": {
+    "ninja": {
+      "gn_args": {
+        "enable_nacl": false,
+        "is_component_build": true,
+        "is_debug": true,
+        "symbol_level": 2,
+        "use_remoteexec": true,
+        "use_siso": false
+      }
+    },
+    "siso_native": {
       "gn_args": {
         "enable_nacl": false,
         "is_component_build": true,
@@ -9,13 +19,14 @@
         "use_siso": true
       }
     },
-    "reproxy": {
+    "siso_reproxy": {
       "gn_args": {
         "enable_nacl": false,
         "is_component_build": true,
         "is_debug": true,
         "symbol_level": 2,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/build/mac-build-perf-siso/gn-args.json b/infra/config/generated/builders/build/mac-build-perf-siso/gn-args.json
index 04d1e343..19e29e7 100644
--- a/infra/config/generated/builders/build/mac-build-perf-siso/gn-args.json
+++ b/infra/config/generated/builders/build/mac-build-perf-siso/gn-args.json
@@ -32,7 +32,8 @@
         "symbol_level": 0,
         "target_cpu": "x64",
         "use_clang_coverage": true,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/build/mac-build-perf/gn-args.json b/infra/config/generated/builders/build/mac-build-perf/gn-args.json
index 7c2ae74..266a3e2 100644
--- a/infra/config/generated/builders/build/mac-build-perf/gn-args.json
+++ b/infra/config/generated/builders/build/mac-build-perf/gn-args.json
@@ -12,6 +12,7 @@
     "symbol_level": 0,
     "target_cpu": "x64",
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/build/win-build-perf-developer/gn-args.json b/infra/config/generated/builders/build/win-build-perf-developer/gn-args.json
index befd649..6e11295c 100644
--- a/infra/config/generated/builders/build/win-build-perf-developer/gn-args.json
+++ b/infra/config/generated/builders/build/win-build-perf-developer/gn-args.json
@@ -1,6 +1,16 @@
 {
   "phases": {
-    "builtin": {
+    "ninja": {
+      "gn_args": {
+        "enable_nacl": false,
+        "is_component_build": true,
+        "is_debug": true,
+        "symbol_level": 2,
+        "use_remoteexec": true,
+        "use_siso": false
+      }
+    },
+    "siso_native": {
       "gn_args": {
         "enable_nacl": false,
         "is_component_build": true,
@@ -9,13 +19,14 @@
         "use_siso": true
       }
     },
-    "reproxy": {
+    "siso_reproxy": {
       "gn_args": {
         "enable_nacl": false,
         "is_component_build": true,
         "is_debug": true,
         "symbol_level": 2,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git "a/infra/config/generated/builders/reclient/Comparison Linux \050reclient\051\050CQ\051/gn-args.json" "b/infra/config/generated/builders/reclient/Comparison Linux \050reclient\051\050CQ\051/gn-args.json"
index 073526a..49c3b87 100644
--- "a/infra/config/generated/builders/reclient/Comparison Linux \050reclient\051\050CQ\051/gn-args.json"
+++ "b/infra/config/generated/builders/reclient/Comparison Linux \050reclient\051\050CQ\051/gn-args.json"
@@ -7,7 +7,8 @@
         "is_component_build": false,
         "is_debug": false,
         "proprietary_codecs": true,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     },
     "build2": {
@@ -17,7 +18,8 @@
         "is_component_build": false,
         "is_debug": false,
         "proprietary_codecs": true,
-        "use_remoteexec": true
+        "use_remoteexec": true,
+        "use_siso": true
       }
     }
   }
diff --git a/infra/config/generated/builders/try/android-12-x64-rel/gn-args.json b/infra/config/generated/builders/try/android-12-x64-rel/gn-args.json
index bc101dd..522bc0c8 100644
--- a/infra/config/generated/builders/try/android-12-x64-rel/gn-args.json
+++ b/infra/config/generated/builders/try/android-12-x64-rel/gn-args.json
@@ -17,6 +17,7 @@
     "target_os": "android",
     "use_clang_coverage": true,
     "use_jacoco_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-12-x64-rel/properties.json b/infra/config/generated/builders/try/android-12-x64-rel/properties.json
index 70d133c3..5bbe50f5 100644
--- a/infra/config/generated/builders/try/android-12-x64-rel/properties.json
+++ b/infra/config/generated/builders/try/android-12-x64-rel/properties.json
@@ -63,6 +63,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/android-arm64-rel/gn-args.json b/infra/config/generated/builders/try/android-arm64-rel/gn-args.json
index 2fd8939..6b178fa 100644
--- a/infra/config/generated/builders/try/android-arm64-rel/gn-args.json
+++ b/infra/config/generated/builders/try/android-arm64-rel/gn-args.json
@@ -18,6 +18,7 @@
     "target_cpu": "arm64",
     "target_os": "android",
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-arm64-rel/properties.json b/infra/config/generated/builders/try/android-arm64-rel/properties.json
index 472a92a..ba42f33 100644
--- a/infra/config/generated/builders/try/android-arm64-rel/properties.json
+++ b/infra/config/generated/builders/try/android-arm64-rel/properties.json
@@ -99,6 +99,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/android-binary-size/gn-args.json b/infra/config/generated/builders/try/android-binary-size/gn-args.json
index 7ef231c9..5275996 100644
--- a/infra/config/generated/builders/try/android-binary-size/gn-args.json
+++ b/infra/config/generated/builders/try/android-binary-size/gn-args.json
@@ -9,6 +9,7 @@
     "symbol_level": 1,
     "target_cpu": "arm64",
     "target_os": "android",
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-x64-cast/gn-args.json b/infra/config/generated/builders/try/android-x64-cast/gn-args.json
index 46a3d40..82e9214f 100644
--- a/infra/config/generated/builders/try/android-x64-cast/gn-args.json
+++ b/infra/config/generated/builders/try/android-x64-cast/gn-args.json
@@ -10,6 +10,7 @@
     "proprietary_codecs": true,
     "symbol_level": 0,
     "target_os": "android",
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-x86-rel/gn-args.json b/infra/config/generated/builders/try/android-x86-rel/gn-args.json
index 1f8165e..f8eadb9cb6 100644
--- a/infra/config/generated/builders/try/android-x86-rel/gn-args.json
+++ b/infra/config/generated/builders/try/android-x86-rel/gn-args.json
@@ -16,6 +16,7 @@
     "target_os": "android",
     "use_clang_coverage": true,
     "use_jacoco_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-x86-rel/properties.json b/infra/config/generated/builders/try/android-x86-rel/properties.json
index 0f83a43b..12b0462 100644
--- a/infra/config/generated/builders/try/android-x86-rel/properties.json
+++ b/infra/config/generated/builders/try/android-x86-rel/properties.json
@@ -61,6 +61,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/android_compile_dbg/gn-args.json b/infra/config/generated/builders/try/android_compile_dbg/gn-args.json
index e9747799..ab242f2 100644
--- a/infra/config/generated/builders/try/android_compile_dbg/gn-args.json
+++ b/infra/config/generated/builders/try/android_compile_dbg/gn-args.json
@@ -8,6 +8,7 @@
     "symbol_level": 0,
     "target_cpu": "arm64",
     "target_os": "android",
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android_cronet/gn-args.json b/infra/config/generated/builders/try/android_cronet/gn-args.json
index 692d224b..18fb50a8 100644
--- a/infra/config/generated/builders/try/android_cronet/gn-args.json
+++ b/infra/config/generated/builders/try/android_cronet/gn-args.json
@@ -25,6 +25,7 @@
     "use_partition_alloc": false,
     "use_platform_icu_alternatives": true,
     "use_remoteexec": true,
+    "use_siso": true,
     "use_thin_lto": false
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/chromeos-amd64-generic-siso-rel/gn-args.json b/infra/config/generated/builders/try/chromeos-amd64-generic-siso-rel/gn-args.json
index b7f6c5a..1189a6d 100644
--- a/infra/config/generated/builders/try/chromeos-amd64-generic-siso-rel/gn-args.json
+++ b/infra/config/generated/builders/try/chromeos-amd64-generic-siso-rel/gn-args.json
@@ -6,6 +6,7 @@
     "is_chromeos_device": true,
     "ozone_platform_headless": true,
     "use_real_dbus_clients": false,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/chromeos-amd64-generic-siso-rel/properties.json b/infra/config/generated/builders/try/chromeos-amd64-generic-siso-rel/properties.json
index 42c1504..86bc420 100644
--- a/infra/config/generated/builders/try/chromeos-amd64-generic-siso-rel/properties.json
+++ b/infra/config/generated/builders/try/chromeos-amd64-generic-siso-rel/properties.json
@@ -61,6 +61,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/fuchsia-binary-size-siso/gn-args.json b/infra/config/generated/builders/try/fuchsia-binary-size-siso/gn-args.json
index 88a56a7a..77baad37 100644
--- a/infra/config/generated/builders/try/fuchsia-binary-size-siso/gn-args.json
+++ b/infra/config/generated/builders/try/fuchsia-binary-size-siso/gn-args.json
@@ -6,6 +6,7 @@
     "is_official_build": true,
     "target_cpu": "arm64",
     "target_os": "fuchsia",
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/fuchsia-x64-cast-receiver-rel/gn-args.json b/infra/config/generated/builders/try/fuchsia-x64-cast-receiver-rel/gn-args.json
index 6e694381..08fff80 100644
--- a/infra/config/generated/builders/try/fuchsia-x64-cast-receiver-rel/gn-args.json
+++ b/infra/config/generated/builders/try/fuchsia-x64-cast-receiver-rel/gn-args.json
@@ -9,6 +9,7 @@
     "symbol_level": 0,
     "target_os": "fuchsia",
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/fuchsia-x64-cast-receiver-rel/properties.json b/infra/config/generated/builders/try/fuchsia-x64-cast-receiver-rel/properties.json
index 211e64b..01f4cc71 100644
--- a/infra/config/generated/builders/try/fuchsia-x64-cast-receiver-rel/properties.json
+++ b/infra/config/generated/builders/try/fuchsia-x64-cast-receiver-rel/properties.json
@@ -59,6 +59,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/ios-simulator-siso/gn-args.json b/infra/config/generated/builders/try/ios-simulator-siso/gn-args.json
index 2c429d4..0180996 100644
--- a/infra/config/generated/builders/try/ios-simulator-siso/gn-args.json
+++ b/infra/config/generated/builders/try/ios-simulator-siso/gn-args.json
@@ -9,6 +9,7 @@
     "target_environment": "simulator",
     "target_os": "ios",
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-simulator-siso/properties.json b/infra/config/generated/builders/try/ios-simulator-siso/properties.json
index 02a34fd..e18d131 100644
--- a/infra/config/generated/builders/try/ios-simulator-siso/properties.json
+++ b/infra/config/generated/builders/try/ios-simulator-siso/properties.json
@@ -62,6 +62,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/linux-chromeos-compile-siso-dbg/gn-args.json b/infra/config/generated/builders/try/linux-chromeos-compile-siso-dbg/gn-args.json
index e2aa178..07378f9 100644
--- a/infra/config/generated/builders/try/linux-chromeos-compile-siso-dbg/gn-args.json
+++ b/infra/config/generated/builders/try/linux-chromeos-compile-siso-dbg/gn-args.json
@@ -7,6 +7,7 @@
     "symbol_level": 0,
     "target_os": "chromeos",
     "use_cups": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux-chromeos-rel/gn-args.json b/infra/config/generated/builders/try/linux-chromeos-rel/gn-args.json
index 556e41e..48fea86 100644
--- a/infra/config/generated/builders/try/linux-chromeos-rel/gn-args.json
+++ b/infra/config/generated/builders/try/linux-chromeos-rel/gn-args.json
@@ -14,6 +14,7 @@
     "target_os": "chromeos",
     "use_clang_coverage": true,
     "use_cups": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux-chromeos-rel/properties.json b/infra/config/generated/builders/try/linux-chromeos-rel/properties.json
index 99d7866..c336975 100644
--- a/infra/config/generated/builders/try/linux-chromeos-rel/properties.json
+++ b/infra/config/generated/builders/try/linux-chromeos-rel/properties.json
@@ -60,6 +60,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/linux-lacros-rel/gn-args.json b/infra/config/generated/builders/try/linux-lacros-rel/gn-args.json
index 0f0c7807..99ae9ce 100644
--- a/infra/config/generated/builders/try/linux-lacros-rel/gn-args.json
+++ b/infra/config/generated/builders/try/linux-lacros-rel/gn-args.json
@@ -11,6 +11,7 @@
     "target_os": "chromeos",
     "use_clang_coverage": true,
     "use_cups": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux-lacros-rel/properties.json b/infra/config/generated/builders/try/linux-lacros-rel/properties.json
index 98b16aa..8d06117 100644
--- a/infra/config/generated/builders/try/linux-lacros-rel/properties.json
+++ b/infra/config/generated/builders/try/linux-lacros-rel/properties.json
@@ -99,6 +99,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/linux-rel/gn-args.json b/infra/config/generated/builders/try/linux-rel/gn-args.json
index 330dc31a..8eca072 100644
--- a/infra/config/generated/builders/try/linux-rel/gn-args.json
+++ b/infra/config/generated/builders/try/linux-rel/gn-args.json
@@ -12,6 +12,7 @@
     "proprietary_codecs": true,
     "symbol_level": 0,
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux-rel/properties.json b/infra/config/generated/builders/try/linux-rel/properties.json
index 57001b4..5901a99 100644
--- a/infra/config/generated/builders/try/linux-rel/properties.json
+++ b/infra/config/generated/builders/try/linux-rel/properties.json
@@ -163,6 +163,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/linux-x64-castos/gn-args.json b/infra/config/generated/builders/try/linux-x64-castos/gn-args.json
index 8241bac..be81ab8 100644
--- a/infra/config/generated/builders/try/linux-x64-castos/gn-args.json
+++ b/infra/config/generated/builders/try/linux-x64-castos/gn-args.json
@@ -6,6 +6,7 @@
     "is_component_build": false,
     "is_debug": false,
     "symbol_level": 0,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux_chromium_asan_siso_rel_ng/gn-args.json b/infra/config/generated/builders/try/linux_chromium_asan_siso_rel_ng/gn-args.json
index eaf3fbf..7bade49 100644
--- a/infra/config/generated/builders/try/linux_chromium_asan_siso_rel_ng/gn-args.json
+++ b/infra/config/generated/builders/try/linux_chromium_asan_siso_rel_ng/gn-args.json
@@ -7,6 +7,7 @@
     "is_debug": false,
     "is_lsan": true,
     "symbol_level": 1,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux_chromium_asan_siso_rel_ng/properties.json b/infra/config/generated/builders/try/linux_chromium_asan_siso_rel_ng/properties.json
index 6625359..dc40a85 100644
--- a/infra/config/generated/builders/try/linux_chromium_asan_siso_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/linux_chromium_asan_siso_rel_ng/properties.json
@@ -86,6 +86,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/linux_chromium_compile_siso_dbg_ng/gn-args.json b/infra/config/generated/builders/try/linux_chromium_compile_siso_dbg_ng/gn-args.json
index 0fb1499d..f73df1f 100644
--- a/infra/config/generated/builders/try/linux_chromium_compile_siso_dbg_ng/gn-args.json
+++ b/infra/config/generated/builders/try/linux_chromium_compile_siso_dbg_ng/gn-args.json
@@ -3,6 +3,7 @@
     "is_component_build": true,
     "is_debug": true,
     "symbol_level": 1,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux_chromium_tsan_siso_rel_ng/gn-args.json b/infra/config/generated/builders/try/linux_chromium_tsan_siso_rel_ng/gn-args.json
index eff0cf2..1acd96fd 100644
--- a/infra/config/generated/builders/try/linux_chromium_tsan_siso_rel_ng/gn-args.json
+++ b/infra/config/generated/builders/try/linux_chromium_tsan_siso_rel_ng/gn-args.json
@@ -6,6 +6,7 @@
     "is_debug": false,
     "is_tsan": true,
     "symbol_level": 1,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux_chromium_tsan_siso_rel_ng/properties.json b/infra/config/generated/builders/try/linux_chromium_tsan_siso_rel_ng/properties.json
index 1c49c23c..d957e75 100644
--- a/infra/config/generated/builders/try/linux_chromium_tsan_siso_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/linux_chromium_tsan_siso_rel_ng/properties.json
@@ -84,6 +84,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/mac-siso-rel/gn-args.json b/infra/config/generated/builders/try/mac-siso-rel/gn-args.json
index 7c2ae74..266a3e2 100644
--- a/infra/config/generated/builders/try/mac-siso-rel/gn-args.json
+++ b/infra/config/generated/builders/try/mac-siso-rel/gn-args.json
@@ -12,6 +12,7 @@
     "symbol_level": 0,
     "target_cpu": "x64",
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/mac-siso-rel/properties.json b/infra/config/generated/builders/try/mac-siso-rel/properties.json
index f1a8eb9..0210a212a 100644
--- a/infra/config/generated/builders/try/mac-siso-rel/properties.json
+++ b/infra/config/generated/builders/try/mac-siso-rel/properties.json
@@ -197,6 +197,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/win-rel/gn-args.json b/infra/config/generated/builders/try/win-rel/gn-args.json
index bdeb53e7..7153fc0 100644
--- a/infra/config/generated/builders/try/win-rel/gn-args.json
+++ b/infra/config/generated/builders/try/win-rel/gn-args.json
@@ -11,6 +11,7 @@
     "proprietary_codecs": true,
     "symbol_level": 0,
     "use_clang_coverage": true,
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/win-rel/properties.json b/infra/config/generated/builders/try/win-rel/properties.json
index eb58bd4..753c0a4e 100644
--- a/infra/config/generated/builders/try/win-rel/properties.json
+++ b/infra/config/generated/builders/try/win-rel/properties.json
@@ -167,6 +167,15 @@
     "check_for_flakiness": true,
     "check_for_flakiness_with_resultdb": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/try/win_chromium_compile_siso_dbg_ng/gn-args.json b/infra/config/generated/builders/try/win_chromium_compile_siso_dbg_ng/gn-args.json
index f555781..7d15cdd 100644
--- a/infra/config/generated/builders/try/win_chromium_compile_siso_dbg_ng/gn-args.json
+++ b/infra/config/generated/builders/try/win_chromium_compile_siso_dbg_ng/gn-args.json
@@ -6,6 +6,7 @@
     "proprietary_codecs": true,
     "symbol_level": 0,
     "target_cpu": "x86",
-    "use_remoteexec": true
+    "use_remoteexec": true,
+    "use_siso": true
   }
 }
\ No newline at end of file
diff --git a/infra/config/generated/testing/variants.pyl b/infra/config/generated/testing/variants.pyl
index f8d9022..6edcd9a 100644
--- a/infra/config/generated/testing/variants.pyl
+++ b/infra/config/generated/testing/variants.pyl
@@ -337,16 +337,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'identifier': 'Lacros version skew testing ash canary',
-    'description': 'Run with ash-chrome version 122.0.6185.0',
+    'description': 'Run with ash-chrome version 122.0.6186.0',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v122.0.6185.0',
-          'revision': 'version:122.0.6185.0',
+          'location': 'lacros_version_skew_tests_v122.0.6186.0',
+          'revision': 'version:122.0.6186.0',
         },
       ],
     },
diff --git a/infra/config/gn_args/gn_args.star b/infra/config/gn_args/gn_args.star
index 3b4570f..91252d7 100644
--- a/infra/config/gn_args/gn_args.star
+++ b/infra/config/gn_args/gn_args.star
@@ -872,6 +872,13 @@
 )
 
 gn_args.config(
+    name = "no_siso",
+    args = {
+        "use_siso": False,
+    },
+)
+
+gn_args.config(
     name = "no_symbols",
     args = {
         "symbol_level": 0,
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index b4522141..d2e0d38 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -889,7 +889,8 @@
             shadow_properties["$build/reclient"] = shadow_reclient
 
     siso_project = defaults.get_value("siso_project", siso_project)
-    if defaults.get_value("siso_enabled", siso_enabled) and siso_project:
+    use_siso = defaults.get_value("siso_enabled", siso_enabled) and siso_project
+    if use_siso:
         properties["$build/siso"] = {
             "configs": defaults.get_value("siso_configs", siso_configs),
             "enable_cloud_profiler": defaults.get_value("siso_enable_cloud_profiler", siso_enable_cloud_profiler),
@@ -962,7 +963,7 @@
 
     register_recipe_experiments_ref(bucket, name, executable)
 
-    additional_exclusions = register_gn_args(builder_group, bucket, name, gn_args)
+    additional_exclusions = register_gn_args(builder_group, bucket, name, gn_args, use_siso)
 
     register_builder_config(
         bucket,
diff --git a/infra/config/lib/gn_args.star b/infra/config/lib/gn_args.star
index 10e85363..ef45e00 100644
--- a/infra/config/lib/gn_args.star
+++ b/infra/config/lib/gn_args.star
@@ -90,11 +90,16 @@
             # Memoize.
             resolved_gn_args_by_config_node[n] = gn_args
 
-        return {k: v for k, v in resolved_gn_args_by_config_node[gn_config_node].items() if v}
+        config = {k: v for k, v in resolved_gn_args_by_config_node[gn_config_node].items() if v}
+        gn_args = gn_config_node.props.builder_defaults | config.get("gn_args", {})
+        if gn_args:
+            config["gn_args"] = gn_args
+
+        return config
 
     return resolve
 
-def _create_gn_config_node(name, gn_args = {}, configs = [], args_file = "", builder_group = ""):
+def _create_gn_config_node(*, name, gn_args = {}, configs = [], args_file = "", builder_group = "", builder_defaults = {}):
     """Create a node of "gn_config" kind and place it into the graph.
 
     Args:
@@ -103,6 +108,13 @@
         configs: ([string]) A list of GN config name strings.
         args_file: (string) The string path of an imported GN file.
         builder_group: (string) The builder group of a builder node.
+        builder_defaults: (dict) A dict of GN arg key-value pairs. In
+            contrast to `gn_args`, arguments specified here are only to
+            the builder that they are specified and not included when
+            the config is referenced by another builder and will be
+            overridden by the expanded configs specified in `configs`.
+            This is used for implementing automatic GN args based on
+            non-gn-arg builder configuration values.
 
     Returns:
         The node key of the created node.
@@ -111,6 +123,7 @@
         "gn_args": gn_args,
         "args_file": args_file,
         "builder_group": builder_group,
+        "builder_defaults": builder_defaults,
     })
 
     # Create edges in the graph from the new node to its included nodes.
@@ -143,7 +156,12 @@
         the "gn_args" field within a builder definition.
     """
     if name:
-        _create_gn_config_node(name, args, configs, args_file)
+        _create_gn_config_node(
+            name = name,
+            gn_args = args,
+            configs = configs,
+            args_file = args_file,
+        )
         return None
     else:
         return struct(
@@ -156,7 +174,7 @@
     config = _config,
 )
 
-def register_gn_args(builder_group, bucket, builder, gn_args):
+def register_gn_args(builder_group, bucket, builder, gn_args, use_siso):
     """Register GN args for a builder.
 
     Internally creates a node of gn_config kind for a builder.
@@ -169,18 +187,26 @@
         gn_args: The string name of a GN config, a dict of phased GN config,
             or the return value of a gn_args.config method call without setting
             the "name" parameter.
+        use_siso: (boolean) if True, configs will automatically set the use_siso
+            GN arg to true unless it is set by the config.
 
     Returns:
         A list of generated GN args file paths relative to the per-builder
             output root dir if gn_args is set; None otherwise.
     """
 
+    defaults = {}
+    if use_siso:
+        defaults["use_siso"] = True
+
     # Function for formating GN config for GN config node creation.
     def format_gn_config(config):
         if type(config) == "string":
-            return {"configs": [config]}
+            d = {"configs": [config]}
         else:
-            return {a: getattr(config, a) for a in dir(config)}
+            d = {a: getattr(config, a) for a in dir(config)}
+        d["builder_defaults"] = defaults
+        return d
 
     builder_node_name = "{}/{}".format(bucket, builder)
     if gn_args:
@@ -192,14 +218,15 @@
             phase_prefix = "{}/{}".format(bucket, builder)
             for phase_name, config in gn_args.items():
                 phase_node_name = "{}:{}".format(phase_prefix, phase_name)
-                phase_node_key = _create_gn_config_node(phase_node_name, **format_gn_config(config))
+                formatted_config = format_gn_config(config)
+                phase_node_key = _create_gn_config_node(name = phase_node_name, **formatted_config)
                 graph.add_edge(builder_node_key, phase_node_key)
 
         else:
             # Non-phased GN config.
-            config = format_gn_config(gn_args)
-            config["builder_group"] = builder_group
-            builder_node_key = _create_gn_config_node(builder_node_name, **config)
+            formatted_config = format_gn_config(gn_args)
+            formatted_config["builder_group"] = builder_group
+            builder_node_key = _create_gn_config_node(name = builder_node_name, **formatted_config)
 
         graph.add_edge(keys.project(), builder_node_key)
         return ["{}/{}/{}".format(bucket, builder, _GN_ARGS_FILE_NAME)]
diff --git a/infra/config/subprojects/build/build.star b/infra/config/subprojects/build/build.star
index 25428d4..9583b08 100644
--- a/infra/config/subprojects/build/build.star
+++ b/infra/config/subprojects/build/build.star
@@ -145,7 +145,7 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(configs = ["try/android-arm64-rel", "no_reclient", "siso"]),
+        "builtin": gn_args.config(configs = ["try/android-arm64-rel", "no_reclient"]),
         "reproxy": "try/android-arm64-rel",
     },
     os = os.LINUX_DEFAULT,
@@ -203,7 +203,7 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(configs = ["try/linux-rel", "no_reclient", "siso"]),
+        "builtin": gn_args.config(configs = ["try/linux-rel", "no_reclient"]),
         "reproxy": "try/linux-rel",
     },
     os = os.LINUX_DEFAULT,
@@ -261,12 +261,7 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(
-            args = {
-                "use_goma": False,
-            },
-            configs = ["try/win-rel", "no_reclient", "siso"],
-        ),
+        "builtin": gn_args.config(configs = ["try/win-rel", "no_reclient"]),
         "reproxy": "try/win-rel",
     },
     os = os.WINDOWS_DEFAULT,
@@ -328,12 +323,7 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(
-            args = {
-                "use_goma": False,
-            },
-            configs = ["try/linux-chromeos-rel", "no_reclient", "siso"],
-        ),
+        "builtin": gn_args.config(configs = ["try/linux-chromeos-rel", "no_reclient"]),
         "reproxy": "try/linux-chromeos-rel",
     },
     os = os.LINUX_DEFAULT,
@@ -398,9 +388,7 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(
-            configs = ["try/mac-rel", "no_reclient", "siso"],
-        ),
+        "builtin": gn_args.config(configs = ["try/mac-rel", "no_reclient"]),
         "reproxy": "try/mac-rel",
     },
     os = os.MAC_DEFAULT,
@@ -449,8 +437,9 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(configs = ["android_developer", "siso"]),
-        "reproxy": gn_args.config(configs = ["android_developer", "reclient"]),
+        "ninja": gn_args.config(configs = ["android_developer", "reclient", "no_siso"]),
+        "siso_reproxy": gn_args.config(configs = ["android_developer", "reclient"]),
+        "siso_native": gn_args.config(configs = ["android_developer"]),
     },
     os = os.LINUX_DEFAULT,
     console_view_entry = consoles.console_view_entry(
@@ -480,8 +469,9 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(configs = ["developer", "siso"]),
-        "reproxy": gn_args.config(configs = ["developer", "reclient"]),
+        "ninja": gn_args.config(configs = ["developer", "reclient", "no_siso"]),
+        "siso_reproxy": gn_args.config(configs = ["developer", "reclient"]),
+        "siso_native": gn_args.config(configs = ["developer"]),
     },
     os = os.LINUX_DEFAULT,
     console_view_entry = consoles.console_view_entry(
@@ -511,8 +501,9 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(configs = ["developer", "siso"]),
-        "reproxy": gn_args.config(configs = ["developer", "reclient"]),
+        "ninja": gn_args.config(configs = ["developer", "reclient", "no_siso"]),
+        "siso_reproxy": gn_args.config(configs = ["developer", "reclient"]),
+        "siso_native": gn_args.config(configs = ["developer"]),
     },
     os = os.WINDOWS_DEFAULT,
     console_view_entry = consoles.console_view_entry(
@@ -542,8 +533,9 @@
         ),
     ),
     gn_args = {
-        "builtin": gn_args.config(configs = ["developer", "siso"]),
-        "reproxy": gn_args.config(configs = ["developer", "reclient"]),
+        "ninja": gn_args.config(configs = ["developer", "reclient", "no_siso"]),
+        "siso_reproxy": gn_args.config(configs = ["developer", "reclient"]),
+        "siso_native": gn_args.config(configs = ["developer"]),
     },
     os = os.MAC_DEFAULT,
     cpu = cpu.ARM64,
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index 63d47c6..00e46f0 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -98,6 +98,7 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(),
     # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools
     # are addressed
@@ -176,6 +177,7 @@
         "chromium.compilator_can_outlive_parent": 100,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(),
     # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools
     # are addressed
@@ -833,6 +835,7 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(),
     # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools
     # are addressed
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
index 6671c53..ae6d512 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -240,6 +240,7 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(
         experiment_percentage = 10,
     ),
@@ -508,11 +509,12 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
-    tryjob = try_.job(),
-    use_clang_coverage = True,
     # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools
     # are addressed
     # use_orchestrator_pool = True,
+    siso_enabled = True,
+    tryjob = try_.job(),
+    use_clang_coverage = True,
 )
 
 try_.compilator_builder(
@@ -556,11 +558,12 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
-    tryjob = try_.job(),
-    use_clang_coverage = True,
     # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools
     # are addressed
     # use_orchestrator_pool = True,
+    siso_enabled = True,
+    tryjob = try_.job(),
+    use_clang_coverage = True,
 )
 
 try_.compilator_builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
index 690dfb4..2c2f9eb 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
@@ -236,6 +236,7 @@
         "chromium.compilator_can_outlive_parent": 100,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(),
     use_clang_coverage = True,
 )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
index 3d49ab5..fd85495 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -316,11 +316,12 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
-    tryjob = try_.job(),
-    use_clang_coverage = True,
     # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools
     # are addressed
     # use_orchestrator_pool = True,
+    siso_enabled = True,
+    tryjob = try_.job(),
+    use_clang_coverage = True,
 )
 
 try_.compilator_builder(
@@ -541,6 +542,7 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(
         experiment_percentage = 10,
     ),
@@ -787,6 +789,7 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(
         experiment_percentage = 10,
     ),
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
index ea4afe07..7da31bb 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -204,6 +204,7 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(
         experiment_percentage = 10,
     ),
@@ -627,6 +628,7 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
+    siso_enabled = True,
     tryjob = try_.job(
         experiment_percentage = 10,
     ),
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
index 3968aca..0a8eb25 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -124,11 +124,12 @@
         "chromium.compilator_can_outlive_parent": 100,
     },
     main_list_view = "try",
-    tryjob = try_.job(),
-    use_clang_coverage = True,
     # TODO (crbug.com/1372179): Use orchestrator pool once overloaded test pools
     # are addressed
     #use_orchestrator_pool = True,
+    siso_enabled = True,
+    tryjob = try_.job(),
+    use_clang_coverage = True,
 )
 
 try_.compilator_builder(
diff --git a/infra/config/targets/lacros-version-skew-variants.json b/infra/config/targets/lacros-version-skew-variants.json
index e1129888..b144eef2 100644
--- a/infra/config/targets/lacros-version-skew-variants.json
+++ b/infra/config/targets/lacros-version-skew-variants.json
@@ -1,16 +1,16 @@
 {
   "LACROS_VERSION_SKEW_CANARY": {
     "args": [
-      "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+      "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
     ],
-    "description": "Run with ash-chrome version 122.0.6185.0",
+    "description": "Run with ash-chrome version 122.0.6186.0",
     "identifier": "Lacros version skew testing ash canary",
     "swarming": {
       "cipd_packages": [
         {
           "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-          "location": "lacros_version_skew_tests_v122.0.6185.0",
-          "revision": "version:122.0.6185.0"
+          "location": "lacros_version_skew_tests_v122.0.6186.0",
+          "revision": "version:122.0.6186.0"
         }
       ]
     }
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd
index 912828e..3a00b72 100644
--- a/ios/chrome/app/strings/ios_chromium_strings.grd
+++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -1,14 +1,12 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+<?xml version='1.0' encoding='UTF-8'?>
+<grit base_dir="." latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
   <!--
   This file contains definition of resources that will be translated for each
   locale.  The strings in this file are specific to iOS.
   -->
   <outputs>
     <output filename="grit/ios_branded_strings.h" type="rc_header">
-      <emit emit_type="prepend"></emit>
+      <emit emit_type="prepend" />
     </output>
     <output filename="ios_chromium_strings_af.pak" type="data_package" lang="af" />
     <output filename="ios_chromium_strings_am.pak" type="data_package" lang="am" />
@@ -193,6 +191,21 @@
       <message name="IDS_IOS_ABOUT_VERSION_COPYRIGHT" desc="Copyright information on the about pages">
         Copyright <ph name="YEAR">$1</ph> The Chromium Authors. All rights reserved.
       </message>
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_ENTER_PASSPHRASE_MESSAGE" desc="The error message to show in the account table when there is a passphrase error. [iOS only]">
+        To use and save Chromium data in your Google Account, enter your passphrase.
+      </message>
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_HAS_TRUSTED_VAULT_RECOVERABILITY_DEGRADED_FOR_EVERYTHING_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault recoverability degraded for everything. [iOS only]">
+        To use and save Chromium data in your Google Account, verify it's you.
+      </message>
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_NEEDS_TRUSTED_VAULT_KEY_FOR_EVERYTHING_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault key for everything. [iOS only]">
+        To use and save Chromium data in your Google Account, verify it's you.
+      </message>
+      <message name="IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER" desc="The title of the spotlight item to set Chrome as a default browser. [Length: unlimited] [iOS only]." meaning="Spotlight item title for setting default browser.">
+        Set Chromium as Default Browser
+      </message>
+      <message name="IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER" desc="Footer text shown in the address migration prompt to account. [iOS only]">
+          This address is currently saved to Chromium. To use it across Google products, save it in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>.
+      </message>
       <message name="IDS_IOS_AUTOFILL_DESCRIBE_LOCAL_COPY" desc="Text label that describes a Wallet credit card which has been copied to the local Chromium instance. Title case. [Length: 20em] [iOS only]">
         Copied to Chromium
       </message>
@@ -200,6 +213,12 @@
         Chromium has features that help you manage your internet data and how quickly you're able to load webpages.
 <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
+      <message name="IDS_IOS_CALENDARS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's calendar while the app is in use [Length: unlimited] [iOS only].">
+        This will be used to create events in your Apple Calendar from Chromium and Google Lens.
+      </message>
+      <message name="IDS_IOS_CHANGE_COMPROMISED_PASSWORD_DESCRIPTION_BRANDED" desc="Text inside Password Details screen shown when password was compromised. [iOS only]" meaning="Text which explains the user that current password is compromised and it should be changed.">
+        Your password was exposed in a data breach. Password Manager recommends changing it now.
+      </message>
       <message name="IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_SIGN_OUT_EVERY_WEBSITE" desc="Footer message in the settings to clear browsing data that allows user to sign out of Chrome to sign out their Google account from all websites. [iOS only]">
         To sign out of your Google Account on all websites, <ph name="BEGIN_LINK">BEGIN_LINK</ph>sign out of Chromium<ph name="END_LINK">END_LINK</ph>.
       </message>
@@ -229,22 +248,15 @@
 
         Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.
       </message>
-      <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT_UNO" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]">
-        Passphrase encryption doesn’t include payment methods and addresses.
-
-To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO_UNO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
-        Payment methods and addresses won’t be encrypted. Browsing history from Chromium won’t sync.
-
-Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_TITLE_CTA_EXPERIMENT_SWITCH" desc="Title of the default browser promotion modal. [iOS only]">
-        Switch to Chromium
-      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_DESCRIPTION" desc="Description of the default browser promotion modal. [iOS only]">
         To make Chromium your default browser, open Settings. Tap Default Browser App, and then select Chromium.
       </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_SUBTITLE_TEXT" desc="Chromium version of the subtitle for the default browser half screen promo. [iOS only]">
+        Automatically use Chromium when you tap links in messages, documents, and other apps.
+      </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_TITLE_TEXT" desc="Chromium version of the title for the default browser half screen promo. [iOS only]">
+        Open Chromium From Any App
+      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_LEARN_MORE_INSTRUCTIONS_MESSAGE" desc="Description to user about how to reach the default browser setting in their device. [iOS only]">
         To make Chromium your default:
 1. Open Settings
@@ -254,54 +266,54 @@
       <message name="IDS_IOS_DEFAULT_BROWSER_LEARN_MORE_INSTRUCTIONS_MESSAGE_CTA_EXPERIMENT" desc="Description to user about how to reach the default browser setting in their device. [iOS only]">
         You can now use Chromium any time you tap on links in messages, documents, and other apps.
       </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_DESKTOP_SUBTITLE" desc="The subtitle explaining what the choosen mode (here desktop, the other possible state is mobile) will do in the browser">
-        This means Chromium will request the desktop site every time.
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_TITLE_TEXT" desc="Chromium version of the title for the default browser half screen promo. [iOS only]">
-        Open Chromium From Any App
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_SUBTITLE_TEXT" desc="Chromium version of the subtitle for the default browser half screen promo. [iOS only]">
-        Automatically use Chromium when you tap links in messages, documents, and other apps.
-      </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_MOBILE_SUBTITLE" desc="The subtitle explaining what the choosen mode (here mobile, the other possible state is desktop) will do in the browser">
-        This means Chromium will request the mobile site every time.
+      <message name="IDS_IOS_DEFAULT_BROWSER_NON_MODAL_DESCRIPTION" desc="Description for the non-modal default browser promotion banner">
+        Open Chromium anytime you tap on links in other apps
       </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_NON_MODAL_TITLE" desc="Title for the non-modal default browser promotion banner">
         Set Chromium as Default?
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_NON_MODAL_DESCRIPTION" desc="Description for the non-modal default browser promotion banner">
-        Open Chromium anytime you tap on links in other apps
-      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_ALL_TABS_DESCRIPTION" desc="Chromium version of the description for the 'All your tabs' default browser promotion modal. [iOS only]">
         Set Chromium as default to sync your tabs, passwords, and payment info on all your devices
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_STAY_SAFE_TITLE" desc="Chromium version of the title for the 'Stay safe' default browser promotion modal. [iOS only]">
-        Stay Safe With Chromium
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_STAY_SAFE_DESCRIPTION" desc="Chromium version of the description for the 'Stay safe' default browser promotion modal. [iOS only]">
-        Use Chromium as your default browser to stay protected from dangerous sites &amp; keep your passwords safe
-      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_BUILT_FOR_IOS_DESCRIPTION" desc="Chromium version of the description for the 'Built for iOS' default browser promotion modal. [iOS only]">
         Use Chromium by default to open links, search from widgets, and autofill passwords in other apps
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_TITLE_TEXT" desc="Chromium version of the title for the default browser video promo. [iOS only]">
-        Set Chromium as your Default Browser
+      <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_STAY_SAFE_DESCRIPTION" desc="Chromium version of the description for the 'Stay safe' default browser promotion modal. [iOS only]">
+        Use Chromium as your default browser to stay protected from dangerous sites &amp; keep your passwords safe
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_3" desc="Chromium version of the text of the row indicating the third step of the instruction to set Chrome as default browser [iOS only]">
-        Select "Chromium."
+      <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_STAY_SAFE_TITLE" desc="Chromium version of the title for the 'Stay safe' default browser promotion modal. [iOS only]">
+        Stay Safe With Chromium
+      </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_TITLE_CTA_EXPERIMENT_SWITCH" desc="Title of the default browser promotion modal. [iOS only]">
+        Switch to Chromium
+      </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_APP_SETTINGS" desc="Chromium version of Text in the default browser video the app settings. [iOS only]">
+        Chromium Settings
       </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_2" desc="Chromium version of the text of the row indicating the second step of the instruction to set Chrome as default browser [iOS only]">
         Tap "Chromium" then "Default Browser App."
       </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_3" desc="Chromium version of the text of the row indicating the third step of the instruction to set Chrome as default browser [iOS only]">
+        Select "Chromium."
+      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_SUBTITLE_TEXT" desc="Chromium version of the subtitle for the default browser video promo. [iOS only]">
         Open Chromium Settings in iOS, then tap on "Default Browser App" and select Chromium.
       </message>
-      <message name="IDS_IOS_DISCONNECT_DIALOG_TITLE" desc="The title of the disconnect dialog [Length: 30em].">
-        Sign out of Chromium?
+      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_TITLE_TEXT" desc="Chromium version of the title for the default browser video promo. [iOS only]">
+        Set Chromium as your Default Browser
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_DESKTOP_SUBTITLE" desc="The subtitle explaining what the choosen mode (here desktop, the other possible state is mobile) will do in the browser">
+        This means Chromium will request the desktop site every time.
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_MOBILE_SUBTITLE" desc="The subtitle explaining what the choosen mode (here mobile, the other possible state is desktop) will do in the browser">
+        This means Chromium will request the mobile site every time.
       </message>
       <message name="IDS_IOS_DISCONNECT_DIALOG_SYNCING_FOOTER_INFO_MOBILE" desc="The information text on the disconnect footer describing signout for non-managed accounts [Length: 400em].">
         When you sign out, Chromium won't sync any new data to your Google Account. Data previously synced stays in the account.
       </message>
+      <message name="IDS_IOS_DISCONNECT_DIALOG_TITLE" desc="The title of the disconnect dialog [Length: 30em].">
+        Sign out of Chromium?
+      </message>
       <message name="IDS_IOS_ENTERPRISE_FORCED_SIGNIN_MESSAGE" desc="Text displayed in the popover to inform the user that the browser is managed by Enterprise policies. (Force Sign In) [iOS only]">
           Your organization requires you to sign in to use Chromium.
       </message>
@@ -311,9 +323,15 @@
       <message name="IDS_IOS_ENTERPRISE_FORCED_SIGNIN_SIGNOUT_DIALOG_TITLE" desc="The signout dialog title when forced sign-in is enabled. (Force Sign In) [iOS only]">
         Sign out of Chromium?
       </message>
+      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO.">
+        Your organization turned off the ability to use and save Chromium data in your Google Account. New bookmarks, passwords, and more will be saved only to this device.
+      </message>
       <message name="IDS_IOS_FACE_ID_USAGE_DESCRIPTION" desc="Specifies the reason for using the device's Face ID capabilities.">
         Chromium keeps your sensitive data secure with Face ID.
       </message>
+      <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC" desc="Description of the feed card sync half sheet. [iOS only]">
+        To personalize your Discover feed and Chromium, turn on sync.
+      </message>
       <message name="IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_SUBTITLE" desc="Subtitle of the Default Browser screen on First run page explaining the default browser feature's utility [iOS only]">
         You can now use Chromium anytime you tap links in messages, documents, and other apps.
       </message>
@@ -335,12 +353,12 @@
       <message name="IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SIGNIN_FORCED" desc="Subtitle of a dialog to sign in to Chrome when sign-in is required because of an enterprise policy. [iOS only]">
         Your organization requires you to sign in to use Chromium.
       </message>
-      <message name="IDS_IOS_FIRST_RUN_SIGNIN_TITLE_SIGNIN_FORCED" desc="In Title Case: Title of a dialog to sign in to Chrome when sign-in is required because of an enterprise policy. [iOS only]">
-        Sign In to Chromium
-      </message>
       <message name="IDS_IOS_FIRST_RUN_SIGNIN_TITLE" desc="Title of the screen suggesting to the user to sign in. [iOS only]">
         Make Chromium Your Own
       </message>
+      <message name="IDS_IOS_FIRST_RUN_SIGNIN_TITLE_SIGNIN_FORCED" desc="In Title Case: Title of a dialog to sign in to Chrome when sign-in is required because of an enterprise policy. [iOS only]">
+        Sign In to Chromium
+      </message>
       <message name="IDS_IOS_FIRST_RUN_UMA_DIALOG_CHECKBOX" desc="Checkbox to accept the metrics reporting consent. Related to IDS_IOS_FIRST_RUN_UMA_DIALOG_EXPLANATION and IDS_IOS_FIRST_RUN_UMA_DIALOG_TITLE. [iOS only]">
         Help Improve Chromium's Features and Performance
         </message>
@@ -369,48 +387,198 @@
       <message name="IDS_IOS_FIRST_RUN_UMA_DIALOG_TITLE" desc="In Title Case: Title of the dialog where users can change their Chrome metrics sharing settings, like usage data. The title communicates that allowing Chrome to see this data can improve Chrome; this happens because we can better invent/improve features based on usage. This appears when they open the Chrome app for the first time on their phone. [iOS only]">
         Make Chromium Better
         </message>
-      <message name="IDS_IOS_FIRST_RUN_WELCOME_SCREEN_SUBTITLE" desc="The subtitle of the welcome screen presented to the user on First Run [iOS only]">
-        Get more done with a simple, secure, and faster-than-ever Chromium.
-      </message>
       <message name="IDS_IOS_FIRST_RUN_WELCOME_SCREEN_METRIC_REPORTING" desc="The text is displayed in a footer on the very first screen of Chrome. Make sure 'usage' and 'crash' are translated consistently with the “Usage statistics and crash reports” section of the Chrome Privacy Policy (google.com/chrome/privacy). The ‘Manage’ link opens a dialog to change the corresponding setting. [iOS only]">
         To help improve the app, Chromium sends usage and crash data to Google. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Manage<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_SEARCH_SUGGESTIONS_DETAIL" desc="Feature detail text in the settings for the user to enable/disable, to send omnibox input to the user's default search engine to get additional suggestions. Text related to 'Improve search suggestions' [iOS only]">
-        When you type in the address bar or search box, Chromium sends what you type to your default search engine to get better suggestions. This is off in Incognito.
+      <message name="IDS_IOS_FIRST_RUN_WELCOME_SCREEN_SUBTITLE" desc="The subtitle of the welcome screen presented to the user on First Run [iOS only]">
+        Get more done with a simple, secure, and faster-than-ever Chromium.
+      </message>
+      <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT" desc="The text of an empty following list.">
+        Visit a site and click Follow in the Chromium menu
+      </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_DETAIL" desc="Feature detail text in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
+        Shows prompts to sign in to Chromium.
+      </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_TEXT" desc="Feature title in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
+        Allow Chromium Sign-in
+      </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER" desc="Parcel tracking feature setting page footer detailing how the data is shared. [iOS only]">
+        Chromium will detect package tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone.
       </message>
       <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_CHROME_TEXT" desc="Feature title in the settings for the user enable or disable. Related with 'Automatically sends usage statistics and crash reports to Google'. [iOS only]">
         Help Improve Chromium's Features and Performance
       </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_SEARCH_SUGGESTIONS_DETAIL" desc="Feature detail text in the settings for the user to enable/disable, to send omnibox input to the user's default search engine to get additional suggestions. Text related to 'Improve search suggestions' [iOS only]">
+        When you type in the address bar or search box, Chromium sends what you type to your default search engine to get better suggestions. This is off in Incognito.
+      </message>
       <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_CHROME_DATA" desc="Turns off and on all the sync data (like bookmarks, history and others). [iOS only]">
         Sync Your Chromium Data
       </message>
-      <message name="IDS_IOS_INCOGNITO_REAUTH_SET_UP_SYSTEM_DIALOG_REASON" desc="Text for system biometric authentication dialog to explain why authentication is required when the user attempts to enable the setting to protect Incognito tabs with biometric auth. [iOS only]">
-       Let Chromium lock your Incognito tabs.
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_KEEP_USING_YOUR_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to keep using your Chromium data in your Google account. [iOS only]">
+        Keep using the Chromium data in your Google Account
+      </message>
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to making sure your can always use Chromium data in your Google account. [iOS only]">
+        Make sure you can always use the Chromium data in your Google Account
+      </message>
+      <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]">
+        Open in Chromium
+      </message>
+      <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO" desc="Button to open a link from an external app in Incognito mode rather than a regular tab. [iOS only]">
+        Open in Chromium Incognito
       </message>
       <message name="IDS_IOS_INCOGNITO_REAUTH_SETTING_NAME" desc="Name of the Setting to protect Incognito tabs with biometric authentication, e.g. Face ID or Touch ID. [iOS only]">
        Lock Incognito Tabs When You Close Chromium
       </message>
-      <message name="IDS_IOS_INTENTS_ADD_BOOKMARK_TITLE" desc="Shortcut name to add bookmarks to Chromium [iOS only].">
-        Add Bookmarks to Chromium
+      <message name="IDS_IOS_INCOGNITO_REAUTH_SET_UP_SYSTEM_DIALOG_REASON" desc="Text for system biometric authentication dialog to explain why authentication is required when the user attempts to enable the setting to protect Incognito tabs with biometric auth. [iOS only]">
+       Let Chromium lock your Incognito tabs.
       </message>
       <message name="IDS_IOS_INTENTS_ADD_BOOKMARK_DESCRIPTION" desc="Shortcut description to add a bookmark to Chromium [iOS only].">
         Adds the inputted URLs to your bookmarks in Chromium.
       </message>
+      <message name="IDS_IOS_INTENTS_ADD_BOOKMARK_TITLE" desc="Shortcut name to add bookmarks to Chromium [iOS only].">
+        Add Bookmarks to Chromium
+      </message>
       <message name="IDS_IOS_INTENTS_ADD_READING_LIST_ITEM_DESCRIPTION" desc="Shortcut description to add a reading list item to Chromium [iOS only].">
         Adds the inputted URLs to your reading list in Chromium.
       </message>
       <message name="IDS_IOS_INTENTS_ADD_READING_LIST_ITEM_TITLE" desc="Shortcut name to add a reading list item to Chrome [iOS only].">
         Add Reading List Item to Chromium
       </message>
+      <message name="IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_DESCRIPTION" desc="Shortcut description to open Clear Browsing Data dialog in Chrome [iOS only].">
+        Clear Browsing Data in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_TITLE" desc="Siri Shortcut for open Clear Browsing Data dialog [iOS only]">
+        Clear Browsing Data in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_PASSWORDS_DESCRIPTION" desc="Siri Shortcut description to manage passwords [iOS only]">
+        Opens The Password Manager in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_PASSWORDS_TITLE" desc="Siri Shortcut for manage passwords title [iOS only]">
+        Manage Passwords in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_PAYMENT_METHODS_DESCRIPTION" desc="Siri Shortcut description to manage payment methods [iOS only]">
+        Opens The Payment Methods Setting Page in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_PAYMENT_METHODS_TITLE" desc="Siri Shortcut for manage payment methods title [iOS only]">
+        Manage Payment Methods in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_SETTINGS_DESCRIPTION" desc="Siri Shortcut description to manage settings in chromium [iOS only]">
+        Opens The Settings in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_SETTINGS_TITLE" desc="Siri Shortcut for manage settings title [iOS only]">
+        Manage Chromium Settings
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_BOOKMARKS_DESCRIPTION" desc="Shortcut description to open bookmarks in chrome [iOS only].">
+        Opens the Chromium bookmarks.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_BOOKMARKS_TITLE" desc="Siri Shortcut for open bookmarks title [iOS only]">
+        See Chromium Bookmarks
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_CHROME_INCOGNITO_TAB_DESCRIPTION" desc="Siri Shortcut description to open chromium incognito tab [iOS only]">
+        Opens a New Chromium Incognito Tab.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_CHROME_INCOGNITO_TAB_TITLE" desc="Siri Shortcut for open chromium incognito tab title [iOS only]">
+        Open Chromium Incognito Tab
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION" desc="Shortcut description to open URLs in Chrome in Incognito [iOS only].">
+        Opens the inputted URLs in Chromium in Incognito.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE" desc="Shortcut name to open URL in Chrome in Incognito [iOS only].">
+        Open URLs in Chromium in Incognito
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_LATEST_TAB_DESCRIPTION" desc="Siri Shortcut description to latest tab in chromium [iOS only]">
+        Open My Latest Tab in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_LATEST_TAB_TITLE" desc="Siri Shortcut for open latest tab title [iOS only]">
+        Open My Latest Tab in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_LENS_DESCRIPTION" desc="Siri Shortcut description to open Lens(Visual Search) [iOS only]">
+        Search Visuals in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_LENS_TITLE" desc="Siri Shortcut for opening Lens (Visual Search) [iOS only]">
+        Search Visuals in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_NEW_TAB_DESCRIPTION" desc="Siri Shortcut description to open new tab in chromium [iOS only]">
+        Opens a New Tab in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_NEW_TAB_TITLE" desc="Siri Shortcut for open new tab title [iOS only]">
+        Open New Tab in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_READING_LIST_DESCRIPTION" desc="Shortcut description to open reading list in chrome [iOS only].">
+        Opens the Chromium Reading List.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_READING_LIST_TITLE" desc="Siri Shortcut for open reading list title [iOS only]">
+        See Chromium Reading List
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_RECENT_TABS_DESCRIPTION" desc="Shortcut description to open recent tabs in chrome [iOS only].">
+        Opens the Chromium Recent Tabs.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_RECENT_TABS_TITLE" desc="Siri Shortcut for open recent tabs title [iOS only]">
+        See Chromium Recent Tabs
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_TAB_GRID_DESCRIPTION" desc="Shortcut description to open tab grid in chrome [iOS only].">
+        Opens the Chromium Tab Grid.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_TAB_GRID_TITLE" desc="Siri Shortcut for open tab grid title [iOS only]">
+        Visit the Tab Grid in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_PLAY_DINO_GAME_DESCRIPTION" desc="Siri Shortcut description to open dino game in chromium [iOS only]">
+        Opens the Chromium Dino Game.
+      </message>
+      <message name="IDS_IOS_INTENTS_PLAY_DINO_GAME_TITLE" desc="Siri Shortcut for play dino game title [iOS only]">
+        Play Chromium Dino Game
+      </message>
+      <message name="IDS_IOS_INTENTS_RUN_SAFETY_CHECK_DESCRIPTION" desc="Siri Shortcut description to run safety check [iOS only]">
+        Opens and Runs Safety Check in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_RUN_SAFETY_CHECK_TITLE" desc="Siri Shortcut for run safety check title [iOS only]">
+        Run Chromium Safety Check
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION" desc="Siri Shortcut for search in chrome description [iOS only].">
+        Start a search in a new Chromium tab.
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE" desc="Siri Shortcut, spoken suggestion for search in chrome [iOS only].">
+        Search in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts App's format for displaying the user search phrase input, shown by the Siri Shortcut app when the           user is adding or editing a Search in Chromium shortcut[iOS only].">
+          Search ${searchPhrase} in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
+        Search in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
+          Search in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_DESCRIPTION" desc="Siri Shortcut description for searching with voice [iOS only]">
+        Search With Voice in Chromium.
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_TITLE" desc="Siri Shortcut for search with voice title [iOS only]">
+        Search With Voice in Chromium
+      </message>
+      <message name="IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_DESCRIPTION" desc="Siri Shortcut description to set Chromium as default browser [iOS only]">
+        Opens the Chromium Setting to set Chromium as Default Browser.
+      </message>
+      <message name="IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_TITLE" desc="Siri Shortcut for set Chromium as default browser title [iOS only]">
+        Set Chromium As Default Browser
+      </message>
+      <message name="IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_DESCRIPTION" desc="Siri Shortcut description to view Chromium history [iOS only]">
+        Opens your Chromium History Page.
+      </message>
+      <message name="IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_TITLE" desc="Siri Shortcut for view chromium history title [iOS only]">
+        View Your Chromium History
+      </message>
       <message name="IDS_IOS_LOCATION_WHEN_IN_USE_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's location information while the app is in use [Length: unlimited] [iOS only].">
           Chromium shares your location with sites you allow.
       </message>
+      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button">
+        To disable Lockdown Mode in Chromium turn it off on your iPad.
+      </message>
+      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE" desc="iPhone summary for lockdown mode info button">
+        To disable Lockdown Mode in Chromium turn it off on your iPhone.
+      </message>
       <message name="IDS_IOS_LOGIN_ERROR_AUTHENTICATING_HOSTED" desc="Couldn't sign in because hosted account is used.">
         Your account does not work on Chromium. Please contact your domain administrator or use a regular Google Account to sign in.
       </message>
-      <message name="IDS_IOS_MANAGE_SYNC_DATA_FROM_CHROME_SYNC_TITLE" desc="Title for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync.">
-        Data from Chromium sync
-      </message>
       <message name="IDS_IOS_MANAGED_DISCONNECT_DIALOG_INFO_UNITY" desc="Message explaining that signing out of a managed account will clear all the Chromium data.[Length: 200em, may be line wrapped to multiple lines at run time.] [iOS only].">
         Because you're signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN">$1<ex>google.com</ex></ph>, your Chromium data will be deleted from this device. Your data will remain in your Google Account.
       </message>
@@ -429,12 +597,31 @@
       <message name="IDS_IOS_MANAGED_SYNC_WITH_USER_POLICY_SUBTITLE" desc="The subtitle of the Sync with a managed account dialog when User Policy is enabled (alternative to IDS_IOS_MANAGED_SIGNIN_SUBTITLE). [300em][iOS only]">
         Your organization <ph name="DOMAIN">$1<ex>doe.com</ex></ph> will have access to your Chromium data, bookmarks, history, passwords and other settings you store in this account. When you sign out, your data will be cleared from this device.  However, your data will remain stored in your managed Google Account and be available to your organization. Your organization can also set user policies specific to that account that can change the behavior of Chromium.
       </message>
+      <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE" desc="Title for the cell to open 'Review data in your account' web page where the user can control all their data data from sync.">
+        Chromium data in your account
+      </message>
+      <message name="IDS_IOS_MANAGE_SYNC_DATA_FROM_CHROME_SYNC_TITLE" desc="Title for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync.">
+        Data from Chromium sync
+      </message>
+      <message name="IDS_IOS_MINI_MAP_CONSENT_SUBTITLE" desc="The subtitle of the consent screen for mini map [iOS only].">
+        Allow Chromium to use Google Maps to give you directions and local info on detected addresses.
+      </message>
       <message name="IDS_IOS_MINI_MAP_FOOTER_STRING" desc="The text of the footer string displayed at the bottom of the minimap [iOS only].">
         Chromium uses Google Maps to give you directions and local info on detected addresses.
       </message>
       <message name="IDS_IOS_MINI_MAP_IPH_TITLE" desc="The text of the iph string displayed on Mini Map screen on first trigger [iOS only].">
         Chromium detects addresses and uses Google Maps to give you directions and local info.
       </message>
+      <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
+        Payment methods and addresses from Google Pay won’t be encrypted. Browsing history from Chromium won’t sync.
+
+Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO_UNO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
+        Payment methods and addresses won’t be encrypted. Browsing history from Chromium won’t sync.
+
+Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
       <message name="IDS_IOS_OPTIONS_IMPORT_DATA_HEADER" desc="The header for the Import Data settings screen. [400em]">
         <ph name="USER_EMAIL1">$1<ex>johndoe@gmail.com</ex></ph> was using Chromium and left bookmarks, passwords, and other settings on this device.
       </message>
@@ -444,6 +631,15 @@
       <message name="IDS_IOS_OPTIONS_TAB_PICKUP_SCREEN_FOOTER" desc="Footer for the screen setting displaying tab suggestion settings.">
           Suggestions are based on your browsing activity on your other devices. To get suggestions, sign in to Chromium on all your devices.
       </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Share Chromium
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC" desc="The description displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Download Chromium here.
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE" desc="The title displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Chromium for iOS
+      </message>
       <message name="IDS_IOS_PAGE_INFO_CHROME_PAGE_LABEL" desc="Label to display at the top of the site information screen when the page you are on is a Chromium page.">
         Chromium Page
       </message>
@@ -466,12 +662,54 @@
       <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_DESCRIPTION" desc="Description for the alert dialog warning the user they are about to hide the parcel tracking module.">
           If you hide "<ph name="Module_Name"><ex>Package Tracking</ex>$1</ph>", Chromium will no longer auto-track your future packages and will delete all your past package tracking data.
       </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen.">
+        Chromium will detect tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone. You can change this in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>.
+      </message>
       <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE" desc="Text for the title string of the parcel tracking opt-in half-sheet screen.">
         Let Chromium help you track your packages
       </message>
+      <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE" desc="Subtitle of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]">
+        When you're signed in to Chromium, passwords you save will go in your Google Account. To turn this off, <ph name="BEGIN_LINK">BEGIN_LINK</ph>go to settings<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_TITLE" desc="Title of the password bottom sheet. [iOS only]">
+          Google Password Manager
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR" desc="Description of the password check cell, explaining that Password Check failed. [iOS only]" meaning="Password Check failed due to some error.">
+        Chromium can't check your passwords.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_NO_PASSWORDS" desc="Description text for when password check cannot be run because the user has no saved passwords">
+        No saved passwords. Chromium can check your passwords when you save them.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_OFFLINE" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has no internet connection and can't check passwords.">
+        Chromium couldn't check your passwords. Try checking your internet connection.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_OTHER" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="Password check failed due to specific reason (out of memory).">
+        Chromium couldn't check all passwords. Try again later.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_QUOTA_LIMIT" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has more passwords than allowed for check.">
+        Chromium couldn't check all passwords. Try again tomorrow.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_QUOTA_LIMIT_VISIT_GOOGLE" desc="Text with link inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has more passwords than allowed for check but he can check in Google Account.">
+        Chromium couldn't check all passwords. Try again tomorrow or <ph name="BEGIN_LINK">BEGIN_LINK</ph>check passwords in your Google Account.<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_SIGNED_OUT" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user is not signed in and can't check passwords.">
+        Chromium can check your passwords when you sign in with your Google Account.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECK_ERROR" desc="Description of the password check cell, explaining that Password Check failed. [iOS only]" meaning="Password Check failed due to some error.">
+        Chromium can't check your passwords
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE" desc="Info text in the recipient picker view of the password sharing flow explaining why one of the family members is not eligible to be a recipient. [iOS Only]">
+        Your family member can't receive passwords right now. Ask them to update Chromium and sync their passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR" desc="Description on the alert view explaining an error in the password sharing flow. [iOS only]">
+        Your password wasn't shared. Check your internet connection and make sure you're signed in to Chromium. Then, try again.
+      </message>
       <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_PROMO_TITLE" desc="The text of the title for the post restore default browser promo.">
         Make Chromium Your Default Browser?
       </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE" desc="The title text of the alert post restore sign-in promo. [iOS only]">
+        Chromium is Signed Out
+      </message>
       <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_PERMISSION_REDIRECT_ALERT_MESSAGE" desc="The description that argues why push notification permission is necessary for price tracking.">
           Chromium notifications are currently turned off in your device settings.
       </message>
@@ -493,6 +731,12 @@
       <message name="IDS_IOS_REMOVE_ACCOUNT_CONFIRMATION_MESSAGE" desc="Dialog message to emphasize the effects of removing an account.">
         This account and any unsaved data will be removed from Chromium.
       </message>
+      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
+        Your Chromium is out of date.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
+        Chromium is out of date, update to the latest version to stay secure.
+      </message>
       <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_BULLET_TWO" desc="Second bullet point under the Safe Browsing enhanced protection mode">
         Keeps you safe on Chromium and may be used to improve your security in other Google apps when you are signed in.
       </message>
@@ -505,12 +749,12 @@
       <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_BULLET_TWO" desc="Second bullet point under the Safe Browsing standard protection mode.">
         Checks URLs with a list of unsafe sites stored in Chromium. If a site tries to steal your password, or when you download a harmful file, Chromium may also send URLs, including bits of page content, to Safe Browsing.
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_SUMMARY" desc="Summary for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
-        Chromium periodically checks your passwords against lists that have been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.
-      </message>
       <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_FRIENDLIER_SUMMARY" desc="Friendlier summary for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
         When you use a password, Chromium warns you if it has been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.
       </message>
+      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_SUMMARY" desc="Summary for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
+        Chromium periodically checks your passwords against lists that have been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.
+      </message>
       <message name="IDS_IOS_SAFE_MODE_NAMED_TWEAKS_FOUND" desc="The message indicating a 3rd party tweak has been found that is known to crash Chromium.  After the ':', we will list the names of the libraries. [Length: 140em]">
         Some add-ons cause Chromium to crash. Please uninstall:
       </message>
@@ -544,24 +788,90 @@
       <message name="IDS_IOS_SCANNER_MULTIPLE_FOREGROUND_APPS_ALERT_DETAIL" desc="Body of a modal dialog shown when the user tries to open the QR or credit card scanner in a Split View mode, when the camera is unavailable. [Length: 140em] [iOS only]">
         Chromium can't use your camera in Split View mode
       </message>
+      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER" desc="Disclaimer telling users what will happen to their passwords">
+        Your password will be saved in your Account (<ph name="EMAIL">$1<ex>example@gmail.com</ex></ph>).
+      </message>
+      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_BRANDED" desc="Disclaimer telling users what will happen to their passwords">
+        Your password will be saved to Password Manager for <ph name="EMAIL">$1<ex>example@gmail.com</ex></ph>.
+      </message>
+      <message name="IDS_IOS_SETTINGS_HEADER_TEXT" desc="Header of the Default Browser Settings page explaining the default browser feature's utility.">
+        You can open links in Chromium automatically by making it your Default Browser App.
+      </message>
+      <message name="IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT" desc="Label of the button that opens the Chrome panel in Settings.app">
+          Open Chromium Settings
+      </message>
+      <message name="IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP" desc="Text of the row indicating the first step of setting the default browser.">
+        1. Open Chromium Settings
+      </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SHORTENED_STEP_2" desc="Text of the row indicating the second step of shortened instruction of turning on iOS auto-fill from Chrome password manager [iOS only]">
+        Select Chromium
+      </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_STEP_4" desc="Text of the row indicating the fourth step of full instruction of of turning on iOS auto-fill from Chrome password manager [iOS only]">
+        4. Select Chromium
+      </message>
       <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SUBTITLE_IPAD" desc="The subtitle of the view that teaches users to turn on iOS auto-fill from Chrome password manager for iPad [iPadOS only]">
         You can use the passwords you saved to Password Manager in other apps on your iPad.
       </message>
       <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SUBTITLE_IPHONE" desc="The subtitle of the view that teaches users to turn on iOS auto-fill from Chrome password manager for iPhone [iOS only]">
         You can use the passwords you saved to Password Manager in other apps on your iPhone.
       </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_MAGIC_STACK_PAGE_HEADER" desc="Informational header at the top of the safety check page when opened via the Magic Stack">
+        Chromium automatically runs Safety Check every day to keep you safe from data breaches, unsafe websites and more. You can find more about Safety Check in Settings.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_PAGE_HEADER" desc="Informational header at the top of the safety check page">
+        Chromium can help keep you safe from data breaches, unsafe websites and more.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_BETA_DESC" desc="Description text for when the app is on Beta and unable to run the check">
+        Not supported on Chromium Beta
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_CANARY_DESC" desc="Description text for when the app is on Canary and unable to run the check">
+        Not supported on Chromium Canary
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_DESCRIPTION" desc="Description text on the update element describing what the update check does.">
+        Keep Chromium up to date
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_ERROR_DESC" desc="Description text for when updates can't be checked because there was an issue with the check">
+        Chromium can't check for updates
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_ERROR_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="An error occured while performing the update check.">
+        Chromium couldn't check for updates. Try again later.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OFFLINE_DESC" desc="Description text for when updates can't be checked because the user is offline">
+        Offline, Chromium can't check for updates
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OFFLINE_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has no internet connection and can't check for updates.">
+        Chromium couldn't check for updates. Try checking your internet connection.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OUT_OF_DATE_DESC" desc="Description text for when Chromium is out of date">
+        Chromium is out of date
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UNABLE_DESC" desc="Description text for when the device is not able to update to the newest version">
+        Chromium can't update
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UNABLE_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The device is not able to update to the newest version.">
+        Chromium is out of date. If no update is available in the <ph name="BEGIN_LINK">BEGIN_LINK</ph>App Store<ph name="END_LINK">END_LINK</ph>, it's possible that your device doesn't support new versions of Chromium anymore.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UP_TO_DATE_DESC" desc="Description text for when Chromium is up to date">
+        Chromium is up to date
+      </message>
+      <message name="IDS_IOS_SETTINGS_SELECT_CHROME_STEP" desc="Text of the row indicating the third step of setting the default browser.">
+        3. Select Chromium
+      </message>
+      <message name="IDS_IOS_SETTINGS_SIGNIN_DISABLED_POPOVER_TEXT" desc="This text is shown when sign-in is disabled by policy and the user taps on the info pop-over of the 'Sign in to Chromium' button in the settings. [iOS only]">
+        Your organization requires you to stay signed out of Chromium.
+      </message>
       <message name="IDS_IOS_SET_UP_LIST_ALL_SET_DESCRIPTION" desc="Description for the Set Up List item that tells the user they have completed all tasks.">
         You'll now get the most out of Chromium on your device.
       </message>
       <message name="IDS_IOS_SET_UP_LIST_AUTOFILL_DESCRIPTION" desc="Description for the Set Up List item that encourages the user to set up Chromium's autofill settings.">
         Access your Chromium passwords and more across other apps on this device.
       </message>
-      <message name="IDS_IOS_SET_UP_LIST_AUTOFILL_TITLE" desc="Title for the Set Up List item that encourages the user to set up Chromium's autofill settings.">
-        Use Chromium for Autofill
-      </message>
       <message name="IDS_IOS_SET_UP_LIST_AUTOFILL_MAGIC_STACK_DESCRIPTION" desc="Description for the Set Up List item in the Magic Stack that encourages the user to set up Chromium's autofill settings.">
         Access your Chromium passwords and more across other apps.
       </message>
+      <message name="IDS_IOS_SET_UP_LIST_AUTOFILL_TITLE" desc="Title for the Set Up List item that encourages the user to set up Chromium's autofill settings.">
+        Use Chromium for Autofill
+      </message>
       <message name="IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_DESCRIPTION" desc="Description for the Set Up List item that encourages the user to set Chromium as their default browser.">
         Use Chromium anytime you tap links in messages, documents, and other apps.
       </message>
@@ -592,28 +902,60 @@
       <message name="IDS_IOS_SHORT_PRODUCT_NAME" desc="The Chrome application short name.">
         Chromium
       </message>
+      <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE" desc="Notification title for the user's signed-in state [iOS only]">
+      Signed in to Chromium
+      </message>
       <message name="IDS_IOS_SIGNIN_SHEET_LABEL_FOR_WEB_SIGNIN" desc="This string is on a sign-in page, after the user taps to sign in to a website with their Google Account. It offers to sign the user in to both the website and to Chromium with the account. It highlights the overarching user benefit of signing in to Chromium (access to data from other devices like bookmarks, passwords, history, settings, etc.). We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account. The tone should be informative and lightweight. [iOS only]">
         Sign in to this site and Chromium to get your bookmarks and more on all your devices.
       </message>
-      <message name="IDS_IOS_SIGN_IN_TO_CHROME_SETTING_TITLE" desc="The title for the setting item to Sign in to Chromium [iOS only]">
-        Sign in to Chromium
-      </message>
       <message name="IDS_IOS_SIGNOUT_DIALOG_MESSAGE_WITH_NOT_SAVED_DATA" desc="Body of a dialog shown to users when they sign out of Chrome but Chrome hasn't synced some data yet, which is permanently deleted if the user proceeds.  [iOS only].">
         Some of your Chromium data hasn't been saved in your Google Account yet.
         Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.
       </message>
-      <message name="IDS_IOS_SIGNOUT_DIALOG_TITLE_WITH_SYNCING_ACCOUNT" desc="The signout dialog title. This dialog is used when the user have a gmail account and sync is turned on [iOS only].">
-        Choose whether to clear your Chromium data from this device or keep it
-      </message>
       <message name="IDS_IOS_SIGNOUT_DIALOG_TITLE_WITHOUT_SYNCING_ACCOUNT" desc="Title of sign-out button, warning the user they’ll have access to less features once signed out. [iOS only].">
         Some Chromium features won’t be available anymore.
       </message>
+      <message name="IDS_IOS_SIGNOUT_DIALOG_TITLE_WITH_SYNCING_ACCOUNT" desc="The signout dialog title. This dialog is used when the user have a gmail account and sync is turned on [iOS only].">
+        Choose whether to clear your Chromium data from this device or keep it
+      </message>
       <message name="IDS_IOS_SIGNOUT_DIALOG_TITLE_WITH_SYNCING_MANAGED_ACCOUNT" desc="The signout dialog title. This dialog is used when the user have a managed account (other than gmail account) [iOS only].">
         Your account is managed by <ph name="HOSTED_DOMAIN">$1<ex>google.com</ex></ph>, so your Chromium data will be cleared from this device
       </message>
+      <message name="IDS_IOS_SIGN_IN_TO_CHROME_SETTING_TITLE" desc="The title for the setting item to Sign in to Chromium [iOS only]">
+        Sign in to Chromium
+      </message>
+      <message name="IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL" desc="Tag label title displayed for chrome actions spotlight items. [iOS only]">
+        Chromium Actions
+      </message>
+      <message name="IDS_IOS_SUGGESTED_STRONG_PASSWORD_HINT_DISPLAYING_EMAIL" desc="Text shown alongside a suggested password to tell user that generated passwords are recorded by chrome. [Length: unlimited] [iOS only]">
+            You won't need to remember this password. It will be saved to Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]">
+        Passphrase encryption doesn’t include payment methods and addresses from Google Pay.
+
+To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT_UNO" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]">
+        Passphrase encryption doesn’t include payment methods and addresses.
+
+To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL" desc="Instructions for the dialog where the user enters the passphrase.">
+        Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
+
+Your data is encrypted with your passphrase. Enter it to use and save Chromium data in your Google Account.
+      </message>
+      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE" desc="Instructions for the dialog where the user enters the passphrase.">
+        Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
+
+Your data was encrypted with your passphrase on <ph name="TIME">$2<ex>Sept 1, 2012</ex></ph>. Enter it to use and save Chromium data in your Google Account.
+      </message>
       <message name="IDS_IOS_SYNC_LOGIN_INFO_OUT_OF_DATE_WITH_UNO" desc="Body of a message that is shown certain error states, such as when account was removed in another app or the password was changed. This string follows the heading &quot;Verify it's you&quot;, and we want the user to tap on the button &quot;Verify&quot;. We are asking the user to sign back in to their Google Account, so that the user can sign back into Chrome and resume access to their Chrome data (such as bookmarks, passwords, history, settings, and more). The tone should be helpful and instructive.">
         Keep using the Chromium data in your Google Account.
       </message>
+      <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]">
+        If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
       <message name="IDS_IOS_TAB_SWITCHER_NO_TABS_TO_SYNC_PROMO" desc="The title of the paragraph IDS_OPEN_TABS_NO_SESSION_INSTRUCTIONS_IOS. The paragraph explains that tabs opened on other devices where the user is signed in will appear here, in the Tab Switcher. [iOS only]">
         Use Chromium Everywhere
       </message>
@@ -632,6 +974,15 @@
       <message name="IDS_IOS_TRANSLATE_SETTING_DESCRIPTION" desc="Description for the Translate setting. [Length: unlimited] [iOS only]">
         When this feature is turned on, Chromium will offer to translate pages written in other languages using Google Translate. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
+      <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION" desc="Explanatory text that appears when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used. [iOS only]">
+          Finish what you were doing in your other open Chromium window.
+      </message>
+      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_SUBTITLE_SYNC_DISABLED" desc="This string is on a sign-in page, shown several weeks after the user has installed Chrome. It explains the overarching user benefit of signing in (access to bookmarks, passwords, history, settings, etc.). However, we introduce a caveat, because the user has a managed account (such as Enterprise); this means that, depending on their organization's settings, the user might not be able to save all types of data in their Google Account. We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account.">
+        Get the most out of Chromium.
+      </message>
+      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_TITLE" desc="Title of the screen suggesting to the user to sign in. The user may see this screen when Chrome is opened, but only several weeks after installation.">
+        Make Chromium Your Own
+      </message>
       <message name="IDS_IOS_UPGRADE_AVAILABLE" desc="Text to inform the user of the presence of a new version of the application">
         Chromium just got better! A new version is available.
       </message>
@@ -641,339 +992,14 @@
       <message name="IDS_IOS_USER_POLICY_NOTIFICATION_TITLE" desc="The title of the User Policy notification dialog. [iOS only] [300em]">
         Chromium now supports user policies for your managed account
       </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SHORTENED_STEP_2" desc="Text of the row indicating the second step of shortened instruction of turning on iOS auto-fill from Chrome password manager [iOS only]">
-        Select Chromium
-      </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_STEP_4" desc="Text of the row indicating the fourth step of full instruction of of turning on iOS auto-fill from Chrome password manager [iOS only]">
-        4. Select Chromium
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_PAGE_HEADER" desc="Informational header at the top of the safety check page">
-        Chromium can help keep you safe from data breaches, unsafe websites and more.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_DESCRIPTION" desc="Description text on the update element describing what the update check does.">
-        Keep Chromium up to date
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_CANARY_DESC" desc="Description text for when the app is on Canary and unable to run the check">
-        Not supported on Chromium Canary
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_BETA_DESC" desc="Description text for when the app is on Beta and unable to run the check">
-        Not supported on Chromium Beta
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UP_TO_DATE_DESC" desc="Description text for when Chromium is up to date">
-        Chromium is up to date
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OUT_OF_DATE_DESC" desc="Description text for when Chromium is out of date">
-        Chromium is out of date
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OFFLINE_DESC" desc="Description text for when updates can't be checked because the user is offline">
-        Offline, Chromium can't check for updates
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OFFLINE_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has no internet connection and can't check for updates.">
-        Chromium couldn't check for updates. Try checking your internet connection.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_ERROR_DESC" desc="Description text for when updates can't be checked because there was an issue with the check">
-        Chromium can't check for updates
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_ERROR_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="An error occured while performing the update check.">
-        Chromium couldn't check for updates. Try again later.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UNABLE_DESC" desc="Description text for when the device is not able to update to the newest version">
-        Chromium can't update
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UNABLE_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The device is not able to update to the newest version.">
-        Chromium is out of date. If no update is available in the <ph name="BEGIN_LINK">BEGIN_LINK</ph>App Store<ph name="END_LINK">END_LINK</ph>, it's possible that your device doesn't support new versions of Chromium anymore.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SIGNIN_DISABLED_POPOVER_TEXT" desc="This text is shown when sign-in is disabled by policy and the user taps on the info pop-over of the 'Sign in to Chromium' button in the settings. [iOS only]">
-        Your organization requires you to stay signed out of Chromium.
-      </message>
-      <message name="IDS_IOS_SUGGESTED_STRONG_PASSWORD_HINT_DISPLAYING_EMAIL" desc="Text shown alongside a suggested password to tell user that generated passwords are recorded by chrome. [Length: unlimited] [iOS only]">
-            You won't need to remember this password. It will be saved to Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_TITLE" desc="Title of the password bottom sheet. [iOS only]">
-          Google Password Manager
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECK_ERROR" desc="Description of the password check cell, explaining that Password Check failed. [iOS only]" meaning="Password Check failed due to some error.">
-        Chromium can't check your passwords
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR" desc="Description of the password check cell, explaining that Password Check failed. [iOS only]" meaning="Password Check failed due to some error.">
-        Chromium can't check your passwords.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_NO_PASSWORDS" desc="Description text for when password check cannot be run because the user has no saved passwords">
-        No saved passwords. Chromium can check your passwords when you save them.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_OFFLINE" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has no internet connection and can't check passwords.">
-        Chromium couldn't check your passwords. Try checking your internet connection.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_SIGNED_OUT" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user is not signed in and can't check passwords.">
-        Chromium can check your passwords when you sign in with your Google Account.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_QUOTA_LIMIT" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has more passwords than allowed for check.">
-        Chromium couldn't check all passwords. Try again tomorrow.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_QUOTA_LIMIT_VISIT_GOOGLE" desc="Text with link inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has more passwords than allowed for check but he can check in Google Account.">
-        Chromium couldn't check all passwords. Try again tomorrow or <ph name="BEGIN_LINK">BEGIN_LINK</ph>check passwords in your Google Account.<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_OTHER" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="Password check failed due to specific reason (out of memory).">
-        Chromium couldn't check all passwords. Try again later.
+      <message name="IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE" desc="Use Chrome By Default title displayed in What's New. [iOS only]">
+        Use Chromium By Default
       </message>
       <message name="IDS_IOS_WHATS_NEW_APP_SETTINGS" desc="Chromium version of Text of the row indicating the step of opening the app settings. [iOS only]">
         Go to Chromium Settings.
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_APP_SETTINGS" desc="Chromium version of Text in the default browser video the app settings. [iOS only]">
-        Chromium Settings
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_STEP_3" desc="Chromium version of Text of the row indicating the third step to turn on Incognito Lock. [iOS only]">
-        Turn on “Lock Incognito Tabs When You Close Chromium.”
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_SUBTITLE" desc="Chromium version of Incognito Lock subtitle displayed in What's New. [iOS only]">
-        Lock your incognito tabs when you leave Chromium or switch to a different app.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_TITLE" desc="Chromium version of Mini Maps title displayed in What's New. [iOS only]">
-        Maps in Chromium
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_STEP_2" desc="Chromium version of Text of the row indicating the second step of of the Mini Maps feature. [iOS only]">
-        Tap “View with Google Maps on Chromium.”
-      </message>
-      <message name="IDS_IOS_CHANGE_COMPROMISED_PASSWORD_DESCRIPTION_BRANDED" desc="Text inside Password Details screen shown when password was compromised. [iOS only]" meaning="Text which explains the user that current password is compromised and it should be changed.">
-        Your password was exposed in a data breach. Password Manager recommends changing it now.
-      </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_DETAIL" desc="Feature detail text in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
-        Shows prompts to sign in to Chromium.
-      </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_TEXT" desc="Feature title in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
-        Allow Chromium Sign-in
-      </message>
-      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER" desc="Disclaimer telling users what will happen to their passwords">
-        Your password will be saved in your Account (<ph name="EMAIL">$1<ex>example@gmail.com</ex></ph>).
-      </message>
-      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_BRANDED" desc="Disclaimer telling users what will happen to their passwords">
-        Your password will be saved to Password Manager for <ph name="EMAIL">$1<ex>example@gmail.com</ex></ph>.
-      </message>
-      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_SUBTITLE_SYNC_DISABLED" desc="This string is on a sign-in page, shown several weeks after the user has installed Chrome. It explains the overarching user benefit of signing in (access to bookmarks, passwords, history, settings, etc.). However, we introduce a caveat, because the user has a managed account (such as Enterprise); this means that, depending on their organization's settings, the user might not be able to save all types of data in their Google Account. We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account.">
-        Get the most out of Chromium.
-      </message>
-      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_TITLE" desc="Title of the screen suggesting to the user to sign in. The user may see this screen when Chrome is opened, but only several weeks after installation.">
-        Make Chromium Your Own
-      </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_ENTER_PASSPHRASE_MESSAGE" desc="The error message to show in the account table when there is a passphrase error. [iOS only]">
-        To use and save Chromium data in your Google Account, enter your passphrase.
-      </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_NEEDS_TRUSTED_VAULT_KEY_FOR_EVERYTHING_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault key for everything. [iOS only]">
-        To use and save Chromium data in your Google Account, verify it's you.
-      </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_HAS_TRUSTED_VAULT_RECOVERABILITY_DEGRADED_FOR_EVERYTHING_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault recoverability degraded for everything. [iOS only]">
-        To use and save Chromium data in your Google Account, verify it's you.
-      </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_KEEP_USING_YOUR_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to keep using your Chromium data in your Google account. [iOS only]">
-        Keep using the Chromium data in your Google Account
-      </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to making sure your can always use Chromium data in your Google account. [iOS only]">
-        Make sure you can always use the Chromium data in your Google Account
-      </message>
-      <message name="IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_TITLE" desc="Siri Shortcut for open Clear Browsing Data dialog [iOS only]">
-        Clear Browsing Data in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_DESCRIPTION" desc="Shortcut description to open Clear Browsing Data dialog in Chrome [iOS only].">
-        Clear Browsing Data in Chromium.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_READING_LIST_TITLE" desc="Siri Shortcut for open reading list title [iOS only]">
-        See Chromium Reading List
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_READING_LIST_DESCRIPTION" desc="Shortcut description to open reading list in chrome [iOS only].">
-        Opens the Chromium Reading List.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_BOOKMARKS_TITLE" desc="Siri Shortcut for open bookmarks title [iOS only]">
-        See Chromium Bookmarks
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_BOOKMARKS_DESCRIPTION" desc="Shortcut description to open bookmarks in chrome [iOS only].">
-        Opens the Chromium bookmarks.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_RECENT_TABS_TITLE" desc="Siri Shortcut for open recent tabs title [iOS only]">
-        See Chromium Recent Tabs
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_RECENT_TABS_DESCRIPTION" desc="Shortcut description to open recent tabs in chrome [iOS only].">
-        Opens the Chromium Recent Tabs.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_TAB_GRID_TITLE" desc="Siri Shortcut for open tab grid title [iOS only]">
-        Visit the Tab Grid in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_TAB_GRID_DESCRIPTION" desc="Shortcut description to open tab grid in chrome [iOS only].">
-        Opens the Chromium Tab Grid.
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_TITLE" desc="Siri Shortcut for search with voice title [iOS only]">
-        Search With Voice in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_DESCRIPTION" desc="Siri Shortcut description for searching with voice [iOS only]">
-        Search With Voice in Chromium.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_LENS_TITLE" desc="Siri Shortcut for opening Lens (Visual Search) [iOS only]">
-        Search Visuals in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_LENS_DESCRIPTION" desc="Siri Shortcut description to open Lens(Visual Search) [iOS only]">
-        Search Visuals in Chromium.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_LATEST_TAB_TITLE" desc="Siri Shortcut for open latest tab title [iOS only]">
-        Open My Latest Tab in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_LATEST_TAB_DESCRIPTION" desc="Siri Shortcut description to latest tab in chromium [iOS only]">
-        Open My Latest Tab in Chromium.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_NEW_TAB_TITLE" desc="Siri Shortcut for open new tab title [iOS only]">
-        Open New Tab in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_NEW_TAB_DESCRIPTION" desc="Siri Shortcut description to open new tab in chromium [iOS only]">
-        Opens a New Tab in Chromium.
-      </message>
-      <message name="IDS_IOS_INTENTS_PLAY_DINO_GAME_TITLE" desc="Siri Shortcut for play dino game title [iOS only]">
-        Play Chromium Dino Game
-      </message>
-      <message name="IDS_IOS_INTENTS_PLAY_DINO_GAME_DESCRIPTION" desc="Siri Shortcut description to open dino game in chromium [iOS only]">
-        Opens the Chromium Dino Game.
-      </message>
-      <message name="IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_TITLE" desc="Siri Shortcut for set Chromium as default browser title [iOS only]">
-        Set Chromium As Default Browser
-      </message>
-      <message name="IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_DESCRIPTION" desc="Siri Shortcut description to set Chromium as default browser [iOS only]">
-        Opens the Chromium Setting to set Chromium as Default Browser.
-      </message>
-      <message name="IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_TITLE" desc="Siri Shortcut for view chromium history title [iOS only]">
-        View Your Chromium History
-      </message>
-      <message name="IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_DESCRIPTION" desc="Siri Shortcut description to view Chromium history [iOS only]">
-        Opens your Chromium History Page.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_CHROME_INCOGNITO_TAB_TITLE" desc="Siri Shortcut for open chromium incognito tab title [iOS only]">
-        Open Chromium Incognito Tab
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_CHROME_INCOGNITO_TAB_DESCRIPTION" desc="Siri Shortcut description to open chromium incognito tab [iOS only]">
-        Opens a New Chromium Incognito Tab.
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_PAYMENT_METHODS_TITLE" desc="Siri Shortcut for manage payment methods title [iOS only]">
-        Manage Payment Methods in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_PAYMENT_METHODS_DESCRIPTION" desc="Siri Shortcut description to manage payment methods [iOS only]">
-        Opens The Payment Methods Setting Page in Chromium.
-      </message>
-      <message name="IDS_IOS_INTENTS_RUN_SAFETY_CHECK_TITLE" desc="Siri Shortcut for run safety check title [iOS only]">
-        Run Chromium Safety Check
-      </message>
-      <message name="IDS_IOS_INTENTS_RUN_SAFETY_CHECK_DESCRIPTION" desc="Siri Shortcut description to run safety check [iOS only]">
-        Opens and Runs Safety Check in Chromium.
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_PASSWORDS_TITLE" desc="Siri Shortcut for manage passwords title [iOS only]">
-        Manage Passwords in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_PASSWORDS_DESCRIPTION" desc="Siri Shortcut description to manage passwords [iOS only]">
-        Opens The Password Manager in Chromium.
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_SETTINGS_TITLE" desc="Siri Shortcut for manage settings title [iOS only]">
-        Manage Chromium Settings
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_SETTINGS_DESCRIPTION" desc="Siri Shortcut description to manage settings in chromium [iOS only]">
-        Opens The Settings in Chromium.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_MAGIC_STACK_PAGE_HEADER" desc="Informational header at the top of the safety check page when opened via the Magic Stack">
-        Chromium automatically runs Safety Check every day to keep you safe from data breaches, unsafe websites and more. You can find more about Safety Check in Settings.
-      </message>
-      <message name="IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER" desc="The title of the spotlight item to set Chrome as a default browser. [Length: unlimited] [iOS only]." meaning="Spotlight item title for setting default browser.">
-        Set Chromium as Default Browser
-      </message>
-      <message name="IDS_IOS_CALENDARS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's calendar while the app is in use [Length: unlimited] [iOS only].">
-        This will be used to create events in your Apple Calendar from Chromium and Google Lens.
-      </message>
-      <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC" desc="Description of the feed card sync half sheet. [iOS only]">
-        To personalize your Discover feed and Chromium, turn on sync.
-      </message>
-      <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT" desc="The text of an empty following list.">
-        Visit a site and click Follow in the Chromium menu
-      </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER" desc="Parcel tracking feature setting page footer detailing how the data is shared. [iOS only]">
-        Chromium will detect package tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone.
-      </message>
-      <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO" desc="Button to open a link from an external app in Incognito mode rather than a regular tab. [iOS only]">
-        Open in Chromium Incognito
-      </message>
-      <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]">
-        Open in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE" desc="Shortcut name to open URL in Chrome in Incognito [iOS only].">
-        Open URLs in Chromium in Incognito
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION" desc="Shortcut description to open URLs in Chrome in Incognito [iOS only].">
-        Opens the inputted URLs in Chromium in Incognito.
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION" desc="Siri Shortcut for search in chrome description [iOS only].">
-        Start a search in a new Chromium tab.
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE" desc="Siri Shortcut, spoken suggestion for search in chrome [iOS only].">
-        Search in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
-          Search in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
-        Search in Chromium
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts App's format for displaying the user search phrase input, shown by the Siri Shortcut app when the
-          user is adding or editing a Search in Chromium shortcut[iOS only].">
-          Search ${searchPhrase} in Chromium
-      </message>
-      <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE" desc="Title for the cell to open 'Review data in your account' web page where the user can control all their data data from sync.">
-        Chromium data in your account
-      </message>
-      <message name="IDS_IOS_MINI_MAP_CONSENT_SUBTITLE" desc="The subtitle of the consent screen for mini map [iOS only].">
-        Allow Chromium to use Google Maps to give you directions and local info on detected addresses.
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen.">
-        Chromium will detect tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone. You can change this in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button">
-        To disable Lockdown Mode in Chromium turn it off on your iPad.
-      </message>
-      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE" desc="iPhone summary for lockdown mode info button">
-        To disable Lockdown Mode in Chromium turn it off on your iPhone.
-      </message>
-      <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE" desc="Subtitle of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]">
-        When you're signed in to Chromium, passwords you save will go in your Google Account. To turn this off, <ph name="BEGIN_LINK">BEGIN_LINK</ph>go to settings<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE" desc="The title text of the alert post restore sign-in promo. [iOS only]">
-        Chromium is Signed Out
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE" desc="Info text in the recipient picker view of the password sharing flow explaining why one of the family members is not eligible to be a recipient. [iOS Only]">
-        Your family member can't receive passwords right now. Ask them to update Chromium and sync their passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR" desc="Description on the alert view explaining an error in the password sharing flow. [iOS only]">
-        Your password wasn't shared. Check your internet connection and make sure you're signed in to Chromium. Then, try again.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO.">
-        Your organization turned off the ability to use and save Chromium data in your Google Account. New bookmarks, passwords, and more will be saved only to this device.
-      </message>
-      <message name="IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER" desc="Footer text shown in the address migration prompt to account. [iOS only]">
-          This address is currently saved to Chromium. To use it across Google products, save it in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>.
-      </message>
-      <message name="IDS_IOS_SETTINGS_HEADER_TEXT" desc="Header of the Default Browser Settings page explaining the default browser feature's utility.">
-        You can open links in Chromium automatically by making it your Default Browser App.
-      </message>
-      <message name="IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT" desc="Label of the button that opens the Chrome panel in Settings.app">
-          Open Chromium Settings
-      </message>
-      <message name="IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP" desc="Text of the row indicating the first step of setting the default browser.">
-        1. Open Chromium Settings
-      </message>
-      <message name="IDS_IOS_SETTINGS_SELECT_CHROME_STEP" desc="Text of the row indicating the third step of setting the default browser.">
-        3. Select Chromium
-      </message>
-      <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc = "Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo.">
-        To send this tab to another device, sign in to Chromium on both devices.
-      </message>
-      <message name="IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL" desc = "Text shown when a user with no available target devices attempts to use send-tab-to-self.">
-        To send this tab to another device, sign in to Chromium there.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1" desc="Text of the row indicating the first step of New Menu in What's New. [iOS only]">
-        Open the Chromium Menu
-      </message>
-      <message name="IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE" desc="Use Chrome By Default title displayed in What's New. [iOS only]">
-        Use Chromium By Default
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE" desc="Chrome Actions title displayed in What's New. [iOS only]">
+        Use Chromium Actions on iOS
       </message>
       <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE" desc="Use Chrome By Default subtitle displayed in What's New. [iOS only]">
         You can now use Chromium anytime you browse or tap links in messages, documents, and other apps.
@@ -981,67 +1007,38 @@
       <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2" desc="Text of the row indicating the second step of Passwords In Other Apps in What's New. [iOS only]">
         Select Chromium
       </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE" desc="Chrome Actions title displayed in What's New. [iOS only]">
-        Use Chromium Actions on iOS
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1" desc="Text of the row indicating the first step of New Menu in What's New. [iOS only]">
+        Open the Chromium Menu
       </message>
-      <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE" desc="Notification title for the user's signed-in state [iOS only]">
-      Signed in to Chromium
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_STEP_3" desc="Chromium version of Text of the row indicating the third step to turn on Incognito Lock. [iOS only]">
+        Turn on “Lock Incognito Tabs When You Close Chromium.”
       </message>
-      <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]">
-        Passphrase encryption doesn’t include payment methods and addresses from Google Pay.
-
-To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_SUBTITLE" desc="Chromium version of Incognito Lock subtitle displayed in What's New. [iOS only]">
+        Lock your incognito tabs when you leave Chromium or switch to a different app.
       </message>
-      <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
-        Payment methods and addresses from Google Pay won’t be encrypted. Browsing history from Chromium won’t sync.
-
-Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_STEP_2" desc="Chromium version of Text of the row indicating the second step of of the Mini Maps feature. [iOS only]">
+        Tap “View with Google Maps on Chromium.”
       </message>
-      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL" desc="Instructions for the dialog where the user enters the passphrase.">
-        Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
-
-Your data is encrypted with your passphrase. Enter it to use and save Chromium data in your Google Account.
-      </message>
-      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE" desc="Instructions for the dialog where the user enters the passphrase.">
-        Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
-
-Your data was encrypted with your passphrase on <ph name="TIME">$2<ex>Sept 1, 2012</ex></ph>. Enter it to use and save Chromium data in your Google Account.
-      </message>
-      <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]">
-        If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Share Chromium
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE" desc="The title displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Chromium for iOS
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC" desc="The description displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Download Chromium here.
-      </message>
-      <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION" desc="Explanatory text that appears when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used. [iOS only]">
-          Finish what you were doing in your other open Chromium window.
-      </message>
-      <message name="IDS_IOS_WINDOW_COUNT_CHANGE" is_accessibility_with_no_ui="true" desc="VoiceOver text spoken when the count of visible windows changes -- note: this text is only spoken, never displayed on screen">
-        {count, plural,
-          =1 {Now showing 1 Chromium window}
-          other {Now showing {count} Chromium windows}}
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_TITLE" desc="Chromium version of Mini Maps title displayed in What's New. [iOS only]">
+        Maps in Chromium
       </message>
       <message name="IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE" desc="Title of a section in a table view to inform users about a chrome tip.">
         Chromium Tip
       </message>
-      <message name="IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL" desc="Tag label title displayed for chrome actions spotlight items. [iOS only]">
-        Chromium Actions
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
-        Chromium is out of date, update to the latest version to stay secure.
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
-        Your Chromium is out of date.
-      </message>
       <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3" desc="Third step of the instructions for the Password Manager widget's installation.">
         In the Search Widgets box, enter Chromium
       </message>
-    </messages>
+    <message name="IDS_IOS_WINDOW_COUNT_CHANGE" is_accessibility_with_no_ui="true" desc="VoiceOver text spoken when the count of visible windows changes -- note: this text is only spoken, never displayed on screen">
+        {count, plural,
+          =1 {Now showing 1 Chromium window}
+          other {Now showing {count} Chromium windows}}
+      </message>
+      <message name="IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL" desc="Text shown when a user with no available target devices attempts to use send-tab-to-self.">
+        To send this tab to another device, sign in to Chromium there.
+      </message>
+      <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc="Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo.">
+        To send this tab to another device, sign in to Chromium on both devices.
+      </message>
+      </messages>
   </release>
-</grit>
+</grit>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd
index 33e1056..c229524 100644
--- a/ios/chrome/app/strings/ios_google_chrome_strings.grd
+++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -1,14 +1,12 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+<?xml version='1.0' encoding='UTF-8'?>
+<grit base_dir="." latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
   <!--
   This file contains definition of resources that will be translated for each
   locale.  The strings in this file are specific to iOS.
   -->
   <outputs>
     <output filename="grit/ios_branded_strings.h" type="rc_header">
-      <emit emit_type="prepend"></emit>
+      <emit emit_type="prepend" />
     </output>
     <output filename="ios_google_chrome_strings_af.pak" type="data_package" lang="af" />
     <output filename="ios_google_chrome_strings_am.pak" type="data_package" lang="am" />
@@ -193,6 +191,21 @@
       <message name="IDS_IOS_ABOUT_VERSION_COPYRIGHT" desc="Copyright information on the about pages">
         Copyright <ph name="YEAR">$1</ph> Google LLC. All rights reserved.
       </message>
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_ENTER_PASSPHRASE_MESSAGE" desc="The error message to show in the account table when there is a passphrase error. [iOS only]">
+        To use and save Chrome data in your Google Account, enter your passphrase.
+      </message>
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_HAS_TRUSTED_VAULT_RECOVERABILITY_DEGRADED_FOR_EVERYTHING_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault recoverability degraded for everything. [iOS only]">
+        To use and save Chrome data in your Google Account, verify it's you.
+      </message>
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_NEEDS_TRUSTED_VAULT_KEY_FOR_EVERYTHING_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault key for everything. [iOS only]">
+        To use and save Chrome data in your Google Account, verify it's you.
+      </message>
+      <message name="IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER" desc="The title of the spotlight item to set Chrome as a default browser. [Length: unlimited] [iOS only]." meaning="Spotlight item title for setting default browser.">
+        Set Chrome as Default Browser
+      </message>
+      <message name="IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER" desc="Footer text shown in the address migration prompt to account. [iOS only]">
+          This address is currently saved to Chrome. To use it across Google products, save it in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>.
+      </message>
       <message name="IDS_IOS_AUTOFILL_DESCRIBE_LOCAL_COPY" desc="Text label that describes a Wallet credit card which has been copied to the local Chrome instance. Title case. [Length: 20em] [iOS only]">
         Copied to Chrome
       </message>
@@ -200,6 +213,12 @@
         Chrome has features that help you manage your internet data and how quickly you're able to load webpages.
 <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
+      <message name="IDS_IOS_CALENDARS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's calendar while the app is in use [Length: unlimited] [iOS only].">
+        This will be used to create events in your Apple Calendar from Chrome and Google Lens.
+      </message>
+      <message name="IDS_IOS_CHANGE_COMPROMISED_PASSWORD_DESCRIPTION_BRANDED" desc="Text inside Password Details screen shown when password was compromised. [iOS only]" meaning="Text which explains the user that current password is compromised and it should be changed.">
+          Your password was exposed in a data breach. Google Password Manager recommends changing it now.
+      </message>
       <message name="IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_SIGN_OUT_EVERY_WEBSITE" desc="Footer message in the settings to clear browsing data that allows user to sign out of Chrome to sign out their Google account from all websites. [iOS only]">
         To sign out of your Google Account on all websites, <ph name="BEGIN_LINK">BEGIN_LINK</ph>sign out of Chrome<ph name="END_LINK">END_LINK</ph>.
       </message>
@@ -229,22 +248,15 @@
 
         Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.
       </message>
-      <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT_UNO" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]">
-        Passphrase encryption doesn’t include payment methods and addresses.
-
-To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO_UNO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
-        Payment methods and addresses won’t be encrypted. Browsing history from Chrome won’t sync.
-
-Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_TITLE_CTA_EXPERIMENT_SWITCH" desc="Title of the default browser promotion modal. [iOS only]">
-        Switch to Chrome
-      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_DESCRIPTION" desc="Description of the default browser promotion modal. [iOS only]">
         To make Chrome your default browser, open Settings. Tap Default Browser App, and then select Chrome.
       </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_SUBTITLE_TEXT" desc="Subtitle for the default browser video half screen promo. [iOS only]">
+        Automatically use Chrome when you tap links in messages, documents, and other apps.
+      </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_TITLE_TEXT" desc="Title for the default browser video promo. [iOS only]">
+        Open Chrome From Any App
+      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_LEARN_MORE_INSTRUCTIONS_MESSAGE" desc="Description to user about how to reach the default browser setting in their device. [iOS only]">
           To make Chrome your default:
   1. Open Settings
@@ -254,54 +266,54 @@
       <message name="IDS_IOS_DEFAULT_BROWSER_LEARN_MORE_INSTRUCTIONS_MESSAGE_CTA_EXPERIMENT" desc="Description to user about how to reach the default browser setting in their device. [iOS only]">
         You can now use Chrome any time you tap on links in messages, documents, and other apps.
       </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_DESKTOP_SUBTITLE" desc="The subtitle explaining what the choosen mode (here desktop, the other possible state is mobile) will do in the browser">
-        This means Chrome will request the desktop site every time.
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_TITLE_TEXT" desc="Title for the default browser video promo. [iOS only]">
-        Open Chrome From Any App
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_SUBTITLE_TEXT" desc="Subtitle for the default browser video half screen promo. [iOS only]">
-        Automatically use Chrome when you tap links in messages, documents, and other apps.
-      </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_MOBILE_SUBTITLE" desc="The subtitle explaining what the choosen mode (here mobile, the other possible state is desktop) will do in the browser">
-        This means Chrome will request the mobile site every time.
+      <message name="IDS_IOS_DEFAULT_BROWSER_NON_MODAL_DESCRIPTION" desc="Description for the non-modal default browser promotion banner">
+        Open Chrome anytime you tap on links in other apps
       </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_NON_MODAL_TITLE" desc="Title for the non-modal default browser promotion banner">
         Set Chrome as Default?
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_NON_MODAL_DESCRIPTION" desc="Description for the non-modal default browser promotion banner">
-        Open Chrome anytime you tap on links in other apps
-      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_ALL_TABS_DESCRIPTION" desc="Description of the 'All your tabs' default browser promotion modal. [iOS only]">
         Set Chrome as default to sync your tabs, passwords, and payment info on all your devices
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_STAY_SAFE_TITLE" desc="Title of the 'Stay safe' default browser promotion modal. [iOS only]">
-        Stay Safe With Google Chrome
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_STAY_SAFE_DESCRIPTION" desc="Description of the 'Stay safe' default browser promotion modal. [iOS only]">
-        Use Chrome as your default browser to stay protected from dangerous sites &amp; keep your passwords safe
-      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_BUILT_FOR_IOS_DESCRIPTION" desc="Description of the 'Built for iOS' default browser promotion modal. [iOS only]">
         Use Chrome by default to open links, search from widgets, and autofill passwords in other apps
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_TITLE_TEXT" desc="Title for the default browser video promo. [iOS only]">
-        Set Chrome as your Default Browser
+      <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_STAY_SAFE_DESCRIPTION" desc="Description of the 'Stay safe' default browser promotion modal. [iOS only]">
+        Use Chrome as your default browser to stay protected from dangerous sites &amp; keep your passwords safe
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_3" desc="Text of the row indicating the third step of the instruction to set Chrome as default browser [iOS only]">
-        Select "Chrome."
+      <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_STAY_SAFE_TITLE" desc="Title of the 'Stay safe' default browser promotion modal. [iOS only]">
+        Stay Safe With Google Chrome
+      </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_TITLE_CTA_EXPERIMENT_SWITCH" desc="Title of the default browser promotion modal. [iOS only]">
+        Switch to Chrome
+      </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_APP_SETTINGS" desc="Text in the default browser video the app settings. [iOS only]">
+        Chrome Settings
       </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_2" desc="Text of the row indicating the second step of the instruction to set Chrome as default browser [iOS only]">
         Tap "Chrome" then "Default Browser App."
       </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_3" desc="Text of the row indicating the third step of the instruction to set Chrome as default browser [iOS only]">
+        Select "Chrome."
+      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_SUBTITLE_TEXT" desc="Subtitle for the default browser video promo. [iOS only]">
         Open Chrome Settings in iOS, then tap on "Default Browser App" and select Chrome.
       </message>
-      <message name="IDS_IOS_DISCONNECT_DIALOG_TITLE" desc="The title of the disconnect dialog [Length: 30em].">
-        Sign out of Chrome?
+      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_TITLE_TEXT" desc="Title for the default browser video promo. [iOS only]">
+        Set Chrome as your Default Browser
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_DESKTOP_SUBTITLE" desc="The subtitle explaining what the choosen mode (here desktop, the other possible state is mobile) will do in the browser">
+        This means Chrome will request the desktop site every time.
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_MOBILE_SUBTITLE" desc="The subtitle explaining what the choosen mode (here mobile, the other possible state is desktop) will do in the browser">
+        This means Chrome will request the mobile site every time.
       </message>
       <message name="IDS_IOS_DISCONNECT_DIALOG_SYNCING_FOOTER_INFO_MOBILE" desc="The information text on the disconnect footer describing signout for non-managed accounts [Length: 400em].">
         When you sign out, Chrome won't sync any new data to your Google Account. Data previously synced stays in the account.
       </message>
+      <message name="IDS_IOS_DISCONNECT_DIALOG_TITLE" desc="The title of the disconnect dialog [Length: 30em].">
+        Sign out of Chrome?
+      </message>
       <message name="IDS_IOS_ENTERPRISE_FORCED_SIGNIN_MESSAGE" desc="Text displayed in the popover to inform the user that the browser is managed by Enterprise policies. (Force Sign In) [iOS only]">
           Your organization requires you to sign in to use Chrome.
       </message>
@@ -311,9 +323,15 @@
       <message name="IDS_IOS_ENTERPRISE_FORCED_SIGNIN_SIGNOUT_DIALOG_TITLE" desc="The signout dialog title when forced sign-in is enabled. (Force Sign In) [iOS only]">
         Sign out of Chrome?
       </message>
+      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO.">
+        Your organization turned off the ability to use and save Chrome data in your Google Account. New bookmarks, passwords, and more will be saved only to this device.
+      </message>
       <message name="IDS_IOS_FACE_ID_USAGE_DESCRIPTION" desc="Specifies the reason for using the device's Face ID capabilities.">
         Chrome keeps your sensitive data secure with Face ID.
       </message>
+      <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC" desc="Description of the feed card sync half sheet. [iOS only]">
+        To personalize your Discover feed and Chrome, turn on sync.
+      </message>
       <message name="IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_SUBTITLE" desc="Subtitle of the Default Browser screen on First run page explaining the default browser feature's utility. [iOS only]">
         You can now use Chrome anytime you tap links in messages, documents, and other apps.
       </message>
@@ -335,12 +353,12 @@
       <message name="IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SIGNIN_FORCED" desc="Subtitle of a dialog to sign in to Chrome when sign-in is required because of an enterprise policy. [iOS only]">
         Your organization requires you to sign in to use Chrome.
       </message>
-      <message name="IDS_IOS_FIRST_RUN_SIGNIN_TITLE_SIGNIN_FORCED" desc="In Title Case: Title of a dialog to sign in to Chrome when sign-in is required because of an enterprise policy. [iOS only]">
-        Sign In to Chrome
-      </message>
       <message name="IDS_IOS_FIRST_RUN_SIGNIN_TITLE" desc="Title of the screen suggesting to the user to sign in. [iOS only]">
         Make Chrome Your Own
       </message>
+      <message name="IDS_IOS_FIRST_RUN_SIGNIN_TITLE_SIGNIN_FORCED" desc="In Title Case: Title of a dialog to sign in to Chrome when sign-in is required because of an enterprise policy. [iOS only]">
+        Sign In to Chrome
+      </message>
       <message name="IDS_IOS_FIRST_RUN_UMA_DIALOG_CHECKBOX" desc="Checkbox to accept the metrics reporting consent. Related to IDS_IOS_FIRST_RUN_UMA_DIALOG_EXPLANATION and IDS_IOS_FIRST_RUN_UMA_DIALOG_TITLE. [iOS only]">
         Help Improve Chrome's Features and Performance
         </message>
@@ -369,48 +387,198 @@
       <message name="IDS_IOS_FIRST_RUN_UMA_DIALOG_TITLE" desc="In Title Case: Title of the dialog where users can change their Chrome metrics sharing settings, like usage data. The title communicates that allowing Chrome to see this data can improve Chrome; this happens because we can better invent/improve features based on usage. This appears when they open the Chrome app for the first time on their phone. [iOS only]">
         Make Chrome Better
         </message>
-      <message name="IDS_IOS_FIRST_RUN_WELCOME_SCREEN_SUBTITLE" desc="The subtitle of the welcome screen presented to the user on First Run [iOS only]">
-        Get more done with a simple, secure, and faster-than-ever Google Chrome.
-      </message>
       <message name="IDS_IOS_FIRST_RUN_WELCOME_SCREEN_METRIC_REPORTING" desc="The text is displayed in a footer on the very first screen of Chrome. Make sure 'usage' and 'crash' are translated consistently with the “Usage statistics and crash reports” section of the Chrome Privacy Policy (google.com/chrome/privacy). The ‘Manage’ link opens a dialog to change the corresponding setting. [iOS only]">
         To help improve the app, Chrome sends usage and crash data to Google. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Manage<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_SEARCH_SUGGESTIONS_DETAIL" desc="Feature detail text in the settings for the user to enable/disable, to send omnibox input to the user's default search engine to get additional suggestions. Text related to 'Improve search suggestions' [iOS only]">
-        When you type in the address bar or search box, Chrome sends what you type to your default search engine to get better suggestions. This is off in Incognito.
+      <message name="IDS_IOS_FIRST_RUN_WELCOME_SCREEN_SUBTITLE" desc="The subtitle of the welcome screen presented to the user on First Run [iOS only]">
+        Get more done with a simple, secure, and faster-than-ever Google Chrome.
+      </message>
+      <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT" desc="The text of an empty following list.">
+        Visit a site and click Follow in the Chrome menu
+      </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_DETAIL" desc="Feature detail text in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
+        Shows prompts to sign in to Chrome.
+      </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_TEXT" desc="Feature title in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
+        Allow Chrome Sign-in
+      </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER" desc="Parcel tracking feature setting page footer detailing how the data is shared. [iOS only]">
+        Chrome will detect package tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone.
       </message>
       <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_CHROME_TEXT" desc="Feature title in the settings for the user enable or disable. Related with 'Automatically sends usage statistics and crash reports to Google'. [iOS only]">
         Help Improve Chrome's Features and Performance
       </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_SEARCH_SUGGESTIONS_DETAIL" desc="Feature detail text in the settings for the user to enable/disable, to send omnibox input to the user's default search engine to get additional suggestions. Text related to 'Improve search suggestions' [iOS only]">
+        When you type in the address bar or search box, Chrome sends what you type to your default search engine to get better suggestions. This is off in Incognito.
+      </message>
       <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_CHROME_DATA" desc="Turns off and on all the sync data (like bookmarks, history and others). [iOS only]">
         Sync Your Chrome Data
       </message>
-      <message name="IDS_IOS_INCOGNITO_REAUTH_SET_UP_SYSTEM_DIALOG_REASON" desc="Text for system biometric authentication dialog to explain why authentication is required when the user attempts to enable the setting to protect Incognito tabs with biometric auth. [iOS only]">
-       Let Chrome lock your Incognito tabs.
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_KEEP_USING_YOUR_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to keep using your Chromium data in your Google account. [iOS only]">
+        Keep using the Chrome data in your Google Account
+      </message>
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to making sure your can always use Chromium data in your Google account. [iOS only]">
+        Make sure you can always use the Chrome data in your Google Account
+      </message>
+      <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]">
+        Open in Chrome
+      </message>
+      <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO" desc="Button to open a link from an external app in Incognito mode rather than a regular tab. [iOS only]">
+        Open in Chrome Incognito
       </message>
       <message name="IDS_IOS_INCOGNITO_REAUTH_SETTING_NAME" desc="Name of the Setting to protect Incognito tabs with biometric authentication, e.g. Face ID or Touch ID. [iOS only]">
        Lock Incognito Tabs When You Close Chrome
       </message>
-      <message name="IDS_IOS_INTENTS_ADD_BOOKMARK_TITLE" desc="Shortcut name to add bookmarks to Chrome [iOS only].">
-        Add Bookmarks to Chrome
+      <message name="IDS_IOS_INCOGNITO_REAUTH_SET_UP_SYSTEM_DIALOG_REASON" desc="Text for system biometric authentication dialog to explain why authentication is required when the user attempts to enable the setting to protect Incognito tabs with biometric auth. [iOS only]">
+       Let Chrome lock your Incognito tabs.
       </message>
       <message name="IDS_IOS_INTENTS_ADD_BOOKMARK_DESCRIPTION" desc="Shortcut description to add a bookmark to Chrome [iOS only].">
         Adds the inputted URLs to your bookmarks in Chrome.
       </message>
+      <message name="IDS_IOS_INTENTS_ADD_BOOKMARK_TITLE" desc="Shortcut name to add bookmarks to Chrome [iOS only].">
+        Add Bookmarks to Chrome
+      </message>
       <message name="IDS_IOS_INTENTS_ADD_READING_LIST_ITEM_DESCRIPTION" desc="Shortcut description to add a reading list item to Chrome [iOS only].">
         Adds the inputted URLs to your reading list in Chrome.
       </message>
       <message name="IDS_IOS_INTENTS_ADD_READING_LIST_ITEM_TITLE" desc="Shortcut name to add a reading list item to Chrome [iOS only].">
         Add Reading List Item to Chrome
       </message>
+      <message name="IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_DESCRIPTION" desc="Shortcut description to open Clear Browsing Data dialog in Chrome [iOS only].">
+        Clear Browsing Data in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_TITLE" desc="Siri Shortcut for open Clear Browsing Data dialog [iOS only]">
+        Clear Browsing Data in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_PASSWORDS_DESCRIPTION" desc="Siri Shortcut description to manage passwords [iOS only]">
+        Opens The Password Manager in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_PASSWORDS_TITLE" desc="Siri Shortcut for manage passwords title [iOS only]">
+        Manage Passwords in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_PAYMENT_METHODS_DESCRIPTION" desc="Siri Shortcut description to manage payment methods [iOS only]">
+        Opens The Payment Methods Setting Page in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_PAYMENT_METHODS_TITLE" desc="Siri Shortcut for manage payment methods title [iOS only]">
+        Manage Payment Methods in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_SETTINGS_DESCRIPTION" desc="Siri Shortcut description to manage settings in chrome [iOS only]">
+        Opens The Settings in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_MANAGE_SETTINGS_TITLE" desc="Siri Shortcut for manage settings title [iOS only]">
+        Manage Chrome Settings
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_BOOKMARKS_DESCRIPTION" desc="Shortcut description to open bookmarks in chrome [iOS only].">
+        Opens the Chrome bookmarks.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_BOOKMARKS_TITLE" desc="Siri Shortcut for open bookmarks title [iOS only]">
+        See Chrome Bookmarks
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_CHROME_INCOGNITO_TAB_DESCRIPTION" desc="Siri Shortcut description to open chrome incognito tab [iOS only]">
+        Opens a New Chrome Incognito Tab.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_CHROME_INCOGNITO_TAB_TITLE" desc="Siri Shortcut for open chrome incognito tab title [iOS only]">
+        Open Chrome Incognito Tab
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION" desc="Shortcut description to open URLs in Chrome in Incognito [iOS only].">
+        Opens the inputted URLs in Google Chrome in Incognito.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE" desc="Shortcut name to open URL in Chrome in Incognito [iOS only].">
+        Open URLs in Chrome in Incognito
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_LATEST_TAB_DESCRIPTION" desc="Siri Shortcut description to latest tab in chromium [iOS only]">
+        Open My Latest Tab in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_LATEST_TAB_TITLE" desc="Siri Shortcut for open latest tab title [iOS only]">
+        Open My Latest Tab in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_LENS_DESCRIPTION" desc="Siri Shortcut description to open Lens(Visual Search) [iOS only]">
+        Search Visuals in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_LENS_TITLE" desc="Siri Shortcut for opening Lens (Visual Search) [iOS only]">
+        Search Visuals in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_NEW_TAB_DESCRIPTION" desc="Siri Shortcut description to open new tab in chromium [iOS only]">
+        Opens a New Tab in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_NEW_TAB_TITLE" desc="Siri Shortcut for open new tab title [iOS only]">
+        Open New Tab in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_READING_LIST_DESCRIPTION" desc="Shortcut description to open reading list in chrome [iOS only].">
+        Opens the Chrome Reading List.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_READING_LIST_TITLE" desc="Siri Shortcut for open reading list title [iOS only]">
+        See Chrome Reading List
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_RECENT_TABS_DESCRIPTION" desc="Shortcut description to open recent tabs in chrome [iOS only].">
+        Opens the Chrome Recent Tabs.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_RECENT_TABS_TITLE" desc="Siri Shortcut for open recent tabs title [iOS only]">
+        See Chrome Recent Tabs
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_TAB_GRID_DESCRIPTION" desc="Shortcut description to open tab grid in chrome [iOS only].">
+        Opens the Chrome Tab Grid.
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_TAB_GRID_TITLE" desc="Siri Shortcut for open tab grid title [iOS only]">
+        Visit the Tab Grid in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_PLAY_DINO_GAME_DESCRIPTION" desc="Siri Shortcut description to open dino game in chrome [iOS only]">
+        Opens the Chrome Dino Game.
+      </message>
+      <message name="IDS_IOS_INTENTS_PLAY_DINO_GAME_TITLE" desc="Siri Shortcut for play dino game title [iOS only]">
+        Play Chrome Dino Game
+      </message>
+      <message name="IDS_IOS_INTENTS_RUN_SAFETY_CHECK_DESCRIPTION" desc="Siri Shortcut description to run safety check [iOS only]">
+        Opens and Runs Safety Check in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_RUN_SAFETY_CHECK_TITLE" desc="Siri Shortcut for run safety check title [iOS only]">
+        Run Chrome Safety Check
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION" desc="Siri Shortcut for search in chrome description [iOS only].">
+        Start a search in a new Chrome tab.
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE" desc="Siri Shortcut, spoken suggestion for search in chrome [iOS only].">
+        Search in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts App's format for displaying the user search phrase input, shown by the Siri Shortcut app when the           user is adding or editing a Search in Chrome shortcut[iOS only].">
+          Search ${searchPhrase} in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
+        Search in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
+          Search in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_DESCRIPTION" desc="Siri Shortcut description for searching with voice [iOS only]">
+        Search With Voice in Chrome.
+      </message>
+      <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_TITLE" desc="Siri Shortcut for search with voice title [iOS only]">
+        Search With Voice in Chrome
+      </message>
+      <message name="IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_DESCRIPTION" desc="Siri Shortcut description to set chrome as default browser [iOS only]">
+        Opens the Chrome Setting to set Chrome as Default Browser.
+      </message>
+      <message name="IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_TITLE" desc="Siri Shortcut for set chrome as default browser title [iOS only]">
+        Set Chrome As Default Browser
+      </message>
+      <message name="IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_DESCRIPTION" desc="Siri Shortcut description to view Chrome history [iOS only]">
+        Opens your Chrome History Page.
+      </message>
+      <message name="IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_TITLE" desc="Siri Shortcut for view chrome history title [iOS only]">
+        View Your Chrome History
+      </message>
       <message name="IDS_IOS_LOCATION_WHEN_IN_USE_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's location information while the app is in use [Length: unlimited] [iOS only].">
           Chrome shares your location with sites you allow.
       </message>
+      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button">
+        To disable Lockdown Mode in Chrome turn it off on your iPad.
+      </message>
+      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE" desc="iPhone summary for lockdown mode info button">
+        To disable Lockdown Mode in Chrome turn it off on your iPhone.
+      </message>
       <message name="IDS_IOS_LOGIN_ERROR_AUTHENTICATING_HOSTED" desc="Couldn't sign in because hosted account is used.">
         Your account does not work on Google Chrome. Please contact your domain administrator or use a regular Google Account to sign in.
       </message>
-      <message name="IDS_IOS_MANAGE_SYNC_DATA_FROM_CHROME_SYNC_TITLE" desc="Title for the cell to open 'Data from Chrome sync' web page where the user can control all their data data from sync.">
-        Data from Chrome sync
-      </message>
       <message name="IDS_IOS_MANAGED_DISCONNECT_DIALOG_INFO_UNITY" desc="Message explaining that signing out of a managed account will clear all the Chrome data. [Length: 200em, may be line wrapped to multiple lines at run time.] [iOS only].">
         Because you're signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN">$1<ex>google.com</ex></ph>, your Chrome data will be deleted from this device. Your data will remain in your Google Account.
       </message>
@@ -429,12 +597,31 @@
       <message name="IDS_IOS_MANAGED_SYNC_WITH_USER_POLICY_SUBTITLE" desc="The subtitle of the Sync with a managed account dialog when User Policy is enabled (alternative to IDS_IOS_MANAGED_SIGNIN_SUBTITLE). [300em][iOS only]">
         Your organization <ph name="DOMAIN">$1<ex>doe.com</ex></ph> will have access to your Chrome data, bookmarks, history, passwords and other settings you store in this account. When you sign out, your data will be cleared from this device.  However, your data will remain stored in your managed Google Account and be available to your organization. Your organization can also set user policies specific to that account that can change the behavior of Chrome.
       </message>
+      <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE" desc="Title for the cell to open 'Review data in your account' web page where the user can control all their data data from sync.">
+        Chrome data in your account
+      </message>
+      <message name="IDS_IOS_MANAGE_SYNC_DATA_FROM_CHROME_SYNC_TITLE" desc="Title for the cell to open 'Data from Chrome sync' web page where the user can control all their data data from sync.">
+        Data from Chrome sync
+      </message>
+      <message name="IDS_IOS_MINI_MAP_CONSENT_SUBTITLE" desc="The subtitle of the consent screen for mini map [iOS only].">
+        Allow Chrome to use Google Maps to give you directions and local info on detected addresses.
+      </message>
       <message name="IDS_IOS_MINI_MAP_FOOTER_STRING" desc="The text of the footer string displayed at the bottom of the minimap [iOS only].">
         Chrome uses Google Maps to give you directions and local info on detected addresses.
       </message>
       <message name="IDS_IOS_MINI_MAP_IPH_TITLE" desc="The text of the iph string displayed on Mini Map screen on first trigger [iOS only].">
         Chrome detects addresses and uses Google Maps to give you directions and local info.
       </message>
+      <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
+        Payment methods and addresses from Google Pay won’t be encrypted. Browsing history from Chrome won’t sync.
+
+Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO_UNO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
+        Payment methods and addresses won’t be encrypted. Browsing history from Chrome won’t sync.
+
+Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
       <message name="IDS_IOS_OPTIONS_IMPORT_DATA_HEADER" desc="The header for the Import Data settings screen. [400em]">
         <ph name="USER_EMAIL1">$1<ex>johndoe@gmail.com</ex></ph> was using Chrome and left bookmarks, passwords, and other settings on this device.
       </message>
@@ -444,6 +631,15 @@
       <message name="IDS_IOS_OPTIONS_TAB_PICKUP_SCREEN_FOOTER" desc="Footer for the screen setting displaying tab suggestion settings.">
         Suggestions are based on your browsing activity on your other devices. To get suggestions, sign in to Chrome on all your devices.
       </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Share Chrome
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC" desc="The description displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Download Chrome here.
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE" desc="The title displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Chrome for iOS
+      </message>
       <message name="IDS_IOS_PAGE_INFO_CHROME_PAGE_LABEL" desc="Label to display at the top of the site information screen when the page you are on is a Google Chrome page.">
         Google Chrome Page
       </message>
@@ -466,18 +662,63 @@
       <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_DESCRIPTION" desc="Description for the alert dialog warning the user they are about to hide the parcel tracking module.">
           If you hide "<ph name="Module_Name"><ex>Package Tracking</ex>$1</ph>", Chrome will no longer auto-track your future packages and will delete all your past package tracking data.
       </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen.">
+        Chrome will detect tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone. You can change this in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>.
+      </message>
       <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_TITLE" desc="Text for the title string of the parcel tracking opt-in half-sheet screen.">
         Let Chrome help you track your packages
       </message>
+      <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE" desc="Subtitle of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]">
+        When you're signed in to Chrome, passwords you save will go in your Google Account. To turn this off, <ph name="BEGIN_LINK">BEGIN_LINK</ph>go to settings<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_TITLE" desc="Title of the password bottom sheet. [iOS only]">
+          Google Password Manager
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR" desc="Description of the password check cell, explaining that Password Check failed. [iOS only]" meaning="Password Check failed due to some error.">
+        Google Password Manager can't check your passwords.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_NO_PASSWORDS" desc="Description text for when password check cannot be run because the user has no saved passwords">
+        No saved passwords. Google Password Manager can check your passwords when you save them.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_OFFLINE" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has no internet connection and can't check passwords.">
+        Google Password Manager couldn't check your passwords. Try checking your internet connection.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_OTHER" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="Password check failed due to specific reason (out of memory).">
+        Google Password Manager couldn't check all passwords. Try again later.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_QUOTA_LIMIT" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has more passwords than allowed for check.">
+        Google Password Manager couldn't check all passwords. Try again tomorrow.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_QUOTA_LIMIT_VISIT_GOOGLE" desc="Text with link inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has more passwords than allowed for check but he can check in Google Account.">
+        Google Password Manager couldn't check all passwords. Try again tomorrow or <ph name="BEGIN_LINK">BEGIN_LINK</ph>check passwords in your Google Account.<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_SIGNED_OUT" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user is not signed in and can't check passwords.">
+        Google Password Manager can check your passwords when you sign in with your Google Account.
+      </message>
+      <message name="IDS_IOS_PASSWORD_CHECK_ERROR" desc="Description of the password check cell, explaining that Password Check failed. [iOS only]" meaning="Password Check failed due to some error.">
+        Chrome can't check your passwords
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE" desc="Info text in the recipient picker view of the password sharing flow explaining why one of the family members is not eligible to be a recipient. [iOS Only]">
+        Your family member can't receive passwords right now. Ask them to update Chrome and sync their passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR" desc="Description on the alert view explaining an error in the password sharing flow. [iOS only]">
+        Your password wasn't shared. Check your internet connection and make sure you're signed in to Chrome. Then, try again.
+      </message>
       <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_PROMO_TITLE" desc="The text of the title for the post restore default browser promo.">
         Make Chrome Your Default Browser?
       </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE" desc="The title text of the alert post restore sign-in promo. [iOS only]">
+        Chrome is Signed Out
+      </message>
       <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_PERMISSION_REDIRECT_ALERT_MESSAGE" desc="The description that argues why push notification permission is necessary for price tracking.">
           Chrome notifications are currently turned off in your device settings.
       </message>
       <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_PERMISSION_REDIRECT_ALERT_TITLE" desc="The title for the UIAlert that redirects the user to iOS' application settings for Chrome.">
           Allow Chrome notifications to get price drop alerts
       </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_FRIENDLIER_SUMMARY_PROXY" desc="Friendlier summary for Privacy Safe Browsing standard protection mode.">
+        Protects against sites, downloads, and extensions that are known to be dangerous. When you visit a site, Chrome sends an obfuscated portion of the URL to Google through a privacy server that hides your IP address. If a site does something suspicious, full URLs and bits of page content are also sent.
+      </message>
       <message name="IDS_IOS_PRODUCT_NAME" desc="The Chrome application name">
         Google Chrome
       </message>
@@ -493,6 +734,12 @@
       <message name="IDS_IOS_REMOVE_ACCOUNT_CONFIRMATION_MESSAGE" desc="Dialog message to emphasize the effects of removing an account.">
       This account and any unsaved data will be removed from Chrome and other Google apps on this device.
       </message>
+      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
+        Your Chrome is out of date.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
+        Chrome is out of date, update to the latest version to stay secure.
+      </message>
       <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_BULLET_TWO" desc="Second bullet point under the Safe Browsing enhanced protection mode">
         Keeps you safe on Chrome and may be used to improve your security in other Google apps when you are signed in.
       </message>
@@ -508,15 +755,12 @@
       <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_BULLET_TWO_PROXY" desc="Second bullet point under the Safe Browsing standard protection mode.">
         Sends an obfuscated portion of the URL to Google through a privacy server that hides your IP address. If a site tries to steal your password, or when you download a harmful file, Chrome may also send URLs, including bits of page content, to Google.
       </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_FRIENDLIER_SUMMARY_PROXY" desc="Friendlier summary for Privacy Safe Browsing standard protection mode.">
-        Protects against sites, downloads, and extensions that are known to be dangerous. When you visit a site, Chrome sends an obfuscated portion of the URL to Google through a privacy server that hides your IP address. If a site does something suspicious, full URLs and bits of page content are also sent.
+      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_FRIENDLIER_SUMMARY" desc="Friendlier summary for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
+        When you use a password, Chrome warns you if it has been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.
       </message>
       <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_SUMMARY" desc="Summary for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
         Chrome periodically checks your passwords against lists that have been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_FRIENDLIER_SUMMARY" desc="Friendlier summary for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
-        When you use a password, Chrome warns you if it has been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.
-      </message>
       <message name="IDS_IOS_SAFE_MODE_NAMED_TWEAKS_FOUND" desc="The message indicating a 3rd party tweak has been found that is known to crash Chrome.  After the ':', we will list the names of the libraries. [Length: 140em]">
         Some add-ons cause Chrome to crash. Please uninstall:
       </message>
@@ -550,12 +794,78 @@
       <message name="IDS_IOS_SCANNER_MULTIPLE_FOREGROUND_APPS_ALERT_DETAIL" desc="Body of a modal dialog shown when the user tries to open the QR scanner in a Split View mode, when the camera is unavailable. [Length: 140em] [iOS only]">
         Google Chrome can't use your camera in Split View mode
       </message>
+      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER" desc="Disclaimer telling users what will happen to their passwords">
+        Your password will be saved in your Google Account (<ph name="EMAIL">$1<ex>example@gmail.com</ex></ph>).
+      </message>
+      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_BRANDED" desc="Disclaimer telling users what will happen to their passwords">
+        Your password will be saved to Google Password Manager for <ph name="EMAIL">$1<ex>example@gmail.com</ex></ph>.
+      </message>
+      <message name="IDS_IOS_SETTINGS_HEADER_TEXT" desc="Header of the Default Browser Settings page explaining the default browser feature's utility.">
+        You can open links in Chrome automatically by making it your Default Browser App.
+      </message>
+      <message name="IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT" desc="Label of the button that opens the Chrome panel in Settings.app">
+          Open Chrome Settings
+      </message>
+      <message name="IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP" desc="Text of the row indicating the first step of setting the default browser.">
+        1. Open Chrome Settings
+      </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SHORTENED_STEP_2" desc="Text of the row indicating the second step of shortened instruction of turning on iOS auto-fill from Chrome password manager [iOS only]">
+        Select Chrome
+      </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_STEP_4" desc="Text of the row indicating the fourth step of full instruction of of turning on iOS auto-fill from Chrome password manager [iOS only]">
+        4. Select Chrome
+      </message>
       <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SUBTITLE_IPAD" desc="The subtitle of the view that teaches users to turn on iOS auto-fill from Chrome password manager for iPad [iPadOS only]">
         You can use the passwords you saved to Google Password Manager in other apps on your iPad.
       </message>
       <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SUBTITLE_IPHONE" desc="The subtitle of the view that teaches users to turn on iOS auto-fill from Chrome password manager for iPhone [iOS only]">
         You can use the passwords you saved to Google Password Manager in other apps on your iPhone.
       </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_MAGIC_STACK_PAGE_HEADER" desc="Informational header at the top of the safety check page when opened via the Magic Stack">
+        Chrome automatically runs Safety Check every day to keep you safe from data breaches, unsafe websites and more. You can find more about Safety Check in Settings.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_PAGE_HEADER" desc="Informational header at the top of the safety check page">
+        Chrome can help keep you safe from data breaches, unsafe websites and more.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_BETA_DESC" desc="Description text for when the app is on Beta and unable to run the check">
+        Not supported on Chrome Beta
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_CANARY_DESC" desc="Description text for when the app is on Canary and unable to run the check">
+        Not supported on Chrome Canary
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_DESCRIPTION" desc="Description text on the update element describing what the update check does.">
+        Keep Chrome up to date
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_ERROR_DESC" desc="Description text for when updates can't be checked because there was an issue with the check">
+        Chrome can't check for updates
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_ERROR_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="An error occured while performing the update check.">
+        Chrome couldn't check for updates. Try again later.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OFFLINE_DESC" desc="Description text for when updates can't be checked because the user is offline">
+        Offline, Chrome can't check for updates
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OFFLINE_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has no internet connection and can't check for updates.">
+        Chrome couldn't check for updates. Try checking your internet connection.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OUT_OF_DATE_DESC" desc="Description text for when Chrome is out of date">
+        Google Chrome is out of date
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UNABLE_DESC" desc="Description text for when the device is not able to update to the newest version">
+        Chrome can't update
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UNABLE_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The device is not able to update to the newest version.">
+        Chrome is out of date. If no update is available in the <ph name="BEGIN_LINK">BEGIN_LINK</ph>App Store<ph name="END_LINK">END_LINK</ph>, it's possible that your device doesn't support new versions of Chrome anymore.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UP_TO_DATE_DESC" desc="Description text for when Chrome is up to date">
+        Google Chrome is up to date
+      </message>
+      <message name="IDS_IOS_SETTINGS_SELECT_CHROME_STEP" desc="Text of the row indicating the third step of setting the default browser.">
+        3. Select Chrome
+      </message>
+      <message name="IDS_IOS_SETTINGS_SIGNIN_DISABLED_POPOVER_TEXT" desc="This text is shown when sign-in is disabled by policy and the user taps on the info pop-over of the 'Sign in to Chrome' button in the settings. [iOS only]">
+        Your organization requires you to stay signed out of Chrome.
+      </message>
       <message name="IDS_IOS_SET_UP_LIST_ALL_SET_DESCRIPTION" desc="Description for the Set Up List item that tells the user they have completed all tasks.">
         You'll now get the most out of Chrome on your device.
       </message>
@@ -598,28 +908,60 @@
       <message name="IDS_IOS_SHORT_PRODUCT_NAME" desc="The Chrome application short name">
         Chrome
       </message>
+      <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE" desc="Notification title for the user's signed-in state [iOS only]">
+      Signed in to Chrome
+      </message>
       <message name="IDS_IOS_SIGNIN_SHEET_LABEL_FOR_WEB_SIGNIN" desc="This string is on a sign-in page, after the user taps to sign in to a website with their Google Account. It offers to sign the user in to both the website and to Chrome with the account. It highlights the overarching user benefit of signing in to Chrome (access to data from other devices like bookmarks, passwords, history, settings, etc.). We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account. The tone should be informative and lightweight. [iOS only]">
         Sign in to this site and Chrome to get your bookmarks and more on all your devices.
       </message>
-      <message name="IDS_IOS_SIGN_IN_TO_CHROME_SETTING_TITLE" desc="The title for the setting item to Sign in to Chrome [iOS only]">
-        Sign in to Chrome
-      </message>
       <message name="IDS_IOS_SIGNOUT_DIALOG_MESSAGE_WITH_NOT_SAVED_DATA" desc="Body of a dialog shown to users when they sign out of Chrome but Chrome hasn't synced some data yet, which is permanently deleted if the user proceeds. Related to IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_BUTTON and IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_TITLE [iOS only].">
         Some of your Chrome data hasn't been saved in your Google Account yet.
         Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.
       </message>
-      <message name="IDS_IOS_SIGNOUT_DIALOG_TITLE_WITH_SYNCING_ACCOUNT" desc="The signout dialog title. This dialog is used when the user have a gmail account and sync is turned on [iOS only].">
-        Choose whether to clear your Chrome data from this device or keep it
-      </message>
       <message name="IDS_IOS_SIGNOUT_DIALOG_TITLE_WITHOUT_SYNCING_ACCOUNT" desc="Title of sign-out button, warning the user they’ll have access to less features once signed out. [iOS only].">
         Some Chrome features won’t be available anymore.
       </message>
+      <message name="IDS_IOS_SIGNOUT_DIALOG_TITLE_WITH_SYNCING_ACCOUNT" desc="The signout dialog title. This dialog is used when the user have a gmail account and sync is turned on [iOS only].">
+        Choose whether to clear your Chrome data from this device or keep it
+      </message>
       <message name="IDS_IOS_SIGNOUT_DIALOG_TITLE_WITH_SYNCING_MANAGED_ACCOUNT" desc="The signout dialog title. This dialog is used when the user have a managed account (other than gmail account) [iOS only].">
         Your account is managed by <ph name="HOSTED_DOMAIN">$1<ex>google.com</ex></ph>, so your Chrome data will be cleared from this device
       </message>
+      <message name="IDS_IOS_SIGN_IN_TO_CHROME_SETTING_TITLE" desc="The title for the setting item to Sign in to Chrome [iOS only]">
+        Sign in to Chrome
+      </message>
+      <message name="IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL" desc="Tag label title displayed for chrome actions spotlight items. [iOS only]">
+        Chrome Actions
+      </message>
+      <message name="IDS_IOS_SUGGESTED_STRONG_PASSWORD_HINT_DISPLAYING_EMAIL" desc="Text shown alongside a suggested password to tell user that generated passwords are recorded by chrome. [Length: unlimited] [iOS only]">
+            You won't need to remember this password. It will be saved to Google Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]">
+        Passphrase encryption doesn’t include payment methods and addresses from Google Pay.
+
+To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT_UNO" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]">
+        Passphrase encryption doesn’t include payment methods and addresses.
+
+To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL" desc="Instructions for the dialog where the user enters the passphrase.">
+        Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
+
+Your data is encrypted with your passphrase. Enter it to use and save Chrome data in your Google Account.
+      </message>
+      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE" desc="Instructions for the dialog where the user enters the passphrase.">
+        Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
+
+Your data was encrypted with your passphrase on <ph name="TIME">$2<ex>Sept 1, 2012</ex></ph>. Enter it to use and save Chrome data in your Google Account.
+      </message>
       <message name="IDS_IOS_SYNC_LOGIN_INFO_OUT_OF_DATE_WITH_UNO" desc="Body of a message that is shown certain error states, such as when account was removed in another app or the password was changed. This string follows the heading &quot;Verify it's you&quot;, and we want the user to tap on the button &quot;Verify&quot;. We are asking the user to sign back in to their Google Account, so that the user can sign back into Chrome and resume access to their Chrome data (such as bookmarks, passwords, history, settings, and more). The tone should be helpful and instructive.">
         Keep using the Chrome data in your Google Account.
       </message>
+      <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]">
+        If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
+      </message>
       <message name="IDS_IOS_TAB_SWITCHER_NO_TABS_TO_SYNC_PROMO" desc="The title of the paragraph IDS_OPEN_TABS_NO_SESSION_INSTRUCTIONS_IOS. The paragraph explains that tabs opened on other devices where the user is signed in will appear here, in the Tab Switcher. [iOS only]">
         Use Chrome Everywhere
       </message>
@@ -638,6 +980,15 @@
       <message name="IDS_IOS_TRANSLATE_SETTING_DESCRIPTION" desc="Description for the Translate setting. [Length: unlimited] [iOS only]">
         When this feature is turned on, Chrome will offer to translate pages written in other languages using Google Translate. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
+      <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION" desc="Explanatory text that appears when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used. [iOS only]">
+          Finish what you were doing in your other open Chrome window.
+      </message>
+      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_SUBTITLE_SYNC_DISABLED" desc="This string is on a sign-in page, shown several weeks after the user has installed Chrome. It explains the overarching user benefit of signing in (access to bookmarks, passwords, history, settings, etc.). However, we introduce a caveat, because the user has a managed account (such as Enterprise); this means that, depending on their organization's settings, the user might not be able to save all types of data in their Google Account. We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account.">
+        Get the most out of Chrome.
+      </message>
+      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_TITLE" desc="Title of the screen suggesting to the user to sign in. The user may see this screen when Chrome is opened, but only several weeks after installation.">
+        Make Chrome Your Own
+      </message>
       <message name="IDS_IOS_UPGRADE_AVAILABLE" desc="Text to inform the user of the presence of a new version of the application">
         Chrome just got better! A new version is available.
       </message>
@@ -647,339 +998,14 @@
       <message name="IDS_IOS_USER_POLICY_NOTIFICATION_TITLE" desc="The title of the User Policy notification dialog. [iOS only] [300em]">
         Chrome now supports user policies for your managed account
       </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SHORTENED_STEP_2" desc="Text of the row indicating the second step of shortened instruction of turning on iOS auto-fill from Chrome password manager [iOS only]">
-        Select Chrome
-      </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_STEP_4" desc="Text of the row indicating the fourth step of full instruction of of turning on iOS auto-fill from Chrome password manager [iOS only]">
-        4. Select Chrome
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_PAGE_HEADER" desc="Informational header at the top of the safety check page">
-        Chrome can help keep you safe from data breaches, unsafe websites and more.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_DESCRIPTION" desc="Description text on the update element describing what the update check does.">
-        Keep Chrome up to date
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_CANARY_DESC" desc="Description text for when the app is on Canary and unable to run the check">
-        Not supported on Chrome Canary
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_BETA_DESC" desc="Description text for when the app is on Beta and unable to run the check">
-        Not supported on Chrome Beta
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UP_TO_DATE_DESC" desc="Description text for when Chrome is up to date">
-        Google Chrome is up to date
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OUT_OF_DATE_DESC" desc="Description text for when Chrome is out of date">
-        Google Chrome is out of date
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OFFLINE_DESC" desc="Description text for when updates can't be checked because the user is offline">
-        Offline, Chrome can't check for updates
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_OFFLINE_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has no internet connection and can't check for updates.">
-        Chrome couldn't check for updates. Try checking your internet connection.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_ERROR_DESC" desc="Description text for when updates can't be checked because there was an issue with the check">
-        Chrome can't check for updates
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_ERROR_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="An error occured while performing the update check.">
-        Chrome couldn't check for updates. Try again later.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UNABLE_DESC" desc="Description text for when the device is not able to update to the newest version">
-        Chrome can't update
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_UNABLE_INFO" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The device is not able to update to the newest version.">
-        Chrome is out of date. If no update is available in the <ph name="BEGIN_LINK">BEGIN_LINK</ph>App Store<ph name="END_LINK">END_LINK</ph>, it's possible that your device doesn't support new versions of Chrome anymore.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SIGNIN_DISABLED_POPOVER_TEXT" desc="This text is shown when sign-in is disabled by policy and the user taps on the info pop-over of the 'Sign in to Chrome' button in the settings. [iOS only]">
-        Your organization requires you to stay signed out of Chrome.
-      </message>
-      <message name="IDS_IOS_SUGGESTED_STRONG_PASSWORD_HINT_DISPLAYING_EMAIL" desc="Text shown alongside a suggested password to tell user that generated passwords are recorded by chrome. [Length: unlimited] [iOS only]">
-            You won't need to remember this password. It will be saved to Google Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_TITLE" desc="Title of the password bottom sheet. [iOS only]">
-          Google Password Manager
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECK_ERROR" desc="Description of the password check cell, explaining that Password Check failed. [iOS only]" meaning="Password Check failed due to some error.">
-        Chrome can't check your passwords
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR" desc="Description of the password check cell, explaining that Password Check failed. [iOS only]" meaning="Password Check failed due to some error.">
-        Google Password Manager can't check your passwords.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_NO_PASSWORDS" desc="Description text for when password check cannot be run because the user has no saved passwords">
-        No saved passwords. Google Password Manager can check your passwords when you save them.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_OFFLINE" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has no internet connection and can't check passwords.">
-        Google Password Manager couldn't check your passwords. Try checking your internet connection.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_SIGNED_OUT" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user is not signed in and can't check passwords.">
-        Google Password Manager can check your passwords when you sign in with your Google Account.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_QUOTA_LIMIT" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has more passwords than allowed for check.">
-        Google Password Manager couldn't check all passwords. Try again tomorrow.
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_QUOTA_LIMIT_VISIT_GOOGLE" desc="Text with link inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="The user has more passwords than allowed for check but he can check in Google Account.">
-        Google Password Manager couldn't check all passwords. Try again tomorrow or <ph name="BEGIN_LINK">BEGIN_LINK</ph>check passwords in your Google Account.<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ERROR_OTHER" desc="Text inside popover which is shown when the user wants to see detailed information about the error. [iOS only]" meaning="Password check failed due to specific reason (out of memory).">
-        Google Password Manager couldn't check all passwords. Try again later.
+      <message name="IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE" desc="Use Chrome By Default title displayed in What's New. [iOS only]">
+        Use Chrome By Default
       </message>
       <message name="IDS_IOS_WHATS_NEW_APP_SETTINGS" desc="Text of the row indicating the step of opening the app settings. [iOS only]">
         Go to Chrome Settings.
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_APP_SETTINGS" desc="Text in the default browser video the app settings. [iOS only]">
-        Chrome Settings
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_STEP_3" desc="Text of the row indicating the third step to turn on Incognito Lock. [iOS only]">
-        Turn on “Lock Incognito Tabs When You Close Chrome.”
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_SUBTITLE" desc="Incognito Lock subtitle displayed in What's New. [iOS only]">
-        Lock your incognito tabs when you leave Chrome or switch to a different app.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_TITLE" desc="Mini Maps title displayed in What's New. [iOS only]">
-        Maps in Chrome
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_STEP_2" desc="Text of the row indicating the second step of of the Mini Maps feature. [iOS only]">
-        Tap “View with Google Maps on Chrome.”
-      </message>
-      <message name="IDS_IOS_CHANGE_COMPROMISED_PASSWORD_DESCRIPTION_BRANDED" desc="Text inside Password Details screen shown when password was compromised. [iOS only]" meaning="Text which explains the user that current password is compromised and it should be changed.">
-          Your password was exposed in a data breach. Google Password Manager recommends changing it now.
-      </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_DETAIL" desc="Feature detail text in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
-        Shows prompts to sign in to Chrome.
-      </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_TEXT" desc="Feature title in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
-        Allow Chrome Sign-in
-      </message>
-      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER" desc="Disclaimer telling users what will happen to their passwords">
-        Your password will be saved in your Google Account (<ph name="EMAIL">$1<ex>example@gmail.com</ex></ph>).
-      </message>
-      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_BRANDED" desc="Disclaimer telling users what will happen to their passwords">
-        Your password will be saved to Google Password Manager for <ph name="EMAIL">$1<ex>example@gmail.com</ex></ph>.
-      </message>
-      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_SUBTITLE_SYNC_DISABLED" desc="This string is on a sign-in page, shown several weeks after the user has installed Chrome. It explains the overarching user benefit of signing in (access to bookmarks, passwords, history, settings, etc.). However, we introduce a caveat, because the user has a managed account (such as Enterprise); this means that, depending on their organization's settings, the user might not be able to save all types of data in their Google Account. We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account.">
-        Get the most out of Chrome.
-      </message>
-      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_TITLE" desc="Title of the screen suggesting to the user to sign in. The user may see this screen when Chrome is opened, but only several weeks after installation.">
-        Make Chrome Your Own
-      </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_ENTER_PASSPHRASE_MESSAGE" desc="The error message to show in the account table when there is a passphrase error. [iOS only]">
-        To use and save Chrome data in your Google Account, enter your passphrase.
-      </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_NEEDS_TRUSTED_VAULT_KEY_FOR_EVERYTHING_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault key for everything. [iOS only]">
-        To use and save Chrome data in your Google Account, verify it's you.
-      </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_HAS_TRUSTED_VAULT_RECOVERABILITY_DEGRADED_FOR_EVERYTHING_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault recoverability degraded for everything. [iOS only]">
-        To use and save Chrome data in your Google Account, verify it's you.
-      </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_KEEP_USING_YOUR_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to keep using your Chromium data in your Google account. [iOS only]">
-        Keep using the Chrome data in your Google Account
-      </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_CHROME_DATA_MESSAGE" desc="The error message in the identity error info bar related to making sure your can always use Chromium data in your Google account. [iOS only]">
-        Make sure you can always use the Chrome data in your Google Account
-      </message>
-      <message name="IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_TITLE" desc="Siri Shortcut for open Clear Browsing Data dialog [iOS only]">
-        Clear Browsing Data in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_DESCRIPTION" desc="Shortcut description to open Clear Browsing Data dialog in Chrome [iOS only].">
-        Clear Browsing Data in Chrome.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_READING_LIST_TITLE" desc="Siri Shortcut for open reading list title [iOS only]">
-        See Chrome Reading List
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_READING_LIST_DESCRIPTION" desc="Shortcut description to open reading list in chrome [iOS only].">
-        Opens the Chrome Reading List.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_BOOKMARKS_TITLE" desc="Siri Shortcut for open bookmarks title [iOS only]">
-        See Chrome Bookmarks
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_BOOKMARKS_DESCRIPTION" desc="Shortcut description to open bookmarks in chrome [iOS only].">
-        Opens the Chrome bookmarks.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_RECENT_TABS_TITLE" desc="Siri Shortcut for open recent tabs title [iOS only]">
-        See Chrome Recent Tabs
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_RECENT_TABS_DESCRIPTION" desc="Shortcut description to open recent tabs in chrome [iOS only].">
-        Opens the Chrome Recent Tabs.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_TAB_GRID_TITLE" desc="Siri Shortcut for open tab grid title [iOS only]">
-        Visit the Tab Grid in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_TAB_GRID_DESCRIPTION" desc="Shortcut description to open tab grid in chrome [iOS only].">
-        Opens the Chrome Tab Grid.
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_TITLE" desc="Siri Shortcut for search with voice title [iOS only]">
-        Search With Voice in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_WITH_VOICE_DESCRIPTION" desc="Siri Shortcut description for searching with voice [iOS only]">
-        Search With Voice in Chrome.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_LATEST_TAB_TITLE" desc="Siri Shortcut for open latest tab title [iOS only]">
-        Open My Latest Tab in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_LATEST_TAB_DESCRIPTION" desc="Siri Shortcut description to latest tab in chromium [iOS only]">
-        Open My Latest Tab in Chrome.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_LENS_TITLE" desc="Siri Shortcut for opening Lens (Visual Search) [iOS only]">
-        Search Visuals in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_LENS_DESCRIPTION" desc="Siri Shortcut description to open Lens(Visual Search) [iOS only]">
-        Search Visuals in Chrome.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_NEW_TAB_TITLE" desc="Siri Shortcut for open new tab title [iOS only]">
-        Open New Tab in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_NEW_TAB_DESCRIPTION" desc="Siri Shortcut description to open new tab in chromium [iOS only]">
-        Opens a New Tab in Chrome.
-      </message>
-      <message name="IDS_IOS_INTENTS_PLAY_DINO_GAME_TITLE" desc="Siri Shortcut for play dino game title [iOS only]">
-        Play Chrome Dino Game
-      </message>
-      <message name="IDS_IOS_INTENTS_PLAY_DINO_GAME_DESCRIPTION" desc="Siri Shortcut description to open dino game in chrome [iOS only]">
-        Opens the Chrome Dino Game.
-      </message>
-      <message name="IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_TITLE" desc="Siri Shortcut for set chrome as default browser title [iOS only]">
-        Set Chrome As Default Browser
-      </message>
-      <message name="IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_DESCRIPTION" desc="Siri Shortcut description to set chrome as default browser [iOS only]">
-        Opens the Chrome Setting to set Chrome as Default Browser.
-      </message>
-      <message name="IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_TITLE" desc="Siri Shortcut for view chrome history title [iOS only]">
-        View Your Chrome History
-      </message>
-      <message name="IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_DESCRIPTION" desc="Siri Shortcut description to view Chrome history [iOS only]">
-        Opens your Chrome History Page.
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_CHROME_INCOGNITO_TAB_TITLE" desc="Siri Shortcut for open chrome incognito tab title [iOS only]">
-        Open Chrome Incognito Tab
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_CHROME_INCOGNITO_TAB_DESCRIPTION" desc="Siri Shortcut description to open chrome incognito tab [iOS only]">
-        Opens a New Chrome Incognito Tab.
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_PAYMENT_METHODS_TITLE" desc="Siri Shortcut for manage payment methods title [iOS only]">
-        Manage Payment Methods in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_PAYMENT_METHODS_DESCRIPTION" desc="Siri Shortcut description to manage payment methods [iOS only]">
-        Opens The Payment Methods Setting Page in Chrome.
-      </message>
-      <message name="IDS_IOS_INTENTS_RUN_SAFETY_CHECK_TITLE" desc="Siri Shortcut for run safety check title [iOS only]">
-        Run Chrome Safety Check
-      </message>
-      <message name="IDS_IOS_INTENTS_RUN_SAFETY_CHECK_DESCRIPTION" desc="Siri Shortcut description to run safety check [iOS only]">
-        Opens and Runs Safety Check in Chrome.
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_PASSWORDS_TITLE" desc="Siri Shortcut for manage passwords title [iOS only]">
-        Manage Passwords in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_PASSWORDS_DESCRIPTION" desc="Siri Shortcut description to manage passwords [iOS only]">
-        Opens The Password Manager in Chrome.
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_SETTINGS_TITLE" desc="Siri Shortcut for manage settings title [iOS only]">
-        Manage Chrome Settings
-      </message>
-      <message name="IDS_IOS_INTENTS_MANAGE_SETTINGS_DESCRIPTION" desc="Siri Shortcut description to manage settings in chrome [iOS only]">
-        Opens The Settings in Chrome.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_MAGIC_STACK_PAGE_HEADER" desc="Informational header at the top of the safety check page when opened via the Magic Stack">
-        Chrome automatically runs Safety Check every day to keep you safe from data breaches, unsafe websites and more. You can find more about Safety Check in Settings.
-      </message>
-      <message name="IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER" desc="The title of the spotlight item to set Chrome as a default browser. [Length: unlimited] [iOS only]." meaning="Spotlight item title for setting default browser.">
-        Set Chrome as Default Browser
-      </message>
-      <message name="IDS_IOS_CALENDARS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's calendar while the app is in use [Length: unlimited] [iOS only].">
-        This will be used to create events in your Apple Calendar from Chrome and Google Lens.
-      </message>
-      <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC" desc="Description of the feed card sync half sheet. [iOS only]">
-        To personalize your Discover feed and Chrome, turn on sync.
-      </message>
-      <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT" desc="The text of an empty following list.">
-        Visit a site and click Follow in the Chrome menu
-      </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER" desc="Parcel tracking feature setting page footer detailing how the data is shared. [iOS only]">
-        Chrome will detect package tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone.
-      </message>
-      <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO" desc="Button to open a link from an external app in Incognito mode rather than a regular tab. [iOS only]">
-        Open in Chrome Incognito
-      </message>
-      <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]">
-        Open in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE" desc="Shortcut name to open URL in Chrome in Incognito [iOS only].">
-        Open URLs in Chrome in Incognito
-      </message>
-      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION" desc="Shortcut description to open URLs in Chrome in Incognito [iOS only].">
-        Opens the inputted URLs in Google Chrome in Incognito.
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION" desc="Siri Shortcut for search in chrome description [iOS only].">
-        Start a search in a new Chrome tab.
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE" desc="Siri Shortcut, spoken suggestion for search in chrome [iOS only].">
-        Search in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
-          Search in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE" desc="Siri Shortcut for search in chrome title [iOS only].">
-        Search in Chrome
-      </message>
-      <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts App's format for displaying the user search phrase input, shown by the Siri Shortcut app when the
-          user is adding or editing a Search in Chrome shortcut[iOS only].">
-          Search ${searchPhrase} in Chrome
-      </message>
-      <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE" desc="Title for the cell to open 'Review data in your account' web page where the user can control all their data data from sync.">
-        Chrome data in your account
-      </message>
-      <message name="IDS_IOS_MINI_MAP_CONSENT_SUBTITLE" desc="The subtitle of the consent screen for mini map [iOS only].">
-        Allow Chrome to use Google Maps to give you directions and local info on detected addresses.
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen.">
-        Chrome will detect tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone. You can change this in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button">
-        To disable Lockdown Mode in Chrome turn it off on your iPad.
-      </message>
-      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE" desc="iPhone summary for lockdown mode info button">
-        To disable Lockdown Mode in Chrome turn it off on your iPhone.
-      </message>
-      <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE" desc="Subtitle of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]">
-        When you're signed in to Chrome, passwords you save will go in your Google Account. To turn this off, <ph name="BEGIN_LINK">BEGIN_LINK</ph>go to settings<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE" desc="The title text of the alert post restore sign-in promo. [iOS only]">
-        Chrome is Signed Out
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE" desc="Info text in the recipient picker view of the password sharing flow explaining why one of the family members is not eligible to be a recipient. [iOS Only]">
-        Your family member can't receive passwords right now. Ask them to update Chrome and sync their passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR" desc="Description on the alert view explaining an error in the password sharing flow. [iOS only]">
-        Your password wasn't shared. Check your internet connection and make sure you're signed in to Chrome. Then, try again.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO.">
-        Your organization turned off the ability to use and save Chrome data in your Google Account. New bookmarks, passwords, and more will be saved only to this device.
-      </message>
-      <message name="IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER" desc="Footer text shown in the address migration prompt to account. [iOS only]">
-          This address is currently saved to Chrome. To use it across Google products, save it in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>.
-      </message>
-      <message name="IDS_IOS_SETTINGS_HEADER_TEXT" desc="Header of the Default Browser Settings page explaining the default browser feature's utility.">
-        You can open links in Chrome automatically by making it your Default Browser App.
-      </message>
-      <message name="IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT" desc="Label of the button that opens the Chrome panel in Settings.app">
-          Open Chrome Settings
-      </message>
-      <message name="IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP" desc="Text of the row indicating the first step of setting the default browser.">
-        1. Open Chrome Settings
-      </message>
-      <message name="IDS_IOS_SETTINGS_SELECT_CHROME_STEP" desc="Text of the row indicating the third step of setting the default browser.">
-        3. Select Chrome
-      </message>
-      <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc = "Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo.">
-        To send this tab to another device, sign in to Chrome on both devices.
-      </message>
-      <message name="IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL" desc = "Text shown when a user with no available target devices attempts to use send-tab-to-self.">
-        To send this tab to another device, sign in to Chrome there.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1" desc="Text of the row indicating the first step of New Menu in What's New. [iOS only]">
-        Open the Chrome Menu
-      </message>
-      <message name="IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE" desc="Use Chrome By Default title displayed in What's New. [iOS only]">
-        Use Chrome By Default
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE" desc="Chrome Actions title displayed in What's New. [iOS only]">
+        Use Chrome Actions on iOS
       </message>
       <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE" desc="Use Chrome By Default subtitle displayed in What's New. [iOS only]">
         You can now use Chrome anytime you browse or tap links in messages, documents, and other apps.
@@ -987,67 +1013,38 @@
       <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2" desc="Text of the row indicating the second step of Passwords In Other Apps in What's New. [iOS only]">
         Select Chrome
       </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE" desc="Chrome Actions title displayed in What's New. [iOS only]">
-        Use Chrome Actions on iOS
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1" desc="Text of the row indicating the first step of New Menu in What's New. [iOS only]">
+        Open the Chrome Menu
       </message>
-      <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE" desc="Notification title for the user's signed-in state [iOS only]">
-      Signed in to Chrome
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_STEP_3" desc="Text of the row indicating the third step to turn on Incognito Lock. [iOS only]">
+        Turn on “Lock Incognito Tabs When You Close Chrome.”
       </message>
-      <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]">
-        Passphrase encryption doesn’t include payment methods and addresses from Google Pay.
-
-To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_SUBTITLE" desc="Incognito Lock subtitle displayed in What's New. [iOS only]">
+        Lock your incognito tabs when you leave Chrome or switch to a different app.
       </message>
-      <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
-        Payment methods and addresses from Google Pay won’t be encrypted. Browsing history from Chrome won’t sync.
-
-Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_STEP_2" desc="Text of the row indicating the second step of of the Mini Maps feature. [iOS only]">
+        Tap “View with Google Maps on Chrome.”
       </message>
-      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL" desc="Instructions for the dialog where the user enters the passphrase.">
-        Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
-
-Your data is encrypted with your passphrase. Enter it to use and save Chrome data in your Google Account.
-      </message>
-      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE" desc="Instructions for the dialog where the user enters the passphrase.">
-        Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
-
-Your data was encrypted with your passphrase on <ph name="TIME">$2<ex>Sept 1, 2012</ex></ph>. Enter it to use and save Chrome data in your Google Account.
-      </message>
-      <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]">
-        If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Share Chrome
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE" desc="The title displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Chrome for iOS
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC" desc="The description displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Download Chrome here.
-      </message>
-      <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION" desc="Explanatory text that appears when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used. [iOS only]">
-          Finish what you were doing in your other open Chrome window.
-      </message>
-      <message name="IDS_IOS_WINDOW_COUNT_CHANGE" is_accessibility_with_no_ui="true" desc="VoiceOver text spoken when the count of visible windows changes -- note: this text is only spoken, never displayed on screen">
-        {count, plural,
-          =1 {Now showing 1 Chrome window}
-          other {Now showing {count} Chrome windows}}
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_TITLE" desc="Mini Maps title displayed in What's New. [iOS only]">
+        Maps in Chrome
       </message>
       <message name="IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE" desc="Title of a section in a table view to inform users about a chrome tip.">
         Chrome Tip
       </message>
-      <message name="IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL" desc="Tag label title displayed for chrome actions spotlight items. [iOS only]">
-        Chrome Actions
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
-        Chrome is out of date, update to the latest version to stay secure.
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
-        Your Chrome is out of date.
-      </message>
       <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3" desc="Third step of the instructions for the Password Manager widget's installation.">
         In the Search Widgets box, enter Chrome
       </message>
-    </messages>
+    <message name="IDS_IOS_WINDOW_COUNT_CHANGE" is_accessibility_with_no_ui="true" desc="VoiceOver text spoken when the count of visible windows changes -- note: this text is only spoken, never displayed on screen">
+        {count, plural,
+          =1 {Now showing 1 Chrome window}
+          other {Now showing {count} Chrome windows}}
+      </message>
+      <message name="IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL" desc="Text shown when a user with no available target devices attempts to use send-tab-to-self.">
+        To send this tab to another device, sign in to Chrome there.
+      </message>
+      <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc="Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo.">
+        To send this tab to another device, sign in to Chrome on both devices.
+      </message>
+      </messages>
   </release>
-</grit>
+</grit>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 29b46c6..67e7b89 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1,14 +1,12 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<grit base_dir="." latest_public_release="0" current_release="1"
-      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+<?xml version='1.0' encoding='UTF-8'?>
+<grit base_dir="." latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
   <!--
   This file contains definition of resources that will be translated for each
   locale.  The strings in this file are specific to iOS.
   -->
   <outputs>
     <output filename="grit/ios_strings.h" type="rc_header">
-      <emit emit_type="prepend"></emit>
+      <emit emit_type="prepend" />
     </output>
     <output filename="ios_strings_ar.pak" type="data_package" lang="ar" />
     <output filename="ios_strings_bg.pak" type="data_package" lang="bg" />
@@ -146,6 +144,9 @@
       <message name="IDS_IOS_ACCNAME_CLEAR_TEXT" desc="The accessibility label for the clear text button in the location bar [Length: unlimited].">
         Clear Text
       </message>
+      <message name="IDS_IOS_ACCNAME_LENS" desc="The accessibility label for the Lens visual search button in the location bar [Length: unlimited]">
+        Lens Visual Search
+      </message>
       <message name="IDS_IOS_ACCNAME_RELOAD" desc="The accessibility label for the reload button [Length: unlimited] [iOS only]">
         Reload
       </message>
@@ -155,9 +156,6 @@
       <message name="IDS_IOS_ACCNAME_VOICE_SEARCH" desc="The accessibility label for the voice search button in the location bar [Length: unlimited]">
         Voice Search
       </message>
-      <message name="IDS_IOS_ACCNAME_LENS" desc="The accessibility label for the Lens visual search button in the location bar [Length: unlimited]">
-        Lens Visual Search
-      </message>
       <message name="IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_SCROLL_BUTTON" desc="Title of the button to scroll the confirmation screen when it is too small to show everything at once. [Length: 20m] [iOS only]">
         More
       </message>
@@ -176,29 +174,32 @@
       <message name="IDS_IOS_ACCOUNT_IDENTITY_CHOOSER_CHOOSE_ACCOUNT" desc="Label at the top an account list. The user has to select one of the accounts to sign-in. [Length: 20em] [iOS only]">
         Choose an Account
       </message>
-      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_TITLE" desc="Title on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
-        Turn On Sync?
+      <message name="IDS_IOS_ACCOUNT_STORAGE_OPT_IN_LABEL" desc="Title for the switch item in Settings that controls whether signed-in users can save/autofill passwords to/from their account. [Length: 25em] [iOS only]">
+        Use and Save Passwords in Your Google Account
       </message>
-      <message name="IDS_IOS_SYNC_PROMO_TURN_ON_SYNC" desc="Button that the user can press if they want to turn on sync with this account. [iOS only]">
-        Turn On Sync
+      <message name="IDS_IOS_ACCOUNT_STORAGE_OPT_IN_SUBLABEL" desc="Title for the switch item in Settings that controls whether signed-in users can save/autofill passwords to/from their account. [Length: unlimited] [iOS only]">
+        When on, passwords are saved in <ph name="ACCOUNT">$1<ex>foo@gmail.com</ex></ph>. When off, passwords are saved only to this device.
       </message>
-      <message name="IDS_IOS_SIGNIN_PROMO_TURN_ON" desc="Button that the user can press if they want to sign-in to the browser. [iOS only]">
-        Turn On
+      <message name="IDS_IOS_ACCOUNT_TABLE_ENTER_PASSPHRASE_MESSAGE" desc="The error message to show in the account table when there is a passphrase error. [iOS only]">
+        Sync is not working. To start sync enter your passphrase.
       </message>
-      <message name="IDS_IOS_SIGNIN_PROMO_SIGNIN_WITH_UNO" desc="Button that the user can press if they want to sign-in in the browser. [iOS only]">
-        Sign In
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_ENTER_PASSPHRASE_BUTTON" desc="Label for the button to open the passphrase dialog from the accounts table. [iOS only]">
+        Enter Passphrase…
       </message>
-      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
-        Sync your passwords, history &amp; more on all devices
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_HAS_TRUSTED_VAULT_RECOVERABILITY_DEGRADED_FOR_PASSWORDS_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault recoverability degraded for passwords. [iOS only]">
+        To make sure you can always use the passwords in your Google Account, verify it's you.
       </message>
-      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE_WITHOUT_PASSWORDS" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
-        Sync your bookmarks, history &amp; more on all devices
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_NEEDS_TRUSTED_VAULT_KEY_FOR_PASSWORDS_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault key for passwords. [iOS only]">
+        To use and save passwords in your Google Account, verify it's you.
       </message>
-      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_MANAGED_TITLE" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user when sync types are limited (i.e. managed by policies). [iOS only]">
-        To sync and personalize across devices, turn on sync.
+      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_VERIFY_ITS_YOU_BUTTON" desc="Label for the button to show the trusted vault reauthentication dialog. [iOS only]">
+        Verify It's You…
       </message>
-      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_SUBTITLE" desc="Subtitle of the sync description section on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
-        Google may use your history to personalize Search and other Google services.
+      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_ADD_ACCOUNT" desc="Title of the button to add an account [Length: 15m] [iOS only]">
+        Add Account
+      </message>
+      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_OK_BUTTON" desc="Title of the button to validate the user consent [Length: 15m] [iOS only]">
+        Yes, I'm In
       </message>
       <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SETTINGS" desc="Explanation text on the sync consent dialog to explain the user they can customize sync settings. [iOS only]">
         You can always choose what to sync in <ph name="BEGIN_LINK">BEGIN_LINK</ph>settings<ph name="END_LINK">END_LINK</ph>.
@@ -212,11 +213,29 @@
       <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_MANAGED_SETTINGS_POST_RESTORE_PROMO" desc="Explanation text on the sync consent dialog to explain the user they can customize sync settings when sync types are limited. This is presented to the user after device restore from backup. [iOS only]">
         Your sync settings will be restored based on your last backup. <ph name="BEGIN_LINK">BEGIN_LINK</ph>See What You Can Sync<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_ADD_ACCOUNT" desc="Title of the button to add an account [Length: 15m] [iOS only]">
-        Add Account
+      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_MANAGED_TITLE" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user when sync types are limited (i.e. managed by policies). [iOS only]">
+        To sync and personalize across devices, turn on sync.
       </message>
-      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_OK_BUTTON" desc="Title of the button to validate the user consent [Length: 15m] [iOS only]">
-        Yes, I'm In
+      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_SUBTITLE" desc="Subtitle of the sync description section on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
+        Google may use your history to personalize Search and other Google services.
+      </message>
+      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
+        Sync your passwords, history &amp; more on all devices
+      </message>
+      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE_WITHOUT_PASSWORDS" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
+        Sync your bookmarks, history &amp; more on all devices
+      </message>
+      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_TITLE" desc="Title on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
+        Turn On Sync?
+      </message>
+      <message name="IDS_IOS_ADDRESSES_NOT_ENCRYPTED_DIALOG_TEXT" desc="Text of a dialog shown to users when they turn on the ability to use and save addresses in their Google Account. This is shown to users who encrypt their data with their own passphrase in order to explain that addresses they will save in the future will not be encrypted. [iOS only]">
+        Addresses aren't encrypted with your passphrase. This lets you use them in other Google services.
+      </message>
+      <message name="IDS_IOS_ADDRESS_BAR_SETTING" desc="Tag label title displayed in the address bar setting section. [iOS only]">
+        Address Bar
+      </message>
+      <message name="IDS_IOS_ADDRESS_BAR_TIP_NOTE" desc="Tag label footer note displayed in the address bar setting section. [iOS only]">
+        You can also touch and hold the address bar to change the position.
       </message>
       <message name="IDS_IOS_ADD_CREDIT_CARD_INVALID_CARD_NUMBER_ALERT" desc="The title of the alert view displaying invalid card number when a user enters invalid card number for the new credit card to save. [iOS only]">
           Invalid Card Number
@@ -227,6 +246,12 @@
       <message name="IDS_IOS_ADD_CREDIT_CARD_INVALID_NICKNAME_ALERT" desc="The title of the alert view displaying invalid nickname when a user enters an invalid nickname for the new credit card to save. [iOS only]">
           Invalid Card Nickname
       </message>
+      <message name="IDS_IOS_ADD_CREDIT_CARD_VIEW_CONTROLLER_DISMISS_ALERT_TITLE" desc="Text displayed on an alert as a title whenever trying to dismiss a presented 'add new credit card view' with pending changes.">
+          Are you sure you want to discard this new card?
+      </message>
+      <message name="IDS_IOS_ADD_PASSWORD" desc="Text on a button which allows the user to save a password for a website in their Password Manager.">
+        Add Password...
+      </message>
       <message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON" desc="Alert button title to ask if the user really wants to cancel sign-in and sync. This button would let the user return to the sync settings, and let them choose again.">
         Continue Setup
       </message>
@@ -236,18 +261,6 @@
       <message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE" desc="Alert title to ask if the user really wants to cancel sign-in and sync.">
         Cancel Sync? You can turn on sync anytime in Settings.
       </message>
-      <message name="IDS_IOS_SHOW_ALL_PASSWORDS" desc="Button title in the keyboard accessory bar to open the list of all saved passwords. [Length: 20em] [iOS only]">
-        Show All...
-      </message>
-      <message name="IDS_IOS_SUGGESTED_STRONG_PASSWORD" desc="Text that shows a suggested generated password at user's request [Length: unlimited] [iOS only]">
-        Use Strong Password:
-      </message>
-      <message name="IDS_IOS_USE_SUGGESTED_PASSWORD" desc="Button title in a suggested password popup asking user if they want to use the suggested password. [Length: 20em] [iOS only]">
-        Use Suggested Password
-      </message>
-      <message name="IDS_IOS_USE_SUGGESTED_STRONG_PASSWORD" desc="Button title in a suggested password popup asking user if they want to use the suggested password. [Length: 20em] [iOS only]">
-        Use Password
-      </message>
       <message name="IDS_IOS_APPLICATION_SHORTCUT_INCOGNITOSEARCH_TITLE" desc="Message when opening a New Incognito Search from springboard force touch static shortcuts. [Length: unlimited] [iOS only]." meaning="3D Touch entry to create a new Incognito tab.">
        Incognito Search
       </message>
@@ -266,6 +279,12 @@
       <message name="IDS_IOS_APP_LAUNCHER_OPEN_APP_BUTTON_LABEL" desc="Label of a button to open an application. [Length: 10em] [iOS only]">
         Open
       </message>
+      <message name="IDS_IOS_APP_SWITCHER_SCENE_TITLE" desc="Shown under the Application title in the OS-level app switcher with the number of tabs in the window">
+        {count, plural,
+          =0 {{domain}}
+          =1 {{domain} and 1 other}
+          other {{domain} and {count} others}}
+      </message>
       <message name="IDS_IOS_AUTOFILL_ACCNAME_HIDE_KEYBOARD" desc="The accessible name for the hide keyboard button in the keyboard accessory shown when filling out forms. [Length: unlimited] [iOS only]">
         Hide keyboard
       </message>
@@ -284,15 +303,25 @@
       <message name="IDS_IOS_AUTOFILL_ADDRESS2" desc="Title of the field of a profile address representing the second line of the address. [Length: 15em] [iOS only]">
         Address 2
       </message>
-      <message name="IDS_IOS_AUTOFILL_DEPENDENT_LOCALITY" desc="Title of the field of a profile address representing the neighborhood. A dependent locality is a subunit of a locality, where a 'locality' is roughly equivalent to a city. Examples of dependent localities include inner-city districts and suburbs. Only used in certain countries, like Brazil and Mexico, for example. [Length: 15em] [iOS only]">
-        Neighborhood
+      <message name="IDS_IOS_AUTOFILL_ADDRESS_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of address suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has address suggestions available for autofill purposes. According to the number of available addresses, the string goes from singular to plural. [iOS only]">
+        {count, plural,
+           =1 {{count} saved address available above your keyboard.}
+           other {{count} saved addresses available above your keyboard.}}
       </message>
       <message name="IDS_IOS_AUTOFILL_ADMIN_LEVEL2" desc="Title of the field of a profile address representing the administrative area level 2. A sub-division of a state, e.g. a Municipio in Brazil or Mexico. [Length: 15em] [iOS only]">
         Municipality
       </message>
+      <message name="IDS_IOS_AUTOFILL_AUTOCOMPLETE_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of autocomplete suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that only has autocomplete suggestions available for autofill purposes. According to the number of available autocomplete suggestions, the string goes from singular to plural. [iOS only]">
+        {count, plural,
+           =1 {{count} saved autocomplete suggestion available above your keyboard.}
+           other {{count} saved autocomplete suggestions available above your keyboard.}}
+      </message>
       <message name="IDS_IOS_AUTOFILL_CARDHOLDER" desc="Title of the field representing the full name of a credit card holder. [Length: 15em] [iOS only]">
         Name on Card
       </message>
+      <message name="IDS_IOS_AUTOFILL_CARDHOLDER_NAME" desc="Tile of the field representing the cardholder name of a credit card. [Length: 15em] [iOS only]">
+        Cardholder Name
+      </message>
       <message name="IDS_IOS_AUTOFILL_CARD_NUMBER" desc="Title of the field representing the number (PAN) on a credit card. [Length: 10em] [iOS only]">
         Card Number
       </message>
@@ -305,18 +334,21 @@
       <message name="IDS_IOS_AUTOFILL_COUNTRY" desc="Title of the field of a profile address representing the country/nation of the address. [Length: 15em] [iOS only]">
         Country
       </message>
+      <message name="IDS_IOS_AUTOFILL_DEPENDENT_LOCALITY" desc="Title of the field of a profile address representing the neighborhood. A dependent locality is a subunit of a locality, where a 'locality' is roughly equivalent to a city. Examples of dependent localities include inner-city districts and suburbs. Only used in certain countries, like Brazil and Mexico, for example. [Length: 15em] [iOS only]">
+        Neighborhood
+      </message>
       <message name="IDS_IOS_AUTOFILL_DIALOG_PLACEHOLDER_CARD_HOLDER_NAME" desc="The placeholder text for credit card holder name text field to add new credit card. [iOS only]" meaning="Name of a person">
           Name
       </message>
       <message name="IDS_IOS_AUTOFILL_DIALOG_PLACEHOLDER_CARD_NUMBER" desc="The placeholder text for credit card number in the payments card unmask dialog. [iOS only]">
           Number
       </message>
-      <message name="IDS_IOS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_MONTH" desc="The placeholder text for credit card expiration month in the payments card unmask dialog. [Length: 4em] [iOS only]">
-        MM
-      </message>
       <message name="IDS_IOS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRATION_YEAR" desc="The placeholder text for credit card expiration year in the payments card unmask dialog. [iOS only]">
           YYYY
       </message>
+      <message name="IDS_IOS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_MONTH" desc="The placeholder text for credit card expiration month in the payments card unmask dialog. [Length: 4em] [iOS only]">
+        MM
+      </message>
       <message name="IDS_IOS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR" desc="The placeholder text for credit card expiration year in the payments card unmask dialog. [Length: 4em] [iOS only]">
         YY
       </message>
@@ -326,9 +358,6 @@
       <message name="IDS_IOS_AUTOFILL_EDIT_ADDRESS" desc="Title for the view in Settings for editing an Autofill profile address. [Length: 20em] [iOS only]">
         Edit Address
       </message>
-      <message name="IDS_IOS_AUTOFILL_SELECT_COUNTRY" desc="Title for the edit view of country selection when saving a new address profile. [Length: 20em] [iOS only]">
-        Country
-      </message>
       <message name="IDS_IOS_AUTOFILL_EDIT_CREDIT_CARD" desc="Title for the view in Settings for editing an Autofill profile address. [Length: 20em] [iOS only]">
         Edit Credit Card
       </message>
@@ -341,33 +370,54 @@
       <message name="IDS_IOS_AUTOFILL_EXP_YEAR" desc="Title of the field representing the expiration year of a credit card. [Length: 15em] [iOS only]">
         Expiration Year
       </message>
-      <message name="IDS_IOS_AUTOFILL_NICKNAME" desc="Title of the field representing the user defined nickname of a credit card. [Length: 15em] [iOS only]">
-        Card Nickname
-      </message>
-      <message name="IDS_IOS_AUTOFILL_CARDHOLDER_NAME" desc="Tile of the field representing the cardholder name of a credit card. [Length: 15em] [iOS only]">
-        Cardholder Name
-      </message>
-      <message name="IDS_IOS_AUTOFILL_SAVE_CARD" desc="Title for the view for saving a credit card. [Length: 15em] [iOS only]">
-        Save Card
-      </message>
-      <message name="IDS_IOS_AUTOFILL_SAVE_ELLIPSIS" desc="Title for the button that presents the View for Saving a credit card. The ellipsis indicate that a following action (the presentation) will take place. [Length: 10em] [iOS only]">
-        Save...
-      </message>
-      <message name="IDS_IOS_AUTOFILL_SAVE_CARD_BADGE_HINT" desc="Accessibility Hint for the Save Card button which presents the current options to Save a Card. This is spoken by VoiceOver.   [Length:Unlimited] [iOS only]">
-        Options to Save Card
+      <message name="IDS_IOS_AUTOFILL_FULLNAME" desc="Title of the field of a profile address representing the full name of the addressee. [Length: 15em] [iOS only]">
+        Full Name
       </message>
       <message name="IDS_IOS_AUTOFILL_HONORIFIC_PREFIX" desc="Title of the field of a profile address representing the title that can be auto-filled by Chrome. A 'Title' field in a web form could be a prefix like Ms., Mx., or Dr. or a position held, like Captain or Rabbi. [Length: 15em] [iOS only]" meaning="Honorific">
         Title
       </message>
-      <message name="IDS_IOS_AUTOFILL_FULLNAME" desc="Title of the field of a profile address representing the full name of the addressee. [Length: 15em] [iOS only]">
-        Full Name
-      </message>
       <message name="IDS_IOS_AUTOFILL_INPUT_BAR_DONE" desc="The title for the button above the keyboard used to dismiss it. [6em]">
         Done
       </message>
+      <message name="IDS_IOS_AUTOFILL_NICKNAME" desc="Title of the field representing the user defined nickname of a credit card. [Length: 15em] [iOS only]">
+        Card Nickname
+      </message>
+      <message name="IDS_IOS_AUTOFILL_PASSWORD_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of password suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has password suggestions available for autofill purposes. According to the number of available passwords, the string goes from singular to plural. [iOS only]">
+        {count, plural,
+           =1 {{count} saved password available above your keyboard.}
+           other {{count} saved passwords available above your keyboard.}}
+      </message>
+      <message name="IDS_IOS_AUTOFILL_PAYMENT_METHOD_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of payment method suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has payment method suggestions available for autofill purposes. According to the number of available payment methods, the string goes from singular to plural. [iOS only]">
+        {count, plural,
+           =1 {{count} saved payment method available above your keyboard.}
+           other {{count} saved payment methods available above your keyboard.}}
+      </message>
       <message name="IDS_IOS_AUTOFILL_PHONE" desc="Title of the field of a profile address representing the phone number of the addressee. [Length: 15em] [iOS only]">
         Phone
       </message>
+      <message name="IDS_IOS_AUTOFILL_PROFILE_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of profile suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has profile suggestions available for autofill purposes. According to the number of available profiles, the string goes from singular to plural. [iOS only]">
+        {count, plural,
+           =1 {{count} saved profile available above your keyboard.}
+           other {{count} saved profiles available above your keyboard.}}
+      </message>
+      <message name="IDS_IOS_AUTOFILL_REAUTH_REASON" desc="Message explaining that the reason why we are requiring the user to re-authenticate is to be able to use the password. This is shown by iOS in the Touch ID reauthentication system dialogue, right under the OS string 'Touch ID for $BROWSER_NAME'. [CHAR_LIMIT=22]">
+        Use password
+      </message>
+      <message name="IDS_IOS_AUTOFILL_SAVE_CARD" desc="Title for the view for saving a credit card. [Length: 15em] [iOS only]">
+        Save Card
+      </message>
+      <message name="IDS_IOS_AUTOFILL_SAVE_CARD_BADGE_HINT" desc="Accessibility Hint for the Save Card button which presents the current options to Save a Card. This is spoken by VoiceOver.   [Length:Unlimited] [iOS only]">
+        Options to Save Card
+      </message>
+      <message name="IDS_IOS_AUTOFILL_SAVE_ELLIPSIS" desc="Title for the button that presents the View for Saving a credit card. The ellipsis indicate that a following action (the presentation) will take place. [Length: 10em] [iOS only]">
+        Save...
+      </message>
+      <message name="IDS_IOS_AUTOFILL_SELECT_COUNTRY" desc="Title for the edit view of country selection when saving a new address profile. [Length: 20em] [iOS only]">
+        Country
+      </message>
+      <message name="IDS_IOS_AUTOFILL_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to use the password, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to view or copy the password from a settings page. [CHAR_LIMIT=100]">
+        To use passwords, you must first set a passcode on your device.
+      </message>
       <message name="IDS_IOS_AUTOFILL_STATE" desc="Title of the field of a profile address representing the state/county/district/oblast of the address. [Length: 15em] [iOS only]">
         State / County
       </message>
@@ -377,69 +427,6 @@
       <message name="IDS_IOS_AUTOFILL_ZIP" desc="Title of the field of a profile address representing the postal code of the address. [Length: 15em] [iOS only]">
         Zip Code
       </message>
-      <message name="IDS_IOS_AUTOFILL_REAUTH_REASON" desc="Message explaining that the reason why we are requiring the user to re-authenticate is to be able to use the password. This is shown by iOS in the Touch ID reauthentication system dialogue, right under the OS string 'Touch ID for $BROWSER_NAME'. [CHAR_LIMIT=22]">
-        Use password
-      </message>
-      <message name="IDS_IOS_AUTOFILL_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to use the password, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to view or copy the password from a settings page. [CHAR_LIMIT=100]">
-        To use passwords, you must first set a passcode on your device.
-      </message>
-      <message name="IDS_IOS_CONSISTENCY_PROMO_ADD_ACCOUNT" desc="Button to add an account to the device.">
-        Add Account…
-      </message>
-      <message name="IDS_IOS_CONSISTENCY_PROMO_CHOOSE_ACCOUNT" desc="Presents the list of account on the device and invites the user to choose an account to sign-in.">
-        Choose an Account
-      </message>
-      <message name="IDS_IOS_CONSISTENCY_PROMO_SIGN_IN" desc="Button to sign in from the consistency menu when there is no Google account on the device.">
-        Sign In…
-      </message>
-      <message name="IDS_IOS_CONSISTENCY_PROMO_SKIP" desc="Dismisses the sign-in promo on the web.">
-        Skip
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_PRIMARY_BUTTON_TEXT" desc="Text for the Notifications promo secondary button.">
-          Turn on Notifications..
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_SECONDARY_BUTTON_TEXT" desc="Text for the Notifications promo secondary button.">
-          No Thanks
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_SUBTITLE" desc="Text for the Notifications promo subtitle.">
-          Receive notificarions for news, sports and more based on your interest
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_TERTIARY_BUTTON_TEXT" desc="Text for the Notifications promo tertiary button.">
-          Remind Me Later
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_TITLE" desc="Text for the Notifications promo title.">
-          Get content that matters to you
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERMISSION_REDIRECT_ALERT_CANCEL" desc="The label for the alert's cancel button">
-        No, Thanks
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERMISSION_REDIRECT_ALERT_REDIRECT" desc="The label for the alert's redirect to the iOS Settings.">
-        Go to Settings...
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SETTINGS_ALERT_TITLE" desc="Title for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page">
-        Turn on Notifications?
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SETTINGS_ALERT_MESSAGE" desc="Text for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page">
-        To get updates about content that matters to you, turn on notification in your iOS settings.
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PROMO_TEXT" desc="Text for the Notifications promo.">
-        Would you like notifications for news, sports, and more based on your interests?
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PROMO_PRIMARY_BUTTON" desc="Text for the Notifications promo primary button.">
-        Yes, I'm in
-      </message>
-      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PROMO_SECONDARY_BUTTON" desc="Text for the Notifications promo secondary button.">
-        No Thanks
-      </message>
-      <message name="IDS_IOS_COPY_LINK_ACTION_TITLE" desc="Title of the action used to copy a link to the pasteboard. [iOS only]">
-        Copy Link
-      </message>
-      <message name="IDS_IOS_DELETE_ACTION_TITLE" desc="Title of the action used to delete a selected item. Item types include, for example, a Bookmark or an History Entry. [iOS only]">
-        Delete
-      </message>
-      <message name="IDS_IOS_OPEN_IN_INCOGNITO_ACTION_TITLE" desc="Title of the action used to open an URL in a new Incognito tab. [iOS only]">
-        Open in Incognito
-      </message>
       <message name="IDS_IOS_BADGE_INCOGNITO_HINT" desc="Button displayed when the user is in Incognito mode. [iOS only]">
         Current Webpage is on Incognito
       </message>
@@ -452,12 +439,57 @@
       <message name="IDS_IOS_BLOCK_POPUPS" desc="Title for the view and option in Settings for blocking pop-ups. [Length: 15em] [iOS only]">
         Block Pop-ups
       </message>
-      <message name="IDS_IOS_SHOW_LINK_PREVIEWS" desc="Title for the view and option in Settings for showing link previews. [Length: unlimited] [iOS only]" meaning="Title for the Chrome Settings option for showing link previews. [Length: unlimited]">
-        Show Link Previews
-      </message>
       <message name="IDS_IOS_BLUETOOTH_USAGE_DESCRIPTION" desc="Specifies the reason for using the device's bluetooth capabilities.">
         This lets you discover relevant web pages based on your surroundings.
       </message>
+      <message name="IDS_IOS_BOOKMARKS_ACCOUNT_SECTION_TITLE" desc="This string appears on a page of saved bookmarks. It is the heading for a category. The categories indicate where a bookmark is saved: in this string, the bookmarks are saved in the user's Google Account. This is a shortened version of the noun phrase: 'Bookmarks in your Google Account'. If your language permits it, you can omit 'Bookmarks' because it is already at the top of the page. [Length: 40em.] [iOS only]" meaning="Bookmarks in your Google Account">
+        In Your Google Account
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_BULK_SAVED" desc="This confirmation message is intended to help users understand that multiple bookmarks have been saved. The confirmation message appears at the bottom of the page after users bulk add bookmarks, telling them how many bookmarks they've added. The tone should be informative.">
+          {count, plural,
+          =1 {Bookmark saved}
+          other {{count} Bookmarks saved}}
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_BULK_SAVED_ACCOUNT" desc="This confirmation message is intended to help users understand that multiple bookmarks have been saved in their account. The confirmation message appears at the bottom of the page after users bulk add bookmarks, telling them how many bookmarks they've added into their account. The tone should be informative.">
+          {count, plural,
+          =1 {Bookmark saved in your Google Account, {email}}
+          other {{count} Bookmarks saved in your Google Account, {email}}}
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_FOLDER_NAME_WITH_CLOUD_SLASH_ICON_LABEL" desc="Accessibility label of the cloud.slash icon in the bookmark views on Folder. For voice over only, not in UI. [iOS only]">
+        <ph name="FOLDER_NAME">$1<ex>new folder</ex></ph>. Only on this device.
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_ALERT_BUTTON" desc="Alert confirm button in the bookmarks page confirming the user wants to save alls their local bookmarks to their account. [iOS Only]">
+        Save in Account
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_ALERT_CANCEL" desc="Alert cancel button in the bookmarks page cancelling the save of all their local bookmarks to their account. [iOS Only]">
+        Cancel
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_ALERT_DESCRIPTION" desc="Alert description in the bookmarks page confirming to the user that they can save all their local bookmarks to their account. [iOS Only]">
+        {count, plural,
+          =1 {You can save your bookmark in your Google Account, {email}.}
+          other {You can save your bookmarks in your Google Account, {email}.}}
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_ALERT_TITLE" desc="Alert title in the bookmarks page asking the user that all their local bookmarks will be saved to their account. [iOS Only]">
+        {count, plural,
+          =1 {Save 1 Bookmark in your Google Account}
+          other {Save {count} Bookmarks in your Google Account}}
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_SECTION_DESCRIPTION" desc="This text is shown above the batch upload button section in the bookmarks page to explain to the user how many bookmarks exist only locally and can be uploaded to their Google Account. [iOS Only]">
+        {count, plural,
+          =1 {1 bookmark is saved only to this device. To use it on your other devices, save it in your Google Account, {email}.}
+          other {{count} bookmarks are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}}
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_SNACKBAR_MESSAGE" desc="Snackbar message in the bookmarks page confirming to the user that all their local bookmarks have been saved to their account. [iOS Only]">
+        {count, plural,
+          =1 {Bookmark saved in your Google Account, {email}.}
+          other {Bookmarks saved in your Google Account, {email}.}}
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_NAME_WITH_CLOUD_SLASH_ICON_LABEL" desc="Accessibility label of the cloud.slash icon in the bookmark views on Bookmark. For voice over only, not in UI. [iOS only]">
+        <ph name="BOOKMRK_NAME">$1<ex>www.example.com</ex></ph>. Only on this device.
+      </message>
+      <message name="IDS_IOS_BOOKMARKS_PROFILE_SECTION_TITLE" desc="This string appears on a page of saved bookmarks. It is the heading for a category. The categories indicate where a bookmark is saved: in this string, the bookmarks are saved locally on the user's device. This is a shortened version of the noun phrase: 'Bookmarks that are only on your device'. If your language permits it, you can omit 'Bookmarks' because it is already at the top of the page. [Length: 40em.] [iOS only]" meaning="Bookmarks that are only on your device">
+        Only on This Device
+      </message>
       <message name="IDS_IOS_BOOKMARK_ACTION_DELETE" desc="Title of the action that deletes a bookmark in the bookmark action sheet. [Length: 30em.] [iOS only]">
         Delete
       </message>
@@ -473,6 +505,36 @@
       <message name="IDS_IOS_BOOKMARK_CHOOSE_GROUP_BUTTON" desc="Button to assign a folder to an uncategorized bookmark. [iOS only]">
         Choose Folder
       </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_DELETE" desc="Text on the bookmarks context bar for delete action">
+       Delete
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_EDIT" desc="Text on the bookmarks context bar for edit action">
+        Edit
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_MORE" desc="Text on the bookmarks context bar to show more context menu">
+        More...
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_NEW_FOLDER" desc="Text on the bookmarks context bar to create new folder">
+        New Folder
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_SELECT" desc="Text on the bookmarks context bar for select action">
+        Select
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_EDIT" desc="Text on the bookmarks context menu to edit selected bookmark">
+        Edit Bookmark
+      </message>
+       <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_EDIT_FOLDER" desc="Text on the bookmarks context menu to edit selected bookmark folder">
+        Edit Folder
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_MOVE" desc="Text on the bookmarks context menu to move selected bookmark">
+        Move
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_OPEN" desc="Text on the bookmarks context menu to open all selected bookmarks">
+        Open All
+      </message>
+      <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_OPEN_INCOGNITO" desc="Text on the bookmarks context menu to open selected bookmark in Incognito">
+        Open in Incognito
+      </message>
       <message name="IDS_IOS_BOOKMARK_CREATE_GROUP" desc="Button to create a new bookmark folder [Length: 30em.]">
         New Folder…
       </message>
@@ -562,28 +624,6 @@
       <message name="IDS_IOS_BOOKMARK_NEW_UNDO_BUTTON_TITLE" desc="Text shown for the undo button. [Length: 30em.] [iOS only]">
         Undo
       </message>
-      <message name="IDS_IOS_BOOKMARKS_ACCOUNT_SECTION_TITLE" desc="This string appears on a page of saved bookmarks. It is the heading for a category. The categories indicate where a bookmark is saved: in this string, the bookmarks are saved in the user's Google Account. This is a shortened version of the noun phrase: 'Bookmarks in your Google Account'. If your language permits it, you can omit 'Bookmarks' because it is already at the top of the page. [Length: 40em.] [iOS only]" meaning="Bookmarks in your Google Account">
-        In Your Google Account
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_BULK_SAVED" desc="This confirmation message is intended to help users understand that multiple bookmarks have been saved. The confirmation message appears at the bottom of the page after users bulk add bookmarks, telling them how many bookmarks they've added. The tone should be informative.">
-          {count, plural,
-          =1 {Bookmark saved}
-          other {{count} Bookmarks saved}}
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_BULK_SAVED_ACCOUNT" desc="This confirmation message is intended to help users understand that multiple bookmarks have been saved in their account. The confirmation message appears at the bottom of the page after users bulk add bookmarks, telling them how many bookmarks they've added into their account. The tone should be informative.">
-          {count, plural,
-          =1 {Bookmark saved in your Google Account, {email}}
-          other {{count} Bookmarks saved in your Google Account, {email}}}
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_PROFILE_SECTION_TITLE" desc="This string appears on a page of saved bookmarks. It is the heading for a category. The categories indicate where a bookmark is saved: in this string, the bookmarks are saved locally on the user's device. This is a shortened version of the noun phrase: 'Bookmarks that are only on your device'. If your language permits it, you can omit 'Bookmarks' because it is already at the top of the page. [Length: 40em.] [iOS only]" meaning="Bookmarks that are only on your device">
-        Only on This Device
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_FOLDER_NAME_WITH_CLOUD_SLASH_ICON_LABEL" desc="Accessibility label of the cloud.slash icon in the bookmark views on Folder. For voice over only, not in UI. [iOS only]">
-        <ph name="FOLDER_NAME">$1<ex>new folder</ex></ph>. Only on this device.
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_NAME_WITH_CLOUD_SLASH_ICON_LABEL" desc="Accessibility label of the cloud.slash icon in the bookmark views on Bookmark. For voice over only, not in UI. [iOS only]">
-        <ph name="BOOKMRK_NAME">$1<ex>www.example.com</ex></ph>. Only on this device.
-      </message>
       <message name="IDS_IOS_BOOKMARK_NEW_ZERO_ITEM_LABEL" desc="Text that indicates that a user has selected zero bookmarks for editing. [Length: 30em.]">
         0 selected
       </message>
@@ -612,12 +652,21 @@
          =1 {Bookmark saved to "{title}" in your account, {email}}
          other {Bookmarks saved to "{title}" in your account, {email}}}
       </message>
+      <message name="IDS_IOS_BOOKMARK_SNACKBAR_EDIT_BOOKMARK" desc="This string is found on a button that takes the user to the Edit Bookmark screen when the user taps it. The button is on a confirmation message that users see when they save a bookmark to their device or in their Google Account. This text is a verb and is short for the longer phrase 'edit the bookmark.' The tone should be informative. Use Apple-style title case. [CHAR_LIMIT=15]">
+        Edit
+      </message>
+      <message name="IDS_IOS_BOOKMARK_SNACKBAR_VIEW_BOOKMARKS" desc="This string is found on a button that takes the user to the Bookmarks screen when the user taps it. The button is on a confirmation message that users see when they bulk save bookmarks to their device or in their Google Account. This text is a verb and is short for the longer phrase 'view bookmarks.' The tone should be informative. Use Apple-style title case. [CHAR_LIMIT=15]">
+        View
+      </message>
       <message name="IDS_IOS_BOOKMARK_URL_FIELD_HEADER" desc="Title shown above URL field on Edit Bookmark screen. [Length: 20em]">
         URL
       </message>
       <message name="IDS_IOS_BOOKMARK_URL_FIELD_VALIDATION_FAILED" desc="Error message shown below URL input field when the URL is incorrect. [Length: 20em]">
         Invalid URL
       </message>
+      <message name="IDS_IOS_BOTTOM_ADDRESS_BAR_OPTION" desc="Tag label title displayed for the bottom address bar preference option. [iOS only]">
+        Bottom
+      </message>
       <message name="IDS_IOS_BRING_ANDROID_TABS_CANCEL_BUTTON" desc="Button to dismiss the 'Bring Android Tabs' prompt. [iOS only]">
         Cancel
       </message>
@@ -665,12 +714,18 @@
       <message name="IDS_IOS_BULK_UPLOAD_BUTTON_TITLE" desc="The text is the primary button in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome.">
         Save in Account
       </message>
-      <message name="IDS_IOS_BULK_UPLOAD_PASSWORD_AUTHENTIFY_MESSAGE" desc="After the user selected to bulk upload passwords, the iPhone request the user to identify, and this message explains what will occurs if they identify.">
-        Save passwords in account
+      <message name="IDS_IOS_BULK_UPLOAD_ON_THIS_DEVICE_SETTINGS_HEADER" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This note explains where the user can go to view and manage individual items. like individual bookmarks or passwords.">
+        You can also view and manage these items in your bookmarks, Reading List, or password manager.
+      </message>
+      <message name="IDS_IOS_BULK_UPLOAD_ON_THIS_DEVICE_TITLE" desc="The text appears as the title of a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome.">
+        On This Device
       </message>
       <message name="IDS_IOS_BULK_UPLOAD_PASSWORD_AND_OTHER_TYPE_AUTHENTIFY_MESSAGE" desc="After the user selected to bulk upload passwords and one other type of items, the iPhone request the user to identify, and this message explains what will occurs if they identify.">
         Save passwords and other items in account
       </message>
+      <message name="IDS_IOS_BULK_UPLOAD_PASSWORD_AUTHENTIFY_MESSAGE" desc="After the user selected to bulk upload passwords, the iPhone request the user to identify, and this message explains what will occurs if they identify.">
+        Save passwords in account
+      </message>
       <message name="IDS_IOS_BULK_UPLOAD_PASSWORD_SUBTITLE" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This line give the number of sites with local passwords and two examples of such sites.">
         {count, plural,
           =1 {For {website_1}}
@@ -683,9 +738,6 @@
           =1 {{count} password}
           other {{count} passwords}}
       </message>
-      <message name="IDS_IOS_BULK_UPLOAD_ON_THIS_DEVICE_SETTINGS_HEADER" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This note explains where the user can go to view and manage individual items. like individual bookmarks or passwords.">
-        You can also view and manage these items in your bookmarks, Reading List, or password manager.
-      </message>
       <message name="IDS_IOS_BULK_UPLOAD_READING_LIST_SUBTITLE" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This line give the number of sites with local reading list pages and two examples of such sites.">
         {count, plural,
           =1 {{website_1}}
@@ -703,46 +755,41 @@
           =1 {Item saved in your Google Account, {email}}
           other {Items saved in your Google Account, {email}}}
       </message>
-      <message name="IDS_IOS_BULK_UPLOAD_ON_THIS_DEVICE_TITLE" desc="The text appears as the title of a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome.">
-        On This Device
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_SECTION_DESCRIPTION" desc="This text is shown above the batch upload button section in the bookmarks page to explain to the user how many bookmarks exist only locally and can be uploaded to their Google Account. [iOS Only]">
-        {count, plural,
-          =1 {1 bookmark is saved only to this device. To use it on your other devices, save it in your Google Account, {email}.}
-          other {{count} bookmarks are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}}
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_ALERT_TITLE" desc="Alert title in the bookmarks page asking the user that all their local bookmarks will be saved to their account. [iOS Only]">
-        {count, plural,
-          =1 {Save 1 Bookmark in your Google Account}
-          other {Save {count} Bookmarks in your Google Account}}
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_ALERT_DESCRIPTION" desc="Alert description in the bookmarks page confirming to the user that they can save all their local bookmarks to their account. [iOS Only]">
-        {count, plural,
-          =1 {You can save your bookmark in your Google Account, {email}.}
-          other {You can save your bookmarks in your Google Account, {email}.}}
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_ALERT_BUTTON" desc="Alert confirm button in the bookmarks page confirming the user wants to save alls their local bookmarks to their account. [iOS Only]">
-        Save in Account
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_ALERT_CANCEL" desc="Alert cancel button in the bookmarks page cancelling the save of all their local bookmarks to their account. [iOS Only]">
-        Cancel
-      </message>
-      <message name="IDS_IOS_BOOKMARKS_HOME_BULK_UPLOAD_SNACKBAR_MESSAGE" desc="Snackbar message in the bookmarks page confirming to the user that all their local bookmarks have been saved to their account. [iOS Only]">
-        {count, plural,
-          =1 {Bookmark saved in your Google Account, {email}.}
-          other {Bookmarks saved in your Google Account, {email}.}}
-      </message>
-      <message name="IDS_IOS_CONTACTS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's contacts while the app is in use [Length: unlimited] [iOS only].">
-        This will be used to show you possible invitees to your event.
-      </message>
       <message name="IDS_IOS_CAMERA_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's camera while the app is in use [Length: unlimited] [iOS only].">
         This lets you take and upload photos, as well as scan QR codes
       </message>
+      <message name="IDS_IOS_CANCEL_PASSWORD_CHECK_BUTTON" desc="Label of a button which stops Password Check [Length: 22em] [iOS only]" meaning="By clicking this button user will stop checking all passwords for security issues.">
+        Cancel
+      </message>
+      <message name="IDS_IOS_CANCEL_PASSWORD_DELETION" desc="Label of a confirmation dialogue button which allows the user to cancel deletion of a stored password. [Length: one line] [iOS only]">
+        Cancel
+      </message>
+      <message name="IDS_IOS_CANCEL_PASSWORD_EDIT" desc="Cancel button inside confirmation alert when the user is trying to edit password [iOS only]" meaning="Cancels editing">
+        Cancel
+      </message>
+      <message name="IDS_IOS_CANCEL_PASSWORD_MOVE" desc="Cancel button inside the password conflict action sheet when the user is trying to move a password to their google account store [iOS only]">
+        Cancel
+      </message>
       <message name="IDS_IOS_CARD_STACK_SCROLLED_NOTIFICATION" desc="The accessibility description for page scrolled notification [iOS only]">
         <ph name="INCOGNITO">$1<ex>Incognito</ex></ph> Tabs <ph name="FIRST_VISIBLE_TAB">$2<ex>3</ex></ph> through <ph name="LAST_VISIBLE_TAB">$3<ex>5</ex></ph> of <ph name="NUMBER_OF_OPEN_TABS">$4<ex>12</ex></ph>
       </message>
-      <message name="IDS_IOS_CREDIT_CARD_SETTINGS_ADD_PAYMENT_METHOD_TITLE" desc="Title of the view that allow user to enter the details for a new credit card to add it to the list the credit cards. [iOS only]">
-          Add Payment Method
+      <message name="IDS_IOS_CARD_WILL_BE_SAVED_TO_ACCOUNT" desc="A message to inform the user that a credit card will be saved to their Google Account.">
+        Cards are saved to your Google Account.
+      </message>
+      <message name="IDS_IOS_CHANGE_COMPROMISED_PASSWORD" desc="Button which is shown on Password Details Screen when password is compromised. [iOS only]" meaning="Telling user to change password on a website since it is compromised.">
+        Change Password on Website
+      </message>
+      <message name="IDS_IOS_CHECK_FINISHED_JUST_NOW" desc="Used instead of timestamp when Password Check finished less than 1 minute ago." meaning="[In sentence case] Check finished just now.">
+        just now
+      </message>
+      <message name="IDS_IOS_CHECK_FINISHED_JUST_NOW_TITLE_CASE" desc="Used instead of timestamp when Password Check finished less than 1 minute ago." meaning="[In Title Case] Check finished just now.">
+        Just Now
+      </message>
+      <message name="IDS_IOS_CHECK_NEVER_RUN" desc="Used instead of timestamp when Password Check never ran" meaning="Check never run.">
+        Check never run.
+      </message>
+      <message name="IDS_IOS_CHECK_PASSWORDS_NOW_BUTTON" desc="Label of a button which starts Password Check [Length: 22em] [iOS only]" meaning="By clicking this button user will start checking all passwords for security issues.">
+        Check Now
       </message>
       <message name="IDS_IOS_CLEAR_AUTOFILL" desc="Label for the option in settings to clear form data. In titlecase. [Length: 20em] [iOS only]">
         Autofill Data
@@ -813,12 +860,6 @@
       <message name="IDS_IOS_CLEAR_BUTTON" desc="Title for the button used to clear data. [Length: 20em] [iOS only]">
         Clear Browsing Data
       </message>
-      <message name="IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE" desc="Title for the UIAlertController indicating browsing data selected will be removed. [Length: 20em] [iOS only]">
-        The items you selected will be removed.
-      </message>
-      <message name="IDS_IOS_CONFIRM_CLEAR_BUTTON" desc="Accessibility label for the button used to confirm clearing data. [iOS only]">
-        Confirm Clear Browsing Data
-      </message>
       <message name="IDS_IOS_CLEAR_CACHE" desc="Label for the option in settings to clear the cache. In titlecase. [Length: 20em] [iOS only]">
         Cached Images and Files
       </message>
@@ -828,14 +869,65 @@
       <message name="IDS_IOS_CLEAR_SAVED_PASSWORDS" desc="Label for the option in settings to clear saved passwords. In titlecase. [Length: 20em] [iOS only]">
         Saved Passwords
       </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_ADDTOREADINGLIST" desc="The iOS menu item for adding a link to the reading list.">
-        Add to Reading List
+      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_DESCRIPTION" desc="Header displayed on the password manager screen displaying credentials that have been leaked or phished [iOS only]">
+        Some of your saved passwords were exposed in a non-Google data breach. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_DISMISSED_WARNINGS_BUTTON_TITLE" desc="Text of the button presenting the password manager screen displaying compromised credential issues dismissed by the user. [iOS only]">
+        Dismissed Warnings
+      </message>
+      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_LEAKED_DESCRIPTION" desc="Text explaining the user one of their credentials was found in a data breach. Displayed on the password manager screen showing credentials that have been leaked or phished. [iOS only]">
+        Found in data breach
+      </message>
+      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_PHISHED_AND_LEAKED_DESCRIPTION" desc="Text explaining the user one of their credentials was phished and leaked. Displayed on the password manager screen showing credentials that have been leaked or phished. [iOS only]">
+        Entered on a deceptive site and found in a data breach
+      </message>
+      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_PHISHED_DESCRIPTION" desc="Text explaining the user one of their credentials was phished. Displayed on the password manager screen showing credentials that have been leaked or phished. [iOS only]">
+        Entered on deceptive site
+      </message>
+      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_TITLE" desc="Title for the password manager screen displaying credentials that have been leaked or phished. The case for 0 compromised passwords is used when all compromised passwords warnings have been muted by the user. In this case the generic Compromised Passwords title is displayed along with a button taking the user to the list of dismissed compromised password credentials. [iOS only] [Length: 22em]">
+        {COUNT, plural,
+          =0 {Compromised Passwords}
+          =1 {{COUNT} Compromised Password}
+          other {{COUNT} Compromised Passwords}}
+      </message>
+      <message name="IDS_IOS_CONFIRM_CLEAR_BUTTON" desc="Accessibility label for the button used to confirm clearing data. [iOS only]">
+        Confirm Clear Browsing Data
+      </message>
+      <message name="IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE" desc="Title for the UIAlertController indicating browsing data selected will be removed. [Length: 20em] [iOS only]">
+        The items you selected will be removed.
+      </message>
+      <message name="IDS_IOS_CONFIRM_PASSWORD_DELETION" desc="Label of a confirmation dialogue button which allows the user to confirm deletion of a stored password. [Length: one line] [iOS only]">
+        Delete Password
+      </message>
+      <message name="IDS_IOS_CONFIRM_PASSWORD_EDIT" desc="Confirm button inside confirmation alert when the user is trying to edit password [iOS only]" meaning="Save edited password">
+        Save Password
+      </message>
+      <message name="IDS_IOS_CONFIRM_USING_OTHER_PASSWORD_CONTINUE" desc="Action button for confirmation dialog which is shown when user wants to use other passwords. [iOS only]" meaning="User acknowledge warning and wants to proceed.">
+        Continue
+      </message>
+      <message name="IDS_IOS_CONSISTENCY_PROMO_ADD_ACCOUNT" desc="Button to add an account to the device.">
+        Add Account…
+      </message>
+      <message name="IDS_IOS_CONSISTENCY_PROMO_CHOOSE_ACCOUNT" desc="Presents the list of account on the device and invites the user to choose an account to sign-in.">
+        Choose an Account
+      </message>
+      <message name="IDS_IOS_CONSISTENCY_PROMO_SIGN_IN" desc="Button to sign in from the consistency menu when there is no Google account on the device.">
+        Sign In…
+      </message>
+      <message name="IDS_IOS_CONSISTENCY_PROMO_SKIP" desc="Dismisses the sign-in promo on the web.">
+        Skip
+      </message>
+      <message name="IDS_IOS_CONTACTS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's contacts while the app is in use [Length: unlimited] [iOS only].">
+        This will be used to show you possible invitees to your event.
       </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_ADDTOBOOKMARKS" desc="The iOS context menu item for adding the url of a tab to the bookmarks. [iOS only]">
         Add to Bookmarks
       </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_CLOSETAB" desc="The iOS context menu item for closing a tab. [iOS only]" meaning="Close the current tab [Title Case].">
-        Close Tab
+      <message name="IDS_IOS_CONTENT_CONTEXT_ADDTOREADINGLIST" desc="The iOS menu item for adding a link to the reading list.">
+        Add to Reading List
+      </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_CLOSEALLTABS" desc="The iOS context menu item for closing all the tabs in the grid. [iOS only]">
+        Close All Tabs
       </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_CLOSEOTHERTABS" desc="The iOS context menu item for closing all the tabs except the currently selected one.">
         Close Other Tabs
@@ -843,123 +935,159 @@
       <message name="IDS_IOS_CONTENT_CONTEXT_CLOSEPINNEDTAB" desc="The iOS context menu item for closing a pinned tab. [iOS only]" meaning="Close the current pinned tab [Title Case].">
         Close Pinned Tab
       </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_CLOSETAB" desc="The iOS context menu item for closing a tab. [iOS only]" meaning="Close the current tab [Title Case].">
+        Close Tab
+      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_COPY" desc="The iOS menu item for copying a link's URL into the pasteboard. Shorter than the desktop version [iOS only]">
         Copy Link URL
       </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_COPYIMAGE" desc="The name of the Copy Image command in the content area context menu.">
         Copy Image
       </message>
-      <message name="IDS_IOS_CONTENT_COPYIMAGE_ALERT_COPYING" desc="The title of the alert while the image to be copied is being downloaded.">
-        Copying...
-      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_OPEN" desc="The iOS menu item for opening a link. Shorter than the desktop version [Length: 25em] [iOS only]">
         Open
       </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_OPEN_ALL_LINKS" desc="The iOS menu item for opening a list of links in new tabs. Shorter than the desktop version [iOS only]">
-        Open all
-      </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_OPENINNEWWINDOW" desc="The iOS menu item for opening a link in a new window. [iOS only]">
-        Open in New Window
-      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_OPENIMAGE" desc="The name of the Open Image command in the content area context menu">
         Open Image
       </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_OPENIMAGENEWTAB" desc="The name of the Open Image in New Tab command in the content area context menu">
         Open Image in New Tab
       </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_OPENINNEWWINDOW" desc="The iOS menu item for opening a link in a new window. [iOS only]">
+        Open in New Window
+      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWINCOGNITOTAB" desc="The iOS menu item for opening a link in a new Incognito tab. Shorter than the desktop version [Length: 25em] [iOS only]">
         Open in New Incognito Tab
       </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWTAB" desc="The iOS menu item for opening a link in another tab. Shorter than the desktop version [iOS only]">
         Open in New Tab
       </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_SAVEIMAGE" desc="The name of the Save Image As command in the content area context menu">
-        Save in Photos
-      </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_CLOSEALLTABS" desc="The iOS context menu item for closing all the tabs in the grid. [iOS only]">
-        Close All Tabs
-      </message>
-      <message name="IDS_IOS_CONTENT_CONTEXT_SELECTTABS" desc="The iOS context menu item for entering into the selection mode, where users can select tabs to perform bulk actions on them.[iOS only]">
-        Select Tabs
+      <message name="IDS_IOS_CONTENT_CONTEXT_OPEN_ALL_LINKS" desc="The iOS menu item for opening a list of links in new tabs. Shorter than the desktop version [iOS only]">
+        Open all
       </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_PINTAB" desc="The iOS context menu item for pinning a tab.[iOS only]">
         Pin Tab
       </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_SAVEIMAGE" desc="The name of the Save Image As command in the content area context menu">
+        Save in Photos
+      </message>
+      <message name="IDS_IOS_CONTENT_CONTEXT_SELECTTABS" desc="The iOS context menu item for entering into the selection mode, where users can select tabs to perform bulk actions on them.[iOS only]">
+        Select Tabs
+      </message>
       <message name="IDS_IOS_CONTENT_CONTEXT_UNPINTAB" desc="The iOS context menu item for unpinning a tab.[iOS only]">
         Unpin Tab
       </message>
+      <message name="IDS_IOS_CONTENT_COPYIMAGE_ALERT_COPYING" desc="The title of the alert while the image to be copied is being downloaded.">
+        Copying...
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERMISSION_REDIRECT_ALERT_CANCEL" desc="The label for the alert's cancel button">
+        No, Thanks
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PERMISSION_REDIRECT_ALERT_REDIRECT" desc="The label for the alert's redirect to the iOS Settings.">
+        Go to Settings...
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PROMO_PRIMARY_BUTTON" desc="Text for the Notifications promo primary button.">
+        Yes, I'm in
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PROMO_SECONDARY_BUTTON" desc="Text for the Notifications promo secondary button.">
+        No Thanks
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_PROMO_TEXT" desc="Text for the Notifications promo.">
+        Would you like notifications for news, sports, and more based on your interests?
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SETTINGS_ALERT_MESSAGE" desc="Text for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page">
+        To get updates about content that matters to you, turn on notification in your iOS settings.
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATIONS_SETTINGS_ALERT_TITLE" desc="Title for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page">
+        Turn on Notifications?
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_PRIMARY_BUTTON_TEXT" desc="Text for the Notifications promo secondary button.">
+          Turn on Notifications..
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_SECONDARY_BUTTON_TEXT" desc="Text for the Notifications promo secondary button.">
+          No Thanks
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_SUBTITLE" desc="Text for the Notifications promo subtitle.">
+          Receive notificarions for news, sports and more based on your interest
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_TERTIARY_BUTTON_TEXT" desc="Text for the Notifications promo tertiary button.">
+          Remind Me Later
+      </message>
+      <message name="IDS_IOS_CONTENT_NOTIFICATION_FULL_PAGE_PROMO_TITLE" desc="Text for the Notifications promo title.">
+          Get content that matters to you
+      </message>
+      <message name="IDS_IOS_CONTENT_SETTINGS_TITLE" desc="Title for content settings dialog [Length: 29em] [iOS only]">
+        Content Settings
+      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_ACCESSIBILITY_LABEL_SUGGESTION" desc="The accessibility label of a suggestion. Summarizes fields in the reading list entry (title, publisher informations, status and informations). Read by Text-to-Speech.">
         <ph name="TITLE"><ex>Learn about the new Chromium Projects</ex>$1</ph>, <ph name="PUBLISHER_INFORMATION"><ex>The Chromium organization</ex>$2</ph>, <ph name="PUBLICATION_DATE"><ex>January 1 2017</ex>$3</ph>
       </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_BOOKMARKS" desc="The Bookmarks title on the new tab page [Length: 10em]">
         Bookmarks
       </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_FOOTER_TITLE" desc="The title of the footer of the sections of Content Suggestions">
+        More
+      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_HIDE" desc="The label in the header to hide/collapse Content Suggestions [Length: 10em]">
         Hide
       </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_HISTORY" desc="The History title on the new tab page [Length: 10em]">
         History
       </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_FOOTER_TITLE" desc="The title of the footer of the sections of Content Suggestions">
-        More
-      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_MOST_VISITED_MODULE_TITLE" desc="The Most Visited module title on the new tab page [Length: 10em]">
         Most Visited Sites
       </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_TITLE" desc="The Parcel Tracking module title on the Home surface [Length: 10em]">
-        Package Tracking
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_INFORMATION" desc="The Parcel Tracking module package information on the Home surface [Length: 10em]">
-        <ph name="Carrier_Name"><ex>USPS</ex>$1</ph> • #<ph name="Parcel_Identifier"><ex>1237834578495</ex>$2</ph>
-      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_ARRIVING_STATUS" desc="The Parcel Tracking module package arriving status description on the Home surface [Length: 10em]">
         Arriving <ph name="Date"><ex>Monday, September 13</ex>$1</ph>
       </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_CANCELLED_STATUS" desc="The Parcel Tracking module package delivery cancelled status description on the Home surface [Length: 10em]">
+        Your delivery was cancelled
+      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_DELIVERED_STATUS" desc="The Parcel Tracking module package delivered status description on the Home surface [Length: 10em]">
         Delivered
       </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_DELIVERED_TODAY" desc="When the tracked parcel was delivered today [Length: 10em]">
         Today
       </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_DELIVERY_ATTEMPTED_STATUS" desc="The Parcel Tracking module package delivery attempted status description on the Home surface [Length: 10em]">
+        Delivery Attempted. Will retry
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_ERROR_STATUS" desc="The Parcel Tracking module package delivery error status description on the Home surface [Length: 10em]">
+        Needs attention
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_INFORMATION" desc="The Parcel Tracking module package information on the Home surface [Length: 10em]">
+        <ph name="Carrier_Name"><ex>USPS</ex>$1</ph> • #<ph name="Parcel_Identifier"><ex>1237834578495</ex>$2</ph>
+      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_LABEL_CREATED_STATUS" desc="The Parcel Tracking module package label created status description on the Home surface [Length: 10em]">
         Label Created. Date Pending
       </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_NEW_STATUS" desc="The Parcel Tracking module package new status description on the Home surface [Length: 10em]">
         Getting Package Status
       </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_DELIVERY_ATTEMPTED_STATUS" desc="The Parcel Tracking module package delivery attempted status description on the Home surface [Length: 10em]">
-        Delivery Attempted. Will retry
-      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_READY_PICKUP_STATUS" desc="The Parcel Tracking module package delivery ready for pickup status description on the Home surface [Length: 10em]">
         Ready for Pickup
       </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_ERROR_STATUS" desc="The Parcel Tracking module package delivery error status description on the Home surface [Length: 10em]">
-        Needs attention
-      </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_UNDELIVERABLE_STATUS" desc="The Parcel Tracking module package delivery undeliverable status description on the Home surface [Length: 10em]">
-        Your package can't be delivered
-      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_RETURNED_TO_SENDER_STATUS" desc="The Parcel Tracking module package delivery returned to sender status description on the Home surface [Length: 10em]">
         Return to sender
       </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_CANCELLED_STATUS" desc="The Parcel Tracking module package delivery cancelled status description on the Home surface [Length: 10em]">
-        Your delivery was cancelled
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_PACKAGE_UNDELIVERABLE_STATUS" desc="The Parcel Tracking module package delivery undeliverable status description on the Home surface [Length: 10em]">
+        Your package can't be delivered
+      </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_PARCEL_TRACKING_MODULE_TITLE" desc="The Parcel Tracking module title on the Home surface [Length: 10em]">
+        Package Tracking
       </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_READING_LIST" desc="The Reading List title on the new tab page [Length: 10em]">
         Reading List
       </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_READING_LIST_ACCESSIBILITY_LABEL_ONE_UNREAD" desc="The accessibility label to use for the reading list content suggestion cell when there is only a single unread article [Length: unlimited]">
-        1 unread article.
-      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_READING_LIST_ACCESSIBILITY_LABEL" desc="The accessibility label to use for the reading list content suggestion cell when there are multiple unread articles [Length: unlimited]">
         <ph name="UNREAD_COUNT">$1<ex>4</ex></ph> unread articles.
       </message>
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_READING_LIST_ACCESSIBILITY_LABEL_ONE_UNREAD" desc="The accessibility label to use for the reading list content suggestion cell when there is only a single unread article [Length: unlimited]">
+        1 unread article.
+      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_RECENT_TABS" desc="The Recent Tabs title on the new tab page [Length: 10em]">
         Recent Tabs
       </message>
-      <message name="IDS_IOS_CONTENT_SUGGESTIONS_WHATS_NEW" desc="The What's New title on the new tab page [Length: 10em]">
-        What's New
-      </message>
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_REMOVE" desc="The name of the Remove command in the Content Suggestions articles context menu">
         Remove
       </message>
@@ -975,14 +1103,29 @@
       <message name="IDS_IOS_CONTENT_SUGGESTIONS_TRENDING_QUERIES_MODULE_TITLE" desc="The Trending Queries module title on the new tab page [Length: 10em]">
         Trending Searches
       </message>
-      <message name="IDS_IOS_CONTENT_SETTINGS_TITLE" desc="Title for content settings dialog [Length: 29em] [iOS only]">
-        Content Settings
+      <message name="IDS_IOS_CONTENT_SUGGESTIONS_WHATS_NEW" desc="The What's New title on the new tab page [Length: 10em]">
+        What's New
+      </message>
+      <message name="IDS_IOS_CONTEXT_MENU_SEARCHIMAGEWITHGOOGLE" desc="Context menu text for option to search an image with Google [Length: 25em] [iOS only]">
+        Search Image with Google
       </message>
       <message name="IDS_IOS_CONTEXT_MENU_SEARCHWEBFORIMAGE" desc="Context menu text for option to perform a search for image [Length: 25em] [iOS only]">
         Search <ph name="SEARCH_ENGINE">$1<ex>Google</ex></ph> for This Image
       </message>
-      <message name="IDS_IOS_CONTEXT_MENU_SEARCHIMAGEWITHGOOGLE" desc="Context menu text for option to search an image with Google [Length: 25em] [iOS only]">
-        Search Image with Google
+      <message name="IDS_IOS_COOKIES_ALLOW_ALL" desc="Label that informs the user that no cookies are blocked">
+        Allow All
+      </message>
+      <message name="IDS_IOS_COOKIES_BLOCK_ALL" desc="Label that informs the user that all cookies are blocked">
+        Block All
+      </message>
+      <message name="IDS_IOS_COOKIES_BLOCK_THIRD_PARTY" desc="Label that informs the user that Third-Party cookies are blocked">
+        Block Third-Party
+      </message>
+      <message name="IDS_IOS_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO" desc="Label that informs the user that Third-Party cookies are blocked only in Incognito">
+        Block in Incognito
+      </message>
+      <message name="IDS_IOS_COPY_LINK_ACTION_TITLE" desc="Title of the action used to copy a link to the pasteboard. [iOS only]">
+        Copy Link
       </message>
       <message name="IDS_IOS_COPY_VERSION_HINT" desc="The accessibility hint for the label showing the Chrome version. [iOS only]">
         Double tap to copy.
@@ -996,23 +1139,26 @@
       <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_LEARN_HOW" desc="Text of the primary button in the inital step view of the Credential Provider Exention Promo. [iOS only]">
         Learn How
       </message>
-      <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_REMIND_ME_LATER" desc="Text of the tertiary button in the inital step and 'Learn More' step views of the Credential Provider Exention Promo. [iOS only]">
-        Remind Me Later
-      </message>
       <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_NO_THANKS" desc="Text of the secondary button in the inital and 'Learn More' step views of the Credential Provider Exention Promo. [iOS only]">
         No Thanks
       </message>
-      <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_OS_PASSWORDS_SETTINGS_TITLE_IOS16" desc="Text of the menu item on the iOS Settings -> Passwords page to turn on crendential provider, for iOS 16 and above. Translate using the same text as the OS Settings in that language. [iOS only]">
-        Password Options
-      </message>
-      <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_OS_PASSWORDS_SETTINGS_TITLE_BELOW_IOS16" desc="Text of the menu item on the iOS Settings -> Passwords page to turn on crendential provider, for iOS 15 and older. Translate using the same text as the OS Settings in that language. [iOS only]">
+      <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_OS_PASSWORDS_SETTINGS_TITLE_BELOW_IOS16" desc="Text of the menu item on the iOS Settings -&gt; Passwords page to turn on crendential provider, for iOS 15 and older. Translate using the same text as the OS Settings in that language. [iOS only]">
         AutoFill Passwords
       </message>
-      <message name="IDS_IOS_OPEN_SETTINGS" desc="Text of the button that will take the user to the Settings page to configure the default browser [iOS only]">
-        Open Settings
+      <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_OS_PASSWORDS_SETTINGS_TITLE_IOS16" desc="Text of the menu item on the iOS Settings -&gt; Passwords page to turn on crendential provider, for iOS 16 and above. Translate using the same text as the OS Settings in that language. [iOS only]">
+        Password Options
       </message>
-      <message name="IDS_IOS_DEFAULT_NON_MODAL_PRIMARY_BUTTON_TEXT" desc="Text of button that will take users to Chrome or iOS settings where they can change the default browser. Used in the non-modal default browser promo [iOS only]">
-        Set…
+      <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_REMIND_ME_LATER" desc="Text of the tertiary button in the inital step and 'Learn More' step views of the Credential Provider Exention Promo. [iOS only]">
+        Remind Me Later
+      </message>
+      <message name="IDS_IOS_CREDIT_CARD_SETTINGS_ADD_PAYMENT_METHOD_TITLE" desc="Title of the view that allow user to enter the details for a new credit card to add it to the list the credit cards. [iOS only]">
+          Add Payment Method
+      </message>
+      <message name="IDS_IOS_DATA_NOT_UPLOADED_DIALOG_BUTTON" desc="Button of a dialog that is shown when the user starts to sign out; the user chooses to sync some or all data types, but some data hasn't been saved in their Google Account yet (for example, if there was an error). This string follows the heading 'Some Data Isn't Saved Yet' and the body text 'Some of your Chrome data hasn't been saved to your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.'; the user can choose to tap on the buttons 'Cancel' or 'Delete and Sign Out'. If the user chooses to continue to sign out, then any of their data (such as bookmarks, passwords, history, settings, and more) that isn't saved in their account will be deleted. The tone should be helpful and instructive. [iOS only]">
+        Delete and Sign Out
+      </message>
+      <message name="IDS_IOS_DATA_NOT_UPLOADED_DIALOG_TITLE" desc="Title of a dialog that is shown when the user starts to sign out; the user chooses to sync some or all data types, but some data hasn't been saved in their Google Account yet (for example, if there was an error). This string precedes the body text 'Some of your Chrome data hasn't been saved to your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.', and the user can choose to tap on the buttons 'Cancel' or 'Delete and Sign Out'. If the user chooses to continue to sign out, then any of their data (such as bookmarks, passwords, history, settings, and more) that isn't saved in their account will be deleted. The tone should be helpful and instructive. [iOS only]">
+        Some Data Isn't Saved Yet
       </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_HALF_SCREEN_PROMO_PRIMARY_BUTTON_TEXT" desc="Text of button that will take users to the video default promo [iOS only]">
         Show Me How
@@ -1035,30 +1181,81 @@
       <message name="IDS_IOS_DEFAULT_BROWSER_TAILORED_PRIMARY_BUTTON_TEXT" desc="Text of button that will take users to settings, where they can change the default browser. Used in tailored default browser promo [iOS only]">
         Switch in Settings…
       </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_DEFAULT_BROWSER_APP" desc="Text in the default browser video promo indicating the default browser app in the chrome settings to set a default browser. [iOS only]">
+        Default Browser App
+      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_PRIMARY_BUTTON_TEXT" desc="Text of button that will take users to iOS settings, where they can change the default browser. Used in the video default browser promo [iOS only]">
         Go to Settings…
       </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_1" desc="Text of the row indicating the first step of the instruction to set Chrome as default browser [iOS only]">
-        Open "Settings."
-      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_SECONDARY_BUTTON_TEXT" desc="Text of button that will dismiss the video default browser promo [iOS only]">
         No, Thanks
       </message>
+      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_1" desc="Text of the row indicating the first step of the instruction to set Chrome as default browser [iOS only]">
+        Open "Settings."
+      </message>
       <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_TERTIARY_BUTTON_TEXT" desc="Text of button that will snooze/remind the user later about the video default browser promo [iOS only]">
         Remind Me Later
       </message>
-      <message name="IDS_IOS_DETECT_ADDRESSES_SETTING_TITLE" desc="Title of the setting to enable address detection in web pages [iOS only]">
-        Detect Addresses
+      <message name="IDS_IOS_DEFAULT_NON_MODAL_PRIMARY_BUTTON_TEXT" desc="Text of button that will take users to Chrome or iOS settings where they can change the default browser. Used in the non-modal default browser promo [iOS only]">
+        Set…
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_DESKTOP" desc="The label used to let the user choose that their pages will be loaded using the Desktop mode (vs Mobile)" meaning="The pages will be loaded in Desktop mode">
+        Desktop
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_LABEL" desc="The label of the cell used to display the current mode (Desktop or Mobile) in which the pages will be loaded by default">
+        Default Site View
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_MOBILE" desc="The label used to let the user choose that their pages will be loaded using the Mobile mode (vs Desktop)" meaning="The pages will be loaded in Mobile mode">
+        Mobile
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_TIP" desc="The text of the tip explaining to the user how to change the mode (desktop/mobile) in which the websites will be requested">
+        You can change the default site view to desktop in Settings &gt; Content Settings
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_TIP_VOICE_OVER" desc="The text of the tip explaining to the user how to change the mode (desktop/mobile) in which the websites will be requested. [Read by Text-to-Speech]">
+        You can change the default site view to desktop in Settings then Content Settings
+      </message>
+      <message name="IDS_IOS_DEFAULT_PAGE_MODE_TITLE" desc="The title of the screen in which the user can choose the default mode (Desktop or Mobile) in which the pages will be loaded">
+        Default Site View
+      </message>
+      <message name="IDS_IOS_DELETE_ACTION_TITLE" desc="Title of the action used to delete a selected item. Item types include, for example, a Bookmark or an History Entry. [iOS only]">
+        Delete
+      </message>
+      <message name="IDS_IOS_DELETE_COMPROMISED_PASSWORD_DESCRIPTION" desc="Message on top of the confirmation alert when the user tapped delete password button. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
+        Deleting this password will not delete your account on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>. Change your password on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph> to keep it safe from others.
+      </message>
+      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION" desc="Message at the top of the confirmation alert when the user tapped delete password button. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
+        Deleting this password will not delete your account on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>.
+      </message>
+      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION_FOR_MULTI_URLS" desc="Message at the top of the confirmation alert when the user tapped delete password button in a Password Details with more than 3 URLs. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
+          Passwords for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>, <ph name="SECOND_WEBSITE">$2<ex>twitter.com</ex></ph>, and <ph name="NUMBER_OF_ACCOUNTS">$3<ex>2</ex></ph> others will be deleted. Your accounts won't be deleted.
+      </message>
+      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION_FOR_SINGLE_URL" desc="Message at the top of the confirmation alert when the user tapped delete password button in a Password Details. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
+        Your <ph name="WEBSITE">$1<ex>twitter.com</ex></ph> account won't be deleted.
+      </message>
+      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION_FOR_THREE_URLS" desc="Message at the top of the confirmation alert when the user tapped delete password button in a Password Details with 3 URLs. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
+        Passwords for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>, <ph name="SECOND_WEBSITE">$2<ex>twitter.com</ex></ph>, and <ph name="THIRD_WEBSITE">$3<ex>twitter.com</ex></ph> will be deleted. Your accounts won't be deleted.
+      </message>
+      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION_FOR_TWO_URLS" desc="Message at the top of the confirmation alert when the user tapped delete password button in a Password Details with 2 URLs. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
+          Passwords for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph> and <ph name="SECOND_WEBSITE">$2<ex>twitter.com</ex></ph> will be deleted. Your accounts won't be deleted.
+      </message>
+      <message name="IDS_IOS_DELETE_PASSWORD_TITLE_FOR_MULTI_GROUPS" desc="Title of the confirmation alert when the user tapped delete password button for multiple passwords. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
+          Delete <ph name="NUMBER_OF_ACCOUNTS">$1<ex>2</ex></ph> Passwords?
+      </message>
+      <message name="IDS_IOS_DELETE_PASSWORD_TITLE_FOR_SINGLE_URL" desc="Title of the confirmation alert when the user tapped delete password button. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
+          Delete Password for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>?
       </message>
       <message name="IDS_IOS_DETECT_ADDRESSES_SETTING_DESCRIPTION" desc="Description of the setting to enable address detection in web pages [iOS only]">
         Get directions and local info from Google Maps
       </message>
-      <message name="IDS_IOS_DETECT_UNITS_SETTING_TITLE" desc="Title of the setting to enable unit detection in web pages [iOS only]">
-        Detect Units
+      <message name="IDS_IOS_DETECT_ADDRESSES_SETTING_TITLE" desc="Title of the setting to enable address detection in web pages [iOS only]">
+        Detect Addresses
       </message>
       <message name="IDS_IOS_DETECT_UNITS_SETTING_DESCRIPTION" desc="Description of the setting to enable unit detection in web pages [iOS only]">
         Convert measurement units found on the web
       </message>
+      <message name="IDS_IOS_DETECT_UNITS_SETTING_TITLE" desc="Title of the setting to enable unit detection in web pages [iOS only]">
+        Detect Units
+      </message>
       <message name="IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE" desc="The title of the continue button on the disconnect dialog [Length: 20em].">
         Sign Out
       </message>
@@ -1071,23 +1268,17 @@
       <message name="IDS_IOS_DISCONNECT_DIALOG_TITLE_UNITY" desc="The title of the disconnect dialog [Length: 30em].">
         Sign out and turn off sync?
       </message>
+      <message name="IDS_IOS_DISCOVER_AND_FOLLOWING_FEED_TITLE" desc="The title in the Discover and Following feed menu if Following is enabled. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
+        Discover &amp; Following
+      </message>
       <message name="IDS_IOS_DISCOVER_FEED_HEADER_IPH" desc="In-product help that points at the menu icon for the news feed on Chrome's new tab page. This string instructs the user to open the menu for settings that let them control the content that appears on the feed.">
         Control your stories and activity here
       </message>
       <message name="IDS_IOS_DISCOVER_FEED_HEADER_TURNED_OFF_LABEL" desc="The message that appears in the feed header when the feed is turned off from the header menu. IMPORTANT: The 'Turn On' part of this string should match the content of IDS_IOS_DISCOVER_FEED_MENU_TURN_ON_ITEM so that users understand what menu option to select.">
         To see content, select Turn On from the menu
       </message>
-      <message name="IDS_IOS_DISCOVER_AND_FOLLOWING_FEED_TITLE" desc="The title in the Discover and Following feed menu if Following is enabled. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
-        Discover &amp; Following
-      </message>
-      <message name="IDS_IOS_DISCOVER_FEED_TITLE" desc="The title in the Discover feed menu.">
-        Discover
-      </message>
-      <message name="IDS_IOS_DISCOVER_FEED_TITLE_NON_DSE" desc="Title in the feed header when the feed is turned on and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
-        Discover by Google
-      </message>
-      <message name="IDS_IOS_DISCOVER_FEED_TITLE_OFF_LABEL" desc="The 'Off' label appended to the title in the Discover feed menu.">
-        Off
+      <message name="IDS_IOS_DISCOVER_FEED_MENU_ACCESSIBILITY_LABEL" desc="The accessibility label for the Discover feed header's menu button.">
+        Options for Discover
       </message>
       <message name="IDS_IOS_DISCOVER_FEED_MENU_LEARN_MORE_ITEM" desc="The 'Learn More' action for the Discover feed header menu.">
         Learn More
@@ -1107,8 +1298,29 @@
       <message name="IDS_IOS_DISCOVER_FEED_MENU_TURN_ON_ITEM" desc="The 'Turn On' action for the Discover feed header menu.">
         Turn On
       </message>
-      <message name="IDS_IOS_DISCOVER_FEED_MENU_ACCESSIBILITY_LABEL" desc="The accessibility label for the Discover feed header's menu button.">
-        Options for Discover
+      <message name="IDS_IOS_DISCOVER_FEED_TITLE" desc="The title in the Discover feed menu.">
+        Discover
+      </message>
+      <message name="IDS_IOS_DISCOVER_FEED_TITLE_NON_DSE" desc="Title in the feed header when the feed is turned on and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
+        Discover by Google
+      </message>
+      <message name="IDS_IOS_DISCOVER_FEED_TITLE_OFF_LABEL" desc="The 'Off' label appended to the title in the Discover feed menu.">
+        Off
+      </message>
+      <message name="IDS_IOS_DISMISSED_WARNINGS_PASSWORD_ISSUES_TITLE" desc="Title for the password manager screen displaying compromised credential issues dismissed by the user. [iOS only] [Length: 22em]">
+        Dismissed Warnings
+      </message>
+      <message name="IDS_IOS_DISMISS_WARNING" desc="Button or dialog title which is shown on Password Details Screen to allow the user to dismiss a compromised password warning. [iOS only]" meaning="Title-cased">
+        Dismiss Warning
+      </message>
+      <message name="IDS_IOS_DISMISS_WARNING_DIALOG_DISMISS_BUTTON" desc="Button of the dialog presented to the user when they want to dismiss a compromised password warning. Button is used to confirm that they want to dismiss the warning. [iOS only]">
+        Dismiss
+      </message>
+      <message name="IDS_IOS_DISMISS_WARNING_DIALOG_MESSAGE" desc="Message of the dialog presented to the user when they want to dismiss a compromised password warning. [iOS only]">
+        This password was exposed in a data breach on the internet. If you don't have time to change it right now, Google recommends keeping this warning to remind yourself later.
+      </message>
+      <message name="IDS_IOS_DISMISS_WARNING_DIALOG_TITLE" desc="Title of the dialog presented to the user when they want to dismiss a compromised password warning. [iOS only]" meaning="Title-cased">
+        Dismiss Warning?
       </message>
       <message name="IDS_IOS_DOWNLOAD_CALENDAR_FILE_WARNING_MESSAGE" desc="Warning message displayed inside an alert before downloading a calendar file.[iOS only]">
           This website wants to download a file and add it to your calendar.
@@ -1116,62 +1328,62 @@
       <message name="IDS_IOS_DOWNLOAD_CALENDAR_FILE_WARNING_TITLE" desc="Title of the alert displaying a warning message before downloading a calendar file.[iOS only]">
           Calendar File Available
       </message>
+      <message name="IDS_IOS_DOWNLOAD_INCOGNITO_WARNING_MESSAGE" desc="Warning message displayed when the user downloads a file while on Incognito.[iOS only]">
+          Anyone using this device can see downloaded files
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_CANCEL_CONFIRMATION" desc="Alert title to confirm download cancellation [Length: 30em] [iOS only]">
+        Stop Download?
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_CANNOT_BE_RETRIED" desc="Label displaying that downloading a file has failed and cannot be retried. [Length: 25em] [iOS only]">
+          Download failed and cannot be retried.
+      </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_CANNOT_DETERMINE_FILE_SIZE" desc="Message displayed when the size of the file to be downloaded is unknown. [Length: 30em] [iOS only]">
         Cannot determine file size.
       </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_CONTINUE" desc="The title of Continue button in the Stop Download? confirmation dialog [30em]">
+        Continue
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_COULDNT_DOWNLOAD" desc="Label displaying that downloading a file was unsuccessful. [Length: 25em] [iOS only]">
+        Couldn't Download
+      </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD" desc="Button to start downloading a file. [Length: 15em] [iOS only]">
         Download
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_TO_FILES" desc="Button to start downloading a file to Files e.g. download to local storage. Files is a product name i.e. the Files app on iOS devices and the correct localized version of the product name should be used. [Length: 15em] [iOS only]" meaning="Button to start downloading a file to Files e.g. download to local storage. Files is a product name i.e. the Files app on iOS devices and the correct localized version of the product name should be used. [Length: 15em] [iOS only]">
-        Files
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_TO_DRIVE" meaning="Button to start downloading a file to Drive e.g. download to Google Drive. Google Drive is a product name and the correct localized version of the product name should be used. [Length: 15em] [iOS only]" desc="Button to start downloading a file to Drive e.g. download to Google Drive. Google Drive is a product name and the correct localized version of the product name should be used. [Length: 15em] [iOS only]">
-        Drive
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_FILE_WITHOUT_SIZE" desc="Label asking the user whether they want to start the download for a file. [Length: 25em] [iOS only]" meaning="Label asking the user whether they want to start the download for a file. [Length: 25em] [iOS only]">
-        Download file?
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_FILE_WITH_SIZE" desc="Label asking the user whether they want to start the download for a file. It includes the size of the file to be downloaded. [Length: 25em] [iOS only]" meaning="Label asking the user whether they want to start the download for a file. It includes the size of the file to be downloaded. [Length: 25em] [iOS only]">
-        Download file? (<ph name="FILE_SIZE">$1<ex>456KB</ex></ph>)
-      </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOADING" desc="Accessibility label for the file icon while the file is being downloaded. [iOS only]">
         Downloading
       </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOADING_ELIPSIS" desc="Label for the file being downloaded. [Length: 25em] [iOS only]">
+        Downloading… <ph name="FILE_SIZE">$1<ex>456KB</ex></ph>
+      </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_COMPLETE" desc="Accessibility label for the file icon when the file has been completely downloaded. [iOS only]">
         Download complete
       </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_FAILED" desc="Label displaying that downloading a file was unsuccessful. [Length: 25em] [iOS only]">
         Download failed.
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_COULDNT_DOWNLOAD" desc="Label displaying that downloading a file was unsuccessful. [Length: 25em] [iOS only]">
-        Couldn't Download
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_FILE_WITHOUT_SIZE" desc="Label asking the user whether they want to start the download for a file. [Length: 25em] [iOS only]" meaning="Label asking the user whether they want to start the download for a file. [Length: 25em] [iOS only]">
+        Download file?
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_CANNOT_BE_RETRIED" desc="Label displaying that downloading a file has failed and cannot be retried. [Length: 25em] [iOS only]">
-          Download failed and cannot be retried.
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_FILE_WITH_SIZE" desc="Label asking the user whether they want to start the download for a file. It includes the size of the file to be downloaded. [Length: 25em] [iOS only]" meaning="Label asking the user whether they want to start the download for a file. It includes the size of the file to be downloaded. [Length: 25em] [iOS only]">
+        Download file? (<ph name="FILE_SIZE">$1<ex>456KB</ex></ph>)
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_INSTALL_GOOGLE_DRIVE" desc="Button to install the Google Drive app. [Length: 25em] [iOS only]">
-        Install Google Drive
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_TO_DRIVE" meaning="Button to start downloading a file to Drive e.g. download to Google Drive. Google Drive is a product name and the correct localized version of the product name should be used. [Length: 15em] [iOS only]" desc="Button to start downloading a file to Drive e.g. download to Google Drive. Google Drive is a product name and the correct localized version of the product name should be used. [Length: 15em] [iOS only]">
+        Drive
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOAD_TO_FILES" desc="Button to start downloading a file to Files e.g. download to local storage. Files is a product name i.e. the Files app on iOS devices and the correct localized version of the product name should be used. [Length: 15em] [iOS only]" meaning="Button to start downloading a file to Files e.g. download to local storage. Files is a product name i.e. the Files app on iOS devices and the correct localized version of the product name should be used. [Length: 15em] [iOS only]">
+        Files
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_FAILED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the download has failed. [Length: unlimited] [iOS only]">
+        Download failed
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_GOOGLE_DRIVE" desc="Button for installing Google Drive app. Google Drive is a product name and should use the correct localized version of the product name. [Length: 25em] [iOS only]">
+        Google Drive
       </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_INSTALL" desc="Button to install the Google Drive app. [Length: 25em] [iOS only]">
         Install
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_CANCEL_CONFIRMATION" desc="Alert title to confirm download cancellation [Length: 30em] [iOS only]">
-        Stop Download?
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_CONTINUE" desc="The title of Continue button in the Stop Download? confirmation dialog [30em]">
-        Continue
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_STOP" desc="The title of Stop button in the Stop Download? confirmation dialog [30em]">
-        Stop
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_REPLACE_CONFIRMATION" desc="Alert title to confirm download old download replacement [Length: 30em] [iOS only]">
-        Start New Download?
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_REPLACE_CONFIRMATION_MESSAGE" desc="Alert message to confirm download old download replacement [Length: 100em] [iOS only]">
-        This will stop all progress for your current download.
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_DOWNLOADING_ELIPSIS" desc="Label for the file being downloaded. [Length: 25em] [iOS only]">
-        Downloading… <ph name="FILE_SIZE">$1<ex>456KB</ex></ph>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_INSTALL_GOOGLE_DRIVE" desc="Button to install the Google Drive app. [Length: 25em] [iOS only]">
+        Install Google Drive
       </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_NO_APP_MESSAGE" desc="Message displayed in dialog informing user that no application on the phone can open the downloaded file. [Length: 50em] [iOS only]">
         No application on this device can open the file.
@@ -1179,33 +1391,36 @@
       <message name="IDS_IOS_DOWNLOAD_MANAGER_PERCENT_DOWNLOADED" desc="Accessibility label for the percentage of the file that has been downloaded. [iOS only]">
         <ph name="PERCENT">$1<ex>49</ex></ph> percent downloaded
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_RETRY_DOWNLOAD" desc="Button to retry downloading a file once a previous attempt to download the file failed. [Length: 25em] [iOS only]">
-        Retry Download
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_REPLACE_CONFIRMATION" desc="Alert title to confirm download old download replacement [Length: 30em] [iOS only]">
+        Start New Download?
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_TRY_AGAIN" desc="Button to retry downloading a file once a previous attempt to download the file failed. [Length: 25em] [iOS only]">
-        Try Again
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_TIME_LEFT" desc="Label displaying the number of minutes remaining for the download. [Length: 7em] [iOS only]">
-        <ph name="MINUTES">$1<ex>3</ex></ph> min
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_UNABLE_TO_OPEN_FILE" desc="Title of dialog displayed when the user attempts to open a downloaded file and no app on the device can open the file. [Length: 25em] [iOS only]">
-        Unable to Open File
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_FAILED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the download has failed. [Length: unlimited] [iOS only]">
-        Download failed
-      </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_SUCCEEDED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the download has sucessfully finished. [Length: unlimited] [iOS only]">
-        Download finished
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_REPLACE_CONFIRMATION_MESSAGE" desc="Alert message to confirm download old download replacement [Length: 100em] [iOS only]">
+        This will stop all progress for your current download.
       </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_REQUESTED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the Download Manager UI is shown to the user. [Length: unlimited] [iOS only]">
         File download is available. Options available near bottom of screen.
       </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_RETRY_DOWNLOAD" desc="Button to retry downloading a file once a previous attempt to download the file failed. [Length: 25em] [iOS only]">
+        Retry Download
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_STOP" desc="The title of Stop button in the Stop Download? confirmation dialog [30em]">
+        Stop
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_SUCCEEDED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the download has sucessfully finished. [Length: unlimited] [iOS only]">
+        Download finished
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_TIME_LEFT" desc="Label displaying the number of minutes remaining for the download. [Length: 7em] [iOS only]">
+        <ph name="MINUTES">$1<ex>3</ex></ph> min
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_TRY_AGAIN" desc="Button to retry downloading a file once a previous attempt to download the file failed. [Length: 25em] [iOS only]">
+        Try Again
+      </message>
+      <message name="IDS_IOS_DOWNLOAD_MANAGER_UNABLE_TO_OPEN_FILE" desc="Title of dialog displayed when the user attempts to open a downloaded file and no app on the device can open the file. [Length: 25em] [iOS only]">
+        Unable to Open File
+      </message>
       <message name="IDS_IOS_DOWNLOAD_MANAGER_UPLOAD_TO_GOOGLE_DRIVE" desc="Button for uploading a downloaded file to Google Drive. It's displayed on the dialog presented when no app on the device can open the file. [Length: 25em] [iOS only]">
         Upload to Google Drive
       </message>
-      <message name="IDS_IOS_DOWNLOAD_MANAGER_GOOGLE_DRIVE" desc="Button for installing Google Drive app. Google Drive is a product name and should use the correct localized version of the product name. [Length: 25em] [iOS only]">
-        Google Drive
-      </message>
       <message name="IDS_IOS_DOWNLOAD_MOBILECONFIG_CONTINUE" desc="Text in the confirmation dialog button that let the user download a .mobileconfig file.[iOS only]">
           Continue
       </message>
@@ -1215,21 +1430,100 @@
       <message name="IDS_IOS_DOWNLOAD_MOBILECONFIG_FILE_WARNING_TITLE" desc="Title of the alert displaying a warning message before downloading a .mobileconfig file.[iOS only]">
           Configuration Profile Available
       </message>
-      <message name="IDS_IOS_DOWNLOAD_INCOGNITO_WARNING_MESSAGE" desc="Warning message displayed when the user downloads a file while on Incognito.[iOS only]">
-          Anyone using this device can see downloaded files
+      <message name="IDS_IOS_EDIT_ACTION_TITLE" desc="Title of the action used to edit a selected item. [iOS only]">
+        Edit
+      </message>
+      <message name="IDS_IOS_EDIT_PASSWORD_DESCRIPTION" desc="Message inside confirmation alert when the user is trying to edit password [iOS only]" meaning="Telling user to ensure provided password matches password on the website.">
+        Make sure the password you are saving matches your password for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_BY_YOUR_ORGANIZATION" desc="Text displayed to inform the user that the browser is managed by Enterprise policies (without link). [iOS only]">
+        Managed by your organization
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_INFO" desc="Text displayed to inform the user that the browser is managed by one or more Enterprise policies. [iOS only]">
+        Managed by your organization. Some features may be unavailable. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_SAVE_IN_ACCOUNT" desc="Text displayed to inform the user that types that can be stored on their account are limited (i.e. managed). [iOS only]">
+        Your organization limits what you can save in your Google Account.
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_SETTING_DESC_WITHOUT_COMPANY_NAME" desc="Text displayed to inform the user that the browser is managed by Enterprise policies without company name. [iOS only]">
+        Managed by your organization.
+<ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn More<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_SETTING_DESC_WITH_COMPANY_NAME" desc="Text displayed to inform the user that the browser is managed by Enterprise policies. MANAGER can be a domain or an email address. [iOS only]">
+        Managed by <ph name="MANAGER">$1<ex>Google</ex></ph>. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_SETTING_MESSAGE" desc="Text displayed to inform the user that the setting is managed by an Enterprise policy. [iOS only]">
+        This setting is enforced by your administrator.
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_SETTING_SYNC_EVERYTHING_MESSAGE" desc="Text displayed to inform the user that the setting 'sync everything' is managed by an Enterprise policy. [iOS only]">
+        Your organization doesn't allow for you to sync everything.
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_SIGNIN_LEARN_MORE" desc="Text displayed to inform the user that their Sign In/Sync is managed by their administrator. [iOS only]">
+          Your browser is managed. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn More<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_MANAGED_SYNC" desc="Text displayed to inform the user that syncable types are limited (i.e. managed). [iOS only]">
+        Your organization limits what you can sync.
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_RESTRICTED_ACCOUNTS_TO_PATTERNS_MESSAGE" desc="Text displayed in the popover to inform the user that the browser is managed by Enterprise policies. (Restrict Accounts To Patterns) [iOS only]">
+          Your organization allows you to sign in only with certain accounts. Accounts that aren't allowed are hidden.
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT" desc="Text displayed in an alert when the user is signed out due to browser sign-in becoming disabled by policy. [iOS only]">
+        You're Signed Out
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_CONTINUE" desc="The text in the 'Continue' button, displayed in an alert when the user is signed out due to browser sign-in becoming disabled by policy.">
+        Continue
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_LEARN_MORE" desc="The text in the 'Learn More' button, displayed in an alert when the user is signed out due to browser sign-in becoming disabled by policy.">
+        Learn More
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_MESSAGE" desc="Message displayed in a prompt when the user is signed out due to browser sign-in becoming disabled by policy.">
+        Your organization turned off sign in. You can still see your bookmarks, history, passwords and other settings on this device. If you make changes, they won’t sync to your account.
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when the user is signed out due to browser sign-in becoming disabled by policy. Related with IDS_IOS_ENTERPRISE_SIGNED_OUT.">
+        Your organization turned off sign-in. New bookmarks, passwords, and more will be saved only to this device.
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE" desc="Message displayed in a prompt when sync is disabled due to an enterprise policy. [iOS only]">
+        Your organization turned off sync. You can still see your bookmarks, history, passwords and other settings on this device. If you make changes, they won’t sync to your account.
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE" desc="Title displayed in a prompt when sync is disabled due to an enterprise policy. [iOS only]">
+        Sync has Been Turned Off
+      </message>
+      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_UNO.">
+        Some Features No Longer Available
+      </message>
+      <message name="IDS_IOS_EXPORT_PASSWORDS" desc="Button that the user can press to export passwords. [Length: 22em] [iOS only]">
+        Export Passwords...
+      </message>
+      <message name="IDS_IOS_EXPORT_PASSWORDS_ALERT_MESSAGE" desc="The message of the alert displayed as a warning to the user who tapped on the button to export passwords. [iOS only]">
+        Your passwords will be visible to anyone who can see the exported file.
+      </message>
+      <message name="IDS_IOS_EXPORT_PASSWORDS_CANCEL_BUTTON" desc="Label of a confirmation dialog button which allows the user to cancel passwords export. [Length: 22em] [iOS only]">
+        Cancel
+      </message>
+      <message name="IDS_IOS_EXPORT_PASSWORDS_FAILED_ALERT_TITLE" desc="Title of the alert informing the user that exporting passwords has failed. [iOS only]">
+        Can't Export Passwords
+      </message>
+      <message name="IDS_IOS_EXPORT_PASSWORDS_OUT_OF_SPACE_ALERT_MESSAGE" desc="The message of an error alert displayed while trying to export passwords. If informs the user that their device storage is almost full and instructing them to free space. [iOS only]">
+        Your device is almost full. Free up space and try again.
+      </message>
+      <message name="IDS_IOS_EXPORT_PASSWORDS_PREPARING_ALERT_TITLE" desc="The title of the alert displayed to indicate that the passwords are being prepared for export. [iOS only]">
+        Preparing Passwords...
+      </message>
+      <message name="IDS_IOS_EXPORT_PASSWORDS_UNKNOWN_ERROR_ALERT_MESSAGE" desc="The message of the alert informing the user that an error has occured while exporting passwords. [iOS only]">
+        An error occured. Try again later.
       </message>
       <message name="IDS_IOS_FACETIME_BUTTON" desc="Text in the confirmation dialog button that will initiate a FaceTime call for the presented number. [Length: 10em] [iOS only]">
         FaceTime
       </message>
+      <message name="IDS_IOS_FEED_CARD_SIGN_IN_ONLY_PROMO_LABEL" desc="This string is on a promo intended to promote signing in to Chrome with the user's Google Account. It appears at the bottom of the Discover news feed on the New Tab Page when the user is not signed in. It explains that the user can sign in to see content suggestions related to their existing content interests and preferences. [iOS only].">
+        Manage your interests and preferences.
+      </message>
       <message name="IDS_IOS_FEED_CARD_SIGN_IN_PROMO_CANCEL_BUTTON" desc="Text of the cancel button in the feed card sign-in promo UI. [iOS only]">
         Cancel
       </message>
       <message name="IDS_IOS_FEED_CARD_SIGN_IN_PROMO_CONTINUE_BUTTON" desc="Text of the continue button in the feed card sign-in promo UI. [iOS only]">
         Continue
       </message>
-      <message name="IDS_IOS_FEED_CARD_SIGN_IN_ONLY_PROMO_LABEL" desc="This string is on a promo intended to promote signing in to Chrome with the user's Google Account. It appears at the bottom of the Discover news feed on the New Tab Page when the user is not signed in. It explains that the user can sign in to see content suggestions related to their existing content interests and preferences. [iOS only].">
-        Manage your interests and preferences.
-      </message>
       <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_TITLE" desc="Title of the feed card sync half sheet. [iOS only]">
         Turn on sync to manage the content you see
       </message>
@@ -1242,11 +1536,17 @@
       <message name="IDS_IOS_FEED_MANAGEMENT_ACTIVITY_TEXT" desc="The 'Activity' row title in the feed management UI.">
         Activity
       </message>
+      <message name="IDS_IOS_FEED_MANAGEMENT_FOLLOWING_DETAIL" desc="The explanation of the 'Following' row title in the feed management UI.">
+        Manage the sites you follow
+      </message>
       <message name="IDS_IOS_FEED_MANAGEMENT_FOLLOWING_TEXT" desc="The 'Following' row title in the feed management UI.">
         Following
       </message>
-      <message name="IDS_IOS_FEED_MANAGEMENT_FOLLOWING_DETAIL" desc="The explanation of the 'Following' row title in the feed management UI.">
-        Manage the sites you follow
+      <message name="IDS_IOS_FEED_MANAGEMENT_HIDDEN_DETAIL" desc="The explanation of the 'Hidden' row in the feed management UI.">
+        See and edit topics you've hidden from your account
+      </message>
+      <message name="IDS_IOS_FEED_MANAGEMENT_HIDDEN_TEXT" desc="The 'Hidden' row title in the feed management UI.">
+        Hidden
       </message>
       <message name="IDS_IOS_FEED_MANAGEMENT_INTERESTS_DETAIL" desc="The explanation of the 'Interests' row in the feed management UI.">
         See and edit the topics you're interested in
@@ -1257,12 +1557,6 @@
       <message name="IDS_IOS_FEED_MANAGEMENT_INTERESTS_TEXT" desc="The 'Interests' row title in the feed management UI.">
         Interests
       </message>
-      <message name="IDS_IOS_FEED_MANAGEMENT_HIDDEN_DETAIL" desc="The explanation of the 'Hidden' row in the feed management UI.">
-        See and edit topics you've hidden from your account
-      </message>
-      <message name="IDS_IOS_FEED_MANAGEMENT_HIDDEN_TEXT" desc="The 'Hidden' row title in the feed management UI.">
-        Hidden
-      </message>
       <message name="IDS_IOS_FEED_MANAGEMENT_TITLE" desc="The title of the feed management UI.">
         Manage
       </message>
@@ -1275,8 +1569,20 @@
       <message name="IDS_IOS_FEED_SORT_PUBLISHER" desc="Sort by publisher label text in feed sort menu.">
         Sort by Publisher
       </message>
-      <message name="IDS_IOS_FIRST_FOLLOW_TITLE" desc="The title of the first follow surface.">
-        You're following <ph name="CHANNEL_NAME">$1<ex>ESPN</ex></ph>
+      <message name="IDS_IOS_FIRSTRUN_TERMS_TITLE" desc="Title for the Terms of Service page shown to user on First Run. [Length: 20em] [iOS only]">
+        Terms of Service
+      </message>
+      <message name="IDS_IOS_FIRST_FOLLOW_BODY" desc="The body of the first follow surface.">
+        Sites you follow are saved in your Google account. You can Manage them in Discover Settings.
+      </message>
+      <message name="IDS_IOS_FIRST_FOLLOW_BODY_UPDATE" desc="The body of the first follow surface for the follow UI update.">
+        The sites and searches you follow are saved in your Google Account. You can manage your follows in settings at any time.
+      </message>
+      <message name="IDS_IOS_FIRST_FOLLOW_GOT_IT" desc="The action button to dismiss the first follow surface.">
+        Got It
+      </message>
+      <message name="IDS_IOS_FIRST_FOLLOW_GO_TO_FOLLOWING" desc="The action button to see the Following feed in the first follow surface.">
+        Go to Following
       </message>
       <message name="IDS_IOS_FIRST_FOLLOW_SUBTITLE" desc="The subtitle of the first follow surface.">
         You'll now see stories from <ph name="CHANNEL_NAME">$1<ex>ESPN</ex></ph> when you open a new tab.
@@ -1284,50 +1590,14 @@
       <message name="IDS_IOS_FIRST_FOLLOW_SUBTITLE_NO_CONTENT" desc="The subtitle of the first follow surface when there's no available content from the website.">
         Soon, you’ll see stories from <ph name="CHANNEL_NAME">$1<ex>ESPN</ex></ph> when you open a new tab.
       </message>
-      <message name="IDS_IOS_FIRST_FOLLOW_BODY" desc="The body of the first follow surface.">
-        Sites you follow are saved in your Google account. You can Manage them in Discover Settings.
+      <message name="IDS_IOS_FIRST_FOLLOW_SUBTITLE_NO_CONTENT_UPDATE" desc="The subtitle of the first follow surface when there's no available content from the website for the follow UI update.">
+        Soon, you’ll see content from and about <ph name="CHANNEL_NAME">$1<ex>ESPN</ex></ph> in Following.
       </message>
       <message name="IDS_IOS_FIRST_FOLLOW_SUBTITLE_UPDATE" desc="The subtitle of the first follow surface for the follow UI update.">
         You'll now see content from and about <ph name="CHANNEL_NAME">$1<ex>ESPN</ex></ph> in Following.
       </message>
-      <message name="IDS_IOS_FIRST_FOLLOW_SUBTITLE_NO_CONTENT_UPDATE" desc="The subtitle of the first follow surface when there's no available content from the website for the follow UI update.">
-        Soon, you’ll see content from and about <ph name="CHANNEL_NAME">$1<ex>ESPN</ex></ph> in Following.
-      </message>
-      <message name="IDS_IOS_FIRST_FOLLOW_BODY_UPDATE" desc="The body of the first follow surface for the follow UI update.">
-        The sites and searches you follow are saved in your Google Account. You can manage your follows in settings at any time.
-      </message>
-      <message name="IDS_IOS_FIRST_FOLLOW_GO_TO_FOLLOWING" desc="The action button to see the Following feed in the first follow surface.">
-        Go to Following
-      </message>
-      <message name="IDS_IOS_FIRST_FOLLOW_GOT_IT" desc="The action button to dismiss the first follow surface.">
-        Got It
-      </message>
-      <message name="IDS_IOS_FOLLOW_WHILE_BROWSING_IPH" desc="The text of the while browsing follow IPH.">
-        To see updates from this site, follow it here.
-      </message>
-      <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TITLE" desc="The title of an empty following list.">
-        You'll find your followed sites here
-      </message>
-      <message name="IDS_IOS_FOLLOW_MANAGEMENT_TITLE" desc="The title of the following feed management UI.">
-        Following
-      </message>
-      <message name="IDS_IOS_FOLLOW_MANAGEMENT_CHANNEL_AWAITING_CONTENT" desc="An indication that a web channel is waiting for content in the following feed management UI">
-        Waiting for content
-      </message>
-      <message name="IDS_IOS_FOLLOW_MANAGEMENT_CHANNEL_UNAVAILABLE" desc="An indication that a web channel is unavailable in the following feed management UI">
-        Updates Unavailable
-      </message>
-      <message name="IDS_IOS_FOLLOW_MANAGEMENT_UNFOLLOW_ACTION" desc="The 'Unfollow' action for a channel in the following feed management UI">
-        Unfollow
-      </message>
-      <message name="IDS_IOS_FOLLOW_MANAGEMENT_VISIT_SITE_ACTION" desc="The 'Visit Site' action for a followed item in the following feed management UI">
-        Visit Site
-      </message>
-      <message name="IDS_IOS_FOLLOWING_FEED_TITLE" desc="The title in the Following feed header label.">
-        Following
-      </message>
-      <message name="IDS_IOS_PHONE_CALL_BUTTON" desc="Text in the confirmation dialog button that will initiate a phone call for the presented number. [Length: 10em] [iOS only]">
-        Call
+      <message name="IDS_IOS_FIRST_FOLLOW_TITLE" desc="The title of the first follow surface.">
+        You're following <ph name="CHANNEL_NAME">$1<ex>ESPN</ex></ph>
       </message>
       <message name="IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_FIRST_STEP" desc="Text of the row indicating the first step of setting the default browser [iOS only]">
         Open <ph name="BEGIN_BOLD">BEGIN_BOLD</ph>Settings<ph name="END_BOLD">END_BOLD</ph>
@@ -1335,12 +1605,12 @@
       <message name="IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_PRIMARY_ACTION" desc="The primary action string on the default browser screen presented to the user on First Run [iOS only]">
         Make Default in Settings…
       </message>
-      <message name="IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_SECOND_STEP" desc="Text of the row indicating the second step of setting the default browser [iOS only]">
-        Tap <ph name="BEGIN_BOLD">BEGIN_BOLD</ph>Default Browser App<ph name="END_BOLD">END_BOLD</ph>
-      </message>
       <message name="IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_SECONDARY_ACTION" desc="The secondary action string on the default browser screen presented to the user on First Run [iOS only]">
         No Thanks
       </message>
+      <message name="IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_SECOND_STEP" desc="Text of the row indicating the second step of setting the default browser [iOS only]">
+        Tap <ph name="BEGIN_BOLD">BEGIN_BOLD</ph>Default Browser App<ph name="END_BOLD">END_BOLD</ph>
+      </message>
       <message name="IDS_IOS_FIRST_RUN_SCREEN_READ_MORE" desc="The label on the primary button of some screens in the first run experience if the content requires scrolling to the end [iOS only]">
         More
       </message>
@@ -1383,12 +1653,78 @@
       <message name="IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TITLE_IPHONE" desc="The title of the welcome screen presented to the user on First Run when on iPhone [iOS only]">
         Built for Your iPhone
       </message>
-      <message name="IDS_IOS_FIRSTRUN_TERMS_TITLE" desc="Title for the Terms of Service page shown to user on First Run. [Length: 20em] [iOS only]">
-        Terms of Service
+      <message name="IDS_IOS_FOLLOWING_FEED_TITLE" desc="The title in the Following feed header label.">
+        Following
+      </message>
+      <message name="IDS_IOS_FOLLOW_MANAGEMENT_CHANNEL_AWAITING_CONTENT" desc="An indication that a web channel is waiting for content in the following feed management UI">
+        Waiting for content
+      </message>
+      <message name="IDS_IOS_FOLLOW_MANAGEMENT_CHANNEL_UNAVAILABLE" desc="An indication that a web channel is unavailable in the following feed management UI">
+        Updates Unavailable
+      </message>
+      <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TITLE" desc="The title of an empty following list.">
+        You'll find your followed sites here
+      </message>
+      <message name="IDS_IOS_FOLLOW_MANAGEMENT_TITLE" desc="The title of the following feed management UI.">
+        Following
+      </message>
+      <message name="IDS_IOS_FOLLOW_MANAGEMENT_UNFOLLOW_ACTION" desc="The 'Unfollow' action for a channel in the following feed management UI">
+        Unfollow
+      </message>
+      <message name="IDS_IOS_FOLLOW_MANAGEMENT_VISIT_SITE_ACTION" desc="The 'Visit Site' action for a followed item in the following feed management UI">
+        Visit Site
+      </message>
+      <message name="IDS_IOS_FOLLOW_WHILE_BROWSING_IPH" desc="The text of the while browsing follow IPH.">
+        To see updates from this site, follow it here.
       </message>
       <message name="IDS_IOS_GENERIC_PASSKIT_ERROR" desc="Generic error message on failure reading a PassKit object. [Length: 60em] [iOS only]">
         Sorry, your Pass cannot be installed to Passbook at this time.
       </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNTS_MANAGEMENT_FROM_ACCOUNT_SETTINGS_TITLE" desc="Title of a page that shows all accounts on the user's device and lets them add, remove and otherwise manage their accounts. Avoid long strings given the limited space between surrounding buttons.">
+        Accounts on This Device
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_BATCH_UPLOAD_BUTTON_ITEM" desc="Title shown on the batch upload button item. [iOS only]">
+        Save in Account…
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_BATCH_UPLOAD_ITEMS_ITEM" desc="Detailed text shown above the batch upload button item. To explain the details of the local data to the user. [iOS only]">
+        {count, plural,
+          =1 {{count} item is saved only to this device. To use it on your other devices, save it in your Google Account, {email}.}
+          other {{count} items are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}}
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_BATCH_UPLOAD_PASSWORDS_AND_ITEMS_ITEM" desc="Detailed text shown above the batch upload button item. To explain the details of the local data to the user. [iOS only]">
+        {count, plural,
+          =1 {{count} password and other items are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}
+          other {{count} passwords and other items are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}}
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_BATCH_UPLOAD_PASSWORDS_ITEM" desc="Detailed text shown above the batch upload button item. To explain the details of the local data to the user. [iOS only]">
+        {count, plural,
+          =1 {{count} password is saved only to this device. To use it on your other devices, save it in your Google Account, {email}.}
+          other {{count} passwords are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}}
+      </message>
+     <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_MANAGE_ACCOUNTS_ITEM" desc="Title shown on the manage accounts on this device button item. [iOS only]">
+        Manage Accounts on This Device...
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_MANAGE_GOOGLE_ACCOUNT_ITEM" desc="Title shown on the manage your Google Account button item. [iOS only]">
+        Manage Your Google Account
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_SIGN_OUT_ITEM" desc="Title shown on the sign out button item. [iOS only]">
+        Sign Out
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_SIGN_OUT_SNACKBAR_MESSAGE" desc="Snackbar message shown after signing out from account settings. [iOS only]">
+        Signed out. Sign back in to use the bookmarks, passwords, and more in your account.
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_SIGN_OUT_SNACKBAR_MESSAGE_ENTERPRISE" desc="Snackbar message shown after signing out from account settings, when an enterprise policy disabled sync. [iOS only]">
+        Signed out
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_TITLE" desc="Title for the view in the Settings for account features management UI. [iOS only]">
+        Account
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_TYPES_LIST_DESCRIPTION" desc="Footer below a section with toggles to control which types of data users can use and save in their Google Account (as opposed to saving them only on the device).">
+        When on, use and save data in your Google Account. When off, data is saved only to this device.
+      </message>
+      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_TYPES_LIST_HEADER" desc="Header of a section with toggles to control which types of data users can use and save in their Google Account (as opposed to saving them only on the device). Try to avoid long strings because this is a header in large font size.">
+        In Your Google Account
+      </message>
       <message name="IDS_IOS_GOOGLE_APPS_INSTALL_BUTTON" desc="Title for the Google Apps section in the Google Apps specific settings. This should match Apple's translation of the INSTALL button in the App Store [Length: 15em] [iOS only]">
         INSTALL
       </message>
@@ -1401,17 +1737,11 @@
       <message name="IDS_IOS_GOOGLE_APPS_SM_SETTINGS" desc="Title for the view in Settings for managing Google apps specific settings. Translate 'Google Apps'. [Length: 15em] [iOS only]">
         Google Apps
       </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SIGNIN_DISABLED_BY_ADMINISTRATOR" desc="Feature detail text in the Google services Settings that notifies the user that express sign-in was disabled by their administrator [iOS only]">
-        Turned off by your administrator
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_ALL" desc="Parcel tracking feature option to turn on auto-track for all detected packages. [iOS only]">
+        Auto-Track All Detected Packages
       </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_SEARCH_SUGGESTIONS_TEXT" desc="Feature title in the settings for the user to enable/disable, to send omnibox input to the user's default search engine to get additional suggestions. Text related to 'When you type in the address bar or search box, Chrome sends what you type to your default search engine to get better suggestions. This is off in Incognito.' [iOS only]">
-        Improve search suggestions
-      </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SAFE_BROWSING_DETAIL" desc="Feature detail text in the setting to enable/disable safe browsing">
-        Sends URLs of some pages you visit to Google, when your security is at risk
-      </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SAFE_BROWSING_TEXT" desc="The section title of 'Protects you and your device from dangerous sites'">
-        Safe Browsing (protects you and your device from dangerous sites)
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_NEVER" desc="Parcel tracking feature option to never auto-track for all detected packages. [iOS only]">
+        Never Auto-Detect Packages
       </message>
       <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_BETTER_SEARCH_AND_BROWSING_DETAIL" desc="Detail text for a feature in the settings for the user to enable/disable, to make searches andn browsing better. Related to 'Make searches and browsing better'. [iOS only]">
         Sends URLs of pages you visit to Google.
@@ -1425,77 +1755,17 @@
       <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_CHROME_DETAIL" desc="Feature detail text in the settings for the user enable or disable. Related with 'Help improve Chrome's features and performance' feature. [iOS only]">
         Automatically sends usage statistics and crash reports to Google.
       </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Google services. [Length: 26em] [iOS only]">
-        Google Services
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_SEARCH_SUGGESTIONS_TEXT" desc="Feature title in the settings for the user to enable/disable, to send omnibox input to the user's default search engine to get additional suggestions. Text related to 'When you type in the address bar or search box, Chrome sends what you type to your default search engine to get better suggestions. This is off in Incognito.' [iOS only]">
+        Improve search suggestions
       </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_ALL" desc="Parcel tracking feature option to turn on auto-track for all detected packages. [iOS only]">
-        Auto-Track All Detected Packages
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SAFE_BROWSING_DETAIL" desc="Feature detail text in the setting to enable/disable safe browsing">
+        Sends URLs of some pages you visit to Google, when your security is at risk
       </message>
-      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_NEVER" desc="Parcel tracking feature option to never auto-track for all detected packages. [iOS only]">
-        Never Auto-Detect Packages
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SAFE_BROWSING_TEXT" desc="The section title of 'Protects you and your device from dangerous sites'">
+        Safe Browsing (protects you and your device from dangerous sites)
       </message>
-      <message name="IDS_IOS_GOOGLE_SYNC_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Sync. [Length: 26em] [iOS only]">
-        Sync
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_BATCH_UPLOAD_BUTTON_ITEM" desc="Title shown on the batch upload button item. [iOS only]">
-        Save in Account…
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_BATCH_UPLOAD_PASSWORDS_ITEM" desc="Detailed text shown above the batch upload button item. To explain the details of the local data to the user. [iOS only]">
-        {count, plural,
-          =1 {{count} password is saved only to this device. To use it on your other devices, save it in your Google Account, {email}.}
-          other {{count} passwords are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}}
-      </message>
-     <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_BATCH_UPLOAD_ITEMS_ITEM" desc="Detailed text shown above the batch upload button item. To explain the details of the local data to the user. [iOS only]">
-        {count, plural,
-          =1 {{count} item is saved only to this device. To use it on your other devices, save it in your Google Account, {email}.}
-          other {{count} items are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}}
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_BATCH_UPLOAD_PASSWORDS_AND_ITEMS_ITEM" desc="Detailed text shown above the batch upload button item. To explain the details of the local data to the user. [iOS only]">
-        {count, plural,
-          =1 {{count} password and other items are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}
-          other {{count} passwords and other items are saved only to this device. To use them on your other devices, save them in your Google Account, {email}.}}
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_TITLE" desc="Title for the view in the Settings for account features management UI. [iOS only]">
-        Account
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_TYPES_LIST_HEADER" desc="Header of a section with toggles to control which types of data users can use and save in their Google Account (as opposed to saving them only on the device). Try to avoid long strings because this is a header in large font size.">
-        In Your Google Account
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_TYPES_LIST_DESCRIPTION" desc="Footer below a section with toggles to control which types of data users can use and save in their Google Account (as opposed to saving them only on the device).">
-        When on, use and save data in your Google Account. When off, data is saved only to this device.
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNTS_MANAGEMENT_FROM_ACCOUNT_SETTINGS_TITLE" desc="Title of a page that shows all accounts on the user's device and lets them add, remove and otherwise manage their accounts. Avoid long strings given the limited space between surrounding buttons.">
-        Accounts on This Device
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_MANAGE_GOOGLE_ACCOUNT_ITEM" desc="Title shown on the manage your Google Account button item. [iOS only]">
-        Manage Your Google Account
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_MANAGE_ACCOUNTS_ITEM" desc="Title shown on the manage accounts on this device button item. [iOS only]">
-        Manage Accounts on This Device...
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_SIGN_OUT_ITEM" desc="Title shown on the sign out button item. [iOS only]">
-        Sign Out
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_SIGN_OUT_SNACKBAR_MESSAGE" desc="Snackbar message shown after signing out from account settings. [iOS only]">
-        Signed out. Sign back in to use the bookmarks, passwords, and more in your account.
-      </message>
-      <message name="IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_SIGN_OUT_SNACKBAR_MESSAGE_ENTERPRISE" desc="Snackbar message shown after signing out from account settings, when an enterprise policy disabled sync. [iOS only]">
-        Signed out
-      </message>
-      <message name="IDS_SIGNIN_DISABLED_ACTION_SHEET_LABEL" desc="Body of a message that is shown when the user starts to sign out. This string precedes the confirmation button 'Sign Out'. If the user chooses to continue to sign out, then the data in their Google Account (such as bookmarks, passwords, history, settings, and more) won't be available on their device. If they sign back in to their Google Account, their data will come back. The tone should be helpful and instructive. [iOS only]">
-        After you sign out, the bookmarks, passwords, and more in your Google Account will be removed from this device.
-      </message>
-      <message name="IDS_IOS_DATA_NOT_UPLOADED_DIALOG_TITLE" desc="Title of a dialog that is shown when the user starts to sign out; the user chooses to sync some or all data types, but some data hasn't been saved in their Google Account yet (for example, if there was an error). This string precedes the body text 'Some of your Chrome data hasn't been saved to your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.', and the user can choose to tap on the buttons 'Cancel' or 'Delete and Sign Out'. If the user chooses to continue to sign out, then any of their data (such as bookmarks, passwords, history, settings, and more) that isn't saved in their account will be deleted. The tone should be helpful and instructive. [iOS only]">
-        Some Data Isn't Saved Yet
-      </message>
-      <message name="IDS_IOS_DATA_NOT_UPLOADED_DIALOG_BUTTON" desc="Button of a dialog that is shown when the user starts to sign out; the user chooses to sync some or all data types, but some data hasn't been saved in their Google Account yet (for example, if there was an error). This string follows the heading 'Some Data Isn't Saved Yet' and the body text 'Some of your Chrome data hasn't been saved to your Google Account yet. Try waiting a few minutes before signing out. If you sign out now, this data will be deleted.'; the user can choose to tap on the buttons 'Cancel' or 'Delete and Sign Out'. If the user chooses to continue to sign out, then any of their data (such as bookmarks, passwords, history, settings, and more) that isn't saved in their account will be deleted. The tone should be helpful and instructive. [iOS only]">
-        Delete and Sign Out
-      </message>
-      <message name="IDS_IOS_ADDRESSES_NOT_ENCRYPTED_DIALOG_TEXT" desc="Text of a dialog shown to users when they turn on the ability to use and save addresses in their Google Account. This is shown to users who encrypt their data with their own passphrase in order to explain that addresses they will save in the future will not be encrypted. [iOS only]">
-        Addresses aren't encrypted with your passphrase. This lets you use them in other Google services.
-      </message>
-      <message name="IDS_IOS_SYNC_SETTINGS_TITLE" desc="Title for the navigation item in Advanced Settings. [Length: 26em] [iOS only]">
-        Sync
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SIGNIN_DISABLED_BY_ADMINISTRATOR" desc="Feature detail text in the Google services Settings that notifies the user that express sign-in was disabled by their administrator [iOS only]">
+        Turned off by your administrator
       </message>
       <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_DISABLBED_BY_ADMINISTRATOR_TITLE" desc="Error displayed as title when the sync is disabled by the enterprise policy. The user doesn't have a regular gmail account.">
         Sync Is Disabled by Your Administrator
@@ -1509,6 +1779,12 @@
       <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_FIX_RECOVERABILITY_DEGRADED_FOR_PASSWORDS" desc="Title button to ask the user to reauthenticate, in order to add recovery options, affecting passwords only.">
         To make sure you can always access your saved passwords, verify it's you
       </message>
+      <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Google services. [Length: 26em] [iOS only]">
+        Google Services
+      </message>
+      <message name="IDS_IOS_GOOGLE_SYNC_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Sync. [Length: 26em] [iOS only]">
+        Sync
+      </message>
       <message name="IDS_IOS_HELP_ACCESSIBILITY_LABEL" desc="Used as the accessibility label read by screen readers for a Help button. [iOS only]">
         Help
       </message>
@@ -1521,6 +1797,24 @@
       <message name="IDS_IOS_HISTORY_OTHER_FORMS_OF_HISTORY" desc="The notification at the top of the history page indicating that deleting Chrome browsing history will not delete other forms of history stored at Google My Activity.">
         Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK">BEGIN_LINK</ph>history.google.com<ph name="END_LINK">END_LINK</ph>.
       </message>
+      <message name="IDS_IOS_HISTORY_SYNC_FOOTER_WITHOUT_EMAIL" desc="Small text above the main button on a page that asks users to start syncing their tabs and browsing history. The first sentence is meant to reassure users that they can always change their mind and opt out again. Separately, the second sentence explains how history data may be used to personalise the user's experience in other services.  The tone should be friendly and reassuring.">
+        You can stop syncing anytime in settings. Google may personalize Search and other services based on your history.
+      </message>
+      <message name="IDS_IOS_HISTORY_SYNC_FOOTER_WITH_EMAIL" desc="Small text above the main button on a page that asks users to start syncing their tabs and browsing history. The first sentence reminds the user that they're signed in with a certain account. The second sentence is meant to reassure users that they can always change their mind and opt out again. The third sentence explains how history data may be used to personalise the user's experience in other services. The tone should be friendly and reassuring.">
+        You are signed in as <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>. You can stop syncing anytime in settings. Google may personalize Search and other services based on your history.
+      </message>
+      <message name="IDS_IOS_HISTORY_SYNC_PRIMARY_ACTION" desc="Title of the button to validate the user consent to sync their history and tabs data.">
+        Yes, I'm In
+      </message>
+      <message name="IDS_IOS_HISTORY_SYNC_SECONDARY_ACTION" desc="Title of the button to refuse to give the  consent to sync their history and tabs data.">
+        No Thanks
+      </message>
+      <message name="IDS_IOS_HISTORY_SYNC_SUBTITLE" desc="Text of a page that asks users to start syncing their tabs and browsing history, so they can get back to sites they visited more quickly without having to type them, for example by seeing these sites suggested in the Omnibox.">
+        To quickly get back to sites you've visited, sync your tabs and history.
+      </message>
+      <message name="IDS_IOS_HISTORY_SYNC_TITLE" desc="Title of a page that asks users to start syncing their tabs and browsing history, so they can get back to sites they visited more quickly without having to type them, for example by seeing these sites suggested in the Omnibox.">
+        Save Time, Type Less
+      </message>
       <message name="IDS_IOS_HTTP_LOGIN_DIALOG_PASSWORD_PLACEHOLDER" desc="The placeholder text for the password on the http login dialog [Length: 20em] [iOS only]">
         Password
       </message>
@@ -1539,26 +1833,38 @@
       <message name="IDS_IOS_ICON_SEARCH" desc="Accessibility label for the search icon [iOS only].">
         Search
       </message>
-      <message name="IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only].">
-        Signed in as <ph name="USER_NAME">$1<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">$2<ex>peter.parker@gmail.com</ex></ph>. Opens settings.
-      </message>
-      <message name="IDS_IOS_IDENTITY_DISC_WITH_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only].">
-        Signed in as <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>. Opens settings.
+      <message name="IDS_IOS_IDENTITY_DISC_SIGNED_OUT_ACCESSIBILITY_LABEL" desc="The content description for a toolbar button displaying the signed-out avatar. Tapping on this button opens the sign-in sheet [iOS only].">
+        Signed out. Opens options to sign in.
       </message>
       <message name="IDS_IOS_IDENTITY_DISC_SIGNED_OUT_ACCESSIBILITY_LABEL_WITH_SYNC" desc="The content description for a toolbar button displaying the signed-out avatar. Tapping on this button navigates to 'Turn on Sync' page in settings [iOS only].">
         Signed out. Opens dialog to sign in and turn on sync.
       </message>
-      <message name="IDS_IOS_IDENTITY_DISC_SIGNED_OUT_ACCESSIBILITY_LABEL" desc="The content description for a toolbar button displaying the signed-out avatar. Tapping on this button opens the sign-in sheet [iOS only].">
-        Signed out. Opens options to sign in.
-      </message>
       <message name="IDS_IOS_IDENTITY_DISC_SIGN_IN_PROMO_LABEL" desc="Text in the sheet that offers the user to sign-in to Chrome [iOS only].">
         Get your bookmarks, passwords, and more on all your devices.
       </message>
-      <message name="IDS_IOS_SIGNIN_SHEET_LABEL_FOR_FEED_PROMO" desc="Text in the sheet that offers the user to sign-in to Chrome, when the sheet is opened from one of the NTP feed promos [iOS only].">
-        Sign in to get content based on your interests.
+      <message name="IDS_IOS_IDENTITY_DISC_WITH_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only].">
+        Signed in as <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>. Opens settings.
       </message>
-      <message name="IDS_IOS_SIGNIN_SHEET_LABEL_FOR_RECENT_TABS" desc="This string is on a sign-in page, after the user taps on a promotion about signing in to Chrome with the user's Google Account. It explains the specific user benefit of signing in from this page (access to tabs from other devices). We want users to understand why signing in is beneficial, and click 'Turn on' to sign in to their Google Account. The tone should be informative and lightweight. [iOS only]">
-        Sign in to see your tabs from your other devices.
+      <message name="IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL" desc="The content description for a toolbar button displaying user profile picture. Tapping on this button navigates to 'Sync and Google services' page in settings [iOS only].">
+        Signed in as <ph name="USER_NAME">$1<ex>Peter Parker</ex></ph>. <ph name="USER_EMAIL">$2<ex>peter.parker@gmail.com</ex></ph>. Opens settings.
+      </message>
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_ENTER_BUTTON_LABEL" desc="The label of the enter passphrase action button in the identity error info bar. [iOS only]">
+        Enter
+      </message>
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_ENTER_PASSPHRASE_TITLE" desc="The title of the identity error info bar when the passphrase is required. [iOS only]">
+        Enter your passphrase
+      </message>
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_KEEP_USING_PASSWORDS_MESSAGE" desc="The error message in the identity error info bar related to keep using passwords. [iOS only]">
+        Keep using the passwords in your Google Account
+      </message>
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_PASSWORDS_MESSAGE" desc="The error message in the identity error info bar related to making sure you can always use your passwords. [iOS only]">
+        Make sure you can always use the passwords in your Google Account
+      </message>
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_BUTTON_LABEL" desc="The label of the verify your account action button in the identity error info bar. [iOS only]">
+        Verify
+      </message>
+      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_ITS_YOU_TITLE" desc="The title of the identity error info bar when identity verification is needed. [iOS only]">
+        Verify it's you
       </message>
       <message name="IDS_IOS_INACTIVE_TABS_BUTTON_SUBTITLE" desc="Subtitle of the button in the Tab Grid that opens the grid of Inactive Tabs.">
         Tabs not used for <ph name="THRESHOLD">$1<ex>14</ex></ph> days
@@ -1592,19 +1898,19 @@
       <message name="IDS_IOS_INACTIVE_TABS_TITLE" desc="Title of the grid of Inactive Tabs.">
         Inactive Tabs
       </message>
-      <message name="IDS_IOS_INACTIVE_TABS_USER_EDU_TITLE" desc="Title of the user education panel explaining Inactive Tabs. Title case.">
-        Inactive Tabs Help You Stay Focused
+      <message name="IDS_IOS_INACTIVE_TABS_USER_EDU_DONE" desc="Title of the button dismissing the user education panel explaining Inactive Tabs. Title case.">
+        Done
+      </message>
+      <message name="IDS_IOS_INACTIVE_TABS_USER_EDU_GO_TO_SETTINGS" desc="Title of the button to go to the app's setting from the user education panel explaining Inactive Tabs. Title case.">
+        Go to Settings
       </message>
       <message name="IDS_IOS_INACTIVE_TABS_USER_EDU_SUBTITLE" desc="Subtitle of the user education panel explaining Inactive Tabs.">
         {COUNT, plural,
           =1 {Open tabs not used for one day or more get moved to Inactive Tabs so you can easily focus on the tabs you use the most. You can change this anytime in settings.}
           other {Open tabs not used for {COUNT} days or more get moved to Inactive Tabs so you can easily focus on the tabs you use the most. You can change this anytime in settings.}}
       </message>
-      <message name="IDS_IOS_INACTIVE_TABS_USER_EDU_DONE" desc="Title of the button dismissing the user education panel explaining Inactive Tabs. Title case.">
-        Done
-      </message>
-      <message name="IDS_IOS_INACTIVE_TABS_USER_EDU_GO_TO_SETTINGS" desc="Title of the button to go to the app's setting from the user education panel explaining Inactive Tabs. Title case.">
-        Go to Settings
+      <message name="IDS_IOS_INACTIVE_TABS_USER_EDU_TITLE" desc="Title of the user education panel explaining Inactive Tabs. Title case.">
+        Inactive Tabs Help You Stay Focused
       </message>
       <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_LEARN_MORE_HINT" desc="Accessibility hint for the 'Learn more' button in the incognito NTP [iOS only]">
         Learn more about Incognito mode
@@ -1615,33 +1921,24 @@
       <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_URL_READ_MORE_BUTTON" desc="Button to unfold a URL which is being truncated, so as to let the user read more of the URL. [iOS only]">
         more
       </message>
-      <message name="IDS_IOS_INCOGNITO_REAUTH_SYSTEM_DIALOG_REASON" desc="Text for system biometric authentication dialog to explain why authentication is required when the user attempts to authenticate to access Incognito tabs. [iOS only]">
-        Use <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph> to unlock your Incognito tabs.
-      </message>
       <message name="IDS_IOS_INCOGNITO_REAUTH_GO_TO_NORMAL_TABS" desc="Button to go to non-Incognito tabs on a screen that blocks Incognito tabs until biometric authetication. [iOS only]">
        See Other Tabs
       </message>
+      <message name="IDS_IOS_INCOGNITO_REAUTH_PASSCODE" desc="The passcode (pin code or password) used instead of biometric authentication, e.g. Face ID or Touch ID, for device authentication. [iOS only]">
+       Passcode
+      </message>
+      <message name="IDS_IOS_INCOGNITO_REAUTH_SET_UP_PASSCODE_HINT" desc="Explanatory text for the setting to protect Incognito tabs with biometric authentication, e.g. Face ID or Touch ID. Appears when the user has no Face ID, Touch ID, or passcode set up, and therefore the feature cannot be enabled. [iOS only]">
+        To lock your Incognito tabs, set up Touch ID, Face ID, or a Passcode.
+      </message>
+      <message name="IDS_IOS_INCOGNITO_REAUTH_SYSTEM_DIALOG_REASON" desc="Text for system biometric authentication dialog to explain why authentication is required when the user attempts to authenticate to access Incognito tabs. [iOS only]">
+        Use <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph> to unlock your Incognito tabs.
+      </message>
       <message name="IDS_IOS_INCOGNITO_REAUTH_UNLOCK_BUTTON" desc="Button to initiate biometric authentication on a screen that blocks Incognito tabs until biometric authetication. [iOS only]">
        Unlock With <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph>
       </message>
       <message name="IDS_IOS_INCOGNITO_REAUTH_UNLOCK_BUTTON_VOICEOVER_LABEL" desc="Voiceover label on the button that starts biometric authentication on a screen that blocks Incognito tabs until biometric authetication. [iOS only]">
        Unlock Incognito Tabs With <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph>
       </message>
-      <message name="IDS_IOS_INCOGNITO_REAUTH_SET_UP_PASSCODE_HINT" desc="Explanatory text for the setting to protect Incognito tabs with biometric authentication, e.g. Face ID or Touch ID. Appears when the user has no Face ID, Touch ID, or passcode set up, and therefore the feature cannot be enabled. [iOS only]">
-        To lock your Incognito tabs, set up Touch ID, Face ID, or a Passcode.
-      </message>
-      <message name="IDS_IOS_INCOGNITO_REAUTH_PASSCODE" desc="The passcode (pin code or password) used instead of biometric authentication, e.g. Face ID or Touch ID, for device authentication. [iOS only]">
-       Passcode
-      </message>
-      <message name="IDS_IOS_INFO_BUTTON_ACCESSIBILITY_HINT" desc="Action hint for the info button of the TableViewInfoButtonCell. This is spoken by VoiceOver. [iOS only]">
-        Double tap for more information
-      </message>
-      <message name="IDS_IOS_INFOBAR_BANNER_DISMISS_HINT" desc="Accessibility hint that indicates the user that can dismiss the Infobar Banner. [Length:Unlimited]">
-        Dismiss
-      </message>
-      <message name="IDS_IOS_INFOBAR_BANNER_OPTIONS_HINT" desc="Accessibility hint that indicates the user that can get more options for the Infobar banner. [Length:Unlimited]">
-        More Options
-      </message>
       <message name="IDS_IOS_INFOBAR_BADGES_PARCEL_TRACKING_HINT" desc="Accessibility hint for the iOS infobar badge item on the omnibox for tracking packages [Length:Unlimited]">
         Options to Track Packages
       </message>
@@ -1654,14 +1951,23 @@
       <message name="IDS_IOS_INFOBAR_BADGES_TRANSLATE_HINT" desc="The iOS infobar badge item for translate [Length:Unlimited]">
         Options to Translate the page
       </message>
-      <message name="IDS_IOS_INFOBAR_MODAL_PASSWORD_SETTINGS_HINT" desc="Accessibility hint that indicates to the user that they can access the Password Settings. [Length:Unlimited]">
-        Access password settings
+      <message name="IDS_IOS_INFOBAR_BANNER_DISMISS_HINT" desc="Accessibility hint that indicates the user that can dismiss the Infobar Banner. [Length:Unlimited]">
+        Dismiss
+      </message>
+      <message name="IDS_IOS_INFOBAR_BANNER_OPTIONS_HINT" desc="Accessibility hint that indicates the user that can get more options for the Infobar banner. [Length:Unlimited]">
+        More Options
+      </message>
+      <message name="IDS_IOS_INFOBAR_MODAL_PASSWORD_HIDE_PASSWORD_HINT" desc="Accessibility hint that indicates to the user that then can hide/mask the password. [Length:Unlimited]">
+        Hide Password
       </message>
       <message name="IDS_IOS_INFOBAR_MODAL_PASSWORD_REVEAL_PASSWORD_HINT" desc="Accessibility hint that indicates to the user that they can reveal the hidden/masked password. [Length:Unlimited]">
         Reveal Password
       </message>
-      <message name="IDS_IOS_INFOBAR_MODAL_PASSWORD_HIDE_PASSWORD_HINT" desc="Accessibility hint that indicates to the user that then can hide/mask the password. [Length:Unlimited]">
-        Hide Password
+      <message name="IDS_IOS_INFOBAR_MODAL_PASSWORD_SETTINGS_HINT" desc="Accessibility hint that indicates to the user that they can access the Password Settings. [Length:Unlimited]">
+        Access password settings
+      </message>
+      <message name="IDS_IOS_INFO_BUTTON_ACCESSIBILITY_HINT" desc="Action hint for the info button of the TableViewInfoButtonCell. This is spoken by VoiceOver. [iOS only]">
+        Double tap for more information
       </message>
       <message name="IDS_IOS_INSPECT_UI_CONSOLE_NOTICE" desc="The message at the top of the debugging page which displays JavaScript console logs [iOS only].">
         Tap the "Start Logging" button to collect future JavaScript console logs and errors from all tabs. Logs will be collected (and stored only in memory) until this page is closed or "Stop Logging" is tapped.
@@ -1684,27 +1990,42 @@
       <message name="IDS_IOS_INTENTS_ADD_READING_LIST_ITEM_PROMPT_DIALOG" desc="Prompt dialog shown or spoken to the user (by Siri) asking them to clarify which URL they'd like to add to their reading list for the Add Reading List Item Shortcut [iOS only]. This is actually never shown to the Chrome for iOS, which is why the corresponding uploaded screenshot is blank, yet it is required by iOS.">
         What URL would you like to add to your reading list?
       </message>
-      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_TITLE" desc="Shortcut name to open URL in Chrome [iOS only].">
-        Open URLs in Chrome
-      </message>
       <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_DESCRIPTION" desc="Shortcut description to open URLs in Chrome [iOS only].">
         Opens the inputted URLs in Google Chrome.
       </message>
-      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts.app format for displaying the URL input [iOS only].">
-        Open ${url}
-      </message>
       <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts.app format for displaying the URL input [iOS only].">
         Open ${url} in Incognito
       </message>
+      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts.app format for displaying the URL input [iOS only].">
+        Open ${url}
+      </message>
+      <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_TITLE" desc="Shortcut name to open URL in Chrome [iOS only].">
+        Open URLs in Chrome
+      </message>
       <message name="IDS_IOS_INTENTS_URL_PARAMETER" desc="The URL the user would like to pass as input parameter to Shortcuts that require a URL as input [iOS only].">
         URL
       </message>
+      <message name="IDS_IOS_IPH_BUBBLE_SNOOZE" desc="Label of a button that appears in an in-product help Tip. Pressing this button will dismiss the Tip, the user will be reminded of the same Tip later on. Used as a button title in an info bubble." meaning="Used as a button title in an info bubble.">
+        Remind Me Later
+      </message>
+      <message name="IDS_IOS_IPH_SIDE_SWIPE_DISMISS_BUTTON" desc="Label of a button that appears in an in-product help view instructing user about side swiping. Pressing this button will dismiss the view. Used as a button title in an info bubble." meaning="Used as a button title in an info bubble in a side swipe in-product help.">
+        Dismiss
+      </message>
+      <message name="IDS_IOS_ITEM_ACCOUNT_ERROR_BADGE_ACCESSIBILITY_HINT" desc="Accessibility hint to let the user know that there is an error badge associated with the listed item. The hint is appended to the a11y message that describes the item. For example, the 'settings' message will become 'settings, account error' when there is an account error badge on the item. [iOS only]">
+        Account error
+      </message>
       <message name="IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT" desc="The text used for the button added to JavaScript dialogs to prevent a page from spamming the user with endless alerts. [Length:27em]">
         Suppress Dialogs
       </message>
+      <message name="IDS_IOS_KEEP_RECENT_PASSWORD" desc="Action button which will keep the most recently used password for a given site, and discard any older passwords, when the user is moving a password to their Google Account. [iOS only]">
+        Keep recent password
+      </message>
       <message name="IDS_IOS_KEYBOARD_ACCESSORY_VIEW_LENS" desc="Accessibility label for a button that opens Lens [iOS only].">
         Search with Lens
       </message>
+      <message name="IDS_IOS_KEYBOARD_ACCESSORY_VIEW_PASTE_SEARCH" desc="Accessibility label for a button that starts a Paste and Search [iOS only]">
+        Paste and Search
+      </message>
       <message name="IDS_IOS_KEYBOARD_ACCESSORY_VIEW_QR_CODE_SEARCH" desc="Accessibility label for a button that starts scanning QR Codes [iOS only].">
         QR code Search
       </message>
@@ -1762,9 +2083,6 @@
       <message name="IDS_IOS_KEYBOARD_LAST_TAB" desc="The title of the keyboard shortcut to open the last tab." meaning="Used as a command title in the iPad command menu.">
         Go to Last Tab
       </message>
-      <message name="IDS_IOS_KEYBOARD_NEXT_TAB" desc="Title of the keyboard shortcut to switch to the next tab in the tab strip." meaning="Used as a command title in the iPad command menu.">
-        Go to Next Tab
-      </message>
       <message name="IDS_IOS_KEYBOARD_NEW_INCOGNITO_TAB" desc="The title of the keyboard shortcut to open a new Incognito tab." meaning="Used as a command title in the iPad command menu.">
         New Incognito Tab
       </message>
@@ -1777,18 +2095,21 @@
       <message name="IDS_IOS_KEYBOARD_NEW_WINDOW" desc="The title of the keyboard shortcut to open a new window." meaning="Used as a command title in the iPad command menu.">
         New Window
       </message>
+      <message name="IDS_IOS_KEYBOARD_NEXT_TAB" desc="Title of the keyboard shortcut to switch to the next tab in the tab strip." meaning="Used as a command title in the iPad command menu.">
+        Go to Next Tab
+      </message>
       <message name="IDS_IOS_KEYBOARD_OPEN_LOCATION" desc="Title of the keyboard shortcut to open a location (puts cursor in the URL bar)." meaning="Used as a command title in the iPad command menu.">
         Open Location…
       </message>
       <message name="IDS_IOS_KEYBOARD_PREVIOUS_TAB" desc="Title of the keyboard shortcut to switch to the previous tab in the tab strip." meaning="Used as a command title in the iPad command menu.">
         Go to Previous Tab
       </message>
+      <message name="IDS_IOS_KEYBOARD_RELOAD" desc="Title for the keyboard shortcut to reload the page." meaning="Used as a command title in the iPad command menu.">
+        Reload
+      </message>
       <message name="IDS_IOS_KEYBOARD_REOPEN_CLOSED_TAB" desc="Title of the keyboard shortcut to reopen a recently closed tab." meaning="Used as a command title in the iPad command menu.">
         Reopen Last Closed Tab
       </message>
-      <message name="IDS_IOS_KEYBOARD_SHOW_READING_LIST" desc="Title of the keyboard shortcut to show the reading list." meaning="Used as a command title in the iPad command menu.">
-        Show Reading List
-      </message>
       <message name="IDS_IOS_KEYBOARD_REPORT_AN_ISSUE" desc="The title of the keyboard shortcut to open the form to report an issue." meaning="Used as a command title in the iPad command menu.">
         Report an Issue…
       </message>
@@ -1807,59 +2128,80 @@
       <message name="IDS_IOS_KEYBOARD_SHOW_HISTORY" desc="Title of the keyboard shortcut to show the History." meaning="Used as a command title in the iPad command menu.">
         Show History
       </message>
+      <message name="IDS_IOS_KEYBOARD_SHOW_READING_LIST" desc="Title of the keyboard shortcut to show the reading list." meaning="Used as a command title in the iPad command menu.">
+        Show Reading List
+      </message>
       <message name="IDS_IOS_KEYBOARD_SHOW_SETTINGS" desc="The title of the keyboard shortcut to open the app's Settings." meaning="Used as a command title in the iPad command menu.">
         Show Settings
       </message>
-      <message name="IDS_IOS_KEYBOARD_RELOAD" desc="Title for the keyboard shortcut to reload the page." meaning="Used as a command title in the iPad command menu.">
-        Reload
-      </message>
       <message name="IDS_IOS_KEYBOARD_STOP" desc="The title of the keyboard shortcut to stop loading the page." meaning="Used as a command title in the iPad command menu.">
         Stop
       </message>
       <message name="IDS_IOS_KEYBOARD_VOICE_SEARCH" desc="Title for the Voice Search keyboard shortcut in the discoverability." meaning="Used as a command title in the iPad command menu.">
         Voice Search
       </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_ADD_LANGUAGE_BUTTON_TITLE" desc="Title for the button to add a language to the list of fluent languages in the language settings page. [Length: 30em] [iOS only]">
+        Add Language...
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_ADD_LANGUAGE_TITLE" desc="Title for the add language page of language settings. [Length: 25em] [iOS only]">
+        Add Language
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_HEADER" desc="Header for the fluent languages section in the language settings page. [Length: unlimited] [iOS only]">
+        Websites will show text in your preferred language, when possible.
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_NEVER_TRANSLATE_TITLE" desc="Label shown next to a language for which translation is not offered. [Length: 25em] [iOS only]">
+        Never Translate
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_OFFER_TO_TRANSLATE_TITLE" desc="Label shown next to a language for which translation is offered. [Length: 25em] [iOS only]">
+        Offer to Translate
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_TITLE" desc="Title for the language settings menu entry and page. [Length: 25em] [iOS only]">
+        Languages
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_TRANSLATE_SWITCH_SUBTITLE" desc="Subtitle for the switch to enable or disable translation in the language settings page. [Length: unlimited] [iOS only]" meaning="This switch controls offering translation for pages in languages other than the languages listed above.">
+        Offer to translate pages in other languages
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_TRANSLATE_SWITCH_TITLE" desc="Title for the switch to enable or disable translation in the language settings page. [Length: 30em] [iOS only]" meaning="Turning this switch on enables offering translation and turning it off disables offering translation.">
+        Translate Pages
+      </message>
+      <message name="IDS_IOS_LEAK_CHECK_SWITCH" desc="Title for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
+        Warn You if Passwords Are Exposed in a Data Breach
+      </message>
       <message name="IDS_IOS_LENS_KEYBOARD_IPH_TEXT" desc="Text the IPH for the Lens button in the keyboard.">
         You can search images and what you see.
       </message>
-      <message name="IDS_IOS_MAGIC_STACK_SEE_MORE" desc="The See More button in Magic Stack modules to show a detailed view. [Length: 10em]">
-        See More
+      <message name="IDS_IOS_LINK_TO_TEXT_ERROR_DESCRIPTION" desc="Description message in the alert dialog shown when link-to-text link generation failed. [iOS only]">
+        A link to the highlight can not be created.
+      </message>
+      <message name="IDS_IOS_LINK_TO_TEXT_ERROR_TITLE" desc="Title of the alert dialog shown when link-to-text link generation failed. [iOS only]">
+        Unable to Create Link
+      </message>
+      <message name="IDS_IOS_LOCAL_ADDRESS_ACCESSIBILITY_LABEL" desc="Screenreader label when an address is saved only locally">
+        Address saved only on this device
+      </message>
+      <message name="IDS_IOS_LOCAL_PASSWORD_ACCESSIBILITY_LABEL" desc="Screenreader label when a password is saved only locally and not backed up to any account.">
+        Password saved only on this device
+      </message>
+      <message name="IDS_IOS_LOCATION_BAR_SIGN_IN" desc="Text shown in the location bar while an HTTP authentication dialog is displayed.">
+          Sign in to website
+      </message>
+      <message name="IDS_IOS_LOCKDOWN_MODE_FOOTER" desc="Title for Lockdown Mode.">
+        When turned on, certain web technologies are blocked, which might cause some websites to load more slowly or not operate correctly.
+      </message>
+      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_TITLE" desc="Title for Lockdown Mode.">
+        This setting is enabled on your device
+      </message>
+      <message name="IDS_IOS_LOCKDOWN_MODE_SWITCH_BUTTON_SUMMARY" desc="Title for Lockdown Mode.">
+        Extreme optional protection for your browser. It should only be used if you believe you may be targeted by a highly sophisticated cyberattack.
+      </message>
+      <message name="IDS_IOS_LOCKDOWN_MODE_TITLE" desc="Title for Lockdown Mode.">
+        Lockdown Mode
       </message>
       <message name="IDS_IOS_MAGIC_STACK_EDIT_MODAL_TITLE" desc="The title of the edit modal for the Magic Stack. [Length: 10em]">
         Edit Carousel
       </message>
-      <message name="IDS_IOS_MANAGE_YOUR_GOOGLE_ACCOUNT_TITLE" desc="Title for the view in the Settings to open 'Google Account' web page.">
-        Manage Your Google Account
-      </message>
-      <message name="IDS_IOS_REMOVE_GOOGLE_ACCOUNT_TITLE" desc="Title for the button that removes a Google account from the device">
-        Remove from This Device
-      </message>
-      <message name="IDS_IOS_MANAGE_SYNC_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Sync. [iOS only]">
-        Manage Sync
-      </message>
-      <message name="IDS_IOS_REMOVE_ACCOUNT_ALERT_TITLE" desc="Title of the alert view when the remove account button is clicked.">
-      Remove account <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>?
-      </message>
-      <message name="IDS_IOS_REMOVE_ACCOUNT_LABEL" desc="Button label for removing an account.">
-      Remove
-      </message>
-      <message name="IDS_IOS_REMOVE_ACTION_TITLE" desc="Title of the action used to remove a selected item. [iOS only]">
-        Remove
-      </message>
-      <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_DESCRIPTION" desc="Subtitle for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync.">
-        Review your account data
-      </message>
-      <message name="IDS_IOS_MANAGE_SYNC_ENCRYPTION" desc="Title for the cell to open the encryption dialog.">
-        Encryption
-      </message>
-      <message name="IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_TITLE" desc="Title for the cell to open 'Google Activity Controls' dialog.">
-        Google Activity Controls
-      </message>
-      <message name="IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_DESCRIPTION" desc="Subtitle for the cell to open 'Google Activity Controls' dialog.">
-        Control how your browsing history is used to personalize Search and more
-      </message>
-      <message name="IDS_IOS_MANAGE_SYNC_DATA_FROM_CHROME_SYNC_DESCRIPTION" desc="Subtitle for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync.">
-        Review your synced data
+      <message name="IDS_IOS_MAGIC_STACK_SEE_MORE" desc="The See More button in Magic Stack modules to show a detailed view. [Length: 10em]">
+        See More
       </message>
       <message name="IDS_IOS_MANAGED_DISCONNECT_DIALOG_ACCEPT_UNITY" desc="Label on the button to proceed with signout and clear all Chrome data.[Length: 30em].">
         Clear
@@ -1882,35 +2224,59 @@
       <message name="IDS_IOS_MANAGED_SYNC_TITLE" desc="The title of the Sync with a managed account dialog (alternative to IDS_IOS_MANAGED_SIGNIN_TITLE). Is only used when the User Policy feature is enabled using the --enable-user-policy-for-ios flag. [40em][iOS only]">
         Sync With Managed Account
       </message>
+      <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_DESCRIPTION" desc="Subtitle for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync.">
+        Review your account data
+      </message>
+      <message name="IDS_IOS_MANAGE_SYNC_DATA_FROM_CHROME_SYNC_DESCRIPTION" desc="Subtitle for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync.">
+        Review your synced data
+      </message>
+      <message name="IDS_IOS_MANAGE_SYNC_ENCRYPTION" desc="Title for the cell to open the encryption dialog.">
+        Encryption
+      </message>
+      <message name="IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_DESCRIPTION" desc="Subtitle for the cell to open 'Google Activity Controls' dialog.">
+        Control how your browsing history is used to personalize Search and more
+      </message>
+      <message name="IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_TITLE" desc="Title for the cell to open 'Google Activity Controls' dialog.">
+        Google Activity Controls
+      </message>
+      <message name="IDS_IOS_MANAGE_SYNC_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Sync. [iOS only]">
+        Manage Sync
+      </message>
+      <message name="IDS_IOS_MANAGE_YOUR_GOOGLE_ACCOUNT_TITLE" desc="Title for the view in the Settings to open 'Google Account' web page.">
+        Manage Your Google Account
+      </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_ADD_PAYMENT_METHOD" desc="The title for the button in the manual fallback UI that takes the user to the add new credit card screen through settings. In this screen, the user can input their card details and save them.">
         Add Payment Method...
       </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_MANAGE_ADDRESSES" desc="The title for the button in the manual fallback UI that takes the user to the addresses settings. In this screen they see all the addresses and can erase them. [30em]">
+        Manage Addresses...
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_MANAGE_CREDIT_CARDS" desc="The title for the button in the manual fallback UI that takes the user to the payments settings. In this screen they see all the credit cards and can erase them. [30em]">
+        Manage Payment Methods...
+      </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_MANAGE_PASSWORDS" desc="The title for the button in the manual fallback UI that takes the user to the passwords settings. In this screen they see all the passwords and can erase them.">
         Manage Passwords...
       </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_MANAGE_SETTINGS" desc="The title for the button in the manual fallback UI that takes the user to the passwords settings. In this screen they can manage the settings for their passwords.">
         Manage Settings...
       </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_NO_USERNAME" desc="The title for disabled buttons on the manual fallback passwords UI when a credential doesn't contains a username. [30em]">
-        No Username
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_NO_PASSWORDS_FOR_SITE" desc="The title for disabled buttons when a list of credentials for manual fallback is empty. [30em]">
-        No passwords found for this site
+      <message name="IDS_IOS_MANUAL_FALLBACK_NOT_SECURE_GENERIC_BODY" desc="The body of the alert informing a user the content they selected won't be filled on the form." meaning="The form is not secure [80em]">
+        To protect your privacy, Chrome will not autofill this field.
       </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_NOT_SECURE_OK_BUTTON" desc="The title of the OK button of the 'Not Secure' alert in manual fallback." meaning="The user will dismiss the alert [20em]">
         OK
       </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_NOT_SECURE_TITLE" desc="The title of the alert informing a user the content they selected won't be filled on the form." meaning="The form is not secure [20em]">
-        Not secure
-      </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_NOT_SECURE_PASSWORD_BODY" desc="The body of the alert informing a user the password they selected won't be filled on the form." meaning="The field the user is trying to fill is not of password type  [80em]">
         To protect your privacy, Chrome will not autofill your password in this field.
       </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_NOT_SECURE_GENERIC_BODY" desc="The body of the alert informing a user the content they selected won't be filled on the form." meaning="The form is not secure [80em]">
-        To protect your privacy, Chrome will not autofill this field.
+      <message name="IDS_IOS_MANUAL_FALLBACK_NOT_SECURE_TITLE" desc="The title of the alert informing a user the content they selected won't be filled on the form." meaning="The form is not secure [20em]">
+        Not secure
       </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_SELECT_PASSWORD_WITH_DOTS" desc="The title for the button in the manual fallback passwords UI that allows the user to select a saved password from a list, and fill it into the active field. [30em]">
-        Select Password...
+      <message name="IDS_IOS_MANUAL_FALLBACK_NO_PASSWORDS_FOR_SITE" desc="The title for disabled buttons when a list of credentials for manual fallback is empty. [30em]">
+        No passwords found for this site
+      </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_NO_USERNAME" desc="The title for disabled buttons on the manual fallback passwords UI when a credential doesn't contains a username. [30em]">
+        No Username
       </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_SELECT_PASSWORD_DIALOG_MESSAGE" desc="The contents of a dialog asking the user to confirm they trust the current site before selecting a saved password to fill.">
         If you trust <ph name="SITE">$1<ex>example.com</ex></ph>, you can use a saved password to sign in.
@@ -1918,14 +2284,8 @@
       <message name="IDS_IOS_MANUAL_FALLBACK_SELECT_PASSWORD_DIALOG_TITLE" desc="The title of a dialog asking the user to confirm they trust the current site before selecting a saved password to fill.">
         Select Password
       </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_SUGGEST_STRONG_PASSWORD_WITH_DOTS" desc="The title for the button in the manual fallback passwords UI that is used to trigger password generation on the active field. 'Strong' refers to the fact that the password is randomly-generated, and thus hard to guess and unlikely to be reused. [30em]">
-        Suggest Strong Password...
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_MANAGE_CREDIT_CARDS" desc="The title for the button in the manual fallback UI that takes the user to the payments settings. In this screen they see all the credit cards and can erase them. [30em]">
-        Manage Payment Methods...
-      </message>
-      <message name="IDS_IOS_MANUAL_FALLBACK_MANAGE_ADDRESSES" desc="The title for the button in the manual fallback UI that takes the user to the addresses settings. In this screen they see all the addresses and can erase them. [30em]">
-        Manage Addresses...
+      <message name="IDS_IOS_MANUAL_FALLBACK_SELECT_PASSWORD_WITH_DOTS" desc="The title for the button in the manual fallback passwords UI that allows the user to select a saved password from a list, and fill it into the active field. [30em]">
+        Select Password...
       </message>
       <message name="IDS_IOS_MANUAL_FALLBACK_SHOW_ADDRESSES" desc="Label for the addresses icon in manual fallback. Read by Text To Speech" meaning="Voice Over will read this to the user followed by 'Button' when this button is focused.">
         Addresses
@@ -1939,27 +2299,33 @@
       <message name="IDS_IOS_MANUAL_FALLBACK_SHOW_PASSWORDS" desc="Label for the password icon in manual fallback. Read by Text To Speech" meaning="Voice Over will read this to the user followed by 'Button' when this button is focused.">
         Passwords
       </message>
+      <message name="IDS_IOS_MANUAL_FALLBACK_SUGGEST_STRONG_PASSWORD_WITH_DOTS" desc="The title for the button in the manual fallback passwords UI that is used to trigger password generation on the active field. 'Strong' refers to the fact that the password is randomly-generated, and thus hard to guess and unlikely to be reused. [30em]">
+        Suggest Strong Password...
+      </message>
       <message name="IDS_IOS_MICROPHONE_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's microphone while the app is in use [Length: unlimited] [iOS only].">
         This lets you search using your voice
       </message>
       <message name="IDS_IOS_MINI_MAP_CONSENT_ACCEPT" desc="The text of the consent button in the consent screen for mini map [iOS only].">
         Accept
       </message>
-      <message name="IDS_IOS_MINI_MAP_CONSENT_NO_THANKS" desc="The text of the no consent button in the consent screen for mini map [iOS only].">
-        No Thanks
-      </message>
       <message name="IDS_IOS_MINI_MAP_CONSENT_FOOTER" desc="The text of the footer note in the consent screen for mini map. Contains a link [iOS only].">
         You can manage this in BEGIN_LINK Content Settings END_LINK
       </message>
       <message name="IDS_IOS_MINI_MAP_CONSENT_MORE" desc="The text of the button to show more text of the consent [iOS only].">
         More
       </message>
+      <message name="IDS_IOS_MINI_MAP_CONSENT_NO_THANKS" desc="The text of the no consent button in the consent screen for mini map [iOS only].">
+        No Thanks
+      </message>
       <message name="IDS_IOS_MINI_MAP_CONSENT_TITLE" desc="The title of the consent screen for mini map [iOS only].">
         Address Found
       </message>
       <message name="IDS_IOS_MINI_MAP_IPH_SUBTITLE" desc="The text of the iph string displayed on Mini Map screen on first trigger [iOS only].">
         You can manage this in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Content Settings<ph name="END_LINK">END_LINK</ph>.
       </message>
+      <message name="IDS_IOS_NAVIGATION_BAR_ADD_BUTTON" desc="Label of the button allowing the user to add a new credit card to the list of their saved credit cards.">
+          Add
+      </message>
       <message name="IDS_IOS_NAVIGATION_BAR_CANCEL_BUTTON" desc="Label of the cancel button displayed on the navigation bar  [Length: 7em] [iOS only].">
         Cancel
       </message>
@@ -1981,6 +2347,9 @@
       <message name="IDS_IOS_NEW_FEATURE_ACCESSIBILITY_HINT" desc="Accessibility hint spoken by VoiceOver to let the user know there is a new feature. This string will be appended to an existing accesibility label when the UI is showing a 'new' badge to attract the user's attention. For example, the label 'Default Browser' would become 'Default Browser, new feature', which is why the string is not capitalized at its start. [iOS/iPadOS only]">
         new feature
       </message>
+      <message name="IDS_IOS_NEW_FEATURE_ACCESSIBILITY_LABEL" desc="Accessibility label for a badge with the letter N that indicates a new feature [iOS only]">
+        New feature
+      </message>
       <message name="IDS_IOS_NEW_INCOGNITO_TAB" desc="Label for text saying the tab is a new Incognito tab.">
         New Incognito Tab
       </message>
@@ -1990,14 +2359,8 @@
       <message name="IDS_IOS_NEW_ITEM_ACCESSIBILITY_HINT" desc="Accessibility hint spoken by VoiceOver to let the user know there is a new item. This string will be appended to an existing accesibility label when the UI is showing a little blue dot to attract the user's attention. For example, the label 'Default Browser' would become 'Default Browser, new item', which is why the string is not capitalized at its start. [iOS/iPadOS only]">
         new item
       </message>
-      <message name="IDS_IOS_SEE_ALL_OPEN_TABS_IPH_ANNOUNCEMENT" desc="Announcement for the tab grid button's in-product help, explaining that all open tabs can be accessed from the Tab Switcher. Read by Text To Speech. [iOS only]">
-        You can access all your open tabs from the Tab Switcher.
-      </message>
-      <message name="IDS_IOS_SEE_ALL_OPEN_TABS_IPH_TEXT" desc="Text for the tab grid button's in-product help, explaining that all open tabs can be seen. [iOS only]">
-        You can find all your open tabs here.
-      </message>
-      <message name="IDS_IOS_SHARE_THIS_PAGE_IPH_TEXT" desc="Text for the share button's in-product help, explaining that this button can be used to share this page. [iOS only]">
-        Share this page
+      <message name="IDS_IOS_NEW_LABEL_FEATURE_BADGE" desc="Character representing the word new displayed inside the badge to represent a new features [CHAR_LIMIT=1][iOS only]" meaning="A badge with a character representing the word new is displayed to inform users that a feature a new. [CHAR_LIMIT=1][iOS only]">
+        N
       </message>
       <message name="IDS_IOS_NEW_TAB_LEARN_MORE_ABOUT_SUGGESTED_CONTENT" desc="Text in the footer of the New Tab Page. Part of the text is a link to a help center page where the user can learn more about suggested content.">
         <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> about suggested content
@@ -2017,6 +2380,9 @@
       <message name="IDS_IOS_NEW_TAB_RECENT_TABS" desc="The header of the panel containing the list of recently closed tabs and the tabs synced from other devices.[Length: 17em]">
         Recent Tabs
       </message>
+      <message name="IDS_IOS_NOTIFICATIONS_TITLE" desc="Title for Notifications settings menu.">
+        Notifications
+      </message>
       <message name="IDS_IOS_NTP_FEED_SIGNIN_COMPACT_PROMO_BODY" desc="The text on the body of the new tab page Feed Signin Promo (compact version), explaining that users will content based on users interests if they enable sync. [iOS only]">
         Sync to get content based on your interests.
       </message>
@@ -2029,6 +2395,75 @@
       <message name="IDS_IOS_NTP_FEED_SIGNIN_PROMO_DISABLE_SNACKBAR_MESSAGE" desc="The test shown in the snackbar message when sign-in promo is trigger when sign-in is disabled. [iOS only]">
         Not available on your device
       </message>
+      <message name="IDS_IOS_OFFER_TO_SAVE_PASSWORDS" desc="Title for the switch item in Settings that can be toggled allowing users to be prompted if they want to save their passwords when logging into webpages. [Length: 25em] [iOS only]">
+        Offer to Save Passwords
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_CLEAR_BROWSING_DATA" desc="Subtitle for the Clear Browsing Data acceleration pedal in the omnibox that should correspond to the path to the Clear Browsing Data dialog in History">
+       Menu → History → Clear Browsing Data
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_DEFAULT_BROWSER" desc="Subtitle for the Set Default Browser acceleration pedal in the omnibox that should correspond to the path to the Default Browser dialog in Settings">
+       Menu → Settings → Default Browser
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_LAUNCH_INCOGNITO" desc="Subtitle for the Open Incognito Tab acceleration pedal in the omnibox that should correspond to the path to the New Incognito Tab button">
+       Menu → New Incognito Tab
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_MANAGE_CHROME_SETTINGS" desc="Subtitle for the Manage Settings acceleration pedal in the omnibox that should correspond to the path to Settings">
+       Menu → Settings
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_MANAGE_PASSWORDS" desc="Subtitle for the Manage Passwords acceleration pedal in the omnibox that should correspond to the path to the Passwords Manager dialog">
+       Menu → Password Manager
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_RUN_CHROME_SAFETY_CHECK" desc="Subtitle for the Run Chrome Safety Check acceleration pedal in the omnibox that should correspond to the path to the Safety Check dialog in Settings">
+       Menu → Settings → Safety Check
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_UPDATE_CREDIT_CARD" desc="Subtitle for the Manage Payment Methods acceleration pedal in the omnibox that should correspond to the path to the Payment Methods dialog in Settings">
+       Menu → Settings → Payment Methods
+      </message>
+      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_VIEW_CHROME_HISTORY" desc="Subtitle for the View Your Chrome History acceleration pedal in the omnibox that should correspond to the path to History">
+       Menu → History
+      </message>
+      <message name="IDS_IOS_OMNIBOX_POPUP_APPEND" desc="Label for the accessibility action for the address and search bar autocomplete suggestion. It replaces the text in the search bar by the suggestion. [Read by Text-to-Speech]">
+        Refine
+      </message>
+      <message name="IDS_IOS_OMNIBOX_POPUP_SWITCH_TO_OPEN_TAB" desc="Label for the accessibility action for the address and search bar autocomplete suggestion. Using this will switch to the already opened tab corresponding to the suggestion. [Read by Text-to-Speech]">
+        Switch to existing tab
+      </message>
+      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_DISCARD" desc="Text in the discard button of the omnibox position choice screen promo. (Title case)">
+       No Thanks
+      </message>
+      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_FRE_SUBTITLE" desc="Subtitle for the omnibox position choice screen in the first run experience.">
+       Switch your address bar to the top or bottom for a customized browsing experience.
+      </message>
+      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_IPH_SUBTITLE" desc="Subtitle for the omnibox position choice screen in a fullscreen promo.">
+       Switch your address bar from the top to the bottom for a customized browsing experience.
+      </message>
+      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_SKIP" desc="Text in the skip button of the omnibox position choice screen promo. (Title case)">
+       Skip
+      </message>
+      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_TITLE" desc="Title for the omnibox position choice promo screen. (Title case)">
+       Address Bar Position
+      </message>
+      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_VALIDATE" desc="Text in the validation button of the omnibox position choice screen promo. (Title case)">
+       Set Position
+      </message>
+      <message name="IDS_IOS_OPEN_ANOTHER_APP_ALLOW" desc="Text on the button, when tapped will allow opening an external application. [iOS only]">
+          Allow
+      </message>
+      <message name="IDS_IOS_OPEN_ANOTHER_APP_BLOCK" desc="Text on the button, when tapped will block opening an external application for this browsing session. [iOS only]">
+          Don't allow
+      </message>
+      <message name="IDS_IOS_OPEN_ANOTHER_APP_FAILED" desc="Alert to let the user know that external app could not be opened. [iOS only]">
+          Something went wrong. The application couldn’t be opened.
+      </message>
+      <message name="IDS_IOS_OPEN_ANOTHER_APP_FAILED_CONFIRM" desc="Button to acknowledge that opening application failed.">
+          Got it
+      </message>
+      <message name="IDS_IOS_OPEN_ANOTHER_APP_FROM_INCOGNITO" desc="Alert to let the user know that the website is trying to open another application from incognito. [iOS only]">
+          This site is trying to open an application.  This will take you out of Incognito.
+      </message>
+      <message name="IDS_IOS_OPEN_CHROME_SETTINGS" desc="Text of the primary button to open chrome settings page. [iOS only]">
+        Open Settings
+      </message>
       <message name="IDS_IOS_OPEN_IN" desc="Label of the button that lets users open a document in another application. [Length: 15em] [iOS only]">
         Open in...
       </message>
@@ -2047,66 +2482,27 @@
       <message name="IDS_IOS_OPEN_IN_FILE_DOWNLOAD_FAILED" desc="The message of the alert informing a user that the download of the file to be opened in another application failed. [Length: 60em] [iOS only]">
         The file could not be downloaded at this time.
       </message>
+      <message name="IDS_IOS_OPEN_IN_INCOGNITO_ACTION_TITLE" desc="Title of the action used to open an URL in a new Incognito tab. [iOS only]">
+        Open in Incognito
+      </message>
+      <message name="IDS_IOS_OPEN_IOS_SETTINGS" desc="Text of the primary button to open iOS settings page. [iOS only]">
+        Go To Settings...
+      </message>
       <message name="IDS_IOS_OPEN_NEW_TAB_IPH_ANNOUNCEMENT" desc="Announcement for the New Tab Tip in-product help promotion, explaining that new tabs can be added.  Read by Text To Speech. [iOS only]" meaning="The user has never created a new tab, and a bubble is displayed pointing to the new tab button to inform users how to create tabs and switch between them.">
         You can open a new tab from the <ph name="NEW_TAB_BUTTON_ACCESSIBILITY_LABEL">$1<ex>new tab</ex></ph> button.
       </message>
       <message name="IDS_IOS_OPEN_NEW_TAB_IPH_TEXT" desc="Text for the New Tab Button in-product help promotion, explaining that new tabs can be added. [iOS only]" meaning="The user has never created a new tab, and a bubble is displayed pointing to the new tab button to inform users how to create tabs and switch between them.">
         You can open a new tab here.
       </message>
+      <message name="IDS_IOS_OPEN_REPEATEDLY_ANOTHER_APP" desc="Alert to let the user know that the website is trying repeatedly to open another application. [iOS only]">
+          This site is repeatedly trying to open another application.
+      </message>
+      <message name="IDS_IOS_OPEN_SETTINGS" desc="Text of the button that will take the user to the Settings page to configure the default browser [iOS only]">
+        Open Settings
+      </message>
       <message name="IDS_IOS_OPEN_SOURCE_LICENSES" desc="The label to access the open source licenses, displayed in the application settings [Length: 30em] [iOS only]">
         Open Source Licenses
       </message>
-      <message name="IDS_IOS_RECENT_TABS_SYNC_IN_PROGRESS" desc="Section header subtitle label while loading tabs in other devices. [Length: 30em] [iOS only]">
-        Syncing...
-      </message>
-      <message name="IDS_IOS_OMNIBOX_POPUP_APPEND" desc="Label for the accessibility action for the address and search bar autocomplete suggestion. It replaces the text in the search bar by the suggestion. [Read by Text-to-Speech]">
-        Refine
-      </message>
-      <message name="IDS_IOS_OMNIBOX_POPUP_SWITCH_TO_OPEN_TAB" desc="Label for the accessibility action for the address and search bar autocomplete suggestion. Using this will switch to the already opened tab corresponding to the suggestion. [Read by Text-to-Speech]">
-        Switch to existing tab
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_DEFAULT_BROWSER" desc="Subtitle for the Set Default Browser acceleration pedal in the omnibox that should correspond to the path to the Default Browser dialog in Settings">
-       Menu → Settings → Default Browser
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_CLEAR_BROWSING_DATA" desc="Subtitle for the Clear Browsing Data acceleration pedal in the omnibox that should correspond to the path to the Clear Browsing Data dialog in History">
-       Menu → History → Clear Browsing Data
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_MANAGE_PASSWORDS" desc="Subtitle for the Manage Passwords acceleration pedal in the omnibox that should correspond to the path to the Passwords Manager dialog">
-       Menu → Password Manager
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_UPDATE_CREDIT_CARD" desc="Subtitle for the Manage Payment Methods acceleration pedal in the omnibox that should correspond to the path to the Payment Methods dialog in Settings">
-       Menu → Settings → Payment Methods
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_LAUNCH_INCOGNITO" desc="Subtitle for the Open Incognito Tab acceleration pedal in the omnibox that should correspond to the path to the New Incognito Tab button">
-       Menu → New Incognito Tab
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_RUN_CHROME_SAFETY_CHECK" desc="Subtitle for the Run Chrome Safety Check acceleration pedal in the omnibox that should correspond to the path to the Safety Check dialog in Settings">
-       Menu → Settings → Safety Check
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_MANAGE_CHROME_SETTINGS" desc="Subtitle for the Manage Settings acceleration pedal in the omnibox that should correspond to the path to Settings">
-       Menu → Settings
-      </message>
-      <message name="IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_VIEW_CHROME_HISTORY" desc="Subtitle for the View Your Chrome History acceleration pedal in the omnibox that should correspond to the path to History">
-       Menu → History
-      </message>
-      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_TITLE" desc="Title for the omnibox position choice promo screen. (Title case)">
-       Address Bar Position
-      </message>
-      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_IPH_SUBTITLE" desc="Subtitle for the omnibox position choice screen in a fullscreen promo.">
-       Switch your address bar from the top to the bottom for a customized browsing experience.
-      </message>
-      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_FRE_SUBTITLE" desc="Subtitle for the omnibox position choice screen in the first run experience.">
-       Switch your address bar to the top or bottom for a customized browsing experience.
-      </message>
-      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_VALIDATE" desc="Text in the validation button of the omnibox position choice screen promo. (Title case)">
-       Set Position
-      </message>
-      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_DISCARD" desc="Text in the discard button of the omnibox position choice screen promo. (Title case)">
-       No Thanks
-      </message>
-      <message name="IDS_IOS_OMNIBOX_POSITION_PROMO_SKIP" desc="Text in the skip button of the omnibox position choice screen promo. (Title case)">
-       Skip
-      </message>
       <message name="IDS_IOS_OPEN_TABS_LAST_USED" desc="Last used timestamp label [Length: 20em] [iOS only]">
         Last synced: <ph name="LAST_USED_TIME">$1<ex>3 mins ago</ex></ph>
       </message>
@@ -2122,14 +2518,14 @@
       <message name="IDS_IOS_OPTIONS_ACCOUNTS_DESCRIPTION" desc="Text informing the user of the accounts they are signed in to Chrome with [iOS only] [150em]">
         Signed In to Google as
       </message>
-      <message name="IDS_IOS_OPTIONS_ACCOUNTS_SYNC_IS_OFF" desc="Text informing the user that sync is off [iOS only] [60em]" meaning="The Chrome sync feature is off.">
-        Off
+      <message name="IDS_IOS_OPTIONS_ACCOUNTS_RESTRICTED_IDENTITIES" desc="Message shown in the settings account switcher when enterprise policy has restricted some unseen identities. [iOS only]">
+          Your organization allows you to sign in only with certain accounts. Accounts that aren't allowed are hidden. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn More<ph name="END_LINK">END_LINK</ph>
       </message>
       <message name="IDS_IOS_OPTIONS_ACCOUNTS_SIGN_OUT_TURN_OFF_SYNC" desc="Title of the button to sign out and turn off sync. [iOS only]">
         Sign Out and Turn Off Sync
       </message>
-      <message name="IDS_IOS_OPTIONS_ACCOUNTS_RESTRICTED_IDENTITIES" desc="Message shown in the settings account switcher when enterprise policy has restricted some unseen identities. [iOS only]">
-          Your organization allows you to sign in only with certain accounts. Accounts that aren't allowed are hidden. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn More<ph name="END_LINK">END_LINK</ph>
+      <message name="IDS_IOS_OPTIONS_ACCOUNTS_SYNC_IS_OFF" desc="Text informing the user that sync is off [iOS only] [60em]" meaning="The Chrome sync feature is off.">
+        Off
       </message>
       <message name="IDS_IOS_OPTIONS_ADVANCED_TAB_LABEL" desc="The title of the Advanced section of the Settings page.  [Length: 20em] [iOS only]">
         Advanced
@@ -2163,9 +2559,6 @@
       <message name="IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON" desc="The title of Continue button in the Import Data settings screen [30em]">
         Continue
       </message>
-      <message name="IDS_IOS_OPTIONS_IMPORT_DATA_TITLE" desc="The title of the Import Data settings screen. [30em]">
-        Manage Data
-      </message>
       <message name="IDS_IOS_OPTIONS_IMPORT_DATA_IMPORT_SUBTITLE" desc="The subtitle of the Import Data option on the Import Data settings screen. [400em]">
         Add existing data to <ph name="USER_EMAIL">$1<ex>john@doe.com</ex></ph>.
       </message>
@@ -2178,6 +2571,9 @@
       <message name="IDS_IOS_OPTIONS_IMPORT_DATA_KEEP_SEPARATE_TITLE" desc="The title of the Keep Data Separate option on the Import Data settings screen. [60em]">
         Keep my data separate
       </message>
+      <message name="IDS_IOS_OPTIONS_IMPORT_DATA_TITLE" desc="The title of the Import Data settings screen. [30em]">
+        Manage Data
+      </message>
       <message name="IDS_IOS_OPTIONS_INACTIVE_TABS_DISABLED" desc="Option description to disable inactive tabs. (Title case)">
         Never Move
       </message>
@@ -2239,17 +2635,194 @@
       <message name="IDS_IOS_OPTIONS_PRIVACY_COOKIES_FOOTER" desc="Footer description explaining how to apply the new cookies setting">
         Your cookies setting applies to all tabs. To apply a new setting to an open tab, reload the tab.
       </message>
+      <message name="IDS_IOS_OPTIONS_REPORT_AN_ISSUE" desc="Title for the option on Settings page to report an issue. [Length: 20em] [iOS only]">
+        Report an Issue
+      </message>
       <message name="IDS_IOS_OPTIONS_TAB_PICKUP" desc="Title for opening the setting for displaying tab suggestions from other devices. (Title case)">
         Show Tab Suggestions from Other Devices
       </message>
       <message name="IDS_IOS_OPTIONS_TAB_PICKUP_SCREEN_TITLE" desc="Title for the screen setting displaying tab suggestion settings. (Title case)">
         Tab Suggestions
       </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_IPH" desc="In product help for the parcel tracking feature.">
-        See all your tracked packages here in this carousel
+      <message name="IDS_IOS_OPTIONS_WEB_SERVICES_LABEL" desc="Title for group of web services items in Privacy settings table, including Show Suggestions, Preload Webpages, and Send Usage Data. [Length: 10em] [iOS only]">
+        Web Services
       </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING" desc="Text for the button that allows the user to enable parcel tracking.">
-        Allow
+      <message name="IDS_IOS_OVERFLOW_BADGE_HINT" desc="Button displayed when there is more than one badge to show [iOS only]">
+        Show available page actions
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_CUSTOMIZE_MENU_CANCEL" desc="The title of the button on the overflow menu customization screen for users to cancel customization." meaning="[In Title case] [iOS only]">
+        Cancel
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_CUSTOMIZE_MENU_DONE" desc="The title of the button on the overflow menu customization screen for users to finish and save customization." meaning="[In Title case] [iOS only]">
+        Done
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_CUSTOMIZE_MENU_TITLE" desc="The title of the screen on the overflow menu where users can customize the items in the menu." meaning="[In Title case] [iOS only]">
+        Customize Menu
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_EDIT_ACTIONS" desc="The iOS menu item for starting the process to edit actions on the overflow menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Customize Menu
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_EDIT_SECTION_HIDDEN_TITLE" desc="The title for the overflow menu edit section showing hidden destinations" meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hidden
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDDEN_BOOKMARKS_SUBTITLE" desc="The subtitle of the Add to Bookmarks action alerting users that the Bookmark destination is hidden." meaning="[In Title case] [iOS only]">
+        Bookmarks are hidden
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDDEN_READING_LIST_SUBTITLE" desc="The subtitle of the Add to Reading List action alerting users that the Reading List destination is hidden." meaning="[In Title case] [iOS only]">
+        Reading List is hidden
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_ADD_TO_BOOKMARKS" desc="The title for the context menu item to hide Add to Bookmarks. This should match the title of the Add to Bookmarks action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Add to Bookmarks
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_CLEAR_BROWSING_DATA" desc="The title for the context menu item to hide Clear Browsing Data. This should match the title of the Clear Browsing Data action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Clear Browsing Data
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_DESKTOP_SITE" desc="The title for the context menu item to hide Request Desktop Site. This should match the title of the Request Desktop Site action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Request Desktop Site
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_EDIT_BOOKMARK" desc="The title for the context menu item to hide Edit Bookmarks. This should match the title of the Edit Bookmarks action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Edit Bookmark
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_FIND_IN_PAGE" desc="The title for the context menu item to hide Find in Page. This should match the title of the Find in Page action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Find in Page
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_FOLLOW" desc="The title for the context menu item to hide Follow. This should match the title of the Follow action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Follow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_MOBILE_SITE" desc="The title for the context menu item to hide Request Mobile Site. This should match the title of the Request Mobile Site action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Request Mobile Site
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_READING_LIST" desc="The title for the context menu item to hide Add to Reading List. This should match the title of the Add to Reading List action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Add to Reading List
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_TEXT_ZOOM" desc="The title for the context menu item to hide Zoom Text. This should match the title of the Zoom Text action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Zoom Text
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_TRANSLATE" desc="The title for the context menu item to hide Translate. This should match the title of the Translate action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Translate
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_UNFOLLOW" desc="The title for the context menu item to hide Unfollow. This should match the title of the Unfollow action in the menu. [iOS only]">
+        Hide Unfollow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_BOOKMARKS" desc="The title for the context menu item to hide Bookmarks. This should match the title of the Bookmarks destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Bookmarks
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_DOWNLOADS" desc="The title for the context menu item to hide Downloads. This should match the title of the Downloads destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Downloads
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_HISTORY" desc="The title for the context menu item to hide History. This should match the title of the History destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide History
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_PASSWORDS" desc="The title for the context menu item to hide Passwords. This should match the title of the Passwords destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Password Manager
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_PRICE_NOTIFICATIONS" desc="The title for the context menu item to hide Price Tracking. This should match the title of the Price Tracking destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Track Price
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_READING_LIST" desc="The title for the context menu item to hide Reading List. This should match the title of the Reading List destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Reading List
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_RECENT_TABS" desc="The title for the context menu item to hide Recent Tabs. This should match the title of the Recent Tabs destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide Recent Tabs
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_WHATS_NEW" desc="The title for the context menu item to hide What's New. This should match the title of the What's New destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
+        Hide What's New
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ITEM_ACCESSIBILITY_HINT" desc="Accessibility hint telling users what will happen if they take action on a shown item." meaning="[In Title case] [iOS only]">
+        Hides this item
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SHOW_ITEM_ACCESSIBILITY_HINT" desc="Accessibility hint telling users what will happen if they take action on a hidden item." meaning="[In Title case] [iOS only]">
+        Shows this item
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SORT_DESCRIPTION" desc="The description of the overflow menu option where the menu will be auto-sorted by frequency." meaning="[iOS only] [Length: Unlimited]">
+        Show frequently used items first.
+      </message>
+      <message name="IDS_IOS_OVERFLOW_MENU_SORT_TITLE" desc="The title of the overflow menu option where the menu will be auto-sorted by frequency." meaning="[iOS only] [Length: Unlimited]">
+        Smart Sort Menu Bar
+      </message>
+      <message name="IDS_IOS_OVERSCROLL_CLOSE_TAB_LABEL" desc="The text to use for the tooltip for the overscroll close tab action. [Length: 20em] [iOS only]">
+        Close Tab
+      </message>
+      <message name="IDS_IOS_OVERSCROLL_NEW_TAB_LABEL" desc="The text to use for the tooltip for the overscroll new tab action. [Length: 20em] [iOS only]">
+        New Tab
+      </message>
+      <message name="IDS_IOS_OVERSCROLL_RELOAD_LABEL" desc="The text to use for the tooltip for the overscroll reload action. [Length: 20em] [iOS only]">
+        Reload
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_COOKIES_BLOCKED_LABEL" desc="Title of the item that displays the number of blocked Cookies in the site information screen.">
+        Blocked Cookies
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_COOKIES_CLEAR_SITE_LABEL" desc="Title of the item that clears Cookies of the current site in the site information screen.">
+        Clear Site Cookies
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_COOKIES_DESCRIPTION" desc="Description of the button opening the third-party cookies information (in page info)">
+        Blocking third-party cookies
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_COOKIES_HEADER" desc="Title of the Cookies section presented in the site information screen.">
+        Cookies
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_COOKIES_IN_USE_LABEL" desc="Title of the item that displays the number of Cookies in Use in the site information screen.">
+        Cookies in Use
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_COOKIES_SETTINGS_LINK_LABEL_ALLOW_ALL" desc="Footer to invite the user to open Cookies settings.">
+        To manage cookies for all sites, see <ph name="BEGIN_LINK">BEGIN_LINK</ph>Cookie Settings<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_COOKIES_SETTINGS_LINK_LABEL_BLOCK" desc="Footer to invite the user to open Cookies settings.">
+        Your current setting may cause some sites to break. To manage cookies for all sites, see <ph name="BEGIN_LINK">BEGIN_LINK</ph>Cookie Settings<ph name="END_LINK">END_LINK</ph>.
+           </message>
+      <message name="IDS_IOS_PAGE_INFO_COOKIES_SWITCH_LABEL" desc="Title of the switch item that can be toggled to enable or disable Third-Party Cookies (in page info)">
+        Block Third-Party Cookies
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_OFFLINE_PAGE" desc="Message to display in the page info when the page you are on is an offline page.">
+        This page has been saved to your Reading List.
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_OFFLINE_PAGE_LABEL" desc="Label to display at the top of the site information screen when the page you are on is an offline page.">
+        Offline Page
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_OFFLINE_TITLE" desc="Title of the message to display in the page info bubble when the page you are on is an offline page.">
+        Viewing Offline Version
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_PERMISSIONS_HEADER" desc="Header of the permissions section (in page info)">
+        Permissions
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_RELOAD" desc="Button title in the page info bubble that allows to reload the current page.">
+        Reload
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_SECURITY_BUTTON_ACCESSIBILITY_LABEL" desc="The accessibility text for the page security info button">
+        Page Security Info
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_SECURITY_STATUS_NOT_SECURE" desc="The label informing that a website is not secure">
+        Not Secure
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_SECURITY_STATUS_SECURE" desc="The label informing that a website is secure">
+        Secure
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_SITE_INFORMATION" desc="Title of the navigation controller to display when the page info is presented.">
+        Site information
+      </message>
+      <message name="IDS_IOS_PAGE_INFO_SITE_SECURITY" desc="Title of the button opening the site security information (in page info)">
+        Site Security
+      </message>
+      <message name="IDS_IOS_PAGE_LOADED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement when a page has loaded. [Length: unlimited] [iOS only]">
+        Webpage loaded
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_CARRIER_FEDEX" desc="Name of FEDEX Carrier">
+          FEDEX
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_CARRIER_UPS" desc="Name of UPS Carrier">
+          UPS
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_CARRIER_USPS" desc="Name of USPS Carrier">
+          USPS
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_CONTEXT_MENU_DESCRIPTION" desc="Descripiton for the long-press context menu of the parcel tracking module.">
+        Hide "<ph name="Module_Name"><ex>Package Tracking</ex>$1</ph>"
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_CONTEXT_MENU_TITLE" desc="Title for the long-press context menu of the parcel tracking module.">
+          This card helps you keep track of your packages and give you important delivery updates.
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_CONTEXT_MENU_UNTRACK" desc="Title for the untrack parcel option of the parcel tracking module.">
+          Untrack this package
       </message>
       <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_ASK_TO_TRACK_TITLE" desc="Text for the title string of the infobar that is displayed to prompt user to track a package.">
         {COUNT, plural,
@@ -2264,17 +2837,20 @@
       <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_TITLE" desc="Text for the title string of the infobar that is displayed when a package is already being tracked.">
         Package Already Tracked
       </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_UNTRACKED_SUBTITLE" desc="Text for the subtitle string of the infobar that is displayed after a package is untracked.">
+        This package has been successfully untracked.
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_UNTRACKED_TITLE" desc="Text for the title string of the infobar that is displayed after a package is untracked.">
+        Package Untracked
+      </message>
       <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_TRACK_BUTTON" desc="Text for the button on the Parcel Tracking infobars that tracks a package.">
         Track
       </message>
       <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_VIEW_BUTTON" desc="Text for the button on the Parcel Tracking infobars that shows the Parcel Tracking module in the NTP.">
         View
       </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_UNTRACKED_TITLE" desc="Text for the title string of the infobar that is displayed after a package is untracked.">
-        Package Untracked
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_UNTRACKED_SUBTITLE" desc="Text for the subtitle string of the infobar that is displayed after a package is untracked.">
-        This package has been successfully untracked.
+      <message name="IDS_IOS_PARCEL_TRACKING_IPH" desc="In product help for the parcel tracking feature.">
+        See all your tracked packages here in this carousel
       </message>
       <message name="IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_DELIVERED_BY" desc="Text that prefaces a parcel carrier in the parcel tracking infobar modal.">
         Delivered by
@@ -2295,6 +2871,15 @@
         =1 {Untrack This Package}
         other {Untrack All Packages}}
       </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_CANCEL" desc="Title for the item to cancel disabling the Parcel Tracking feature. ">
+          Cancel
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_TITLE" desc="Title for the alert dialog warning the user they are about to hide the parcel tracking module.">
+          Hiding This Card Will Turn Off Package Tracking and Remove All Your Data
+      </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING" desc="Text for the button that allows the user to enable parcel tracking.">
+        Allow
+      </message>
       <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_PRIMARY_ACTION" desc="Text for the primary action string of the parcel tracking opt-in half-sheet screen.">
         Always Track Packages
       </message>
@@ -2307,6 +2892,16 @@
       <message name="IDS_IOS_PARCEL_TRACKING_REPORT_AN_ISSUE" desc="Title for the option on the parcel tracking infobar to report an issue">
         Report an issue
       </message>
+      <message name="IDS_IOS_PARCEL_TRACKING_UNTRACK_SNACKBAR_TITLE" desc="Title for the snackbar indicating a parcel has been untracked. ">
+          Stopped tracking this package
+      </message>
+      <message name="IDS_IOS_PARENT_MANAGED_POPOVER_TEXT" desc="This text is shown when parental controls are enabled for a supervised user which affects settings.">
+      Managed by your parent
+      </message>
+      <message name="IDS_IOS_PARENT_MANAGED_SETTING" desc="Text displayed to inform the user that the browser is managed by their parent. [iOS only]">
+        Your account is managed by your parent.
+<ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn More<ph name="END_LINK">END_LINK</ph>
+      </message>
       <message name="IDS_IOS_PARTIAL_TRANSLATE_ACTION_TRANSLATE_FULL_PAGE" desc="The action button to translate the full page (Title Case).">
         Translate Full Page
       </message>
@@ -2325,11 +2920,17 @@
       <message name="IDS_IOS_PARTIAL_TRANSLATE_SWITCH_FULL_PAGE_TRANSLATION" desc="Title of the alert proposing to switch to full page translation if partial translate fails.">
         Switch to Full Page Translation
       </message>
+      <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_BUTTON_TEXT" desc="Button text for the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]">
+        Got It
+      </message>
+      <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_TITLE" desc="Title of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]">
+        Passwords on All Your Devices
+      </message>
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_CONTINUE" desc="The action button to use the selected credentials to fill the username on a username only form without password.">
         Continue
       </message>
-      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_PASSWORD" desc="The action button to use the selected credentials to fill the username and password fields on the webpage.">
-        Use Password
+      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_MORE_PASSWORDS" desc="This message is mentioned on the first password suggestion of the Password Bottom Sheet if there are more than one suggestion available and all other suggestions are hidden, which is the case initially, until the user expands the list by double tapping on this suggestion. This is spoken by VoiceOver. [iOS only]">
+        Double tap for more passwords.
       </message>
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_USERNAME" desc="Text shown for an option in a list of the user's saved passwords, when the user did not save a username along with the password.">
         No Username ••••••••
@@ -2337,14 +2938,11 @@
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_PASSWORD_MANAGER" desc="The password bottom sheet's long press menu item to open the password manager.">
         Password Manager
       </message>
-      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_SHOW_DETAILS" desc="The password bottom sheet's long press menu item to open the password details page, which displays more information, like username, password and associated website.">
-        Show Details
-      </message>
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_SELECT_PASSWORD" desc="This message is mentioned right after the title when the Password Bottom Sheet opens. For example, in English, it would say: 'Google Password Manager. Select a password to fill.'. This is spoken by VoiceOver. [iOS only]">
         Select a password to fill.
       </message>
-      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_MORE_PASSWORDS" desc="This message is mentioned on the first password suggestion of the Password Bottom Sheet if there are more than one suggestion available and all other suggestions are hidden, which is the case initially, until the user expands the list by double tapping on this suggestion. This is spoken by VoiceOver. [iOS only]">
-        Double tap for more passwords.
+      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_SHOW_DETAILS" desc="The password bottom sheet's long press menu item to open the password details page, which displays more information, like username, password and associated website.">
+        Show Details
       </message>
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_SUBTITLE" desc="Shown on the password bottom sheet to inform users that, upon accepting the prompt, their username and password will be shared with the given website. [iOS only]" meaning="A string under the title logo of the password bottom sheet.">
         You'll sign in to <ph name="URL">$1<ex>chromium.org</ex></ph>
@@ -2352,297 +2950,133 @@
       <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD" desc="The action button to dismiss the password bottom sheet and revert to using the keyboard to fill in username and password information on the webpage.">
               Use Keyboard
             </message>
-      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_CONTINUE" desc="The action button to use the selected credit card to fill the payment fields on the webpage.">
-        Continue
+      <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_PASSWORD" desc="The action button to use the selected credentials to fill the username and password fields on the webpage.">
+        Use Password
       </message>
-      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_MANAGE_PAYMENT_METHODS" desc="The payment bottom sheet's long press menu item to open all payment methods view.">
-        Manage Payment Methods
+      <message name="IDS_IOS_PASSWORD_CHECKUP" desc="Title for the item in Settings for Password Checkup feature." meaning="Label tells the user about status of Password Checkup [CHAR_LIMIT=25] [iOS only]">
+        Password Checkup
       </message>
-      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_SHOW_DETAILS" desc="The payment bottom sheet's long press menu item to open the credit card details view.">
-        Show Details
+      <message name="IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT" desc="In sentence case: Displays the number of compromised passwords present in the database." meaning="[In sentence case]">
+        {COUNT, plural,
+          =0 {No compromised passwords}
+          =1 {{COUNT} compromised password}
+          other {{COUNT} compromised passwords}}
       </message>
-      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_SELECT_PAYMENT_METHOD" desc="This message is mentioned right after the title when the Payments Bottom Sheet opens. For example, when using Google Pay, it would say: 'Google Pay. Select a payment method to fill.'. This is spoken by VoiceOver. [iOS only]">
-        Select a payment method to fill.
+      <message name="IDS_IOS_PASSWORD_CHECKUP_DESCRIPTION" desc="Description for the Password Check item in Settings" meaning="Label is shown to explain purpose of Password Checkup feature. This string is shown only if user didn't run the password checkup before or checkup finished due to error without any results.  [iOS only]">
+        Check your saved passwords to strengthen your security and stay safer online
       </message>
-      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_SUBTITLE" desc="Shown on the payment bottom sheet to inform users that, upon accepting the prompt, credit card informations will be shared with the given website. [iOS only]" meaning="A string under the title logo of the payment bottom sheet.">
-        You'll fill info into <ph name="URL">$1<ex>chromium.org</ex></ph>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_DISMISSED_COUNT" desc="Displays the number of compromised password warnings that have been dismissed.">
+        {COUNT, plural,
+          =1 {You dismissed {COUNT} warning}
+          other {You dismissed {COUNT} warnings}}
       </message>
-      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_USE_KEYBOARD" desc="The action button to dismiss the payment bottom sheet and revert to using the keyboard to fill in payment fields on the webpage.">
-        Use Keyboard
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_CHECK_AGAIN_BUTTON" desc="Label of a button which starts a new password checkup [Length: 22em] [iOS only]">
+        Check Again
       </message>
-      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_CARD_DESCRIPTION" desc="The (accessibility) credit card description from the network of the card and last 4 digits of the card number.">
-        <ph name="NETWORK_NAME">$1<ex>Visa</ex></ph> ending in <ph name="LAST_FOUR_DIGITS">$2<ex>1234</ex></ph>
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_SUBTITLE" desc="Subitle for the compromised passwords item in the Password Checkup Homepage when there are compromised passwords. [iOS only]">
+        You should change these now
       </message>
-      <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_PRIMARY_ACTION" desc="The text for the primary action button of the post restore default browser promo.">
-        Make Default in Settings…
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_TITLE" desc="In Title Case: Title for the compromised passwords item in the Password Checkup Homepage. [Length: 16em] [iOS only]" meaning="[In Title Case]">
+        {count, plural,
+          =0 {No Compromised Passwords}
+          =1 {{count} Compromised Password}
+          other {{count} Compromised Passwords}}
       </message>
-      <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_SECONDARY_ACTION" desc="The text for the secondary action button of the post restore default browser promo.">
-        No Thanks
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_DISMISSED_WARNINGS_SUBTITLE" desc="Subitle for the compromised passwords item in the Password Checkup Homepage when there are dismissed compromised password warnings. [iOS only]">
+        {count, plural,
+          =1 {You dismissed {count} warning}
+          other {You dismissed {count} warnings}}
       </message>
-      <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_SUBTITLE_IPAD" desc="The text for the subtitle of the post restore default browser promo for iPad.">
-        Your iPad was recently restored, which might have changed your default browser.
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_ERROR_DIALOG_TITLE" desc="Title of the error dialog presented to the user when a password checkup failed. [iOS only]">
+        Something went wrong
       </message>
-      <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_SUBTITLE_IPHONE" desc="The text for the subtitle of the post restore default browser promo for iPhone.">
-        Your iPhone was recently restored, which might have changed your default browser.
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_FOOTER" desc="Footer message for the Password Checkup Homepage explaining the purpose of Password Checkup. [iOS only]">
+        Make sure your passwords are safe, find out if they’ve been compromised, and get advice to help protect yourself online. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_CHIP" desc="Acessibility label to describe the UI which displays a product's price in the Price Tracking Item UI.">
-          Price
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_COMPROMISED_PASSWORDS_SUBTITLE" desc="Subitle for the compromised passwords item in the Password Checkup Homepage when there are no compromised passwords. [iOS only]">
+        If your passwords are compromised, we'll let you know
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_PERMISSION_REDIRECT_ALERT_CANCEL" desc="The label for the alert's cancel button">
-          Cancel
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_REUSED_PASSWORDS_SUBTITLE" desc="Subitle for the reused passwords item in the Password Checkup Homepage when there are no reused passwords. [iOS only]">
+        You're not reusing any passwords
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_PERMISSION_REDIRECT_ALERT_REDIRECT" desc="The label for the alert's button that redirects the user to Chrome's application settings in iOS">
-          Go to Settings
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_REUSED_PASSWORDS_TITLE" desc="Title for the reused passwords item in the Password Checkup Homepage when there are no reused passwords. [Length: 16em] [iOS only]">
+        Your Passwords are Unique
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_ERROR_ALERT_TITLE" desc="The title for the UIAlert that informs the user that an error occurred during the price tracking subscription and unsubscription process">
-          Something Went Wrong
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_WEAK_PASSWORDS_SUBTITLE" desc="Subitle for the weak passwords item in the Password Checkup Homepage when there are no weak passwords. [iOS only]">
+        You're using passwords that look hard to guess
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_SUBSCRIBE_ERROR_ALERT_DESCRIPTION" desc="The description that informs the user that an error occurred during the price tracking subscription process.">
-          Couldn't track the price.
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_WEAK_PASSWORDS_TITLE" desc="Title for the weak passwords item in the Password Checkup Homepage when there are no weak passwords. [Length: 16em] [iOS only]">
+        Your Passwords look Strong
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_ERROR_ALERT_REATTEMPT" desc="The label for the alert's button that reattempts to execute the action that originally failed">
-          Try Again
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_REUSED_PASSWORDS_SUBTITLE" desc="Subitle for the reused passwords item in the Password Checkup Homepage when there are reused passwords. [iOS only]">
+        Create unique passwords
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TITLE" desc="Title for Price Notifications table view.">
-        Track Price
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_REUSED_PASSWORDS_TITLE" desc="In Title Case: Title for the reused passwords item in the Password Checkup Homepage when there are reused passwords. User can only have 2 or more reused passwords, so this string will always be plural. [Length: 16em] [iOS only]" meaning="[In Title Case]">
+        <ph name="COUNT">$1<ex>2</ex></ph> Reused Passwords
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TOAST_IPH_TEXT" desc="Text for Price tracking toast IPH.">
-        Track price here
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_WEAK_PASSWORDS_SUBTITLE" desc="Subitle for the weak passwords item in the Password Checkup Homepage when there are weak passwords. [iOS only]">
+        Create strong passwords
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACKABLE_SECTION_HEADER" desc="Section header for a Price Notifications table view section that lists items available on the current page to have their prices tracked.">
-        Current Site
+      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_WEAK_PASSWORDS_TITLE" desc="In Title Case: Title for the weak passwords item in the Password Checkup Homepage when there are weak passwords. [Length: 16em] [iOS only]" meaning="[In Title Case]">
+        {count, plural,
+          =1 {{count} Weak Password}
+          other {{count} Weak Passwords}}
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACKED_SECTION_HEADER" desc="Section header for a Price Notifications table view section that lists items the user is currently price tracking.">
-        Tracking Prices
+      <message name="IDS_IOS_PASSWORD_CHECKUP_LAST_COMPLETED_CHECK" desc="Subtitle for Password Checkup cell which shows the timestamp of the last check." meaning="Time when passwords were checked last time.">
+        Checked <ph name="TIME">$1<ex>10 minutes ago</ex></ph>
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICAITONS_PRICE_TRACK_TRACKABLE_ITEM_IS_TRACKED" desc="Table element description explaining that the current website contains an item that the user is already tracking">
-        You're already tracking this product.
+      <message name="IDS_IOS_PASSWORD_CHECKUP_ONGOING" desc="In Title Case: Title for the item in Settings for Password Checkup feature while the checks are running. [CHAR_LIMIT=25] [iOS only]" meaning="In Title Case.">
+        Checking Passwords…
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACKABLE_EMPTY_LIST" desc="Table element description explaining that the current website does not contain any items that can have their prices tracked.">
-        Price tracking isn't available for this page.
+      <message name="IDS_IOS_PASSWORD_CHECKUP_REUSED_COUNT" desc="Displays the number of reused passwords present in the database. User can only have 2 or more reused passwords, so this string will always be plural.">
+        <ph name="COUNT">$1<ex>2</ex></ph> reused passwords
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACKING_EMPTY_LIST" desc="Table element description explaining that this section is the location where the user's price-tracked items will be displayed.">
-        The products you track will show up here.
+      <message name="IDS_IOS_PASSWORD_CHECKUP_SAFE_STATE_ACCESSIBILITY_LABEL" is_accessibility_with_no_ui="true" desc="Addition to the accessibility label for the Password Checkup cell in the Password Manager page when the Password Checkup resulted with no insecure passwords. Meaning that all saved passwords are safe. [iOS only]">
+        No issues found
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_DESCRIPTION" desc="A table header element that describes the effect of a user choosing to price-track an item.">
-        You'll get an alert if the price drops on any site.
+      <message name="IDS_IOS_PASSWORD_CHECKUP_SITES_AND_APPS_COUNT" desc="Displays the number of sites and apps for which passwords are being checked during/after Password Checkup.  [iOS only]">
+        {COUNT, plural,
+          =1 {for {COUNT} site or app}
+          other {for {COUNT} sites and apps}}
       </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_DESCRIPTION_EMPTY_STATE" desc="A table header element that describes the effect of a user choosing to price-track an item. This appears when the user does not have any tracked items.">
-        Track the price of a product across online stores. You’ll get alerts when the price drops.
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_DESCRIPTION_FOR_TRACKED_ITEM" desc="A table header element that describes that this price-tracked item can be managed in bookmarks.">
-        You're already tracking this product. This page is saved in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Mobile Bookmarks<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACK_BUTTON" desc="The title for a button that adds the price-trackable item to the user's stored price tracking list.">
-        Track
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_MENU_ITEM_STOP_TRACKING" desc="Title for action menu item that stops the price-tracking process for the given item.">
-        Untrack
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_MENU_ITEM_STOP_TRACKING_SNACKBAR" desc="Snackbar message that displays when the price-tracking process is stopped for the given item.">
-        Price tracking stopped
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_UNSUBSCRIBE_ERROR_ALERT_DESCRIPTION" desc="The description that informs the user that an error occurred during the price tracking subscription cancellation process.">
-          Your change couldn't be saved.
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_SETTINGS_ALERT_MESSAGE" desc="Message for Price Notifications UI Alert Prompt displayed from the settings menu that redirects the user to the iOS push notifications permission page.">
-          To get notifications of price drop alerts, you'll need to turn on notifications in your iOS settings.
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_SETTINGS_ALERT_TITLE" desc="Title for Price Notifications UI Alert Prompt displayed from the settings menu that redirects the user to the iOS push notifications permission page.">
-          Turn on Price Alerts?
-      </message>
-      <message name="IDS_IOS_NOTIFICATIONS_TITLE" desc="Title for Notifications settings menu.">
-        Notifications
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_OVERFLOW_MENU_TITLE" desc="Title for Price Tracking Notifications overflow menu destination title.">
-        Track Price
-      </message>
-      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACKING_TITLE" desc="Title for Price Tracking Notifications settings menu row.">
-        Tracking Price
-      </message>
-      <message name="IDS_IOS_PRIVACY_GUIDE_TITLE" desc="Title for the Privacy Guide settings menu row.">
-        Privacy Guide
-      </message>
-      <message name="IDS_IOS_PRIVACY_GUIDE_WELCOME_TITLE" desc="Title for the Privacy Guide Welcome step.">
-        A Guide Of Your Privacy Choices
-      </message>
-      <message name="IDS_IOS_PRIVACY_GUIDE_WELCOME_SUBTITLE" desc="Subtitle for the Privacy Guide Welcome step.">
-        Take a guided tour of key privacy and security controls. For more options, go to individual settings.
-      </message>
-      <message name="IDS_IOS_PRIVACY_GUIDE_LETS_GO_BUTTON" desc="Text for the 'Let's go' button on the Welcome step of the Privacy Guide.">
-        Let's go
-      </message>
-      <message name="IDS_IOS_PRIVACY_GUIDE_CANCEL_BUTTON" desc="Text for the 'Cancel' button on the Welcome step of the Privacy Guide.">
-        Cancel
-      </message>
-      <message name="IDS_IOS_TRACKING_PRICE_HEADER_TEXT" desc="Text for Tracking Price header.">
-        Manage how you receive price drop alerts for products you track
-      </message>
-      <message name="IDS_IOS_TRACKING_PRICE_MOBILE_NOTIFICATIONS_TITLE" desc="Title for Tracking Price mobile notifications row.">
-        Mobile Notifications
-      </message>
-      <message name="IDS_IOS_TRACKING_PRICE_EMAIL_NOTIFICATIONS_TITLE" desc="Title for Tracking Price email notifications row.">
-        Email Notifications
-      </message>
-      <message name="IDS_IOS_TRACKING_PRICE_EMAIL_NOTIFICATIONS_DETAILS" desc="Subtitle that describes to which email address price tracking notifications would be sent.">
-        Send to <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_LOCKDOWN_MODE_TITLE" desc="Title for Lockdown Mode.">
-        Lockdown Mode
-      </message>
-      <message name="IDS_IOS_LOCKDOWN_MODE_SWITCH_BUTTON_SUMMARY" desc="Title for Lockdown Mode.">
-        Extreme optional protection for your browser. It should only be used if you believe you may be targeted by a highly sophisticated cyberattack.
-      </message>
-      <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_TITLE" desc="Title for Lockdown Mode.">
-        This setting is enabled on your device
-      </message>
-      <message name="IDS_IOS_LOCKDOWN_MODE_FOOTER" desc="Title for Lockdown Mode.">
-        When turned on, certain web technologies are blocked, which might cause some websites to load more slowly or not operate correctly.
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_SUMMARY" desc="Summary for Privacy Safe Browsing enhanced protection mode.">
-        Faster, proactive protection against dangerous websites, downloads, and extensions. Warns you about password breaches. Requires browsing data to be sent to Google.
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_FRIENDLIER_SUMMARY" desc="Friendlier summary for Privacy Safe Browsing enhanced protection mode.">
-        Real-time, proactive protection against dangerous sites, downloads, and extensions that’s based on your browsing data getting sent to Google
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_TITLE" desc="Title for Privacy Safe Browsing enhanced protection mode.">
-        Enhanced Protection
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_SUMMARY" desc="Summary for Privacy Safe Browsing standard protection mode.">
-        Standard protection against websites, downloads, and extensions that are known to be dangerous.
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_FRIENDLIER_SUMMARY" desc="Friendlier summary for Privacy Safe Browsing standard protection mode.">
-        Protects against sites, downloads, and extensions that are known to be dangerous. If a page does something suspicious, URLs and bits of page content are sent to Google Safe Browsing.
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_TITLE" desc="Title for Privacy Safe Browsing standard protection mode.">
-        Standard Protection
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_SUMMARY" desc="Summary for Privacy Safe Browsing no protection mode.">
-        Does not protect you against dangerous websites, downloads, and extensions. You’ll still get Safe Browsing protection, where available, in other Google services, like Gmail and Search.
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_FRIENDLIER_SUMMARY" desc="Friendlier summary for Privacy Safe Browsing no protection mode.">
-        Does not protect you against dangerous websites, downloads, and extensions. Your Safe Browsing settings in other Google products won't be affected.
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_TITLE" desc="Title for Privacy Safe Browsing no protection mode.">
-        No Protection (not recommended)
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_DETAIL_TITLE" desc="Detail title for Privacy Safe Browsing no protection mode.">
-        No Protection
-      </message>
-      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_TITLE" desc="Title for Privacy Safe Browsing table view.">
-        Safe Browsing
-      </message>
-      <message name="IDS_IOS_PRIVACY_SYNC_AND_GOOGLE_SERVICES_FOOTER" desc="Footer to invite the user to open the Sync Settings and Google Services settings.">
-        For more settings that relate to privacy, security, and data collection, see both <ph name="BEGIN_LINK">BEGIN_LINK</ph>Sync<ph name="END_LINK">END_LINK</ph> and <ph name="BEGIN_LINK">BEGIN_LINK</ph>Google Services<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_PRIVACY_GOOGLE_SERVICES_FOOTER" desc="Footer to invite the user to open the Google Services settings.">
-        For more settings that relate to privacy, security, and data collection, see <ph name="BEGIN_LINK">BEGIN_LINK</ph>Google Services<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_OPTIONS_REPORT_AN_ISSUE" desc="Title for the option on Settings page to report an issue. [Length: 20em] [iOS only]">
-        Report an Issue
-      </message>
-      <message name="IDS_IOS_OPTIONS_WEB_SERVICES_LABEL" desc="Title for group of web services items in Privacy settings table, including Show Suggestions, Preload Webpages, and Send Usage Data. [Length: 10em] [iOS only]">
-        Web Services
-      </message>
-      <message name="IDS_IOS_OVERFLOW_BADGE_HINT" desc="Button displayed when there is more than one badge to show [iOS only]">
-        Show available page actions
-      </message>
-      <message name="IDS_IOS_OVERSCROLL_NEW_TAB_LABEL" desc="The text to use for the tooltip for the overscroll new tab action. [Length: 20em] [iOS only]">
-        New Tab
-      </message>
-      <message name="IDS_IOS_OVERSCROLL_CLOSE_TAB_LABEL" desc="The text to use for the tooltip for the overscroll close tab action. [Length: 20em] [iOS only]">
-        Close Tab
-      </message>
-      <message name="IDS_IOS_OVERSCROLL_RELOAD_LABEL" desc="The text to use for the tooltip for the overscroll reload action. [Length: 20em] [iOS only]">
-        Reload
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_COOKIES_BLOCKED_LABEL" desc="Title of the item that displays the number of blocked Cookies in the site information screen.">
-        Blocked Cookies
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_COOKIES_CLEAR_SITE_LABEL" desc="Title of the item that clears Cookies of the current site in the site information screen.">
-        Clear Site Cookies
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_COOKIES_DESCRIPTION" desc="Description of the button opening the third-party cookies information (in page info)">
-        Blocking third-party cookies
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_COOKIES_IN_USE_LABEL" desc="Title of the item that displays the number of Cookies in Use in the site information screen.">
-        Cookies in Use
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_COOKIES_SETTINGS_LINK_LABEL_ALLOW_ALL" desc="Footer to invite the user to open Cookies settings.">
-        To manage cookies for all sites, see <ph name="BEGIN_LINK">BEGIN_LINK</ph>Cookie Settings<ph name="END_LINK">END_LINK</ph>.
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_COOKIES_SETTINGS_LINK_LABEL_BLOCK" desc="Footer to invite the user to open Cookies settings.">
-        Your current setting may cause some sites to break. To manage cookies for all sites, see <ph name="BEGIN_LINK">BEGIN_LINK</ph>Cookie Settings<ph name="END_LINK">END_LINK</ph>.
-           </message>
-      <message name="IDS_IOS_PAGE_INFO_COOKIES_SWITCH_LABEL" desc="Title of the switch item that can be toggled to enable or disable Third-Party Cookies (in page info)">
-        Block Third-Party Cookies
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_COOKIES_HEADER" desc="Title of the Cookies section presented in the site information screen.">
-        Cookies
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_OFFLINE_PAGE" desc="Message to display in the page info when the page you are on is an offline page.">
-        This page has been saved to your Reading List.
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_OFFLINE_PAGE_LABEL" desc="Label to display at the top of the site information screen when the page you are on is an offline page.">
-        Offline Page
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_OFFLINE_TITLE" desc="Title of the message to display in the page info bubble when the page you are on is an offline page.">
-        Viewing Offline Version
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_PERMISSIONS_HEADER" desc="Header of the permissions section (in page info)">
-        Permissions
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_RELOAD" desc="Button title in the page info bubble that allows to reload the current page.">
-        Reload
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_SECURITY_BUTTON_ACCESSIBILITY_LABEL" desc="The accessibility text for the page security info button">
-        Page Security Info
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_SITE_INFORMATION" desc="Title of the navigation controller to display when the page info is presented.">
-        Site information
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_SITE_SECURITY" desc="Title of the button opening the site security information (in page info)">
-        Site Security
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_SECURITY_STATUS_SECURE" desc="The label informing that a website is secure">
-        Secure
-      </message>
-      <message name="IDS_IOS_PAGE_INFO_SECURITY_STATUS_NOT_SECURE" desc="The label informing that a website is not secure">
-        Not Secure
-      </message>
-      <message name="IDS_IOS_PAGE_LOADED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement when a page has loaded. [Length: unlimited] [iOS only]">
-        Webpage loaded
-      </message>
-      <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_TITLE" desc="Title of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]">
-        Passwords on All Your Devices
-      </message>
-      <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_BUTTON_TEXT" desc="Button text for the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]">
-        Got It
+      <message name="IDS_IOS_PASSWORD_CHECKUP_WEAK_COUNT" desc="Displays the number of weak passwords present in the database.">
+        {COUNT, plural,
+          =1 {{COUNT} weak password}
+          other {{COUNT} weak passwords}}
       </message>
       <message name="IDS_IOS_PASSWORD_LEAK_CHANGE_CREDENTIALS" desc="The text of the OK button in the dialog for credentials leaked on the current site.">
         Got It
       </message>
+      <message name="IDS_IOS_PASSWORD_MANAGER" desc="Title for the view in Settings for managing saved passwords. [Length: 15em] [iOS only]">
+        Password Manager
+      </message>
       <message name="IDS_IOS_PASSWORD_MANAGER_BLOCK_BUTTON" desc="Button text for the 'Save Password' infobar's 'Never remember for this site' option [Length: 10em]">
         Never
       </message>
+      <message name="IDS_IOS_PASSWORD_MANAGER_HEADER_NOT_SYNCING" desc="Header text for the view in Settings for managing saved passwords. This string only appears when the user is not syncing their passwords. [Length: unlimited] [iOS only]">
+        Passwords are saved to Google Password Manager on this device only.
+      </message>
+      <message name="IDS_IOS_PASSWORD_MANAGER_LOCAL_SAVE_SUBTITLE" desc="Infobar subtitle to save a password on device. [Length: 60em]">
+        To Google Password Manager on this device
+      </message>
       <message name="IDS_IOS_PASSWORD_MANAGER_MODAL_BLOCK_BUTTON" desc="Button text for the 'Save Password' Infobar's Modal 'Never remember this site' option [Length: 70em]">
         Never For This Site
       </message>
+      <message name="IDS_IOS_PASSWORD_MANAGER_ON_ACCOUNT_SAVE_SUBTITLE" desc="Infobar subtitle to save a password on account. [Length: 60em]">
+        To Google Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
+      </message>
       <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON" desc="Save button text for password manager [Length: 10em]">
         Save
       </message>
       <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT" desc="Info bar message to save a password. [Length: 60em]">
         Save password?
       </message>
-      <message name="IDS_IOS_PASSWORD_MANAGER_ON_ACCOUNT_SAVE_SUBTITLE" desc="Infobar subtitle to save a password on account. [Length: 60em]">
-        To Google Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_MANAGER_LOCAL_SAVE_SUBTITLE" desc="Infobar subtitle to save a password on device. [Length: 60em]">
-        To Google Password Manager on this device
-      </message>
       <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_TITLE" desc="Infobar title to save a password. [Length: 70em]">
         Save password
       </message>
+      <message name="IDS_IOS_PASSWORD_MANAGER_TITLE_VIEW_ACCESSIBILITY_LABEL" desc="The accessibility announcement read by Voice Over for the navigation bar title of the Password Manager.">
+          Google Password Manager
+        </message>
       <message name="IDS_IOS_PASSWORD_MANAGER_UPDATE_BUTTON" desc="Label for the 'update' button in the Update Password infobar. This infobar asks if the user wishes to update the saved password for a site to a new password the user has just entered; the button applies the suggested update. [Length: 10em]">
         Update
       </message>
@@ -2655,85 +3089,190 @@
         <message name="IDS_IOS_PASSWORD_MANAGER_UPDATE_PASSWORD_TITLE" desc="Infobar title to update a password. [Length: 70em]">
         Update password
       </message>
-        <message name="IDS_IOS_PASSWORD_MANAGER_TITLE_VIEW_ACCESSIBILITY_LABEL" desc="The accessibility announcement read by Voice Over for the navigation bar title of the Password Manager.">
-          Google Password Manager
-        </message>
-      <message name="IDS_IOS_SAFE_BROWSING_NO_PROTECTION_CONFIRMATION_DIALOG_TITLE" desc="Title for Safe Browsing no protection confirmation dialog.">
-        Turn Off Safe Browsing?
+        <message name="IDS_IOS_PASSWORD_MANAGER_WIDGET_PROMO_BUTTON_TITLE" desc="Title of the button for the Password Manager widget promo shown in the Password Manager." meaning="Title-cased">
+        Show Me How
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_NO_PROTECTION_CONFIRMATION_DIALOG_MESSAGE" desc="Message for Safe Browsing no protection confirmation dialog.">
-        Safe Browsing protects you against attackers who may trick you into doing something dangerous like installing malicious software or revealing personal information like passwords, phone numbers, or credit cards. If you turn it off, be careful when browsing unfamiliar or unreputable sites.        </message>
-      <message name="IDS_IOS_SAFE_BROWSING_NO_PROTECTION_CONFIRMATION_DIALOG_CONFIRM" desc="Message for Safe Browsing no protection confirmation button.">
-        Turn Off
+      <message name="IDS_IOS_PASSWORD_MANAGER_WIDGET_PROMO_TEXT" desc="Descriptive text for the Password Manager widget promo shown in the Password Manager.">
+        Securely access your passwords from the home screen with the Password Manager widget.
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_ACCOUNT_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection account icon.">
-        When you're signed in, this data is linked to your Google Account to protect you across Google services, for example increasing protection in Gmail after a security incident.
+      <message name="IDS_IOS_PASSWORD_MOVE_CONFLICT_ACTION_SHEET_MESSAGE" desc="Action sheet message to explain to the user that they already have a saved credential for the same username and website, and explain the suggested action to store only the most recent password to their google account store. [iOS only]">
+        You already saved a password for this site in your Google Account. Google can choose the most recent password for you.
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_DOWNLOAD_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection download icon.">
-        In-depth scans for suspicious downloads.
+      <message name="IDS_IOS_PASSWORD_MOVE_CONFLICT_ACTION_SHEET_TITLE" desc="Action sheet title to inform the user that the password they want to move to their google account store already exists. [iOS only]">
+        Password Already Exists
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_G_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection G icon.">
-        When you're signed in, protects you across Google services.
+      <message name="IDS_IOS_PASSWORD_SAVED_TO_ACCOUNT_SNACKBAR_MESSAGE" desc="Message briefly displayed at the bottom of the screen to inform the user that the password had successfully been moved to their google account store. [iOS only]">
+        Password saved in your Google Account, <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_GLOBE_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection globe icon.">
-        Improves security for you and everyone on the web.
+      <message name="IDS_IOS_PASSWORD_SETTINGS" desc="Title for the view in Settings for managing the settings related to saved passwords. [Length: 15em] [iOS only]">
+        Password Settings
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_WHEN_ON_HEADER" desc="Header for Safe Browsing enhanced protection mode When On section.">
-        When On
+      <message name="IDS_IOS_PASSWORD_SETTINGS_ADD_PASSWORD_MANUALLY_TITLE" desc="Title of the view that allow user to enter the details for a new password credential to add it to the list the passwords. [iOS only]">
+        Add Password
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_THINGS_TO_CONSIDER_HEADER" desc="Header for Safe Browsing enhanced protection mode Things To Consider section.">
-        Things To Consider
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_ALERT_BUTTON" desc="Alert accept button in settings &gt; password confirming the user wants to save all their local passwords to their account. [iOS Only]">
+        Save in Account
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_KEY_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection key icon.">
-        Warns you if you use a password that has been compromised in a data breach.
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_ALERT_CANCEL" desc="Alert cancel button in settings &gt; password cancelling when user is offered to move passwords to account. [iOS Only]">
+        Cancel
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_LINK_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection link icon.">
-        Sends the URLs you visit and a small sample of page content, downloads, extension activity, and system information to Google Safe Browsing to check if they're harmful.
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_ALERT_DESCRIPTION" desc="Alert description in settings &gt; password confirming to the user that they can save all their local passwords to their account. [iOS Only]">
+        {COUNT, plural,
+        =1 {You can save your password for {DOMAIN_ONE} in your Google Account, {EMAIL}}
+        =2 {You can save your passwords for {DOMAIN_ONE} and {DOMAIN_TWO} in your Google Account, {EMAIL}}
+        =3 {You can save your passwords for {DOMAIN_ONE}, {DOMAIN_TWO}, and {OTHER_DOMAINS_COUNT} other in your Google Account, {EMAIL}}
+        other {You can save your passwords for {DOMAIN_ONE}, {DOMAIN_TWO}, and {OTHER_DOMAINS_COUNT} others in your Google Account, {EMAIL}}}
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_PERFORMANCE_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection performance icon.">
-        Doesn't noticeably slow down your browser or device.
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_ALERT_TITLE" desc="Alert title in settings &gt; password, confirming all local passwords will be saved to the user's account. [iOS Only]">
+        {COUNT, plural,
+        =1 {Save {COUNT} Password in Your Google Account}
+        other {Save {COUNT} Passwords in Your Google Account}}
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_TITLE" desc="Title for Safe Browsing enhanced protection mode.">
-        Enhanced Protection
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SECTION_BUTTON" desc="Section button in settings &gt; password allowing the user to save all their local passwords to their account. [iOS Only]">
+        {COUNT, plural,
+        =1 {Save Password in Account}
+        other {Save Passwords in Account}}
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_EXTENDED_REPORTING_TITLE" desc="Title for Safe Browsing extended reporting.">
-        Help Improve Security on the Web for Everyone
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SECTION_DESCRIPTION" desc="Section description in settings &gt; password explaining to the user that they can save all their local passwords to their account to use them on other devices. [iOS Only]">
+        {COUNT, plural,
+        =1 {{COUNT} password is saved only to this device. To use it on your other devices, save it in your Google Account, {EMAIL}.}
+        other {{COUNT} passwords are saved only to this device. To use them on your other devices, save them in your Google Account, {EMAIL}.}}
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_EXTENDED_REPORTING_SUMMARY" desc="Summary for Safe Browsing extended reporting.">
-        Sends URLs of some pages you visit, limited system information, and some page content to Google, to help discover new threats and protect everyone on the web.
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SECTION_TITLE" desc="Section title in settings &gt; password, about saving all local passwords to the user's account. [iOS Only]">
+        Use Passwords on All Your Devices
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_TITLE" desc="Title for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
-        Warn You if Passwords Are Exposed in a Data Breach
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to save local passwords to their account, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to save local passwords to their account. [Length: about two lines] [iOS only]">
+        To save passwords in your account, you must first set a passcode on your device.
       </message>
-      <message name="IDS_IOS_SPEECH_RECOGNITION_USAGE_DESCRIPTION" desc="Specifies the reason for sending user data to Apple's speech recognition servers.">
-        This will let you use your voice with certain features on websites.
+      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SNACKBAR_MESSAGE" desc="Snackbar message in settings &gt; password, about local passwords having been saved into the user's account. [iOS Only]">
+        {COUNT, plural,
+        =1 {Password saved in your Google Account, {EMAIL}}
+        other {Passwords saved in your Google Account, {EMAIL}}}
       </message>
-      <message name="IDS_IOS_TABLE_VIEW_INFO_BUTTON_ITEM_ACCESSIBILITY_TAP" desc="Accessibility hint for info button items that have a tap functionality.">
-        Button
+      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION" desc="Section title in settings &gt; password, about on-device Encryption. [iOS Only]">
+        On-Device Encryption
       </message>
-      <message name="IDS_IOS_TABS_MANAGEMENT_SETTINGS" desc="Title for the tabs management panel in settings [Length: 30em] [iOS only]">
-        Tabs
+      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_LEARN_MORE" desc="Section title in settings &gt; password. [iOS Only]">
+        Your passwords are encrypted on your device before they’re saved to Google Password Manager.
       </message>
-      <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_TITLE" desc="Title shown in the iOS message when the account tailored security setting is enabled for a consented primary account">
-        Enhanced Protection is On
+      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_OPTED_IN_LEARN_MORE" desc="Section title in settings &gt; password, allow to learn more about on-device encryption. [iOS Only]">
+        Learn More
       </message>
-      <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_TITLE" desc="Title shown in the iOS message when the account tailored security setting is disabled for a consented primary account">
-        Enhanced Protection is Off
+      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_OPT_IN" desc="Section title in settings &gt; password, explaining to the user what they can opt-in. [iOS Only]">
+        For added safety, encrypt passwords on your device before they’re saved to Google Password Manager.
       </message>
-      <message name="IDS_IOS_TAILORED_SECURITY_UNCONSENTED_ENABLE_MESSAGE_TITLE" desc="Title shown in the iOS message when the account tailored security setting is enabled for an unconsented primary account">
-        More Security?
+      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_SET_UP" desc="Section title in settings &gt; password, allowing user to opt-in. [iOS Only]">
+        Set Up…
       </message>
-      <message name="IDS_IOS_TAILORED_SECURITY_TURN_ON_ACTION_TITLE" desc="Action shown in the iOS message when the account tailored security setting is enabled for an unconsented primary account">
-        Turn On
+      <message name="IDS_IOS_PASSWORD_SETTINGS_PASSWORD_PLACEHOLDER_TEXT" desc="Placeholder text for the password field when adding a new credential manually via settings [Length: 10em]">
+        password
       </message>
-      <message name="IDS_SAVE_PASSWORD_FOOTER" desc="The footer text of the infobar that offers user to save/update a password to Chrome.">
-        Passwords are saved in your Google Account so you can use them on any device.
+      <message name="IDS_IOS_PASSWORD_SETTINGS_SAVE_BUTTON" desc="Save button text for adding a new credential manually via settings [Length: 10em]">
+        Save
       </message>
-      <message name="IDS_SAVE_PASSWORD_FOOTER_DISPLAYING_USER_EMAIL" desc="The footer text of the infobar that offers user to save/update a password to Chrome; also display's current user's email.">
-        You can use saved passwords on any device. They're saved to Google Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
+      <message name="IDS_IOS_PASSWORD_SETTINGS_USERNAME_PLACEHOLDER_TEXT" desc="Placeholder text for the username field indicating that the field is optional when adding a new credential manually via settings [Length: 10em]">
+        optional
       </message>
-      <message name="IDS_IOS_PERMISSIONS_CAMERA" desc="Usually used to show whether user has enabled a site's permission to use the device camera.">
-        Camera
+      <message name="IDS_IOS_PASSWORD_SETTINGS_VIEW_PASSWORD_BUTTON" desc="View Password button text for viewing an existing credential. [Length: 10em]">
+        View Password
+      </message>
+      <message name="IDS_IOS_PASSWORD_SETTINGS_WEBSITE_PLACEHOLDER_TEXT" desc="Placeholder text for the website field when adding a new credential manually via settings [Length: 10em]">
+        example.com
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_CANCELLED_TITLE" desc="Title text on the sharing status view when the sharing was cancelled. [iOS only]">
+        Password Was Not Shared
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PICKER_BACK_BUTTON" desc="Button text for the navigation back action in the family picker view in the password sharing flow. [iOS only]">
+        Back
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PICKER_SUBTITLE" desc="Header text in the view that allows to choose recipients for password sharing from a list of family members explaining what happens when the user shares their password with them. [iOS Only]">
+        When you share a copy of your username and password, your family member can fill them using Google Password Manager.
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_BUTTON" desc="Button text for the confirm action in the password sharing family promo view. [iOS only]">
+        Got It
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_INVITE_MEMBERS_SUBTITLE" desc="Subtitle text displayed in the family promo view of the password sharing flow describing that the user needs other family members in order to use the feature. [iOS only]">
+        For now, you can only share passwords with family members. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Invite family members<ph name="END_LINK">END_LINK</ph> to join your group and get more from your products and subscriptions across Google.
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_INVITE_MEMBERS_TITLE" desc="Title text of the family promo view in the password sharing flow in the case where user has a family group with no other members. [iOS only]">
+        Invite Family Members
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_SUBTITLE" desc="Subtitle text displayed in the family promo view of the password sharing flow describing what are the prerequisites to use the feature. [iOS only]">
+        For now, you can only share passwords with family members. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Create a family group<ph name="END_LINK">END_LINK</ph> with up to 6 members and get more from your products and subscriptions across Google.
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_TITLE" desc="Title text of the family promo view in the password sharing flow.">
+        Join a Family Group
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR_TITLE" desc="Title text on the alert view explaining an error in the password sharing flow. [iOS only]">
+        Something Went Wrong
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_LABEL" desc="Text describing what is happening at the beginning of the password sharing flow. [iOS only]">
+        Checking your family members…
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FIRST_RUN_SUBTITLE" desc="Subtitle text describing the password sharing feature displayed in the first run experience view. [iOS only]">
+        You can securely share a copy of your password with someone in your family group. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_FIRST_RUN_TITLE" desc="Title text describing the password sharing feature displayed in the first run experience view. [iOS only]">
+        Share a Copy of Your Password
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_NOTIFICATION_MULTIPLE_PASSWORDS_SUBTITLE" desc="Subtitle text in the password sign-in bottom sheet that informs the user that they received multiple passwords via the password sharing feature. [iOS only]">
+        You have received passwords for <ph name="WEBSITE">$1<ex>amazon.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_NOTIFICATION_SINGLE_PASSWORD_SUBTITLE" desc="Subtitle text in the password sign-in bottom sheet that informs the user about the full name of a family member that shared a password with them on this site. [iOS only]">
+        <ph name="FULL_NAME">$1<ex>John Doe</ex></ph> has shared a password with you for <ph name="WEBSITE">$2<ex>amazon.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_NOTIFICATION_TITLE" desc="Title text in the password sign-in bottom sheet informing the user that they have received some new passwords via the password sharing feature. [iOS only]">
+        {count, plural,
+        =1 {New Password For This Site}
+        other {New Passwords For This Site}}
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_PASSWORD_PICKER_NEXT_BUTTON" desc="Button text for the confirm action in the password picker view in the password sharing flow. [iOS only]">
+        Next
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_SHARE_BUTTON" desc="Button text for the confirm action in the password sharing flow. [iOS only]">
+        Share
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_STATUS_PROGRESS_TITLE" desc="Title text on the sharing status view when it is in progress. [iOS only]">
+        Sharing Password
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE" desc="Footnote text on the sharing status view when it succeeds describing how to revoke access to the shared password. [iOS only]">
+        To stop others from using your password, <ph name="BEGIN_LINK">BEGIN_LINK</ph>change it on <ph name="WEBSITE">$1<ex>amazon.com</ex></ph><ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE_ANDROID_APP" desc="Footnote text on the sharing status view when it succeeds describing how to revoke access to the shared password when it was shared for an Android app. [iOS only]">
+        To stop others from using your password, open the <ph name="APP">$1<ex>Netflix</ex></ph> app to change your password
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE" desc="Subtitle text on the sharing status view when it succeeds describing that the recipient can now use the shared password. [iOS only]">
+        <ph name="BEGIN_BOLD">BEGIN_BOLD</ph><ph name="USERNAME">$1<ex>johndoe</ex></ph><ph name="END_BOLD">END_BOLD</ph> can now use your username and password when they use Google Password Manager to sign in to <ph name="BEGIN_BOLD">BEGIN_BOLD</ph><ph name="WEBSITE">$2<ex>amazon.com</ex></ph><ph name="END_BOLD">END_BOLD</ph>. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE_MULTIPLE_RECIPIENTS" desc="Subtitle text on the sharing status view when it succeeds describing that the recipient can now use the shared password. [iOS only]">
+        Your family members can now use your username and password when they use Google Password Manager to sign in to <ph name="BEGIN_BOLD">BEGIN_BOLD</ph><ph name="WEBSITE">$1<ex>amazon.com</ex></ph><ph name="END_BOLD">END_BOLD</ph>. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_TITLE" desc="Title text on the sharing status view when it succeeded. [iOS only]">
+        Password Shared
+      </message>
+      <message name="IDS_IOS_PASSWORD_SHARING_TITLE" desc="Title of the password sharing bottom sheet view. [iOS only]">
+        Share Password
+      </message>
+      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_CARD_DESCRIPTION" desc="The (accessibility) credit card description from the network of the card and last 4 digits of the card number.">
+        <ph name="NETWORK_NAME">$1<ex>Visa</ex></ph> ending in <ph name="LAST_FOUR_DIGITS">$2<ex>1234</ex></ph>
+      </message>
+      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_CONTINUE" desc="The action button to use the selected credit card to fill the payment fields on the webpage.">
+        Continue
+      </message>
+      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_MANAGE_PAYMENT_METHODS" desc="The payment bottom sheet's long press menu item to open all payment methods view.">
+        Manage Payment Methods
+      </message>
+      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_SELECT_PAYMENT_METHOD" desc="This message is mentioned right after the title when the Payments Bottom Sheet opens. For example, when using Google Pay, it would say: 'Google Pay. Select a payment method to fill.'. This is spoken by VoiceOver. [iOS only]">
+        Select a payment method to fill.
+      </message>
+      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_SHOW_DETAILS" desc="The payment bottom sheet's long press menu item to open the credit card details view.">
+        Show Details
+      </message>
+      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_SUBTITLE" desc="Shown on the payment bottom sheet to inform users that, upon accepting the prompt, credit card informations will be shared with the given website. [iOS only]" meaning="A string under the title logo of the payment bottom sheet.">
+        You'll fill info into <ph name="URL">$1<ex>chromium.org</ex></ph>
+      </message>
+      <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_USE_KEYBOARD" desc="The action button to dismiss the payment bottom sheet and revert to using the keyboard to fill in payment fields on the webpage.">
+        Use Keyboard
       </message>
       <message name="IDS_IOS_PERMISSIONS_ALERT_DIALOG_BUTTON_TEXT_DENY" desc="Button text to deny access to permissions. This should match the iOS built-in alert for permissions access.">
         Don't Allow
@@ -2753,6 +3292,9 @@
       <message name="IDS_IOS_PERMISSIONS_ALERT_DIALOG_PERMISSION_MICROPHONE" desc="Name of permission shown in the alert asking users for access to permissions. This should match the iOS built-in alert for permissions access.">
         microphone
       </message>
+      <message name="IDS_IOS_PERMISSIONS_CAMERA" desc="Usually used to show whether user has enabled a site's permission to use the device camera.">
+        Camera
+      </message>
       <message name="IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE" desc="Message shown in the infobar when camera access is enabled.">
         Camera Access Allowed
       </message>
@@ -2762,9 +3304,6 @@
       <message name="IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE" desc="Message shown in the infobar when microphone access is enabled.">
         Microphone Access Allowed
       </message>
-      <message name="IDS_IOS_PERMISSIONS_MICROPHONE" desc="Usually used to show whether user has enabled a site's permission to use the device microphone.">
-        Microphone
-      </message>
       <message name="IDS_IOS_PERMISSIONS_INFOBAR_MODAL_DESCRIPTION" desc="Description of the permissions infobar and in the page info used to update site permissions.">
         <ph name="BEGIN_BOLD">BEGIN_BOLD</ph>"<ph name="SITE_NAME">$1<ex>www.dailydot.com</ex></ph>"<ph name="END_BOLD">END_BOLD</ph> permissions will reset to off when you leave this site.
       </message>
@@ -2774,15 +3313,21 @@
       <message name="IDS_IOS_PERMISSIONS_INFOBAR_OVERFLOW_POPUP_TITLE" desc="Title of the infobar modal shown when the user taps Camera/Microphone access.">
         Edit Permissions
       </message>
+      <message name="IDS_IOS_PERMISSIONS_MICROPHONE" desc="Usually used to show whether user has enabled a site's permission to use the device microphone.">
+        Microphone
+      </message>
+      <message name="IDS_IOS_PHONE_CALL_BUTTON" desc="Text in the confirmation dialog button that will initiate a phone call for the presented number. [Length: 10em] [iOS only]">
+        Call
+      </message>
+      <message name="IDS_IOS_PHOTO_LIBRARY_ADD_USAGE_DESCRIPTION" desc="Specifies the reason for writing to the user's photo library while the app is in use [Length: unlimited] [iOS only].">
+        This lets you save photos to your photo library.
+      </message>
       <message name="IDS_IOS_PINNED_TABS_DRAG_TO_PIN_LABEL" desc="Label displayed in the pin tab toolbar when a Tab is being dragged.">
         Drag tab here to pin it.
       </message>
       <message name="IDS_IOS_PINNED_TAB_ACCESSIBILITY_LABEL" desc="Accessibility label for the Pinned Tab following by the tab title.">
         Pinned, <ph name="TAB_TITLE">$1<ex>CNN: Breaking News, Latest News and Videos</ex></ph>
       </message>
-      <message name="IDS_IOS_PHOTO_LIBRARY_ADD_USAGE_DESCRIPTION" desc="Specifies the reason for writing to the user's photo library while the app is in use [Length: unlimited] [iOS only].">
-        This lets you save photos to your photo library.
-      </message>
       <message name="IDS_IOS_PLACEHOLDER_FIND_IN_PAGE" desc="The iOS placeholder for searching in the current page [Length: 30em] [iOS only]">
         Find in page...
       </message>
@@ -2795,11 +3340,32 @@
       <message name="IDS_IOS_POPUPS_BLOCKED_MOBILE" desc="Message shown in the infobar when a popup is blocked [length: 20em]">
         Pop-ups blocked (<ph name="NUMBER_OF_BLOCKED_POPUPS">$1<ex>1</ex></ph>)
       </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_PROMO_TITLE" desc="The title text of the fullscreen, post restore sign-in promo. [iOS only]">
-        Welcome Back, <ph name="USER_NAME">$1<ex>Ben</ex></ph>
+      <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_PRIMARY_ACTION" desc="The text for the primary action button of the post restore default browser promo.">
+        Make Default in Settings…
       </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_PROMO_TITLE_SHORT" desc="The title text of the fullscreen, post restore sign-in promo, if there is not a name for the user. [iOS only]">
-        Welcome Back
+      <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_SECONDARY_ACTION" desc="The text for the secondary action button of the post restore default browser promo.">
+        No Thanks
+      </message>
+      <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_SUBTITLE_IPAD" desc="The text for the subtitle of the post restore default browser promo for iPad.">
+        Your iPad was recently restored, which might have changed your default browser.
+      </message>
+      <message name="IDS_IOS_POST_RESTORE_DEFAULT_BROWSER_SUBTITLE_IPHONE" desc="The text for the subtitle of the post restore default browser promo for iPhone.">
+        Your iPhone was recently restored, which might have changed your default browser.
+      </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_CANCEL_ACTION" desc="The cancel action text of the alert post restore sign-in promo. [iOS only]">
+        Ignore
+      </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_MESSAGE_IPAD" desc="The message text of the alert post restore sign-in promo. [iOS only]">
+        You were signed out of your account, <ph name="USER_NAME">$1<ex>example@gmail.com</ex></ph>, as part of your iPad reset. To sign back in, tap "Continue" below.
+      </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_MESSAGE_IPHONE" desc="The message text of the alert post restore sign-in promo. [iOS only]">
+        You were signed out of your account, <ph name="USER_NAME">$1<ex>example@gmail.com</ex></ph>, as part of your iPhone reset. To sign back in, tap "Continue" below.
+      </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_NOTE_IPAD" desc="Text above the action buttons of the fullscreen post-restore sign-in promo. [iOS only]">
+        You were signed out as part of your iPad reset. Tap continue below to sign in.
+      </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_NOTE_IPHONE" desc="Text above the action buttons of the fullscreen post-restore sign-in promo. [iOS only]">
+        You were signed out as part of your iPhone reset. Tap continue below to sign in.
       </message>
       <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_PRIMARY_ACTION" desc="The primary action text of the fullscreen, post restore sign-in promo. [iOS only]">
         Continue as <ph name="USER_NAME">$1<ex>Ben</ex></ph>
@@ -2807,29 +3373,86 @@
       <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_PRIMARY_ACTION_SHORT" desc="The primary action text of the fullscreen, post restore sign-in promo, if there is not a name for the user. [iOS only]">
         Continue
       </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_PROMO_TITLE" desc="The title text of the fullscreen, post restore sign-in promo. [iOS only]">
+        Welcome Back, <ph name="USER_NAME">$1<ex>Ben</ex></ph>
+      </message>
+      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_PROMO_TITLE_SHORT" desc="The title text of the fullscreen, post restore sign-in promo, if there is not a name for the user. [iOS only]">
+        Welcome Back
+      </message>
       <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_SECONDARY_ACTION" desc="The secondary action text of the fullscreen, post restore sign-in promo. [iOS only]">
         Don't Sign In
       </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_NOTE_IPHONE" desc="Text above the action buttons of the fullscreen post-restore sign-in promo. [iOS only]">
-        You were signed out as part of your iPhone reset. Tap continue below to sign in.
+      <message name="IDS_IOS_PRICE_NOTIFICAITONS_PRICE_TRACK_TRACKABLE_ITEM_IS_TRACKED" desc="Table element description explaining that the current website contains an item that the user is already tracking">
+        You're already tracking this product.
       </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_NOTE_IPAD" desc="Text above the action buttons of the fullscreen post-restore sign-in promo. [iOS only]">
-        You were signed out as part of your iPad reset. Tap continue below to sign in.
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_OVERFLOW_MENU_TITLE" desc="Title for Price Tracking Notifications overflow menu destination title.">
+        Track Price
       </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_MESSAGE_IPHONE" desc="The message text of the alert post restore sign-in promo. [iOS only]">
-        You were signed out of your account, <ph name="USER_NAME">$1<ex>example@gmail.com</ex></ph>, as part of your iPhone reset. To sign back in, tap "Continue" below.
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACKING_TITLE" desc="Title for Price Tracking Notifications settings menu row.">
+        Tracking Price
       </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_MESSAGE_IPAD" desc="The message text of the alert post restore sign-in promo. [iOS only]">
-        You were signed out of your account, <ph name="USER_NAME">$1<ex>example@gmail.com</ex></ph>, as part of your iPad reset. To sign back in, tap "Continue" below.
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_CHIP" desc="Acessibility label to describe the UI which displays a product's price in the Price Tracking Item UI.">
+          Price
       </message>
-      <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_CANCEL_ACTION" desc="The cancel action text of the alert post restore sign-in promo. [iOS only]">
-        Ignore
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_DESCRIPTION" desc="A table header element that describes the effect of a user choosing to price-track an item.">
+        You'll get an alert if the price drops on any site.
       </message>
-      <message name="IDS_IOS_PROMOS_MANAGER_ALERT_PROMO_DEFAULT_PRIMARY_BUTTON_TEXT" desc="The default text for the primary button alert promo. [iOS only]">
-        OK
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_DESCRIPTION_EMPTY_STATE" desc="A table header element that describes the effect of a user choosing to price-track an item. This appears when the user does not have any tracked items.">
+        Track the price of a product across online stores. You’ll get alerts when the price drops.
       </message>
-      <message name="IDS_IOS_PROMOS_MANAGER_ALERT_PROMO_DEFAULT_CANCEL_BUTTON_TEXT" desc="The default text for the cancel button alert promo. [iOS only]">
-        Cancel
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_DESCRIPTION_FOR_TRACKED_ITEM" desc="A table header element that describes that this price-tracked item can be managed in bookmarks.">
+        You're already tracking this product. This page is saved in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Mobile Bookmarks<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_ERROR_ALERT_REATTEMPT" desc="The label for the alert's button that reattempts to execute the action that originally failed">
+          Try Again
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_ERROR_ALERT_TITLE" desc="The title for the UIAlert that informs the user that an error occurred during the price tracking subscription and unsubscription process">
+          Something Went Wrong
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_MENU_ITEM_STOP_TRACKING" desc="Title for action menu item that stops the price-tracking process for the given item.">
+        Untrack
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_MENU_ITEM_STOP_TRACKING_SNACKBAR" desc="Snackbar message that displays when the price-tracking process is stopped for the given item.">
+        Price tracking stopped
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_PERMISSION_REDIRECT_ALERT_CANCEL" desc="The label for the alert's cancel button">
+          Cancel
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_PERMISSION_REDIRECT_ALERT_REDIRECT" desc="The label for the alert's button that redirects the user to Chrome's application settings in iOS">
+          Go to Settings
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_SUBSCRIBE_ERROR_ALERT_DESCRIPTION" desc="The description that informs the user that an error occurred during the price tracking subscription process.">
+          Couldn't track the price.
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TITLE" desc="Title for Price Notifications table view.">
+        Track Price
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TOAST_IPH_TEXT" desc="Text for Price tracking toast IPH.">
+        Track price here
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACKABLE_EMPTY_LIST" desc="Table element description explaining that the current website does not contain any items that can have their prices tracked.">
+        Price tracking isn't available for this page.
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACKABLE_SECTION_HEADER" desc="Section header for a Price Notifications table view section that lists items available on the current page to have their prices tracked.">
+        Current Site
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACKED_SECTION_HEADER" desc="Section header for a Price Notifications table view section that lists items the user is currently price tracking.">
+        Tracking Prices
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACKING_EMPTY_LIST" desc="Table element description explaining that this section is the location where the user's price-tracked items will be displayed.">
+        The products you track will show up here.
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_TRACK_BUTTON" desc="The title for a button that adds the price-trackable item to the user's stored price tracking list.">
+        Track
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACK_UNSUBSCRIBE_ERROR_ALERT_DESCRIPTION" desc="The description that informs the user that an error occurred during the price tracking subscription cancellation process.">
+          Your change couldn't be saved.
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_SETTINGS_ALERT_MESSAGE" desc="Message for Price Notifications UI Alert Prompt displayed from the settings menu that redirects the user to the iOS push notifications permission page.">
+          To get notifications of price drop alerts, you'll need to turn on notifications in your iOS settings.
+      </message>
+      <message name="IDS_IOS_PRICE_NOTIFICATIONS_SETTINGS_ALERT_TITLE" desc="Title for Price Notifications UI Alert Prompt displayed from the settings menu that redirects the user to the iOS push notifications permission page.">
+          Turn on Price Alerts?
       </message>
       <message name="IDS_IOS_PRINT_PDF_ERROR_SUBTITLE" desc="Message of a popup window indicating that the printing operation did not succeed. [Length: 100em] [iOS only]">
         Make sure you have a network connection, and try again.
@@ -2843,15 +3466,75 @@
       <message name="IDS_IOS_PRINT_PDF_TRY_AGAIN" desc="Label of the button letting the user try to download a PDF again, after a failure. [iOS only]">
         Try again
       </message>
+      <message name="IDS_IOS_PRIVACY_GOOGLE_SERVICES_FOOTER" desc="Footer to invite the user to open the Google Services settings.">
+        For more settings that relate to privacy, security, and data collection, see <ph name="BEGIN_LINK">BEGIN_LINK</ph>Google Services<ph name="END_LINK">END_LINK</ph>.
+      </message>
+      <message name="IDS_IOS_PRIVACY_GUIDE_CANCEL_BUTTON" desc="Text for the 'Cancel' button on the Welcome step of the Privacy Guide.">
+        Cancel
+      </message>
+      <message name="IDS_IOS_PRIVACY_GUIDE_LETS_GO_BUTTON" desc="Text for the 'Let's go' button on the Welcome step of the Privacy Guide.">
+        Let's go
+      </message>
+      <message name="IDS_IOS_PRIVACY_GUIDE_TITLE" desc="Title for the Privacy Guide settings menu row.">
+        Privacy Guide
+      </message>
+      <message name="IDS_IOS_PRIVACY_GUIDE_WELCOME_SUBTITLE" desc="Subtitle for the Privacy Guide Welcome step.">
+        Take a guided tour of key privacy and security controls. For more options, go to individual settings.
+      </message>
+      <message name="IDS_IOS_PRIVACY_GUIDE_WELCOME_TITLE" desc="Title for the Privacy Guide Welcome step.">
+        A Guide Of Your Privacy Choices
+      </message>
       <message name="IDS_IOS_PRIVACY_POLICY" desc="The label to access the privacy policy, displayed in the application settings, with no product name. [Length: 30em] [iOS only]">
         Google Privacy Policy
       </message>
       <message name="IDS_IOS_PRIVACY_POLICY_URL" translateable="false">
         https://policies.google.com/privacy
       </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_FRIENDLIER_SUMMARY" desc="Friendlier summary for Privacy Safe Browsing enhanced protection mode.">
+        Real-time, proactive protection against dangerous sites, downloads, and extensions that’s based on your browsing data getting sent to Google
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_SUMMARY" desc="Summary for Privacy Safe Browsing enhanced protection mode.">
+        Faster, proactive protection against dangerous websites, downloads, and extensions. Warns you about password breaches. Requires browsing data to be sent to Google.
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_TITLE" desc="Title for Privacy Safe Browsing enhanced protection mode.">
+        Enhanced Protection
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_DETAIL_TITLE" desc="Detail title for Privacy Safe Browsing no protection mode.">
+        No Protection
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_FRIENDLIER_SUMMARY" desc="Friendlier summary for Privacy Safe Browsing no protection mode.">
+        Does not protect you against dangerous websites, downloads, and extensions. Your Safe Browsing settings in other Google products won't be affected.
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_SUMMARY" desc="Summary for Privacy Safe Browsing no protection mode.">
+        Does not protect you against dangerous websites, downloads, and extensions. You’ll still get Safe Browsing protection, where available, in other Google services, like Gmail and Search.
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_TITLE" desc="Title for Privacy Safe Browsing no protection mode.">
+        No Protection (not recommended)
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_FRIENDLIER_SUMMARY" desc="Friendlier summary for Privacy Safe Browsing standard protection mode.">
+        Protects against sites, downloads, and extensions that are known to be dangerous. If a page does something suspicious, URLs and bits of page content are sent to Google Safe Browsing.
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_SUMMARY" desc="Summary for Privacy Safe Browsing standard protection mode.">
+        Standard protection against websites, downloads, and extensions that are known to be dangerous.
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_TITLE" desc="Title for Privacy Safe Browsing standard protection mode.">
+        Standard Protection
+      </message>
+      <message name="IDS_IOS_PRIVACY_SAFE_BROWSING_TITLE" desc="Title for Privacy Safe Browsing table view.">
+        Safe Browsing
+      </message>
+      <message name="IDS_IOS_PRIVACY_SYNC_AND_GOOGLE_SERVICES_FOOTER" desc="Footer to invite the user to open the Sync Settings and Google Services settings.">
+        For more settings that relate to privacy, security, and data collection, see both <ph name="BEGIN_LINK">BEGIN_LINK</ph>Sync<ph name="END_LINK">END_LINK</ph> and <ph name="BEGIN_LINK">BEGIN_LINK</ph>Google Services<ph name="END_LINK">END_LINK</ph>.
+      </message>
       <message name="IDS_IOS_PROGRESS_BAR_ACCESSIBILITY" desc="Text read by voice over to inform the user about the progress of the page load. [Read by Text To Speech].">
         Page load progress bar, <ph name="EMAIL">$1<ex>20%</ex></ph> loaded.
       </message>
+      <message name="IDS_IOS_PROMOS_MANAGER_ALERT_PROMO_DEFAULT_CANCEL_BUTTON_TEXT" desc="The default text for the cancel button alert promo. [iOS only]">
+        Cancel
+      </message>
+      <message name="IDS_IOS_PROMOS_MANAGER_ALERT_PROMO_DEFAULT_PRIMARY_BUTTON_TEXT" desc="The default text for the primary button alert promo. [iOS only]">
+        OK
+      </message>
       <message name="IDS_IOS_PULL_TO_REFRESH_IPH" desc="The text for the full screen in-product help for pull-to-refresh on the current tab.">
         You can pull down to refresh.
       </message>
@@ -2885,66 +3568,9 @@
       <message name="IDS_IOS_QR_SCANNER_MULTIPLE_FOREGROUND_APPS_ALERT_TITLE" desc="Title of a modal dialog shown when the user tries to open the QR scanner in a Split View mode. [Length: 40em] [iOS only]" meaning="Title of a Split View error dialog in QR Scanner.">
         Split View
       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_BULLET_ONE" desc="First bullet point under the Safe Browsing enhanced protection mode">
-         Predicts and warns you about dangerous events before they happen.
-       </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_BULLET_FOUR" desc="Fourth bullet point under the Safe Browsing enhanced protection mode">
-        Warns you if passwords are exposed in a data breach.
-      </message>
-      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_BULLET_FIVE" desc="Fifth bullet point under the Safe Browsing enhanced protection mode">
-        Sends URLs to Safe Browsing to check them. Also sends a small sample of pages, downloads, extension activity, and system information to help discover new threats. Temporarily links this data to your Google Account when you’re signed in, to protect you across Google apps.
-      </message>
-      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_BULLET_ONE" desc="First bullet point under the Safe Browsing standard protection mode.">
-        Detects and warns you about dangerous events when they happen.
-      </message>
-      <message name="IDS_IOS_SCANNER_TORCH_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label for the button to turn torch on and off in the Scanner. The current state of the button is communicated using the accessibility value. [Length: unlimited] [iOS only]"  meaning="The button to turn on and off the torch. [20em] [Read by Text-to-Speech]">
-        Torch
-      </message>
-      <message name="IDS_IOS_SCANNER_TORCH_OFF_ACCESSIBILITY_VALUE" desc="Accessibility value of the button to turn torch on in the Scanner. The button communicates that the torch is current off. [Length: unlimited] [iOS only]" meaning="The user will put off the torch [20em] [Read by Text-to-Speech]">
-        Off
-      </message>
-      <message name="IDS_IOS_SCANNER_TORCH_ON_ACCESSIBILITY_VALUE" desc="Accessibility value of the button to turn torch off in the Scanner. The button communicates that the torch is currently on. [Length: unlimited] [iOS only]" meaning="The user will put on the torch [20em] [Read by Text-to-Speech]">
-        On
-      </message>
-      <message name="IDS_IOS_TRACK_PRICES_ON_TABS" desc="This text shows in the price tracking settings dialog. It tells users the switch on the side can be used to turn on/off the 'Track prices on tabs' feature.">
-        Track Prices on Tabs
-      </message>
-      <message name="IDS_IOS_TRACK_PRICES_ON_TABS_DESCRIPTION" desc="This text shows below 'Track prices on tabs'. It describes what will happen when turning on this feature.">
-        See price drops on your tabs.
-      </message>
       <message name="IDS_IOS_QR_SCANNER_VIEWPORT_CAPTION" desc="Message displayed below the QR scanner viewport instructing the user to position the scanned QR or bar code inside the viewport. [Length: unlimited] [iOS only]">
         Position QR code or barcode in this frame
       </message>
-      <message name="IDS_IOS_READING_LIST_SNACKBAR_MESSAGE" desc="Message briefly displayed at the bottom of the screen to the user to inform that the selected page has been added to the reading list. [Length: 35em]" meaning="The selected page has been added to your reading list. [Length: 35em]">
-        Added to Reading List
-      </message>
-      <message name="IDS_IOS_READING_LIST_SNACKBAR_MESSAGE_FOR_ACCOUNT" desc="This confirmation message is intended to help users understand that a page has been saved to the Reading List that is saved in their Google Account. The confirmation message appears at the bottom of the page after users choose to save a page. The tone should be informative." meaning="The selected page has been added to your account's reading list.">
-        {count, plural,
-        =1 {Page added to your reading list in your account, {email}}
-        other {Pages added to your reading list in your account, {email}}}
-      </message>
-      <message name="IDS_IOS_READING_LIST_SNACKBAR_MESSAGE_FOR_ACCOUNT_WITH_COUNT" desc="This confirmation message is intended to help users understand that pages have been saved to the Reading List that is saved in their Google Account. The confirmation message appears at the bottom of the page after users choose to bulk save pages. The tone should be informative." meaning="The inputted pages have been added to your account's reading list.">
-        {count, plural,
-        =1 {Page added to your reading list in your account, {email}}
-        other {{count} Pages added to your reading list in your account, {email}}}
-      </message>
-      <message name="IDS_IOS_READING_LIST_SNACKBAR_MESSAGE_NO_ACCOUNT_WITH_COUNT" desc="This confirmation message is intended to help users understand that multiple pages have been saved to their Reading List. The confirmation message appears at the bottom of the page after users bulk add reading list items, telling them how many they've added. The tone should be informative.">
-          {count, plural,
-          =1 {Page added to your reading list}
-          other {{count} Pages added to your reading list}}
-      </message>
-      <message name="IDS_IOS_READING_LIST_SNACKBAR_UNDO_ACTION" desc="This string is found on a button that removes a page from the Reading List when the user taps it. The button is on a confirmation message that users see when they save a page to the Reading List. This text is a verb and is short for the longer phrase 'undo the addition of this page to my Reading List.' The tone should be informative. Use Apple-style title case. [CHAR_LIMIT=15]" meaning="Undo the action of adding new item to the reading list by removing the newly added item. Use Apple-style title case. [CHAR_LIMIT=15]">
-        Undo
-      </message>
-      <message name="IDS_IOS_READING_LIST_SNACKBAR_VIEW_ACTION" desc="This string is found on a button that brings to user to view the Reading List when the user taps it. The button is on a confirmation message that users see when they bulk save pages to the Reading List. This text is a verb and is short for the longer phrase 'view my Reading List.' The tone should be informative. Use Apple-style title case. [CHAR_LIMIT=15]">
-        View
-      </message>
-      <message name="IDS_IOS_READING_LIST_ENTRY_ACCESSIBILITY_LABEL" desc="Accessibility label for a reading list entry. Summarizes fields in the reading list entry (title, status and url). Read by Text To Speech. Similar to IDS_IOS_READING_LIST_ENTRY_WITH_UPLOAD_STATE_ACCESSIBILITY_LABEL">
-        <ph name="TITLE"><ex>Chromium - The Chromium Projects</ex>$1</ph>, <ph name="STATE"><ex>Available offline</ex>$2</ph>, <ph name="URL"><ex>http://www.chromium.org/Home</ex>$3</ph>
-      </message>
-      <message name="IDS_IOS_READING_LIST_ENTRY_WITH_UPLOAD_STATE_ACCESSIBILITY_LABEL" desc="Accessibility label for a reading list entry. Summarizes fields in the reading list entry (title, status, upload state and url). Read by Text To Speech. Similar to IDS_IOS_READING_LIST_ENTRY_ACCESSIBILITY_LABEL">
-        <ph name="TITLE"><ex>Chromium - The Chromium Projects</ex>$1</ph>, <ph name="STATE"><ex>Available offline</ex>$2</ph>, Only on this device, <ph name="URL"><ex>http://www.chromium.org/Home</ex>$3</ph>
-      </message>
       <message name="IDS_IOS_READING_LIST_ACCESSIBILITY_STATE_DOWNLOADED" desc="Accessibility label for the offline status of the reading list entry. Read by Text To Speech.">
         Available offline
       </message>
@@ -2954,84 +3580,6 @@
       <message name="IDS_IOS_READING_LIST_CANCEL_BUTTON" desc="Label of the button to stop editing the reading list entries (delete, mark as read/unread) [Length: 25em]" meaning="Stop editing. [Length: 25em]">
         Cancel
       </message>
-      <message name="IDS_IOS_SCANNER_ALERT_CANCEL" desc="Title for a button to cancel a Scanner error dialog. The dialog will be dismissed and no action will be taken. [Length: 20em] [iOS only]" meaning="A button to cancel a Scanner error dialog.">
-        Cancel
-      </message>
-      <message name="IDS_IOS_SCANNER_CAMERA_IN_USE_ALERT_TITLE" desc="Title of a modal dialog shown when the user tries to open the scanner but the camera is in use by another application. [Length: 40em] [iOS only]">
-        Camera is in use
-      </message>
-      <message name="IDS_IOS_SCANNER_CAMERA_PERMISSIONS_HELP_DETAIL_GO_TO_SETTINGS" desc="Body of modal dialog shown when the user tries to open the scanner but the application lacks permission to use the camera. This body tells the users they'll be redirected to the Settings app. [Length: 140em] [iOS only]">
-        To scan a QR code or credit card, enable the camera from settings.
-      </message>
-      <message name="IDS_IOS_SCANNER_CAMERA_PERMISSIONS_HELP_GO_TO_SETTINGS" desc="Title for a button to go to System settings app. [Length: 20em] [iOS only]">
-        Settings
-      </message>
-      <message name="IDS_IOS_SCANNER_CAMERA_UNAVAILABLE_ALERT_TITLE" desc="Title of a modal dialog shown when the user tries to open the scanner but the camera is unavailable. [Length: 40em] [iOS only]">
-        Camera is unavailable
-      </message>
-      <message name="IDS_IOS_SCANNER_SCANNED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the user scans a QR code, bar code, or Credit Card. [Length: unlimited] [iOS only]">
-        Scanned
-      </message>
-      <message name="IDS_IOS_SCANNER_MULTIPLE_FOREGROUND_APPS_ALERT_TITLE" desc="Title of a modal dialog shown when the user tries to open the scanner in a Split View mode. [Length: 40em] [iOS only]" meaning="Title of a Split View error dialog in Scanner.">
-        Split View
-      </message>
-      <message name="IDS_IOS_SEARCH_WITH_TITLE_SEARCH" desc="Edit menu button title to open a tab with a Search query of the current selection [Length: 25em]." meaning="Edit menu Search button [Length: 25em]">
-        Search
-      </message>
-      <message name="IDS_IOS_SEARCH_WITH_TITLE_SEARCH_WITH" desc="Edit menu button title to open a tab with a Search query of the current selection. Will contain the search provider. [Length: 25em]." meaning="Edit menu Search button [Length: 25em]">
-        Search with <ph name="SEARCH_PROVIDER">$1<ex>Google</ex></ph>
-      </message>
-      <message name="IDS_IOS_SEARCH_WITH_TITLE_WEB_SEARCH" desc="Edit menu button title to open a tab with a Search query of the current selection. Should be similar to the Android equivalent. [Length: 25em]." meaning="Edit menu Search button [Length: 25em]">
-        Web Search
-      </message>
-      <message name="IDS_IOS_SNACKBAR_ACTION_GO_TO_FEED" desc="The iOS snackbar action when successfuly following a web content. [iOS only]">
-        GO TO FEED
-      </message>
-      <message name="IDS_IOS_SNACKBAR_ACTION_TRY_AGAIN" desc="The iOS snackbar message when failed to follow/unfollow a web content. [iOS only]">
-        TRY AGAIN
-      </message>
-      <message name="IDS_IOS_SNACKBAR_ACTION_UNDO" desc="The iOS snackbar action when succeed to unfollow a web content. [iOS only]">
-        UNDO
-      </message>
-      <message name="IDS_IOS_SNACKBAR_MESSAGE_FOLLOW_FAILED" desc="The iOS snackbar message when failed to follow a web content. [iOS only]">
-        Can't follow. Something went wrong.
-      </message>
-      <message name="IDS_IOS_SNACKBAR_MESSAGE_FOLLOW_SUCCEED" desc="The iOS snackbar message when ssucceed to follow a web content. [iOS only]">
-        Following <ph name="CHANNEL_NAME">$1<ex>CNN</ex></ph>
-      </message>
-      <message name="IDS_IOS_SNACKBAR_MESSAGE_OFFLINE" desc="The iOS snackbar message when failed to follow/unfollow a web content because of offline. [iOS only]">
-        You're offline. Check your internet connection and try again.
-      </message>
-      <message name="IDS_IOS_SNACKBAR_MESSAGE_UNFOLLOW_FAILED" desc="The iOS snackbar message when failed to unfollow a web content. [iOS only]">
-        Can't unfollow. Something went wrong.
-      </message>
-      <message name="IDS_IOS_SNACKBAR_MESSAGE_UNFOLLOW_SUCCEED" desc="The iOS snackbar message when succeed to unfollow a web content. [iOS only]">
-        Unfollowed <ph name="CHANNEL_NAME">$1<ex>CNN</ex></ph>
-      </message>
-      <message name="IDS_IOS_SNACKBAR_MESSAGE_INCOGNITO_DISABLED_BY_PARENT" desc="The material toast message when incogonito mode is disabled by parent [iOS only].">
-        Incognito Mode is Unavailable
-      </message>
-      <message name="IDS_IOS_SNACKBAR_MESSAGE_INCOGNITO_DISABLED" desc="The material toast message when incogonito mode is disabled by policy [iOS only].">
-        Your organization turned off Incognito mode
-      </message>
-      <message name="IDS_IOS_SNACKBAR_MESSAGE_INCOGNITO_FORCED" desc="The material toast message when incogonito mode is forced by policy [iOS only].">
-        Your organization requires Incognito mode
-      </message>
-      <message name="IDS_IOS_TOOLS_MENU_CELL_NEW_FEATURE_BADGE" desc="Title and accessibility label of the badge displayed on a tools menu item when it represents a new feature [Length: 20em]" meaning="A badge with this title is displayed informing the user that this feature that is new to them.">
-        New
-      </message>
-      <message name="IDS_IOS_NEW_LABEL_FEATURE_BADGE" desc="Character representing the word new displayed inside the badge to represent a new features [CHAR_LIMIT=1][iOS only]" meaning="A badge with a character representing the word new is displayed to inform users that a feature a new. [CHAR_LIMIT=1][iOS only]">
-        N
-      </message>
-      <message name="IDS_IOS_NEW_FEATURE_ACCESSIBILITY_LABEL" desc="Accessibility label for a badge with the letter N that indicates a new feature [iOS only]">
-        New feature
-      </message>
-      <message name="IDS_IOS_TOOLS_MENU_DOWNLOADS" desc="The iOS menu item for opening the downloads folder [iOS only]" meaning="[Length: unlimited]">
-        Downloads
-      </message>
-      <message name="IDS_IOS_TOOLS_MENU_NEW_WINDOW" desc="The iOS menu item for opening a new window [iOS only]" meaning="[Length: unlimited]">
-        New Window
-      </message>
       <message name="IDS_IOS_READING_LIST_CONTENT_CONTEXT_OFFLINE" desc="Title of the button to display the Offline version instead of the Online one. [Length: 50em]">
         View Offline Version in New Tab
       </message>
@@ -3047,6 +3595,12 @@
       <message name="IDS_IOS_READING_LIST_EDIT_BUTTON" desc="Label of the button to edit the reading list entries (delete, mark as read/unread) [Length: 20em]" meaning="Start editing the reading list entries. [Length: 20em]">
         Edit
       </message>
+      <message name="IDS_IOS_READING_LIST_ENTRY_ACCESSIBILITY_LABEL" desc="Accessibility label for a reading list entry. Summarizes fields in the reading list entry (title, status and url). Read by Text To Speech. Similar to IDS_IOS_READING_LIST_ENTRY_WITH_UPLOAD_STATE_ACCESSIBILITY_LABEL">
+        <ph name="TITLE"><ex>Chromium - The Chromium Projects</ex>$1</ph>, <ph name="STATE"><ex>Available offline</ex>$2</ph>, <ph name="URL"><ex>http://www.chromium.org/Home</ex>$3</ph>
+      </message>
+      <message name="IDS_IOS_READING_LIST_ENTRY_WITH_UPLOAD_STATE_ACCESSIBILITY_LABEL" desc="Accessibility label for a reading list entry. Summarizes fields in the reading list entry (title, status, upload state and url). Read by Text To Speech. Similar to IDS_IOS_READING_LIST_ENTRY_ACCESSIBILITY_LABEL">
+        <ph name="TITLE"><ex>Chromium - The Chromium Projects</ex>$1</ph>, <ph name="STATE"><ex>Available offline</ex>$2</ph>, Only on this device, <ph name="URL"><ex>http://www.chromium.org/Home</ex>$3</ph>
+      </message>
       <message name="IDS_IOS_READING_LIST_JUST_NOW" desc="String indicating that an event (adding item, distillation) happened less than one minute ago. [Length: 25em]">
         Just now
       </message>
@@ -3086,6 +3640,30 @@
       <message name="IDS_IOS_READING_LIST_READ_HEADER" desc="Heading. Appears above a list of articles the user has already read, in their Reading List. Appears on the same page as an 'Unread' heading, which contains articles the user hasn't read yet. In English, 'Read' can be both verb and adjective so we needed to be more explicit. Does not need to be translated literally. [Length: 40em]" meaning="The entries below this header are read. [Length: 40em]">
         Pages You've Read
       </message>
+      <message name="IDS_IOS_READING_LIST_SNACKBAR_MESSAGE" desc="Message briefly displayed at the bottom of the screen to the user to inform that the selected page has been added to the reading list. [Length: 35em]" meaning="The selected page has been added to your reading list. [Length: 35em]">
+        Added to Reading List
+      </message>
+      <message name="IDS_IOS_READING_LIST_SNACKBAR_MESSAGE_FOR_ACCOUNT" desc="This confirmation message is intended to help users understand that a page has been saved to the Reading List that is saved in their Google Account. The confirmation message appears at the bottom of the page after users choose to save a page. The tone should be informative." meaning="The selected page has been added to your account's reading list.">
+        {count, plural,
+        =1 {Page added to your reading list in your account, {email}}
+        other {Pages added to your reading list in your account, {email}}}
+      </message>
+      <message name="IDS_IOS_READING_LIST_SNACKBAR_MESSAGE_FOR_ACCOUNT_WITH_COUNT" desc="This confirmation message is intended to help users understand that pages have been saved to the Reading List that is saved in their Google Account. The confirmation message appears at the bottom of the page after users choose to bulk save pages. The tone should be informative." meaning="The inputted pages have been added to your account's reading list.">
+        {count, plural,
+        =1 {Page added to your reading list in your account, {email}}
+        other {{count} Pages added to your reading list in your account, {email}}}
+      </message>
+      <message name="IDS_IOS_READING_LIST_SNACKBAR_MESSAGE_NO_ACCOUNT_WITH_COUNT" desc="This confirmation message is intended to help users understand that multiple pages have been saved to their Reading List. The confirmation message appears at the bottom of the page after users bulk add reading list items, telling them how many they've added. The tone should be informative.">
+          {count, plural,
+          =1 {Page added to your reading list}
+          other {{count} Pages added to your reading list}}
+      </message>
+      <message name="IDS_IOS_READING_LIST_SNACKBAR_UNDO_ACTION" desc="This string is found on a button that removes a page from the Reading List when the user taps it. The button is on a confirmation message that users see when they save a page to the Reading List. This text is a verb and is short for the longer phrase 'undo the addition of this page to my Reading List.' The tone should be informative. Use Apple-style title case. [CHAR_LIMIT=15]" meaning="Undo the action of adding new item to the reading list by removing the newly added item. Use Apple-style title case. [CHAR_LIMIT=15]">
+        Undo
+      </message>
+      <message name="IDS_IOS_READING_LIST_SNACKBAR_VIEW_ACTION" desc="This string is found on a button that brings to user to view the Reading List when the user taps it. The button is on a confirmation message that users see when they bulk save pages to the Reading List. This text is a verb and is short for the longer phrase 'view my Reading List.' The tone should be informative. Use Apple-style title case. [CHAR_LIMIT=15]">
+        View
+      </message>
       <message name="IDS_IOS_READING_LIST_UNREAD_HEADER" desc="Header for the list containing the unread reading list entries" meaning="The entries below this header are unread. [Length: 15em]">
         Unread
       </message>
@@ -3107,12 +3685,12 @@
       <message name="IDS_IOS_RECENT_TABS_OTHER_DEVICES_EMPTY_TITLE" desc="Title shown in the Other Devices section of the Recent Tabs screen when there are no recent tabs from other devices. Either because the user is signed out, Tabs synchronization is off or because there are no other devices signed in with Tabs synchronization turned on.">
           You'll find your tabs from other devices here
       </message>
-      <message name="IDS_IOS_RECENT_TABS_OTHER_DEVICES_TURN_ON_SYNC" desc="Button label to turn Sync on for user. [Length: 30em]" meaning="Label using the Title Casing as recommended for buttons.">
-          Turn On Sync
-      </message>
       <message name="IDS_IOS_RECENT_TABS_OTHER_DEVICES_LABEL" desc="Label for the sign-in promo in the Recent tabs page.">
           To see tabs from your other devices, sync your tabs and history.
       </message>
+      <message name="IDS_IOS_RECENT_TABS_OTHER_DEVICES_TURN_ON_SYNC" desc="Button label to turn Sync on for user. [Length: 30em]" meaning="Label using the Title Casing as recommended for buttons.">
+          Turn On Sync
+      </message>
       <message name="IDS_IOS_RECENT_TABS_OTHER_DEVICES_TURN_ON_TABS" desc="Button for the sign-in promo in the Recent tabs page.">
           Turn On
       </message>
@@ -3122,9 +3700,182 @@
       <message name="IDS_IOS_RECENT_TABS_RECENTLY_CLOSED_EMPTY" desc="The content of the Recently Closed section in the Recent Tabs panel when there are no recently closed tabs.">
         You can come back here to reopen tabs that you've recently closed
       </message>
+      <message name="IDS_IOS_RECENT_TABS_SYNC_IN_PROGRESS" desc="Section header subtitle label while loading tabs in other devices. [Length: 30em] [iOS only]">
+        Syncing...
+      </message>
+      <message name="IDS_IOS_REMOVE_ACCOUNT_ALERT_TITLE" desc="Title of the alert view when the remove account button is clicked.">
+      Remove account <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>?
+      </message>
+      <message name="IDS_IOS_REMOVE_ACCOUNT_LABEL" desc="Button label for removing an account.">
+      Remove
+      </message>
+      <message name="IDS_IOS_REMOVE_ACTION_TITLE" desc="Title of the action used to remove a selected item. [iOS only]">
+        Remove
+      </message>
+      <message name="IDS_IOS_REMOVE_GOOGLE_ACCOUNT_TITLE" desc="Title for the button that removes a Google account from the device">
+        Remove from This Device
+      </message>
       <message name="IDS_IOS_RESET_ZOOM" desc="Label for a button to reset the text zoom level to the default state." meaning="Reset text zoom level to the default state">
         Reset
       </message>
+      <message name="IDS_IOS_RESTORE_WARNING" desc="Button or dialog title which is shown on Password Details Screen to allow the user to restore a dismissed compromised password warning. [iOS only]" meaning="Title-cased">
+        Restore Warning
+      </message>
+      <message name="IDS_IOS_RETURN_TO_RECENT_TAB_TIME_DAYS" desc="Type in days for time since the recent tab was opened, shortened to d.">
+          <ph name="TIME">$1</ph> d ago
+          </message>
+      <message name="IDS_IOS_RETURN_TO_RECENT_TAB_TIME_HOURS" desc="Type in hours for time since the recent tab was opened, shortened to h.">
+          <ph name="TIME">$1</ph> h ago
+          </message>
+      <message name="IDS_IOS_RETURN_TO_RECENT_TAB_TITLE" desc="Title of the Return to Recent Tab Content Suggestons Tile.">
+          Return to Recent Tab
+      </message>
+      <message name="IDS_IOS_REUSED_PASSWORD_ISSUES_DESCRIPTION" desc="Header displayed on the password manager screen displaying credentials that share passwords with other credentials in the password manager [iOS only]" meaning="This header explains the risks of reusing passwords for multiple sites and apps. It suggests the user changing reused passwords.">
+        Use a unique password for every site or app. If someone discovers a reused password, it can be used to access your other accounts. Click to open the website and change them now.
+      </message>
+      <message name="IDS_IOS_REUSED_PASSWORD_ISSUES_GROUP_HEADER" desc="Header shown on top of a group of credentials sharing the same password, inside the password manager screen diplaying shared passswords. User can only have 2 or more reused passwords, so this string will always be plural. [iOS only]">
+        <ph name="COUNT">$1<ex>2</ex></ph> accounts using same password
+      </message>
+      <message name="IDS_IOS_REUSED_PASSWORD_ISSUES_TITLE" desc="Title for the password manager screen displaying credentials that share passwords with other credentials in the password manager. User can only have 2 or more reused passwords, so this string will always be plural. [iOS only] [Length: 22em]">
+        <ph name="COUNT">$1<ex>2</ex></ph> Reused Passwords
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_COMPROMISED_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a compromised password issue. [iOS only]">
+        You have compromised passwords.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_MULTIPLE_PASSWORD_ISSUES" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple password issues of different type (e.g. compromised, reused, weak). [iOS only]">
+        You have several password issues.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_REUSED_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a reused password issue. [iOS only]">
+        You have reused passwords.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_SAFE_BROWSING" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Safe Browsing check finds an issue. [iOS only]">
+        Get protection from dangerous sites.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_WEAK_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a weak password issue. [iOS only]">
+        You have weak passwords.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_CONTEXT_MENU_DESCRIPTION" desc="Descripiton for the long-press context menu of the module that presents the Safety Check.">
+        Hide "Safety Check"
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_CONTEXT_MENU_TITLE" desc="Title for the long-press context menu of the module that presents the Safety Check.">
+          This card shows any privacy or security issues that Safety Check automatically detects for you.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_ALL_SAFE" desc="Tag label description displayed for the Safety Check module in the Magic Stack when there are no Safety Check issue found. [iOS only]">
+        Safety Check didn't find any security issues for you to fix.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_COMPROMISED_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a compromised password issue. [iOS only]">
+        You have 1 compromised password. Fix it now to stay safe.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_DEFAULT" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Safety Check has not been run yet. [iOS only]">
+        Stay safe from data breaches, unsafe websites and more.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_MULTIPLE_COMPROMISED_PASSWORDS" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple compromised passwords. [iOS only]">
+        You have <ph name="NUMBER_OF_PASSWORDS">$1<ex>2</ex></ph> compromised passwords that could put your security at risk.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_MULTIPLE_PASSWORD_ISSUES" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple password issues of different type (e.g. compromised, reused, weak). [iOS only]">
+        You have several password issues that could put your security at risk.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_MULTIPLE_REUSED_PASSWORDS" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple reused passwords. [iOS only]">
+        You have <ph name="NUMBER_OF_PASSWORDS">$1<ex>2</ex></ph> reused passwords that could put your security at risk.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_MULTIPLE_WEAK_PASSWORDS" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple weak passwords. [iOS only]">
+        You have <ph name="NUMBER_OF_PASSWORDS">$1<ex>2</ex></ph> weak passwords that could put your security at risk.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_REUSED_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a reused password issue. [iOS only]">
+        You have 1 reused password. Fix it now to stay safe.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_SAFE_BROWSING" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Safe Browsing check finds an issue. [iOS only]">
+        Get protection from dangerous sites, downloads, and extensions.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_WEAK_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a weak password issue. [iOS only]">
+        You have 1 weak password. Fix it now to stay safe.
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_LAST_COMPLETED_CHECK" desc="Subtitle for Safety Check (Magic Stack) module which shows the timestamp of the last check." meaning="Time when the Safety Check was last run.">
+        Last run <ph name="TIME">$1<ex>10 minutes ago</ex></ph>
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_PASSWORD_CHECKUP_ONGOING" desc="In sentence case: Subtitle for the password check item in Safety Check indicating that the checks are running. Sentence case. [CHAR_LIMIT=25] [iOS only]" meaning="In sentence case.">
+        Checking passwords…
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_RUNNING" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Safety Check is running. [iOS only]">
+        Safety Check is running…
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_TITLE" desc="Tag label title displayed for the Safety Check module in the Magic Stack. [iOS only]">
+        Safety Check
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_TITLE_ALL_SAFE" desc="Tag label title displayed for the Safety Check module in the Magic Stack when there are no Safety Check issue found. [iOS only]">
+        Your Browser Looks Good
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_TITLE_DEFAULT" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Safety Check has not been run yet. [iOS only]">
+        Run Safety Check
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_TITLE_PASSWORD" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Password check finds an issue. [iOS only]">
+        Change Your Passwords
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_TITLE_SAFE_BROWSING" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Safe Browsing check finds an issue. [iOS only]">
+        Add Browsing Protection
+      </message>
+      <message name="IDS_IOS_SAFETY_CHECK_TITLE_UPDATE_CHROME" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
+        Update Your Browser
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_ACCOUNT_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection account icon.">
+        When you're signed in, this data is linked to your Google Account to protect you across Google services, for example increasing protection in Gmail after a security incident.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_BULLET_FIVE" desc="Fifth bullet point under the Safe Browsing enhanced protection mode">
+        Sends URLs to Safe Browsing to check them. Also sends a small sample of pages, downloads, extension activity, and system information to help discover new threats. Temporarily links this data to your Google Account when you’re signed in, to protect you across Google apps.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_BULLET_FOUR" desc="Fourth bullet point under the Safe Browsing enhanced protection mode">
+        Warns you if passwords are exposed in a data breach.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_BULLET_ONE" desc="First bullet point under the Safe Browsing enhanced protection mode">
+         Predicts and warns you about dangerous events before they happen.
+       </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_DOWNLOAD_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection download icon.">
+        In-depth scans for suspicious downloads.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_GLOBE_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection globe icon.">
+        Improves security for you and everyone on the web.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_G_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection G icon.">
+        When you're signed in, protects you across Google services.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_KEY_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection key icon.">
+        Warns you if you use a password that has been compromised in a data breach.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_LINK_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection link icon.">
+        Sends the URLs you visit and a small sample of page content, downloads, extension activity, and system information to Google Safe Browsing to check if they're harmful.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_PERFORMANCE_ICON_DESCRIPTION" desc="Description for Safe Browsing enhanced protection performance icon.">
+        Doesn't noticeably slow down your browser or device.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_THINGS_TO_CONSIDER_HEADER" desc="Header for Safe Browsing enhanced protection mode Things To Consider section.">
+        Things To Consider
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_TITLE" desc="Title for Safe Browsing enhanced protection mode.">
+        Enhanced Protection
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_ENHANCED_PROTECTION_WHEN_ON_HEADER" desc="Header for Safe Browsing enhanced protection mode When On section.">
+        When On
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_NO_PROTECTION_CONFIRMATION_DIALOG_CONFIRM" desc="Message for Safe Browsing no protection confirmation button.">
+        Turn Off
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_NO_PROTECTION_CONFIRMATION_DIALOG_MESSAGE" desc="Message for Safe Browsing no protection confirmation dialog.">
+        Safe Browsing protects you against attackers who may trick you into doing something dangerous like installing malicious software or revealing personal information like passwords, phone numbers, or credit cards. If you turn it off, be careful when browsing unfamiliar or unreputable sites.        </message>
+      <message name="IDS_IOS_SAFE_BROWSING_NO_PROTECTION_CONFIRMATION_DIALOG_TITLE" desc="Title for Safe Browsing no protection confirmation dialog.">
+        Turn Off Safe Browsing?
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_BULLET_ONE" desc="First bullet point under the Safe Browsing standard protection mode.">
+        Detects and warns you about dangerous events when they happen.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_EXTENDED_REPORTING_SUMMARY" desc="Summary for Safe Browsing extended reporting.">
+        Sends URLs of some pages you visit, limited system information, and some page content to Google, to help discover new threats and protect everyone on the web.
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_EXTENDED_REPORTING_TITLE" desc="Title for Safe Browsing extended reporting.">
+        Help Improve Security on the Web for Everyone
+      </message>
+      <message name="IDS_IOS_SAFE_BROWSING_STANDARD_PROTECTION_LEAK_CHECK_TITLE" desc="Title for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
+        Warn You if Passwords Are Exposed in a Data Breach
+      </message>
       <message name="IDS_IOS_SAFE_MODE_AW_SNAP" desc="The title of the safe mode UI after multiple crashes.  This is intended to be a humorous exclamation of dismay. [Length: 30em]">
         Aw, Snap!
       </message>
@@ -3155,565 +3906,75 @@
       <message name="IDS_IOS_SAVE_PASSWORDS" desc="Title for the switch item in Settings that can be toggled to enable or disable saving passwords. [Length: 15em] [iOS only]">
         Save Passwords
       </message>
-      <message name="IDS_IOS_OFFER_TO_SAVE_PASSWORDS" desc="Title for the switch item in Settings that can be toggled allowing users to be prompted if they want to save their passwords when logging into webpages. [Length: 25em] [iOS only]">
-        Offer to Save Passwords
-      </message>
-      <message name="IDS_IOS_ACCOUNT_STORAGE_OPT_IN_LABEL" desc="Title for the switch item in Settings that controls whether signed-in users can save/autofill passwords to/from their account. [Length: 25em] [iOS only]">
-        Use and Save Passwords in Your Google Account
-      </message>
-      <message name="IDS_IOS_ACCOUNT_STORAGE_OPT_IN_SUBLABEL" desc="Title for the switch item in Settings that controls whether signed-in users can save/autofill passwords to/from their account. [Length: unlimited] [iOS only]">
-        When on, passwords are saved in <ph name="ACCOUNT">$1<ex>foo@gmail.com</ex></ph>. When off, passwords are saved only to this device.
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_ADD_PASSWORD_MANUALLY_TITLE" desc="Title of the view that allow user to enter the details for a new password credential to add it to the list the passwords. [iOS only]">
-        Add Password
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_ALERT_BUTTON" desc="Alert accept button in settings > password confirming the user wants to save all their local passwords to their account. [iOS Only]">
-        Save in Account
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_ALERT_CANCEL" desc="Alert cancel button in settings > password cancelling when user is offered to move passwords to account. [iOS Only]">
-        Cancel
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_ALERT_DESCRIPTION" desc="Alert description in settings > password confirming to the user that they can save all their local passwords to their account. [iOS Only]">
-        {COUNT, plural,
-        =1 {You can save your password for {DOMAIN_ONE} in your Google Account, {EMAIL}}
-        =2 {You can save your passwords for {DOMAIN_ONE} and {DOMAIN_TWO} in your Google Account, {EMAIL}}
-        =3 {You can save your passwords for {DOMAIN_ONE}, {DOMAIN_TWO}, and {OTHER_DOMAINS_COUNT} other in your Google Account, {EMAIL}}
-        other {You can save your passwords for {DOMAIN_ONE}, {DOMAIN_TWO}, and {OTHER_DOMAINS_COUNT} others in your Google Account, {EMAIL}}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_ALERT_TITLE" desc="Alert title in settings > password, confirming all local passwords will be saved to the user's account. [iOS Only]">
-        {COUNT, plural,
-        =1 {Save {COUNT} Password in Your Google Account}
-        other {Save {COUNT} Passwords in Your Google Account}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SECTION_BUTTON" desc="Section button in settings > password allowing the user to save all their local passwords to their account. [iOS Only]">
-        {COUNT, plural,
-        =1 {Save Password in Account}
-        other {Save Passwords in Account}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SECTION_DESCRIPTION" desc="Section description in settings > password explaining to the user that they can save all their local passwords to their account to use them on other devices. [iOS Only]">
-        {COUNT, plural,
-        =1 {{COUNT} password is saved only to this device. To use it on your other devices, save it in your Google Account, {EMAIL}.}
-        other {{COUNT} passwords are saved only to this device. To use them on your other devices, save them in your Google Account, {EMAIL}.}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SECTION_TITLE" desc="Section title in settings > password, about saving all local passwords to the user's account. [iOS Only]">
-        Use Passwords on All Your Devices
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SNACKBAR_MESSAGE" desc="Snackbar message in settings > password, about local passwords having been saved into the user's account. [iOS Only]">
-        {COUNT, plural,
-        =1 {Password saved in your Google Account, {EMAIL}}
-        other {Passwords saved in your Google Account, {EMAIL}}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_BULK_UPLOAD_PASSWORDS_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to save local passwords to their account, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to save local passwords to their account. [Length: about two lines] [iOS only]">
-        To save passwords in your account, you must first set a passcode on your device.
-      </message>
-      <message name="IDS_IOS_LOCAL_PASSWORD_ACCESSIBILITY_LABEL" desc="Screenreader label when a password is saved only locally and not backed up to any account.">
-        Password saved only on this device
-      </message>
-      <message name="IDS_IOS_LOCAL_ADDRESS_ACCESSIBILITY_LABEL" desc="Screenreader label when an address is saved only locally">
-        Address saved only on this device
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_SAVE_BUTTON" desc="Save button text for adding a new credential manually via settings [Length: 10em]">
-        Save
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_WEBSITE_PLACEHOLDER_TEXT" desc="Placeholder text for the website field when adding a new credential manually via settings [Length: 10em]">
-        example.com
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_USERNAME_PLACEHOLDER_TEXT" desc="Placeholder text for the username field indicating that the field is optional when adding a new credential manually via settings [Length: 10em]">
-        optional
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_PASSWORD_PLACEHOLDER_TEXT" desc="Placeholder text for the password field when adding a new credential manually via settings [Length: 10em]">
-        password
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_VIEW_PASSWORD_BUTTON" desc="View Password button text for viewing an existing credential. [Length: 10em]">
-        View Password
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION" desc="Section title in settings > password, about on-device Encryption. [iOS Only]">
-        On-Device Encryption
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_OPT_IN" desc="Section title in settings > password, explaining to the user what they can opt-in. [iOS Only]">
-        For added safety, encrypt passwords on your device before they’re saved to Google Password Manager.
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_SET_UP" desc="Section title in settings > password, allowing user to opt-in. [iOS Only]">
-        Set Up…
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_LEARN_MORE" desc="Section title in settings > password. [iOS Only]">
-        Your passwords are encrypted on your device before they’re saved to Google Password Manager.
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS_ON_DEVICE_ENCRYPTION_OPTED_IN_LEARN_MORE" desc="Section title in settings > password, allow to learn more about on-device encryption. [iOS Only]">
-        Learn More
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_CANCELLED_TITLE" desc="Title text on the sharing status view when the sharing was cancelled. [iOS only]">
-        Password Was Not Shared
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PICKER_BACK_BUTTON" desc="Button text for the navigation back action in the family picker view in the password sharing flow. [iOS only]">
-        Back
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PICKER_SUBTITLE" desc="Header text in the view that allows to choose recipients for password sharing from a list of family members explaining what happens when the user shares their password with them. [iOS Only]">
-        When you share a copy of your username and password, your family member can fill them using Google Password Manager.
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR_TITLE" desc="Title text on the alert view explaining an error in the password sharing flow. [iOS only]">
-        Something Went Wrong
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_LABEL" desc="Text describing what is happening at the beginning of the password sharing flow. [iOS only]">
-        Checking your family members…
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FIRST_RUN_TITLE" desc="Title text describing the password sharing feature displayed in the first run experience view. [iOS only]">
-        Share a Copy of Your Password
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FIRST_RUN_SUBTITLE" desc="Subtitle text describing the password sharing feature displayed in the first run experience view. [iOS only]">
-        You can securely share a copy of your password with someone in your family group. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_PASSWORD_PICKER_NEXT_BUTTON" desc="Button text for the confirm action in the password picker view in the password sharing flow. [iOS only]">
-        Next
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_STATUS_PROGRESS_TITLE" desc="Title text on the sharing status view when it is in progress. [iOS only]">
-        Sharing Password
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE" desc="Footnote text on the sharing status view when it succeeds describing how to revoke access to the shared password. [iOS only]">
-        To stop others from using your password, <ph name="BEGIN_LINK">BEGIN_LINK</ph>change it on <ph name="WEBSITE">$1<ex>amazon.com</ex></ph><ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE_ANDROID_APP" desc="Footnote text on the sharing status view when it succeeds describing how to revoke access to the shared password when it was shared for an Android app. [iOS only]">
-        To stop others from using your password, open the <ph name="APP">$1<ex>Netflix</ex></ph> app to change your password
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE" desc="Subtitle text on the sharing status view when it succeeds describing that the recipient can now use the shared password. [iOS only]">
-        <ph name="BEGIN_BOLD">BEGIN_BOLD</ph><ph name="USERNAME">$1<ex>johndoe</ex></ph><ph name="END_BOLD">END_BOLD</ph> can now use your username and password when they use Google Password Manager to sign in to <ph name="BEGIN_BOLD">BEGIN_BOLD</ph><ph name="WEBSITE">$2<ex>amazon.com</ex></ph><ph name="END_BOLD">END_BOLD</ph>. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE_MULTIPLE_RECIPIENTS" desc="Subtitle text on the sharing status view when it succeeds describing that the recipient can now use the shared password. [iOS only]">
-        Your family members can now use your username and password when they use Google Password Manager to sign in to <ph name="BEGIN_BOLD">BEGIN_BOLD</ph><ph name="WEBSITE">$1<ex>amazon.com</ex></ph><ph name="END_BOLD">END_BOLD</ph>. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_TITLE" desc="Title text on the sharing status view when it succeeded. [iOS only]">
-        Password Shared
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_TITLE" desc="Title of the password sharing bottom sheet view. [iOS only]">
-        Share Password
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_SHARE_BUTTON" desc="Button text for the confirm action in the password sharing flow. [iOS only]">
-        Share
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_BUTTON" desc="Button text for the confirm action in the password sharing family promo view. [iOS only]">
-        Got It
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_INVITE_MEMBERS_SUBTITLE" desc="Subtitle text displayed in the family promo view of the password sharing flow describing that the user needs other family members in order to use the feature. [iOS only]">
-        For now, you can only share passwords with family members. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Invite family members<ph name="END_LINK">END_LINK</ph> to join your group and get more from your products and subscriptions across Google.
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_INVITE_MEMBERS_TITLE" desc="Title text of the family promo view in the password sharing flow in the case where user has a family group with no other members. [iOS only]">
-        Invite Family Members
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_SUBTITLE" desc="Subtitle text displayed in the family promo view of the password sharing flow describing what are the prerequisites to use the feature. [iOS only]">
-        For now, you can only share passwords with family members. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Create a family group<ph name="END_LINK">END_LINK</ph> with up to 6 members and get more from your products and subscriptions across Google.
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PROMO_TITLE" desc="Title text of the family promo view in the password sharing flow.">
-        Join a Family Group
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_NOTIFICATION_TITLE" desc="Title text in the password sign-in bottom sheet informing the user that they have received some new passwords via the password sharing feature. [iOS only]">
-        {count, plural,
-        =1 {New Password For This Site}
-        other {New Passwords For This Site}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_NOTIFICATION_SINGLE_PASSWORD_SUBTITLE" desc="Subtitle text in the password sign-in bottom sheet that informs the user about the full name of a family member that shared a password with them on this site. [iOS only]">
-        <ph name="FULL_NAME">$1<ex>John Doe</ex></ph> has shared a password with you for <ph name="WEBSITE">$2<ex>amazon.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_PASSWORD_SHARING_NOTIFICATION_MULTIPLE_PASSWORDS_SUBTITLE" desc="Subtitle text in the password sign-in bottom sheet that informs the user that they received multiple passwords via the password sharing feature. [iOS only]">
-        You have received passwords for <ph name="WEBSITE">$1<ex>amazon.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION" desc="Footer text shown when the user is trying to add a new credential manually via settings [iOS only]" meaning="Telling user to ensure provided password matches password on the website.">
-        Make sure you're saving your current password for this site.
-      </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION" desc="Footer text shown when the user is trying to add or edit a credential manually via settings and the note typed by user is too long. [iOS only]">
-        Notes can save up to <ph name="CHARACTER_LIMIT">$1<ex>1000</ex></ph> characters.
-      </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_MISSING_TLD_DESCRIPTION" desc="Footer text shown when the website field data misses the top-level domain when creating a new credential via settings [iOS only]" meaning="Suggesting user to add the top-level domain in the website text.">
-        Did you mean <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>?
-      </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_DUPLICATE_SECTION_ALERT_DESCRIPTION" desc="Text shown alerting the user that a similar credential exists with the same username/website combination when adding a new credential [iOS only]">
-        You already saved a password for "<ph name="USERNAME">$1<ex>johndoe</ex></ph>" at <ph name="WEBSITE">$2<ex>twitter.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_DUPLICATE_SECTION_ALERT_DESCRIPTION_WITHOUT_USERNAME" desc="Text shown alerting the user that a similar credential exists with the same website combination when adding a new credential [iOS only]">
-        You already saved a password for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_NON_SYNCING" desc="Disclaimer telling non-syncing users what will happen to their passwords">
-        Your password will be saved to your device.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_ALL_SET_TITLE" desc="Title for the Set Up List item that tells the user they have completed all tasks.">
-        You're All Set
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_AUTOFILL_SEE_MORE_DESCRIPTION" desc="Description for the Set Up List item in the See More modal that encourages the user to set up Chrome's autofill settings.">
-        Access your passwords and more across apps.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_AUTOFILL_SHORT_DESCRIPTION" desc="Shortened description for the Set Up List item that encourages the user to set up Chrome's autofill settings.">
-        Access your passwords across other apps.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_COLLAPSE" desc="Accessibility label for the button to expand the Set Up List.">
-        Collapse list
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_CONTENT_NOTIFICATION_DESCRIPTION" desc="Description for the Set Up List item that encourages the user to enable Chrome content notifications.">
-        Keep up with news, sports, and more based on your interests
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_CONTENT_NOTIFICATION_SHORT_DESCRIPTION" desc="Short description for the Set Up List item that encourages the user to enable Chrome content notifications.">
-        Keep up with news, sports, and more.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_CONTENT_NOTIFICATION_TITLE" desc="Title for the Set Up List item that encourages the user to enable Chrome content notifications.">
-        Get Content Notifications
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_EXPAND" desc="Accessibility label for the button to expand the Set Up List.">
-        Expand list
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_MENU" desc="Accessibility label for the Set Up List menu button.">
-        Options
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_SETTINGS_TURN_OFF" desc="Title for the item to turn off the Set Up List, in the Set Up List Settings action sheet.">
-        Turn off
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_SETTINGS_CANCEL" desc="Title for the item to cancel opening the Set Up List Settings action sheet.">
-        Cancel
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_DESCRIPTION" desc="Description for the Set Up List item that encourages the user to sign in and set up syncing.">
-        Sign in with your Google Account to sync your bookmarks, history, and more.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_MAGIC_STACK_DESCRIPTION" desc="Description for the Set Up List item in the Magic Stack that encourages the user to sign in and set up syncing.">
-        Sign in with your Google Account to sync your passwords and more.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION" desc="Shortened description for the Set Up List item that encourages the user to sign in and set up syncing.">
-        Sync your bookmarks, history, and more.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION_NO_SYNC" desc="Same as IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION but without mentioning sync.">
-        Get your bookmarks, passwords, and more.
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_TITLE" desc="Title for the Set Up List item that encourages the user to sign in and set up syncing.">
-        Sign in and Sync
-      </message>
-      <message name="IDS_IOS_SET_UP_LIST_TRY_BUTTON_TEXT" desc="Button text next to a Set Up List item suggesting to the user to try the action.">
-        Try
-      </message>
-      <message name="IDS_IOS_LEAK_CHECK_SWITCH" desc="Title for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
-        Warn You if Passwords Are Exposed in a Data Breach
-      </message>
-      <message name="IDS_IOS_PASSWORD_MANAGER" desc="Title for the view in Settings for managing saved passwords. [Length: 15em] [iOS only]">
-        Password Manager
-      </message>
-      <message name="IDS_IOS_PASSWORD_SETTINGS" desc="Title for the view in Settings for managing the settings related to saved passwords. [Length: 15em] [iOS only]">
-        Password Settings
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_BY_YOUR_ORGANIZATION" desc="Text displayed to inform the user that the browser is managed by Enterprise policies (without link). [iOS only]">
-        Managed by your organization
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_INFO" desc="Text displayed to inform the user that the browser is managed by one or more Enterprise policies. [iOS only]">
-        Managed by your organization. Some features may be unavailable. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_SIGNIN_LEARN_MORE" desc="Text displayed to inform the user that their Sign In/Sync is managed by their administrator. [iOS only]">
-          Your browser is managed. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn More<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_RESTRICTED_ACCOUNTS_TO_PATTERNS_MESSAGE" desc="Text displayed in the popover to inform the user that the browser is managed by Enterprise policies. (Restrict Accounts To Patterns) [iOS only]">
-          Your organization allows you to sign in only with certain accounts. Accounts that aren't allowed are hidden.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_SETTING_DESC_WITH_COMPANY_NAME" desc="Text displayed to inform the user that the browser is managed by Enterprise policies. MANAGER can be a domain or an email address. [iOS only]">
-        Managed by <ph name="MANAGER">$1<ex>Google</ex></ph>. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_SETTING_DESC_WITHOUT_COMPANY_NAME" desc="Text displayed to inform the user that the browser is managed by Enterprise policies without company name. [iOS only]">
-        Managed by your organization.
-<ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn More<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_SUPERVISED_USER_UNAVAILABLE_SETTING_MESSAGE" desc="Text displayed to inform that the setting is not available for supervised user.">
-        This setting is unavailable.
-      </message>
-      <message name="IDS_IOS_PARENT_MANAGED_SETTING" desc="Text displayed to inform the user that the browser is managed by their parent. [iOS only]">
-        Your account is managed by your parent.
-<ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn More<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_SETTING_MESSAGE" desc="Text displayed to inform the user that the setting is managed by an Enterprise policy. [iOS only]">
-        This setting is enforced by your administrator.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_SETTING_SYNC_EVERYTHING_MESSAGE" desc="Text displayed to inform the user that the setting 'sync everything' is managed by an Enterprise policy. [iOS only]">
-        Your organization doesn't allow for you to sync everything.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_SYNC" desc="Text displayed to inform the user that syncable types are limited (i.e. managed). [iOS only]">
-        Your organization limits what you can sync.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_MANAGED_SAVE_IN_ACCOUNT" desc="Text displayed to inform the user that types that can be stored on their account are limited (i.e. managed). [iOS only]">
-        Your organization limits what you can save in your Google Account.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT" desc="Text displayed in an alert when the user is signed out due to browser sign-in becoming disabled by policy. [iOS only]">
-        You're Signed Out
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_CONTINUE" desc="The text in the 'Continue' button, displayed in an alert when the user is signed out due to browser sign-in becoming disabled by policy.">
-        Continue
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_LEARN_MORE" desc="The text in the 'Learn More' button, displayed in an alert when the user is signed out due to browser sign-in becoming disabled by policy.">
-        Learn More
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_MESSAGE" desc="Message displayed in a prompt when the user is signed out due to browser sign-in becoming disabled by policy.">
-        Your organization turned off sign in. You can still see your bookmarks, history, passwords and other settings on this device. If you make changes, they won’t sync to your account.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SIGNED_OUT_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when the user is signed out due to browser sign-in becoming disabled by policy. Related with IDS_IOS_ENTERPRISE_SIGNED_OUT.">
-        Your organization turned off sign-in. New bookmarks, passwords, and more will be saved only to this device.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE" desc="Message displayed in a prompt when sync is disabled due to an enterprise policy. [iOS only]">
-        Your organization turned off sync. You can still see your bookmarks, history, passwords and other settings on this device. If you make changes, they won’t sync to your account.
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE" desc="Title displayed in a prompt when sync is disabled due to an enterprise policy. [iOS only]">
-        Sync has Been Turned Off
-      </message>
-      <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_UNO.">
-        Some Features No Longer Available
-      </message>
-      <message name="IDS_IOS_EXPORT_PASSWORDS" desc="Button that the user can press to export passwords. [Length: 22em] [iOS only]">
-        Export Passwords...
-      </message>
-      <message name="IDS_IOS_EXPORT_PASSWORDS_ALERT_MESSAGE" desc="The message of the alert displayed as a warning to the user who tapped on the button to export passwords. [iOS only]">
-        Your passwords will be visible to anyone who can see the exported file.
-      </message>
-      <message name="IDS_IOS_EXPORT_PASSWORDS_PREPARING_ALERT_TITLE" desc="The title of the alert displayed to indicate that the passwords are being prepared for export. [iOS only]">
-        Preparing Passwords...
-      </message>
-      <message name="IDS_IOS_EXPORT_PASSWORDS_FAILED_ALERT_TITLE" desc="Title of the alert informing the user that exporting passwords has failed. [iOS only]">
-        Can't Export Passwords
-      </message>
-      <message name="IDS_IOS_EXPORT_PASSWORDS_UNKNOWN_ERROR_ALERT_MESSAGE" desc="The message of the alert informing the user that an error has occured while exporting passwords. [iOS only]">
-        An error occured. Try again later.
-      </message>
-      <message name="IDS_IOS_EXPORT_PASSWORDS_OUT_OF_SPACE_ALERT_MESSAGE" desc="The message of an error alert displayed while trying to export passwords. If informs the user that their device storage is almost full and instructing them to free space. [iOS only]">
-        Your device is almost full. Free up space and try again.
-      </message>
-      <message name="IDS_IOS_EXPORT_PASSWORDS_CANCEL_BUTTON" desc="Label of a confirmation dialog button which allows the user to cancel passwords export. [Length: 22em] [iOS only]">
-        Cancel
-      </message>
-      <message name="IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT" desc="Footer text of an account address profile when it is viewed in settings. [iOS only]">
-          You can use saved addresses across Google products. This address is saved in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>.
-      </message>
-      <message name="IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR" desc="Error shown when the address is edited in settings and one of the required fields is empty. [iOS only]">
-          {count, plural,
-          =1 {A required field is empty. Fill it before saving.}
-          other {Some required fields are empty. Fill them before saving.}}
-      </message>
-      <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON" desc="Confirmation button title shown to the user when the address is deleted. [iOS only]">
-          {count, plural,
-          =1 {Delete Address}
-          other {Delete Addresses}}
-      </message>
-      <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when an account address is deleted. [iOS only]">
-          {count, plural,
-          =1 {This address will be deleted from your Google Account (<ph name="USER_EMAIL">{email}<ex>janedoe@google.com</ex></ph>) and from this device.}
-          other {These addresses will be deleted from your Google Account (<ph name="USER_EMAIL">{email}<ex>janedoe@google.com</ex></ph>) and from this device.}}
-      </message>
-      <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_SYNC_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when a sync address is deleted. [iOS only]">
-          {count, plural,
-          =1 {This address will be deleted from this and your other signed-in devices.}
-          other {These addresses will be deleted from this and your other signed-in devices.}}
-      </message>
-      <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when a local address is deleted. [iOS only]">
-          {count, plural,
-          =1 {This address will be deleted from this device.}
-          other {These addresses will be deleted from this device.}}
-      </message>
-      <message name="IDS_IOS_SETTINGS_AUTOFILL_MIGRATE_ADDRESS_TO_ACCOUNT_BUTTON_TITLE" desc="Button title asking the user to migrate the local address to account. [iOS only]">
-          Move Address to Account
-      </message>
-      <message name="IDS_IOS_SETTINGS_AUTOFILL_MIGRATE_ADDRESS_TO_ACCOUNT_BUTTON_DESCRIPTION" desc="Button description asking the user to migrate the local address to account. [iOS only]">
-          This address is only saved on this device. To use it on your other devices, move it to your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_SETTINGS_AUTOFILL_MIGRATE_ADDRESS_TO_ACCOUNT_CONFIRMATION_TEXT" desc="Text shown to the user after the migration of address from local to account was succesfull [iOS only]">
-                Address moved to your account <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>
-            </message>
-      <message name="IDS_IOS_SETTINGS_EXPORT_PASSWORDS_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to export the passwords, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to view or copy the password from a settings page. [Length: about two lines]">
-        To export passwords, you must first set a passcode on your device.
-      </message>
-      <message name="IDS_IOS_SETTINGS_FOLLOW_STEPS_BELOW_TEXT" desc="The prompt under the Default Browser Settings page's header text.">
-        Follow the steps below:
-      </message>
-      <message name="IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER" desc="Label of the row that opens the Default Browser Settings page">
-          Default Browser
-      </message>
-      <message name="IDS_IOS_SETTINGS_TAP_DEFAULT_BROWSER_APP_STEP" desc="Text of the row indicating the second step of setting the default browser.">
-        2. Tap Default Browser App
-      </message>
       <message name="IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT_HEADER" desc="Header text with link for the view in Settings for managing saved passwords. [Length: unlimited] [iOS only]">
         Create, save, and manage your passwords so you can easily sign in to sites and apps. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_PASSWORD_MANAGER_HEADER_NOT_SYNCING" desc="Header text for the view in Settings for managing saved passwords. This string only appears when the user is not syncing their passwords. [Length: unlimited] [iOS only]">
-        Passwords are saved to Google Password Manager on this device only.
-      </message>
-      <message name="IDS_IOS_ADD_PASSWORD" desc="Text on a button which allows the user to save a password for a website in their Password Manager.">
-        Add Password...
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP" desc="Title for the item in Settings for Password Checkup feature." meaning="Label tells the user about status of Password Checkup [CHAR_LIMIT=25] [iOS only]">
-        Password Checkup
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_SAFE_STATE_ACCESSIBILITY_LABEL" is_accessibility_with_no_ui="true" desc="Addition to the accessibility label for the Password Checkup cell in the Password Manager page when the Password Checkup resulted with no insecure passwords. Meaning that all saved passwords are safe. [iOS only]">
-        No issues found
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_ONGOING" desc="In Title Case: Title for the item in Settings for Password Checkup feature while the checks are running. [CHAR_LIMIT=25] [iOS only]" meaning="In Title Case.">
-        Checking Passwords…
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_PASSWORD_CHECKUP_ONGOING" desc="In sentence case: Subtitle for the password check item in Safety Check indicating that the checks are running. Sentence case. [CHAR_LIMIT=25] [iOS only]" meaning="In sentence case.">
-        Checking passwords…
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_DESCRIPTION" desc="Description for the Password Check item in Settings" meaning="Label is shown to explain purpose of Password Checkup feature. This string is shown only if user didn't run the password checkup before or checkup finished due to error without any results.  [iOS only]">
-        Check your saved passwords to strengthen your security and stay safer online
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_SITES_AND_APPS_COUNT" desc="Displays the number of sites and apps for which passwords are being checked during/after Password Checkup.  [iOS only]">
-        {COUNT, plural,
-          =1 {for {COUNT} site or app}
-          other {for {COUNT} sites and apps}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT" desc="In sentence case: Displays the number of compromised passwords present in the database." meaning="[In sentence case]">
-        {COUNT, plural,
-          =0 {No compromised passwords}
-          =1 {{COUNT} compromised password}
-          other {{COUNT} compromised passwords}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_REUSED_COUNT" desc="Displays the number of reused passwords present in the database. User can only have 2 or more reused passwords, so this string will always be plural.">
-        <ph name="COUNT">$1<ex>2</ex></ph> reused passwords
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_WEAK_COUNT" desc="Displays the number of weak passwords present in the database.">
-        {COUNT, plural,
-          =1 {{COUNT} weak password}
-          other {{COUNT} weak passwords}}
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_DISMISSED_COUNT" desc="Displays the number of compromised password warnings that have been dismissed.">
-        {COUNT, plural,
-          =1 {You dismissed {COUNT} warning}
-          other {You dismissed {COUNT} warnings}}
-      </message>
-      <message name="IDS_IOS_CHECK_PASSWORDS_NOW_BUTTON" desc="Label of a button which starts Password Check [Length: 22em] [iOS only]" meaning="By clicking this button user will start checking all passwords for security issues.">
-        Check Now
-      </message>
-      <message name="IDS_IOS_CANCEL_PASSWORD_CHECK_BUTTON" desc="Label of a button which stops Password Check [Length: 22em] [iOS only]" meaning="By clicking this button user will stop checking all passwords for security issues.">
-        Cancel
-      </message>
-      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_TITLE" desc="Title for the password manager screen displaying credentials that have been leaked or phished. The case for 0 compromised passwords is used when all compromised passwords warnings have been muted by the user. In this case the generic Compromised Passwords title is displayed along with a button taking the user to the list of dismissed compromised password credentials. [iOS only] [Length: 22em]">
-        {COUNT, plural,
-          =0 {Compromised Passwords}
-          =1 {{COUNT} Compromised Password}
-          other {{COUNT} Compromised Passwords}}
-      </message>
-      <message name="IDS_IOS_WEAK_PASSWORD_ISSUES_TITLE" desc="Title for the password manager screen displaying credentials with weak passwords [iOS only] [Length: 22em]">
-        {COUNT, plural,
-          =1 {{COUNT} Weak Password}
-          other {{COUNT} Weak Passwords}}
-      </message>
-      <message name="IDS_IOS_REUSED_PASSWORD_ISSUES_TITLE" desc="Title for the password manager screen displaying credentials that share passwords with other credentials in the password manager. User can only have 2 or more reused passwords, so this string will always be plural. [iOS only] [Length: 22em]">
-        <ph name="COUNT">$1<ex>2</ex></ph> Reused Passwords
-      </message>
-      <message name="IDS_IOS_DISMISSED_WARNINGS_PASSWORD_ISSUES_TITLE"  desc="Title for the password manager screen displaying compromised credential issues dismissed by the user. [iOS only] [Length: 22em]">
-        Dismissed Warnings
-      </message>
-      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_DESCRIPTION" desc="Header displayed on the password manager screen displaying credentials that have been leaked or phished [iOS only]">
-        Some of your saved passwords were exposed in a non-Google data breach. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_REUSED_PASSWORD_ISSUES_DESCRIPTION" desc="Header displayed on the password manager screen displaying credentials that share passwords with other credentials in the password manager [iOS only]" meaning="This header explains the risks of reusing passwords for multiple sites and apps. It suggests the user changing reused passwords.">
-        Use a unique password for every site or app. If someone discovers a reused password, it can be used to access your other accounts. Click to open the website and change them now.
-      </message>
-      <message name="IDS_IOS_WEAK_PASSWORD_ISSUES_DESCRIPTION" desc="Header displayed on the password manager screen displaying credentials weak passwords [iOS only]" meaning="This header explains the risks of having weak passwords and provides a link to the support page explaining how create strong passwords.">
-        Weak passwords are easy to guess. Make sure you’re creating strong passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>See more security tips.<ph name="END_LINK">END_LINK</ph>
-      </message>
-      <message name="IDS_IOS_REUSED_PASSWORD_ISSUES_GROUP_HEADER" desc="Header shown on top of a group of credentials sharing the same password, inside the password manager screen diplaying shared passswords. User can only have 2 or more reused passwords, so this string will always be plural. [iOS only]">
-        <ph name="COUNT">$1<ex>2</ex></ph> accounts using same password
-      </message>
-      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_LEAKED_DESCRIPTION" desc="Text explaining the user one of their credentials was found in a data breach. Displayed on the password manager screen showing credentials that have been leaked or phished. [iOS only]">
-        Found in data breach
-      </message>
-      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_PHISHED_DESCRIPTION" desc="Text explaining the user one of their credentials was phished. Displayed on the password manager screen showing credentials that have been leaked or phished. [iOS only]">
-        Entered on deceptive site
-      </message>
-      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_PHISHED_AND_LEAKED_DESCRIPTION" desc="Text explaining the user one of their credentials was phished and leaked. Displayed on the password manager screen showing credentials that have been leaked or phished. [iOS only]">
-        Entered on a deceptive site and found in a data breach
-      </message>
-      <message name="IDS_IOS_COMPROMISED_PASSWORD_ISSUES_DISMISSED_WARNINGS_BUTTON_TITLE" desc="Text of the button presenting the password manager screen displaying compromised credential issues dismissed by the user. [iOS only]">
-        Dismissed Warnings
-      </message>
-      <message name="IDS_IOS_CHANGE_COMPROMISED_PASSWORD" desc="Button which is shown on Password Details Screen when password is compromised. [iOS only]" meaning="Telling user to change password on a website since it is compromised.">
-        Change Password on Website
-      </message>
-      <message name="IDS_IOS_DISMISS_WARNING" desc="Button or dialog title which is shown on Password Details Screen to allow the user to dismiss a compromised password warning. [iOS only]" meaning="Title-cased">
-        Dismiss Warning
-      </message>
-      <message name="IDS_IOS_DISMISS_WARNING_DIALOG_TITLE" desc="Title of the dialog presented to the user when they want to dismiss a compromised password warning. [iOS only]" meaning="Title-cased">
-        Dismiss Warning?
-      </message>
-      <message name="IDS_IOS_DISMISS_WARNING_DIALOG_MESSAGE" desc="Message of the dialog presented to the user when they want to dismiss a compromised password warning. [iOS only]">
-        This password was exposed in a data breach on the internet. If you don't have time to change it right now, Google recommends keeping this warning to remind yourself later.
-      </message>
-      <message name="IDS_IOS_DISMISS_WARNING_DIALOG_DISMISS_BUTTON" desc="Button of the dialog presented to the user when they want to dismiss a compromised password warning. Button is used to confirm that they want to dismiss the warning. [iOS only]">
-        Dismiss
-      </message>
-      <message name="IDS_IOS_RESTORE_WARNING" desc="Button or dialog title which is shown on Password Details Screen to allow the user to restore a dismissed compromised password warning. [iOS only]" meaning="Title-cased">
-        Restore Warning
-      </message>
-      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION" desc="Message at the top of the confirmation alert when the user tapped delete password button. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
-        Deleting this password will not delete your account on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>.
-      </message>
-      <message name="IDS_IOS_DELETE_COMPROMISED_PASSWORD_DESCRIPTION" desc="Message on top of the confirmation alert when the user tapped delete password button. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
-        Deleting this password will not delete your account on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>. Change your password on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph> to keep it safe from others.
-      </message>
-      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION_FOR_MULTI_URLS" desc="Message at the top of the confirmation alert when the user tapped delete password button in a Password Details with more than 3 URLs. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
-          Passwords for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>, <ph name="SECOND_WEBSITE">$2<ex>twitter.com</ex></ph>, and <ph name="NUMBER_OF_ACCOUNTS">$3<ex>2</ex></ph> others will be deleted. Your accounts won't be deleted.
-      </message>
-      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION_FOR_THREE_URLS" desc="Message at the top of the confirmation alert when the user tapped delete password button in a Password Details with 3 URLs. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
-        Passwords for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>, <ph name="SECOND_WEBSITE">$2<ex>twitter.com</ex></ph>, and <ph name="THIRD_WEBSITE">$3<ex>twitter.com</ex></ph> will be deleted. Your accounts won't be deleted.
-      </message>
-      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION_FOR_TWO_URLS" desc="Message at the top of the confirmation alert when the user tapped delete password button in a Password Details with 2 URLs. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
-          Passwords for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph> and <ph name="SECOND_WEBSITE">$2<ex>twitter.com</ex></ph> will be deleted. Your accounts won't be deleted.
-      </message>
-      <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION_FOR_SINGLE_URL" desc="Message at the top of the confirmation alert when the user tapped delete password button in a Password Details. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
-        Your <ph name="WEBSITE">$1<ex>twitter.com</ex></ph> account won't be deleted.
-      </message>
-      <message name="IDS_IOS_DELETE_PASSWORD_TITLE_FOR_MULTI_GROUPS" desc="Title of the confirmation alert when the user tapped delete password button for multiple passwords. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
-          Delete <ph name="NUMBER_OF_ACCOUNTS">$1<ex>2</ex></ph> Passwords?
-      </message>
-      <message name="IDS_IOS_DELETE_PASSWORD_TITLE_FOR_SINGLE_URL" desc="Title of the confirmation alert when the user tapped delete password button. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website.">
-          Delete Password for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>?
-      </message>
-      <message name="IDS_IOS_EDIT_ACTION_TITLE" desc="Title of the action used to edit a selected item. [iOS only]">
-        Edit
-      </message>
-      <message name="IDS_IOS_EDIT_PASSWORD_DESCRIPTION" desc="Message inside confirmation alert when the user is trying to edit password [iOS only]" meaning="Telling user to ensure provided password matches password on the website.">
-        Make sure the password you are saving matches your password for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_CONFIRM_PASSWORD_EDIT" desc="Confirm button inside confirmation alert when the user is trying to edit password [iOS only]" meaning="Save edited password">
-        Save Password
-      </message>
-      <message name="IDS_IOS_USERNAME_ALREADY_USED" desc="Error description telling the user that entered username is already used for this site [iOS only]">
-        You already saved this username for this site
-      </message>
-      <message name="IDS_IOS_CANCEL_PASSWORD_EDIT" desc="Cancel button inside confirmation alert when the user is trying to edit password [iOS only]" meaning="Cancels editing">
-        Cancel
-      </message>
-      <message name="IDS_IOS_CONFIRM_USING_OTHER_PASSWORD_CONTINUE" desc="Action button for confirmation dialog which is shown when user wants to use other passwords. [iOS only]" meaning="User acknowledge warning and wants to proceed.">
-        Continue
-      </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_LAST_COMPLETED_CHECK" desc="Subtitle for Password Checkup cell which shows the timestamp of the last check." meaning="Time when passwords were checked last time.">
-        Checked <ph name="TIME">$1<ex>10 minutes ago</ex></ph>
-      </message>
-      <message name="IDS_IOS_CHECK_FINISHED_JUST_NOW" desc="Used instead of timestamp when Password Check finished less than 1 minute ago." meaning="[In sentence case] Check finished just now.">
-        just now
-      </message>
-      <message name="IDS_IOS_CHECK_FINISHED_JUST_NOW_TITLE_CASE" desc="Used instead of timestamp when Password Check finished less than 1 minute ago." meaning="[In Title Case] Check finished just now.">
-        Just Now
-      </message>
-      <message name="IDS_IOS_CHECK_NEVER_RUN" desc="Used instead of timestamp when Password Check never ran" meaning="Check never run.">
-        Check never run.
-      </message>
       <message name="IDS_IOS_SAVE_PASSWORD_TO_ACCOUNT_STORE" desc="Action button to save password in google account. [iOS only]" meaning="User wants to move password from local device to google account storage.">
         Save in Account
       </message>
       <message name="IDS_IOS_SAVE_PASSWORD_TO_ACCOUNT_STORE_DESCRIPTION" desc="Description of save password in google account action. [iOS only]" meaning="Telling user that current password is in local device store and suggesting moving it to their google account store.">
         This password is saved only to this device. To use it on your other devices, save it in your Google Account, <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
       </message>
-      <message name="IDS_IOS_PASSWORD_SAVED_TO_ACCOUNT_SNACKBAR_MESSAGE" desc="Message briefly displayed at the bottom of the screen to inform the user that the password had successfully been moved to their google account store. [iOS only]">
-        Password saved in your Google Account, <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_ASK_EVERY_TIME" desc="Switch label to let the user choose whether they want to pick an account every time. [iOS only]">
+        Ask which account to use every time
       </message>
-      <message name="IDS_IOS_KEEP_RECENT_PASSWORD" desc="Action button which will keep the most recently used password for a given site, and discard any older passwords, when the user is moving a password to their Google Account. [iOS only]">
-        Keep recent password
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_BODY" desc="Text when a user attempts to save an image to Google Photos, then is presented with the account picker dialog to select which account they want to use to save the image. [iOS only]">
+        Select the account you want to use to save <ph name="FILENAME">$1<ex>image.jpeg</ex></ph> - <ph name="FILESIZE">$2<ex>4 MB</ex></ph>
       </message>
-      <message name="IDS_IOS_PASSWORD_MOVE_CONFLICT_ACTION_SHEET_TITLE" desc="Action sheet title to inform the user that the password they want to move to their google account store already exists. [iOS only]">
-        Password Already Exists
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_SUBMIT" desc="Dialog primary button label to validate the account picked to save an image to Google Photos. [iOS only]" meaning="This button saves the image to the user's Google Photos library i.e. this means 'Save' as in 'Save in Google Photos'.">
+        Save
       </message>
-      <message name="IDS_IOS_PASSWORD_MOVE_CONFLICT_ACTION_SHEET_MESSAGE" desc="Action sheet message to explain to the user that they already have a saved credential for the same username and website, and explain the suggested action to store only the most recent password to their google account store. [iOS only]">
-        You already saved a password for this site in your Google Account. Google can choose the most recent password for you.
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_TITLE" desc="Dialog title to invite the user to pick an account to save an image to Google Photos. [iOS only]">
+        Save in Google Photos
       </message>
-      <message name="IDS_IOS_CANCEL_PASSWORD_MOVE" desc="Cancel button inside the password conflict action sheet when the user is trying to move a password to their google account store [iOS only]">
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_SNACKBAR_IMAGE_SAVED_MESSAGE" desc="Message of snackbar that is shown when the image selected by the user to be saved in Google Photos has been saved successfully. [iOS only]">
+        Image saved in Google Photos for <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_SNACKBAR_IMAGE_SAVED_OPEN_BUTTON" desc="Label of snackbar button that is shown when the image selected by the user to be saved in Google Photos has been saved successfully. The button opens the saved image i.e. it either shows the Google Photos app in the App Store if it is not installed, or opens the image in the Google Photos app. [iOS only]">
+        Open
+      </message>
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_SNACKBAR_SAVING_IMAGE_MESSAGE" desc="Message of snackbar that is shown when the user started saving an image to Google Photos. [iOS only]">
+        Saving image in Google Photos for <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>...
+      </message>
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_THIS_FILE_COULD_NOT_BE_UPLOADED_MESSAGE" desc="Message of an alert that is presented if the user's attempt to upload an image to Google Photos fails. [iOS only]">
+        <ph name="FILENAME">$1<ex>image.jpeg</ex></ph> (<ph name="FILESIZE">$2<ex>4 MB</ex></ph>) could not be uploaded
+      </message>
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_THIS_FILE_COULD_NOT_BE_UPLOADED_TITLE" desc="Title of an alert that is presented if the user's attempt to upload an image to Google Photos fails. [iOS only]">
+        This File Could Not Be Uploaded
+      </message>
+      <message name="IDS_IOS_SAVE_TO_PHOTOS_THIS_FILE_COULD_NOT_BE_UPLOADED_TRY_AGAIN" desc="Button in an alert that is presented if the user's attempt to upload an image to Google Photos fails. The button lets the user try to upload the image again. [iOS only]">
+        Try Again
+      </message>
+      <message name="IDS_IOS_SCANNER_ALERT_CANCEL" desc="Title for a button to cancel a Scanner error dialog. The dialog will be dismissed and no action will be taken. [Length: 20em] [iOS only]" meaning="A button to cancel a Scanner error dialog.">
         Cancel
       </message>
+      <message name="IDS_IOS_SCANNER_CAMERA_IN_USE_ALERT_TITLE" desc="Title of a modal dialog shown when the user tries to open the scanner but the camera is in use by another application. [Length: 40em] [iOS only]">
+        Camera is in use
+      </message>
+      <message name="IDS_IOS_SCANNER_CAMERA_PERMISSIONS_HELP_DETAIL_GO_TO_SETTINGS" desc="Body of modal dialog shown when the user tries to open the scanner but the application lacks permission to use the camera. This body tells the users they'll be redirected to the Settings app. [Length: 140em] [iOS only]">
+        To scan a QR code or credit card, enable the camera from settings.
+      </message>
+      <message name="IDS_IOS_SCANNER_CAMERA_PERMISSIONS_HELP_GO_TO_SETTINGS" desc="Title for a button to go to System settings app. [Length: 20em] [iOS only]">
+        Settings
+      </message>
+      <message name="IDS_IOS_SCANNER_CAMERA_UNAVAILABLE_ALERT_TITLE" desc="Title of a modal dialog shown when the user tries to open the scanner but the camera is unavailable. [Length: 40em] [iOS only]">
+        Camera is unavailable
+      </message>
+      <message name="IDS_IOS_SCANNER_MULTIPLE_FOREGROUND_APPS_ALERT_TITLE" desc="Title of a modal dialog shown when the user tries to open the scanner in a Split View mode. [Length: 40em] [iOS only]" meaning="Title of a Split View error dialog in Scanner.">
+        Split View
+      </message>
+      <message name="IDS_IOS_SCANNER_SCANNED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the user scans a QR code, bar code, or Credit Card. [Length: unlimited] [iOS only]">
+        Scanned
+      </message>
+      <message name="IDS_IOS_SCANNER_TORCH_BUTTON_ACCESSIBILITY_LABEL" desc="Accessibility label for the button to turn torch on and off in the Scanner. The current state of the button is communicated using the accessibility value. [Length: unlimited] [iOS only]" meaning="The button to turn on and off the torch. [20em] [Read by Text-to-Speech]">
+        Torch
+      </message>
+      <message name="IDS_IOS_SCANNER_TORCH_OFF_ACCESSIBILITY_VALUE" desc="Accessibility value of the button to turn torch on in the Scanner. The button communicates that the torch is current off. [Length: unlimited] [iOS only]" meaning="The user will put off the torch [20em] [Read by Text-to-Speech]">
+        Off
+      </message>
+      <message name="IDS_IOS_SCANNER_TORCH_ON_ACCESSIBILITY_VALUE" desc="Accessibility value of the button to turn torch off in the Scanner. The button communicates that the torch is currently on. [Length: unlimited] [iOS only]" meaning="The user will put on the torch [20em] [Read by Text-to-Speech]">
+        On
+      </message>
       <message name="IDS_IOS_SEARCH_COPIED" desc="The message displayed when the search is copied via long press (contextual search) [Length: 10em] [iOS only]">
         Copied
       </message>
@@ -3726,35 +3987,11 @@
       <message name="IDS_IOS_SEARCH_COPIED_TEXT" desc="If a user has some text on their clipboard, this string will appear as an option when the user long-presses on Chrome's address bar. The user can select this option to search the default search engine for the text. This string is a complete sentence. If necessary for your language, you can translate as 'Search for Text That You Copied.' [iOS only]" meaning="Maximum characters: 32">
           Search for Copied Text
       </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_DESKTOP" desc="The label used to let the user choose that their pages will be loaded using the Desktop mode (vs Mobile)" meaning="The pages will be loaded in Desktop mode">
-        Desktop
+      <message name="IDS_IOS_SEARCH_ENGINE_ACCESSIBILITY_COLLAPSE_SNIPPET" desc="Accessibility action to collapse the search engine description.">
+        Tap to collapse
       </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_LABEL" desc="The label of the cell used to display the current mode (Desktop or Mobile) in which the pages will be loaded by default">
-        Default Site View
-      </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_MOBILE" desc="The label used to let the user choose that their pages will be loaded using the Mobile mode (vs Desktop)" meaning="The pages will be loaded in Mobile mode">
-        Mobile
-      </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_TITLE" desc="The title of the screen in which the user can choose the default mode (Desktop or Mobile) in which the pages will be loaded">
-        Default Site View
-      </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_TIP" desc="The text of the tip explaining to the user how to change the mode (desktop/mobile) in which the websites will be requested">
-        You can change the default site view to desktop in Settings > Content Settings
-      </message>
-      <message name="IDS_IOS_DEFAULT_PAGE_MODE_TIP_VOICE_OVER" desc="The text of the tip explaining to the user how to change the mode (desktop/mobile) in which the websites will be requested. [Read by Text-to-Speech]">
-        You can change the default site view to desktop in Settings then Content Settings
-      </message>
-      <message name="IDS_IOS_WEB_INSPECTOR_LABEL" desc="The label of the cell used to display whether Web Inspector support is enabled">
-        Web Inspector
-      </message>
-      <message name="IDS_IOS_WEB_INSPECTOR_TITLE" desc="The title of the screen in which the user can enable Web Inspector support, to allow debugging web pages">
-        Web Inspector
-      </message>
-      <message name="IDS_IOS_WEB_INSPECTOR_SUBTITLE_IPAD" desc="The subtitle explaining how to use Web Inspector">
-        To use the Web Inspector, connect to Safari on your computer using a cable and access your iPad from the Develop menu. You can enable the develop menu in the Advanced section of Safari settings on your computer.
-      </message>
-      <message name="IDS_IOS_WEB_INSPECTOR_SUBTITLE_IPHONE" desc="The subtitle explaining how to use Web Inspector">
-        To use the Web Inspector, connect to Safari on your computer using a cable and access your iPhone from the Develop menu. You can enable the develop menu in the Advanced section of Safari settings on your computer.
+      <message name="IDS_IOS_SEARCH_ENGINE_ACCESSIBILITY_EXPAND_SNIPPET" desc="Accessibility action to expand the search engine description.">
+        Tap to expand
       </message>
       <message name="IDS_IOS_SEARCH_ENGINE_SETTING_CUSTOM_SECTION_HEADER" desc="The header for custom search engines section in Search Engine selection setting [iOS only]">
         Recently Visited
@@ -3765,6 +4002,112 @@
       <message name="IDS_IOS_SEARCH_ENGINE_SETTING_TITLE" desc="The title for Search Engine selection setting [iOS only]">
         Search Engine
       </message>
+      <message name="IDS_IOS_SEARCH_WITH_TITLE_SEARCH" desc="Edit menu button title to open a tab with a Search query of the current selection [Length: 25em]." meaning="Edit menu Search button [Length: 25em]">
+        Search
+      </message>
+      <message name="IDS_IOS_SEARCH_WITH_TITLE_SEARCH_WITH" desc="Edit menu button title to open a tab with a Search query of the current selection. Will contain the search provider. [Length: 25em]." meaning="Edit menu Search button [Length: 25em]">
+        Search with <ph name="SEARCH_PROVIDER">$1<ex>Google</ex></ph>
+      </message>
+      <message name="IDS_IOS_SEARCH_WITH_TITLE_WEB_SEARCH" desc="Edit menu button title to open a tab with a Search query of the current selection. Should be similar to the Android equivalent. [Length: 25em]." meaning="Edit menu Search button [Length: 25em]">
+        Web Search
+      </message>
+      <message name="IDS_IOS_SEE_ALL_OPEN_TABS_IPH_ANNOUNCEMENT" desc="Announcement for the tab grid button's in-product help, explaining that all open tabs can be accessed from the Tab Switcher. Read by Text To Speech. [iOS only]">
+        You can access all your open tabs from the Tab Switcher.
+      </message>
+      <message name="IDS_IOS_SEE_ALL_OPEN_TABS_IPH_TEXT" desc="Text for the tab grid button's in-product help, explaining that all open tabs can be seen. [iOS only]">
+        You can find all your open tabs here.
+      </message>
+      <message name="IDS_IOS_SEND_TAB_TO_SELF_SNACKBAR_MESSAGE" desc="Message briefly displayed at the bottom of the screen to the user to inform that the tab is being sent to the target device. [Length: 35em]" meaning="The is being sent to the target device. [Length: 35em]">
+        Sending to <ph name="DEVICE_NAME">$1<ex>IPhone</ex></ph>...
+      </message>
+      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_ACTION" desc="Button label for the Send Tab To Self modal dialog that sends the current tab to a user's other device. [iOS only]">
+        Send To Your Device
+      </message>
+      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_ITEM_SUBTITLE_DAY" desc="Text label for the Send Tab To Self modal dialog that shows the last active time of a user's device. [iOS only]">
+        Active 1 Day Ago
+      </message>
+      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_ITEM_SUBTITLE_DAYS" desc="Text label for the Send Tab To Self modal dialog that shows the last active time of a user's devicet. [iOS only]">
+        Active <ph name="Days">$1<ex>2</ex></ph> Days Ago
+      </message>
+      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_ITEM_SUBTITLE_TODAY" desc="Text label for the Send Tab To Self modal dialog that shows the last active time of a user's device. [iOS only]">
+        Active Today
+      </message>
+      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_TITLE" desc="Title for the Send Tab To Self modal dialog that chooses the device to which the current tab will be sent. [iOS only]">
+        Send Webpage
+      </message>
+      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION" desc="Footer text shown when the user is trying to add a new credential manually via settings [iOS only]" meaning="Telling user to ensure provided password matches password on the website.">
+        Make sure you're saving your current password for this site.
+      </message>
+      <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_NON_SYNCING" desc="Disclaimer telling non-syncing users what will happen to their passwords">
+        Your password will be saved to your device.
+      </message>
+      <message name="IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT" desc="Footer text of an account address profile when it is viewed in settings. [iOS only]">
+          You can use saved addresses across Google products. This address is saved in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>.
+      </message>
+      <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when an account address is deleted. [iOS only]">
+          {count, plural,
+          =1 {This address will be deleted from your Google Account (<ph name="USER_EMAIL">{email}<ex>janedoe@google.com</ex></ph>) and from this device.}
+          other {These addresses will be deleted from your Google Account (<ph name="USER_EMAIL">{email}<ex>janedoe@google.com</ex></ph>) and from this device.}}
+      </message>
+      <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON" desc="Confirmation button title shown to the user when the address is deleted. [iOS only]">
+          {count, plural,
+          =1 {Delete Address}
+          other {Delete Addresses}}
+      </message>
+      <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when a local address is deleted. [iOS only]">
+          {count, plural,
+          =1 {This address will be deleted from this device.}
+          other {These addresses will be deleted from this device.}}
+      </message>
+      <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_SYNC_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when a sync address is deleted. [iOS only]">
+          {count, plural,
+          =1 {This address will be deleted from this and your other signed-in devices.}
+          other {These addresses will be deleted from this and your other signed-in devices.}}
+      </message>
+      <message name="IDS_IOS_SETTINGS_AUTOFILL_MIGRATE_ADDRESS_TO_ACCOUNT_BUTTON_DESCRIPTION" desc="Button description asking the user to migrate the local address to account. [iOS only]">
+          This address is only saved on this device. To use it on your other devices, move it to your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_SETTINGS_AUTOFILL_MIGRATE_ADDRESS_TO_ACCOUNT_BUTTON_TITLE" desc="Button title asking the user to migrate the local address to account. [iOS only]">
+          Move Address to Account
+      </message>
+      <message name="IDS_IOS_SETTINGS_AUTOFILL_MIGRATE_ADDRESS_TO_ACCOUNT_CONFIRMATION_TEXT" desc="Text shown to the user after the migration of address from local to account was succesfull [iOS only]">
+                Address moved to your account <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>
+            </message>
+      <message name="IDS_IOS_SETTINGS_DOWNLOADS_ACCOUNT_SELECTION_HEADER" desc="Header of Google Photos account selection section in Downloads settings. The section contains the list of accounts on the device among which the user can choose to save images to Google Photos. [iOS only]">
+        Accounts on this Device
+</message>
+      <message name="IDS_IOS_SETTINGS_DOWNLOADS_SAVE_TO_PHOTOS_HEADER" desc="Header of Save to Photos settings section in Downloads settings. This should be the name of the Google branded application Google Photos. [iOS only]">
+        Google Photos
+      </message>
+      <message name="IDS_IOS_SETTINGS_DOWNLOADS_TITLE" desc="Title for the Downloads settings dialog [iOS only]" meaning="Title for the Downloads settings dialog [Length: 29em] [iOS only]">
+        Downloads
+      </message>
+      <message name="IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR" desc="Error shown when the address is edited in settings and one of the required fields is empty. [iOS only]">
+          {count, plural,
+          =1 {A required field is empty. Fill it before saving.}
+          other {Some required fields are empty. Fill them before saving.}}
+      </message>
+      <message name="IDS_IOS_SETTINGS_EXPORT_PASSWORDS_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to export the passwords, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to view or copy the password from a settings page. [Length: about two lines]">
+        To export passwords, you must first set a passcode on your device.
+      </message>
+      <message name="IDS_IOS_SETTINGS_FOLLOW_STEPS_BELOW_TEXT" desc="The prompt under the Default Browser Settings page's header text.">
+        Follow the steps below:
+      </message>
+      <message name="IDS_IOS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION" desc="Description text of HTTPS-Only Mode in  settings">
+        Use HTTPS whenever possible and get warned before loading sites that don’t support it.
+      </message>
+      <message name="IDS_IOS_SETTINGS_HTTPS_ONLY_MODE_TITLE" desc="Title for HTTPS-Only Mode toggle in settings">
+        Always Use Secure Connections
+      </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_DUPLICATE_SECTION_ALERT_DESCRIPTION" desc="Text shown alerting the user that a similar credential exists with the same username/website combination when adding a new credential [iOS only]">
+        You already saved a password for "<ph name="USERNAME">$1<ex>johndoe</ex></ph>" at <ph name="WEBSITE">$2<ex>twitter.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_DUPLICATE_SECTION_ALERT_DESCRIPTION_WITHOUT_USERNAME" desc="Text shown alerting the user that a similar credential exists with the same website combination when adding a new credential [iOS only]">
+        You already saved a password for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_EXCEPTIONS_HEADING" desc="The title for a list of sites where passwords will not be saved. These items are already saved by the browser and can only be deleted. [Length: one line] [iOS only]">
+      Never Saved
+      </message>
       <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS" desc="The title of the view that teaches users to turn on iOS auto-fill from Chrome password manager">
         Passwords in Other Apps
       </message>
@@ -3798,68 +4141,17 @@
       <message name="IDS_IOS_SETTINGS_PASSWORDS_IN_OTHER_APPS_SUBTITLE_SYNCING_ENABLED" desc="The subtitle of the view that teaches password-syncing users they can access passwords from their other devices">
         You can also use saved passwords on your other devices.
       </message>
-      <message name="IDS_IOS_SETTINGS_PRIVACY_TITLE" desc="Title for the Privacy and Security preferences.">
-        Privacy and Security
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_MISSING_TLD_DESCRIPTION" desc="Footer text shown when the website field data misses the top-level domain when creating a new credential via settings [iOS only]" meaning="Suggesting user to add the top-level domain in the website text.">
+        Did you mean <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>?
       </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_PASSWORDS_TITLE" desc="Title for the passwords element of safety check" meaning="Row title to access the password check subpage if a probelm is found with user's saved passwords [CHAR_LIMIT=20]">
-        Passwords
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_NUMBER_ACCOUNT" desc="A description presented to the user of how many accounts have sign-in information available by tapping on this menu item. [iOS only]">
+        <ph name="NUMBER_OF_ACCOUNTS">$1<ex>2</ex></ph> accounts
       </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_PASSWORDS_DESCRIPTION" desc="Description text on the password element describing what the password check does.">
-        Check for compromised passwords
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_SAVED_HEADING" desc="The title for a list of username/site/password items. These items are already saved by the browser and can be deleted/edited. [Length: one line] [iOS only]">
+      Saved Passwords
       </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_TITLE" desc="Title for the safe browsing element of safety check" meaning="Row title to display the user's safe browsing status [CHAR_LIMIT=20]">
-        Safe Browsing
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_DESCRIPTION" desc="Description text on the Safe Browsing element describing what the Safe Browsing check does.">
-        Stay protected from dangerous websites
-      </message>
-      <message name="IDS_IOS_SETTINGS_HTTPS_ONLY_MODE_TITLE" desc="Title for HTTPS-Only Mode toggle in settings">
-        Always Use Secure Connections
-      </message>
-      <message name="IDS_IOS_SETTINGS_HTTPS_ONLY_MODE_DESCRIPTION" desc="Description text of HTTPS-Only Mode in  settings">
-        Use HTTPS whenever possible and get warned before loading sites that don’t support it.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_DISABLED_DESC" desc="Detail text for the Safe Browsing check if the user has Safe Browsing disabled">
-        Off - Not recommended
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_ENABLED_DESC" desc="Detail text for the Safe Browsing check if the user has Safe Browsing enabled">
-        Safe Browsing is on
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_ENHANCED_PROTECTION_ENABLED_DESC" desc="Detail text for the Safe Browsing check if the user has Safe Browsing Standard Protection enabled">
-        Enhanced protection is on
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_STANDARD_PROTECTION_ENABLED_DESC_WITH_ENHANCED_PROTECTION" desc="Detail text for the Safe Browsing check if the user has Safe Browsing Standard Protection enabled">
-        Standard protection is on. For even more security, use Enhanced protection.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_MANAGED_DESC" desc="Detail text for the Safe Browsing check if the user's Safe Browsing setting is managed by their administrator and disabled">
-        Turned off by your administrator
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_MANAGED_DESC" desc="Description text for when the device has updates managed by an administrator">
-       Managed by your administrator
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_OPEN_SAFE_BROWSING_INFO" desc="String in the popover for the Safe Browsing check to direct the user to the Google Services page if Safe Browsing is disabled">
-        To turn on Safe Browsing, open <ph name="BEGIN_LINK">BEGIN_LINK</ph>Google Services<ph name="END_LINK">END_LINK</ph> and tap Safe Browsing.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_TITLE" desc="Title for the updates element of safety check" meaning="Row title to display the user's Chrome update status, and access upates [CHAR_LIMIT=20]">
-        Updates
-      </message>
-      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_ISSUES_FOUND_TIME" desc="Footer for the safety check section telling the user when issues were found.">
-        Issues found <ph name="TIME">$1<ex>10 minutes ago</ex></ph>.
-      </message>
-      <message name="IDS_IOS_SETTINGS_SITE_COPY_BUTTON" desc="Button that the user can press to copy the site to clipboard. [Length: 12em]">
-        Copy
-      </message>
-      <message name="IDS_IOS_SETTINGS_SITE_COPY_MENU_ITEM" desc="Context menu item available on the cell showing the site/URL with a passwords origin, in the detailed view of a stored credential. The user can select it to copy the site to clipboard. [Length: should be one short word, is under 5em in English]">
-        Copy
-      </message>
-      <message name="IDS_IOS_SETTINGS_USERNAME_COPY_BUTTON" desc="Button that the user can press to copy the username to clipboard. [Length: 12em]">
-        Copy
-      </message>
-      <message name="IDS_IOS_SETTINGS_USERNAME_COPY_MENU_ITEM" desc="Context menu item available on the username cell in the detailed view of a stored credential. The user can select it to copy the username to clipboard. [Length: should be one short word, is under 5em in English]">
-        Copy
-      </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORD_PLACEHOLDER_SEARCH" desc="The iOS placeholder for searching passwords in the saved list [Length: 30em] [iOS only]">
-        Search Passwords
+      <message name="IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION" desc="Footer text shown when the user is trying to add or edit a credential manually via settings and the note typed by user is too long. [iOS only]">
+        Notes can save up to <ph name="CHARACTER_LIMIT">$1<ex>1000</ex></ph> characters.
       </message>
       <message name="IDS_IOS_SETTINGS_PASSWORD_COPY_BUTTON" desc="Button that the user can press to copy the password to clipboard. [Length: 12em]">
         Copy
@@ -3882,38 +4174,74 @@
       <message name="IDS_IOS_SETTINGS_PASSWORD_HIDE_MENU_ITEM" desc="Context menu item available on the password cell in detailed view of a stored password. The user can select it to hide the password to clipboard. [Length: should be one short word, is under 5em in English]">
         Hide
       </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORD_PLACEHOLDER_SEARCH" desc="The iOS placeholder for searching passwords in the saved list [Length: 30em] [iOS only]">
+        Search Passwords
+      </message>
       <message name="IDS_IOS_SETTINGS_PASSWORD_REAUTH_REASON_COPY" desc="Message explaining that the reason why we are requiring the user to re-authenticate is to be able to copy the password. This is shown by iOS in the Touch ID reauthentication system dialogue, right under the OS string 'Touch ID for $BROWSER_NAME'. [Length: 22em]">
         Copy password
       </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORD_REAUTH_REASON_SHOW" desc="Message explaining that the reason why we are requiring the user to re-authenticate is to be able to show the password in plain text. This is shown by iOS in the Touch ID reauthentication system dialogue, right under the OS string 'Touch ID for $BROWSER_NAME'. [Length: 22em]">
-        Show password
-      </message>
       <message name="IDS_IOS_SETTINGS_PASSWORD_REAUTH_REASON_EDIT" desc="Message explaining that the reason why we are requiring the user to re-authenticate is to be able to edit the password. This is shown by iOS in the Touch ID reauthentication system dialogue, right under the OS string 'Touch ID for $BROWSER_NAME'. [Length: 22em]">
         Edit password
       </message>
+      <message name="IDS_IOS_SETTINGS_PASSWORD_REAUTH_REASON_SHOW" desc="Message explaining that the reason why we are requiring the user to re-authenticate is to be able to show the password in plain text. This is shown by iOS in the Touch ID reauthentication system dialogue, right under the OS string 'Touch ID for $BROWSER_NAME'. [Length: 22em]">
+        Show password
+      </message>
       <message name="IDS_IOS_SETTINGS_PASSWORD_SHOW_BUTTON" desc="Button that the user can press in order to have the password displayed in plain text. [Length: 12em]">
         Show
       </message>
       <message name="IDS_IOS_SETTINGS_PASSWORD_SHOW_MENU_ITEM" desc="Context menu item available on the password cell in detailed view of a stored password. The user can select it to show the password to clipboard. [Length: should be one short word, is under 5em in English]">
         Show
       </message>
-      <message name="IDS_IOS_SETTINGS_SITE_WAS_COPIED_MESSAGE" desc="Confirmation that the site URL of a saved credential was copied. This is shown alone in an infobar at the bottom of the screen. [Length: one line]">
-        Site address copied
-      </message>
-      <message name="IDS_IOS_SETTINGS_SITES_WERE_COPIED_MESSAGE" desc="Confirmation that the sites URL's of a saved credential was copied. This is shown alone in an infobar at the bottom of the screen. [Length: one line]">
-        Site addresses copied
-      </message>
-      <message name="IDS_IOS_SETTINGS_USERNAME_WAS_COPIED_MESSAGE" desc="Confirmation that the username was copied. This is shown alone in an infobar at the bottom of the screen. [Length: one line]">
-        Username copied
-      </message>
       <message name="IDS_IOS_SETTINGS_PASSWORD_WAS_COPIED_MESSAGE" desc="Confirmation that the password was copied. This is shown alone in an infobar at the bottom of the screen after the user successfully reauthenticates with Touch ID or PIN. [Length: one line]">
         Password copied
       </message>
       <message name="IDS_IOS_SETTINGS_PASSWORD_WAS_NOT_COPIED_MESSAGE" desc="Message informing the user that the password was not copied because the authentication failed. This is shown alone in an infobar at the bottom of the screen after the user tries to reauthenticate with Touch ID or PIN to copy the password and fails. [Length: one line]">
         Can't verify your identity. Password not copied.
       </message>
-      <message name="IDS_IOS_SETTINGS_SET_UP_SCREENLOCK_TITLE" desc="Title of the alert informing the user that in order to view or copy the password, a screen lock needs to be set up on the device. [Length: one line]">
-        Set A Passcode
+      <message name="IDS_IOS_SETTINGS_PRIVACY_TITLE" desc="Title for the Privacy and Security preferences.">
+        Privacy and Security
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_ISSUES_FOUND_TIME" desc="Footer for the safety check section telling the user when issues were found.">
+        Issues found <ph name="TIME">$1<ex>10 minutes ago</ex></ph>.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_OPEN_SAFE_BROWSING_INFO" desc="String in the popover for the Safe Browsing check to direct the user to the Google Services page if Safe Browsing is disabled">
+        To turn on Safe Browsing, open <ph name="BEGIN_LINK">BEGIN_LINK</ph>Google Services<ph name="END_LINK">END_LINK</ph> and tap Safe Browsing.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_PASSWORDS_DESCRIPTION" desc="Description text on the password element describing what the password check does.">
+        Check for compromised passwords
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_PASSWORDS_TITLE" desc="Title for the passwords element of safety check" meaning="Row title to access the password check subpage if a probelm is found with user's saved passwords [CHAR_LIMIT=20]">
+        Passwords
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_DESCRIPTION" desc="Description text on the Safe Browsing element describing what the Safe Browsing check does.">
+        Stay protected from dangerous websites
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_DISABLED_DESC" desc="Detail text for the Safe Browsing check if the user has Safe Browsing disabled">
+        Off - Not recommended
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_ENABLED_DESC" desc="Detail text for the Safe Browsing check if the user has Safe Browsing enabled">
+        Safe Browsing is on
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_ENHANCED_PROTECTION_ENABLED_DESC" desc="Detail text for the Safe Browsing check if the user has Safe Browsing Standard Protection enabled">
+        Enhanced protection is on
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_MANAGED_DESC" desc="Detail text for the Safe Browsing check if the user's Safe Browsing setting is managed by their administrator and disabled">
+        Turned off by your administrator
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_STANDARD_PROTECTION_ENABLED_DESC_WITH_ENHANCED_PROTECTION" desc="Detail text for the Safe Browsing check if the user has Safe Browsing Standard Protection enabled">
+        Standard protection is on. For even more security, use Enhanced protection.
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_TITLE" desc="Title for the safe browsing element of safety check" meaning="Row title to display the user's safe browsing status [CHAR_LIMIT=20]">
+        Safe Browsing
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_MANAGED_DESC" desc="Description text for when the device has updates managed by an administrator">
+       Managed by your administrator
+      </message>
+      <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_TITLE" desc="Title for the updates element of safety check" meaning="Row title to display the user's Chrome update status, and access upates [CHAR_LIMIT=20]">
+        Updates
+      </message>
+      <message name="IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER" desc="Label of the row that opens the Default Browser Settings page">
+          Default Browser
       </message>
       <message name="IDS_IOS_SETTINGS_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to view or copy the password, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to view or copy the password from a settings page. [Length: about two lines]">
         To see passwords, you must first set a passcode on your device.
@@ -3924,9 +4252,54 @@
       <message name="IDS_IOS_SETTINGS_SET_UP_SCREENLOCK_OPEN_SETTINGS" desc="The label of the 'Go to Settings' button of the alert informing the user that in order to view or copy the password, a screen lock needs to be set up on the device. The button opens the Passwords page of the iOS Settings App. Title case. [iOS only]">
         Go to Settings
       </message>
+      <message name="IDS_IOS_SETTINGS_SET_UP_SCREENLOCK_TITLE" desc="Title of the alert informing the user that in order to view or copy the password, a screen lock needs to be set up on the device. [Length: one line]">
+        Set A Passcode
+      </message>
+      <message name="IDS_IOS_SETTINGS_SITES_WERE_COPIED_MESSAGE" desc="Confirmation that the sites URL's of a saved credential was copied. This is shown alone in an infobar at the bottom of the screen. [Length: one line]">
+        Site addresses copied
+      </message>
+      <message name="IDS_IOS_SETTINGS_SITE_COPY_BUTTON" desc="Button that the user can press to copy the site to clipboard. [Length: 12em]">
+        Copy
+      </message>
+      <message name="IDS_IOS_SETTINGS_SITE_COPY_MENU_ITEM" desc="Context menu item available on the cell showing the site/URL with a passwords origin, in the detailed view of a stored credential. The user can select it to copy the site to clipboard. [Length: should be one short word, is under 5em in English]">
+        Copy
+      </message>
+      <message name="IDS_IOS_SETTINGS_SITE_WAS_COPIED_MESSAGE" desc="Confirmation that the site URL of a saved credential was copied. This is shown alone in an infobar at the bottom of the screen. [Length: one line]">
+        Site address copied
+      </message>
+      <message name="IDS_IOS_SETTINGS_SWIPE_DOWN_DISCARD" desc="Button displayed along with a message alert whenever a user tries to dismiss a Settings screen which is being edited, or information is being added to it. Selecting this option will discard the current changes and dismiss the screen.">
+        Discard Changes
+      </message>
+      <message name="IDS_IOS_SETTINGS_SWIPE_DOWN_KEEP" desc="Button displayed along with a message alert whenever a user tries to dismiss a Settings screen which is being edited, or information is being added to it. Selecting this option will dismiss the message alert, and will keep displaying the settings screen.">
+        Keep Editing
+      </message>
+      <message name="IDS_IOS_SETTINGS_SWIPE_DOWN_MESSAGE" desc="Message displayed whenever a user tries to dismiss a Settings screen which is being edited, or information is being added to it.">
+        Are you sure you want to discard your changes?
+      </message>
+      <message name="IDS_IOS_SETTINGS_TAP_DEFAULT_BROWSER_APP_STEP" desc="Text of the row indicating the second step of setting the default browser.">
+        2. Tap Default Browser App
+      </message>
       <message name="IDS_IOS_SETTINGS_TITLE" desc="Title for the settings panel [iOS].">
         Settings
       </message>
+      <message name="IDS_IOS_SETTINGS_TOOLBAR_ADD" desc="Label of the button displayed on the bottom toolbar of the settings' collections. Pressing this button opens the Add view. For example: Clicking this button in the Password settings would open the add password view.">
+        Add
+      </message>
+      <message name="IDS_IOS_SETTINGS_TOOLBAR_DELETE" desc="Label of the button displayed on the bottom toolbar of the settings' collections when they are in edit mode. Pressing this button deletes the currently selected items.">
+        Delete
+      </message>
+      <message name="IDS_IOS_SETTINGS_TOOLBAR_SETTINGS_SUBMENU" desc="Button text in a toolbar that will take the user to a submenu with settings related to the currently-displayed content.">
+        Settings
+      </message>
+        <message name="IDS_IOS_SETTINGS_USERNAME_COPY_BUTTON" desc="Button that the user can press to copy the username to clipboard. [Length: 12em]">
+        Copy
+      </message>
+      <message name="IDS_IOS_SETTINGS_USERNAME_COPY_MENU_ITEM" desc="Context menu item available on the username cell in the detailed view of a stored credential. The user can select it to copy the username to clipboard. [Length: should be one short word, is under 5em in English]">
+        Copy
+      </message>
+      <message name="IDS_IOS_SETTINGS_USERNAME_WAS_COPIED_MESSAGE" desc="Confirmation that the username was copied. This is shown alone in an infobar at the bottom of the screen. [Length: one line]">
+        Username copied
+      </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>
@@ -3939,23 +4312,68 @@
       <message name="IDS_IOS_SETTING_OPENED_IN_ANOTHER_WINDOW" desc="Generic status label displayed in Settings to show that a setting cannot be edited because it is currently being opened for edit in another window. [Length: keep it short.] [iOS only]" meaning="The setting is opened for edit in another window.">
         Opened Elsewhere
       </message>
-      <message name="IDS_IOS_SETTINGS_TOOLBAR_DELETE" desc="Label of the button displayed on the bottom toolbar of the settings' collections when they are in edit mode. Pressing this button deletes the currently selected items.">
-        Delete
+      <message name="IDS_IOS_SET_UP_LIST_ALL_SET_TITLE" desc="Title for the Set Up List item that tells the user they have completed all tasks.">
+        You're All Set
       </message>
-      <message name="IDS_IOS_SETTINGS_TOOLBAR_ADD" desc="Label of the button displayed on the bottom toolbar of the settings' collections. Pressing this button opens the Add view. For example: Clicking this button in the Password settings would open the add password view.">
-        Add
+      <message name="IDS_IOS_SET_UP_LIST_AUTOFILL_SEE_MORE_DESCRIPTION" desc="Description for the Set Up List item in the See More modal that encourages the user to set up Chrome's autofill settings.">
+        Access your passwords and more across apps.
       </message>
-      <message name="IDS_IOS_SETTINGS_TOOLBAR_SETTINGS_SUBMENU" desc="Button text in a toolbar that will take the user to a submenu with settings related to the currently-displayed content.">
-        Settings
+      <message name="IDS_IOS_SET_UP_LIST_AUTOFILL_SHORT_DESCRIPTION" desc="Shortened description for the Set Up List item that encourages the user to set up Chrome's autofill settings.">
+        Access your passwords across other apps.
       </message>
-        <message name="IDS_IOS_SETTINGS_SWIPE_DOWN_MESSAGE" desc="Message displayed whenever a user tries to dismiss a Settings screen which is being edited, or information is being added to it.">
-        Are you sure you want to discard your changes?
+      <message name="IDS_IOS_SET_UP_LIST_COLLAPSE" desc="Accessibility label for the button to expand the Set Up List.">
+        Collapse list
       </message>
-      <message name="IDS_IOS_SETTINGS_SWIPE_DOWN_DISCARD" desc="Button displayed along with a message alert whenever a user tries to dismiss a Settings screen which is being edited, or information is being added to it. Selecting this option will discard the current changes and dismiss the screen.">
-        Discard Changes
+      <message name="IDS_IOS_SET_UP_LIST_CONTENT_NOTIFICATION_DESCRIPTION" desc="Description for the Set Up List item that encourages the user to enable Chrome content notifications.">
+        Keep up with news, sports, and more based on your interests
       </message>
-      <message name="IDS_IOS_SETTINGS_SWIPE_DOWN_KEEP" desc="Button displayed along with a message alert whenever a user tries to dismiss a Settings screen which is being edited, or information is being added to it. Selecting this option will dismiss the message alert, and will keep displaying the settings screen.">
-        Keep Editing
+      <message name="IDS_IOS_SET_UP_LIST_CONTENT_NOTIFICATION_SHORT_DESCRIPTION" desc="Short description for the Set Up List item that encourages the user to enable Chrome content notifications.">
+        Keep up with news, sports, and more.
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_CONTENT_NOTIFICATION_TITLE" desc="Title for the Set Up List item that encourages the user to enable Chrome content notifications.">
+        Get Content Notifications
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_EXPAND" desc="Accessibility label for the button to expand the Set Up List.">
+        Expand list
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_MENU" desc="Accessibility label for the Set Up List menu button.">
+        Options
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_SETTINGS_CANCEL" desc="Title for the item to cancel opening the Set Up List Settings action sheet.">
+        Cancel
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_SETTINGS_TURN_OFF" desc="Title for the item to turn off the Set Up List, in the Set Up List Settings action sheet.">
+        Turn off
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_DESCRIPTION" desc="Description for the Set Up List item that encourages the user to sign in and set up syncing.">
+        Sign in with your Google Account to sync your bookmarks, history, and more.
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_MAGIC_STACK_DESCRIPTION" desc="Description for the Set Up List item in the Magic Stack that encourages the user to sign in and set up syncing.">
+        Sign in with your Google Account to sync your passwords and more.
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION" desc="Shortened description for the Set Up List item that encourages the user to sign in and set up syncing.">
+        Sync your bookmarks, history, and more.
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION_NO_SYNC" desc="Same as IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION but without mentioning sync.">
+        Get your bookmarks, passwords, and more.
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_TITLE" desc="Title for the Set Up List item that encourages the user to sign in and set up syncing.">
+        Sign in and Sync
+      </message>
+      <message name="IDS_IOS_SET_UP_LIST_TRY_BUTTON_TEXT" desc="Button text next to a Set Up List item suggesting to the user to try the action.">
+        Try
+      </message>
+      <message name="IDS_IOS_SHARED_HIGHLIGHT_LEARN_MORE" desc="An option in a menu which appears after a user taps on a highlighted passage in a web page. When selected, the user will be taken to a help article explaining how the highlighting feature works. Title-cased. [Length: 25em]">
+        Learn More...
+      </message>
+      <message name="IDS_IOS_SHARED_HIGHLIGHT_MENU_TITLE" desc="The title at the top of a menu which appears after a user taps on a highlighted passage in a web page. Title-cased.">
+        Highlighted Text
+      </message>
+      <message name="IDS_IOS_SHARED_HIGHLIGHT_REMOVE" desc="An option in a menu which appears after a user taps on a highlighted passage in a web page. Selecting this option causes the passage to no longer be highlighted. Title-cased. [Length: 25em]">
+        Remove
+      </message>
+      <message name="IDS_IOS_SHARED_HIGHLIGHT_RESHARE" desc="An option in a menu which appears after a user taps on a highlighted passage in a web page. Selecting this option allows the user to share a link directly to the passage on which they tapped. Title-cased. [Length: 25em]">
+        Share Highlight
       </message>
       <message name="IDS_IOS_SHARE_BUTTON_LABEL" desc="Label of a button which will initiate a share flow. [iOS only]">
         Share...
@@ -3969,18 +4387,21 @@
       <message name="IDS_IOS_SHARE_GPLUS_COMPLETE" desc="Message shown when Google+ share has been posted. [Length: Unknown. Keep it short.] [iOS only]">
         Google+ post completed.
       </message>
+      <message name="IDS_IOS_SHARE_LINK_TO_TEXT" desc="Option that appears in the iOS Edit Menu when highlighting text (alongside options like Copy, Paste, and Share). When selected, this generates a special URL that will open the current page and jump to/highlight the user's current selection. The user will then have the chance to share this special URL through the normal iOS sharing menu.">
+          Create Link
+      </message>
       <message name="IDS_IOS_SHARE_MENU_COPY" desc="Text label of the Copy action in the extension menu that copies the current URL to the pasteboard. [iOS only]">
         Copy
       </message>
       <message name="IDS_IOS_SHARE_MENU_FIND_IN_PAGE" desc="Text label to the Find in Page action in the extension menu that open the 'Find in Page' menu. [iOS only]">
         Find in Page
       </message>
-      <message name="IDS_IOS_SHARE_MENU_PRINT_ACTION" desc="The text label of the Print action in the extension menu that starts the printing process. [Length: 13em] [iOS only]">
-        Print
-      </message>
       <message name="IDS_IOS_SHARE_MENU_GENERATE_QR_CODE_ACTION" desc="The text label of the action in the extension menu that generates and shows a QR code for the current page. This is Title Case. [iOS only]" meaning="Action from the displayed menu after the user tap on the share button. In Title Case.">
         Create a QR Code
       </message>
+      <message name="IDS_IOS_SHARE_MENU_PRINT_ACTION" desc="The text label of the Print action in the extension menu that starts the printing process. [Length: 13em] [iOS only]">
+        Print
+      </message>
       <message name="IDS_IOS_SHARE_MENU_READING_LIST_ACTION" desc="The text label of the Add To Reading List action in the extension menu that adds the current page to the reading list. [Length: 25em] This is Title Case. [iOS only]" meaning="Action from the displayed menu after the user tap on the share button. In Title Case.">
         Add to Reading List
       </message>
@@ -3993,38 +4414,14 @@
       <message name="IDS_IOS_SHARE_MENU_SEND_TAB_TO_SELF_ACTION" desc="Text label to the Send Tab To Self action in the extension menu that sends the current tab to the user's other devices. This is Title Case. [iOS only]" meaning="Action from the displayed menu after the user tap on the share button. In Title Case.">
         Send to Your Devices
       </message>
+      <message name="IDS_IOS_SHARE_MESSAGES_COMPLETE" desc="Message shown when message share has been sent. [Length: Unknown. Keep it short.] [iOS only]">
+        Message sent.
+      </message>
       <message name="IDS_IOS_SHARE_PAGE_BUTTON_LABEL" desc="Label of a button which will initiate a share flow for the current page. [iOS only]">
         Share Page...
       </message>
-      <message name="IDS_SEND_TAB_TO_SELF_INFOBAR_MESSAGE" desc="The message text for the infobar when a user receives a shared tab from another device.">
-        Tab received.
-      </message>
-      <message name="IDS_SEND_TAB_TO_SELF_INFOBAR_MESSAGE_URL" desc="Clickable text displayed as part of a URL in the inforbar displayed when a user receives a shared tab from another device.">
-        Open
-      </message>
-      <message name="IDS_IOS_SEND_TAB_TO_SELF_SNACKBAR_MESSAGE" desc="Message briefly displayed at the bottom of the screen to the user to inform that the tab is being sent to the target device. [Length: 35em]" meaning="The is being sent to the target device. [Length: 35em]">
-        Sending to <ph name="DEVICE_NAME">$1<ex>IPhone</ex></ph>...
-      </message>
-      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_ACTION" desc="Button label for the Send Tab To Self modal dialog that sends the current tab to a user's other device. [iOS only]">
-        Send To Your Device
-      </message>
-      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_TITLE" desc="Title for the Send Tab To Self modal dialog that chooses the device to which the current tab will be sent. [iOS only]">
-        Send Webpage
-      </message>
-      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_ITEM_SUBTITLE_TODAY" desc="Text label for the Send Tab To Self modal dialog that shows the last active time of a user's device. [iOS only]">
-        Active Today
-      </message>
-      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_ITEM_SUBTITLE_DAY" desc="Text label for the Send Tab To Self modal dialog that shows the last active time of a user's device. [iOS only]">
-        Active 1 Day Ago
-      </message>
-      <message name="IDS_IOS_SEND_TAB_TO_SELF_TARGET_DEVICE_ITEM_SUBTITLE_DAYS" desc="Text label for the Send Tab To Self modal dialog that shows the last active time of a user's devicet. [iOS only]">
-        Active <ph name="Days">$1<ex>2</ex></ph> Days Ago
-      </message>
-      <message name="IDS_SEND_TAB_TO_SELF_MANAGE_DEVICES_LINK" desc="Text with a link to a page where the user can manage the devices they can share a tab to.">
-        <ph name="BEGIN_LINK">BEGIN_LINK</ph>Your devices<ph name="END_LINK">END_LINK</ph> · <ph name="EMAIL">$1<ex>foo@gmail.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_SHARE_MESSAGES_COMPLETE" desc="Message shown when message share has been sent. [Length: Unknown. Keep it short.] [iOS only]">
-        Message sent.
+      <message name="IDS_IOS_SHARE_THIS_PAGE_IPH_TEXT" desc="Text for the share button's in-product help, explaining that this button can be used to share this page. [iOS only]">
+        Share this page
       </message>
       <message name="IDS_IOS_SHARE_TO_CLIPBOARD_SUCCESS" desc="Message displayed when the copy link (in Share... menu) action has succeeded. [Length: 30em] [iOS only]">
         Link copied
@@ -4050,6 +4447,18 @@
       <message name="IDS_IOS_SHARE_TWITTER_COMPLETE" desc="Message shown when Twitter share has been posted. [Length: Unknown. Keep it short.] [iOS only]">
         Tweet completed.
       </message>
+      <message name="IDS_IOS_SHOW_ALL_PASSWORDS" desc="Button title in the keyboard accessory bar to open the list of all saved passwords. [Length: 20em] [iOS only]">
+        Show All...
+      </message>
+      <message name="IDS_IOS_SHOW_LINK_PREVIEWS" desc="Title for the view and option in Settings for showing link previews. [Length: unlimited] [iOS only]" meaning="Title for the Chrome Settings option for showing link previews. [Length: unlimited]">
+        Show Link Previews
+      </message>
+      <message name="IDS_IOS_SHOW_PASSWORD_VIEW_FEDERATION" desc="Label indicating that the text displayed below is the hostname of the identity provider used for the displayed credential. [Length: to fit on one line] [iOS only]">
+        Signed In With
+      </message>
+      <message name="IDS_IOS_SHOW_PASSWORD_VIEW_NOTE" desc="Label indicating that the text displayed below is a note for a password added by the user. [Length: 20em] [iOS only]">
+        Note
+      </message>
       <message name="IDS_IOS_SHOW_PASSWORD_VIEW_PASSWORD" desc="Label indicating that the text displayed below is a password. [Length: 20em] [iOS only]">
         Password
       </message>
@@ -4062,47 +4471,68 @@
       <message name="IDS_IOS_SHOW_PASSWORD_VIEW_USERNAME" desc="Label indicating that the text displayed below is the username to which a saved password corresponds. The password is displayed in the same view, but under a different label. [Length: 20em] [iOS only]">
         Username
       </message>
-      <message name="IDS_IOS_SHOW_PASSWORD_VIEW_FEDERATION" desc="Label indicating that the text displayed below is the hostname of the identity provider used for the displayed credential. [Length: to fit on one line] [iOS only]">
-        Signed In With
+      <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE_WITH_USERNAME" desc="Notification title for the user's signed-in state that includes the user's full name [iOS only]">
+      Signed in as <ph name="USER">$1<ex>Jane Doe</ex></ph>
       </message>
-      <message name="IDS_IOS_SHOW_PASSWORD_VIEW_NOTE" desc="Label indicating that the text displayed below is a note for a password added by the user. [Length: 20em] [iOS only]">
-        Note
+      <message name="IDS_IOS_SIGNIN_PROMO_BOOKMARKS" desc="This string is on a promo intended to promote signing in to Chrome with the user's Google Account. It appears on the Bookmarks page when the user is not signed in. We want users to read this promo and click 'Continue as name' to sign in to their Google Account. The tone should be informative and lightweight. [Length: 90em]">
+        Sign in to get your bookmarks on all your devices.
       </message>
-      <message name="IDS_IOS_CANCEL_PASSWORD_DELETION" desc="Label of a confirmation dialogue button which allows the user to cancel deletion of a stored password. [Length: one line] [iOS only]">
-        Cancel
+      <message name="IDS_IOS_SIGNIN_PROMO_CHANGE_ACCOUNT" desc="Button that the user can press if they are not the profile that Chrome found (opposite of 'Continue as Joe Doe'). The user will be able to choose another account and sign-in with it.">
+        Choose Another Account
       </message>
-      <message name="IDS_IOS_CONFIRM_PASSWORD_DELETION" desc="Label of a confirmation dialogue button which allows the user to confirm deletion of a stored password. [Length: one line] [iOS only]">
-        Delete Password
+      <message name="IDS_IOS_SIGNIN_PROMO_CLOSE_ACCESSIBILITY" desc="Accessibility label to describe the close button action in the sign-in promo element.">
+        Close sign-in promo
       </message>
-      <message name="IDS_IOS_COOKIES_ALLOW_ALL" desc="Label that informs the user that no cookies are blocked">
-        Allow All
+      <message name="IDS_IOS_SIGNIN_PROMO_CONTINUE_AS" desc="Button that the user can press to login without asking the password and continue using Chrome with this acccount. [Length: 9em]">
+        Continue as <ph name="NAME">$1<ex>John Doe</ex></ph>
       </message>
-      <message name="IDS_IOS_COOKIES_BLOCK_ALL" desc="Label that informs the user that all cookies are blocked">
-        Block All
+      <message name="IDS_IOS_SIGNIN_PROMO_READING_LIST" desc="This string is on a promo intended to promote signing in to Chrome with the user's Google Account. It appears on the Reading List page when the user is not signed in. We want users to read this promo and click 'Continue as {name}' to sign in to their Google Account. The tone should be informative and lightweight.">
+        Sign in to get your reading list on all your devices.
       </message>
-      <message name="IDS_IOS_COOKIES_BLOCK_THIRD_PARTY" desc="Label that informs the user that Third-Party cookies are blocked">
-        Block Third-Party
+      <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_COOKIES_BLOCK_THIRD_PARTY_INCOGNITO" desc="Label that informs the user that Third-Party cookies are blocked only in Incognito">
-        Block in Incognito
+      <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_RETURN_TO_RECENT_TAB_TITLE" desc="Title of the Return to Recent Tab Content Suggestons Tile.">
-          Return to Recent Tab
+      <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_RETURN_TO_RECENT_TAB_TIME_DAYS" desc="Type in days for time since the recent tab was opened, shortened to d.">
-          <ph name="TIME">$1</ph> d ago
-          </message>
-      <message name="IDS_IOS_RETURN_TO_RECENT_TAB_TIME_HOURS" desc="Type in hours for time since the recent tab was opened, shortened to h.">
-          <ph name="TIME">$1</ph> h ago
-          </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_NUMBER_ACCOUNT" desc="A description presented to the user of how many accounts have sign-in information available by tapping on this menu item. [iOS only]">
-        <ph name="NUMBER_OF_ACCOUNTS">$1<ex>2</ex></ph> accounts
+      <message name="IDS_IOS_SIGNIN_PROMO_SIGNIN_WITH_UNO" desc="Button that the user can press if they want to sign-in in the browser. [iOS only]">
+        Sign In
       </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_SAVED_HEADING" desc="The title for a list of username/site/password items. These items are already saved by the browser and can be deleted/edited. [Length: one line] [iOS only]">
-      Saved Passwords
+      <message name="IDS_IOS_SIGNIN_PROMO_TURN_ON" desc="Button that the user can press if they want to sign-in to the browser. [iOS only]">
+        Turn On
       </message>
-      <message name="IDS_IOS_SETTINGS_PASSWORDS_EXCEPTIONS_HEADING" desc="The title for a list of sites where passwords will not be saved. These items are already saved by the browser and can only be deleted. [Length: one line] [iOS only]">
-      Never Saved
+      <message name="IDS_IOS_SIGNIN_SHEET_LABEL_FOR_FEED_PROMO" desc="Text in the sheet that offers the user to sign-in to Chrome, when the sheet is opened from one of the NTP feed promos [iOS only].">
+        Sign in to get content based on your interests.
+      </message>
+      <message name="IDS_IOS_SIGNIN_SHEET_LABEL_FOR_RECENT_TABS" desc="This string is on a sign-in page, after the user taps on a promotion about signing in to Chrome with the user's Google Account. It explains the specific user benefit of signing in from this page (access to tabs from other devices). We want users to understand why signing in is beneficial, and click 'Turn on' to sign in to their Google Account. The tone should be informative and lightweight. [iOS only]">
+        Sign in to see your tabs from your other devices.
+      </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>
+      <message name="IDS_IOS_SIGNIN_SNACKBAR_UNDO" desc="This string is found on a button that signs the user out when the user taps it. It is on a confirmation message that users see when they sign in to Chrome with their Google Account. This text is a verb and is short for the longer phrase 'Undo my sign-in.' The tone should be informative. [Length: 15em] [iOS only]">
+        Undo
+      </message>
+      <message name="IDS_IOS_SIGNOUT_DIALOG_CLEAR_DATA_BUTTON" desc="This button signs the user out and clear all the data from the user device. The data remain in their Google account. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
+        Clear Data
+      </message>
+      <message name="IDS_IOS_SIGNOUT_DIALOG_KEEP_DATA_BUTTON" desc="This button signs the user out and all its data stays on the device. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
+        Keep Data
+      </message>
+      <message name="IDS_IOS_SIGNOUT_DIALOG_MESSAGE_WITH_SYNC" desc="The text describes that sync will be off when user signs out [iOS only].">
+        Signing out turns off sync.
+      </message>
+      <message name="IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_BUTTON" desc="Button title of a dialog shown to users when they sign out of Chrome but Chrome hasn't synced some data yet, which is permanently deleted if the user proceeds by pressing this button. Related to IDS_IOS_SIGNOUT_DIALOG_MESSAGE_WITH_NOT_SAVED_DATA and IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_TITLE [iOS only].">
+        Delete and Sign Out
+      </message>
+      <message name="IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_TITLE" desc="Title of a dialog shown to users when they sign out of Chrome but Chrome hasn't synced some data yet, which is permanently deleted if the user proceeds. IDS_IOS_SIGNOUT_DIALOG_MESSAGE_WITH_NOT_SAVED_DATA and IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_BUTTON [iOS only].">
+        Some Data Isn't Saved Yet
+      </message>
+      <message name="IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_BUTTON" desc="This button signs the user out. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
+        Sign Out
       </message>
       <message name="IDS_IOS_SIGN_IN_AGAIN" desc="Title displayed when there is an authentication failure in sign-in and the user needs to attempt to sign in again. [Length: 20em] [iOS only]">
         Sign In Again
@@ -4113,177 +4543,6 @@
       <message name="IDS_IOS_SIGN_IN_FAILED" desc="Explanatory message shown when Sign in to Chrome failed for an unknown technical reason.  [Length: 50em] [iOS only]">
         Failed to sign in. Please try again later.
       </message>
-      <message name="IDS_IOS_WEBSIGN_ERROR_TITLE" desc="Title displayed when sign in fails due to an authentication issue. [iOS only]">
-        Something Went Wrong
-      </message>
-      <message name="IDS_IOS_WEBSIGN_ERROR_GENERIC_ERROR" desc="Title displayed when sign in fails due to an authentication issue. [iOS only]">
-        Can't sign-in.
-      </message>
-      <message name="IDS_IOS_WEBSIGN_ERROR_TIMEOUT_ERROR" desc="Title displayed when sign in fails due to an authentication issue. [iOS only]">
-        Check your connection and try signing in again.
-      </message>
-      <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_DEFAULT_BROWSER_APP" desc="Text in the default browser video promo indicating the default browser app in the chrome settings to set a default browser. [iOS only]">
-        Default Browser App
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_TITLE" desc="Search Tabs title displayed in What's New. [iOS only]">
-        Search Tabs Across Synced Devices
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_SUBTITLE" desc="Search Tabs subtitle displayed in What's New. [iOS only]">
-        Quickly find open and recently closed tabs across your synced devices.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_1" desc="Text of the row indicating the first step of Search Tabs in What's New. [iOS only]">
-        Open the Tab Grid
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_2" desc="Text of the row indicating the second step of Search Tabs in What's New. [iOS only]">
-        At the Top of the Screen, Tap the Search Icon
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_TITLE" desc="New Menu title displayed in What's New. [iOS only]">
-        Explore the New Menu
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_SUBTITLE" desc="New Menu subtitle displayed in What's New. [iOS only]">
-        Now your saved bookmarks, passwords and more are at the top.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_2" desc="Text of the row indicating the second step of New Menu in What's New. [iOS only]">
-        Explore the options in the menu bar
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_1" desc="Text of the row indicating the first step of Use Chrome By Default in What's New. [iOS only]">
-        Open Settings
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_2" desc="Text of the row indicating the second step of Use Chrome By Default in What's New. [iOS only]">
-        Tap Default Browser App
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_1" desc="Text of the row indicating the first step of Passwords In Other Apps in What's New. [iOS only]">
-        Open AutoFill Password Settings
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_1_IOS16" desc="Text of the row indicating the first step of Passwords In Other Apps in What's New. [iOS only]">
-        Open Password Options
-      </message>
-      <message name="IDS_IOS_OPEN_CHROME_SETTINGS" desc="Text of the primary button to open chrome settings page. [iOS only]">
-        Open Settings
-      </message>
-      <message name="IDS_IOS_OPEN_IOS_SETTINGS" desc="Text of the primary button to open iOS settings page. [iOS only]">
-        Go To Settings...
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2_IOS16" desc="Text of the row indicating the first step of shortened instruction of of turning on iOS auto-fill from Chrome password manager on iOS 16 and above [iOS only]">
-        Turn on AutoFill Passwords
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_TITLE" desc="Open in incognito tabs from other apps title displayed in What's New. [iOS only]">
-        Open links from other apps in Incognito
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_SUBTITLE" desc="Open in incognito tabs from other apps subtitle displayed in What's New. [iOS only]">
-        You can choose to open incoming URLs from other apps in Incognito.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_SCREENSHOT_TEXT_OPEN_IN_INCOGNITO" desc="Text in image asking the user to open a url in incognito. [iOS only]">
-        Open in Incognito?
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_SCREENSHOT_TEXT_URL" desc="Text in image representing a url to open in incognito tabs from other apps. [iOS only]">
-        https://www.amazon.com/Wife-Gifts/s?k=for+Wife+Gifts
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_STEP_2" desc="Text of the row indicating the second step of opening in incognito tabs from other apps. [iOS only]">
-        Tap “Privacy &amp; Security.”
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_STEP_3" desc="Text of the row indicating the third step of opening in incognito tabs from other apps. [iOS only]">
-        Turn on "Ask to Open Links from Other Apps in Incognito."
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SUBTITLE" desc="Chrome Actions subtitle displayed in What's New. [iOS only]">
-        Shortcuts to quickly modify settings and use features from the address bar.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SCREENSHOT_TEXT_MANAGE_PASSWORDS" desc="Text in image displaying the result of Chrome Actions query. [iOS only]">
-        Manage Passwords
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SCREENSHOT_TEXT_MENU" desc="Text in image displaying the first step of the Chrome Actions query result. [iOS only]">
-        Menu
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SCREENSHOT_TEXT_SETTINGS" desc="Text in image displaying the second step of the Chrome Actions query result. [iOS only]">
-        Settings
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SCREENSHOT_TEXT_PASSWORDS" desc="Text in image displaying the third step of the Chrome Actions query result. [iOS only]">
-        Passwords
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_STEP_1" desc="Text of the row indicating the first step of Chrome Actions. [iOS only]">
-        In the address bar, enter a task like “clear my history” or “edit passwords.”
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_STEP_2" desc="Text of the row indicating the second step of Chrome Actions. [iOS only]">
-        Tap the shortcut that appears under the address bar.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_STEP_3" desc="Text of the row indicating the third step of Chrome Actions. [iOS only]">
-        Complete your task.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_TITLE" desc="Incognito Lock title displayed in What's New. [iOS only]">
-        Incognito Lock
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_SCREENSHOT_TEXT_UNLOCK" desc="Text in image indicating the user to unlock with face ID. [iOS only]">
-        Unlock With Face ID
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_STEP_2" desc="Text of the row indicating the second step to turn on Incognito Lock. [iOS only]">
-        Tap “Privacy &amp; Security.”
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SUBTITLE" desc="Google calendar subtitle displayed in What's New. [iOS only]">
-        Create Calendar events directly by clicking on a date in a web page.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_TITLE" desc="Google calendar title displayed in What's New. [iOS only]">
-        Create calendar events from dates
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_CALENDAR" desc="Text in image displaying Google calendar title. [iOS only]">
-        Calendar
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_ADD_TITLE" desc="Text in image displaying a placeholder for the title of the Google calendar event. [iOS only]">
-        Add title
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_ALL_DAY" desc="Text in image indicating whether or not the Google calendar event is applied to the whole day. [iOS only]">
-        All day
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_STARTS" desc="Text in image indicating the start of the Google calendar event. [iOS only]">
-        Starts
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_DATE" desc="Text in image displaying a date in the Google calendar event. [iOS only]">
-        Oct 25, 2023
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_TIME" desc="Text in image displaying a time in the Google calendar event. [iOS only]">
-        5:30 PM
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_ENDS" desc="Text in image indicating the end of the Google calendar event. [iOS only]">
-        Ends
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_REPEAT" desc="Text in image indicating the frequency of the Google calendat event. [iOS only]">
-        Repeat
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_NEVER" desc="Text in image indicating that the Google calendar event should not be repreated. [iOS only]">
-        Never
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_EVENTS" desc="Text in image indicating previous Google Calendar events. [iOS only]">
-        Events
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_STEP_1" desc="Text of the row indicating the first step of creating a Google calandar event. [iOS only]">
-        Touch &amp; hold a date.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_STEP_2" desc="Text of the row indicating the second step of creating a Google calandar event. [iOS only]">
-        Select “Add to Google Calendar“ or “Add to Apple Calendar.“
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_CALENDAR_STEP_3" desc="Text of the row indicating the third step of creating a Google calandar event. [iOS only]">
-        Edit the event details and tap “Save.“
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_SUBTITLE" desc="Mini Maps subtitle displayed in What's New. [iOS only]">
-        Use addresses on web pages to get local info and directions.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_STEP_1" desc="Text of the row indicating the first step of of the Mini Maps feature. [iOS only]">
-        Touch &amp; Hold an address.
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_STEP_3" desc="Text of the row indicating the third step of of the Mini Maps feature. [iOS only]">
-        For route options, tap “Get Directions.”
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_SCREENSHOT_TEXT_MAPS" desc="Text in image displaying Google maps title. [iOS only]">
-        Maps
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_SCREENSHOT_TEXT_OPEN_IN_APP" desc="Text in image displaying Open in App. [iOS only]">
-        Open in App…
-      </message>
-      <message name="IDS_IOS_SEARCH_ENGINE_ACCESSIBILITY_EXPAND_SNIPPET" desc="Accessibility action to expand the search engine description.">
-        Tap to expand
-      </message>
-      <message name="IDS_IOS_SEARCH_ENGINE_ACCESSIBILITY_COLLAPSE_SNIPPET" desc="Accessibility action to collapse the search engine description.">
-        Tap to collapse
-      </message>
       <message name="IDS_IOS_SIGN_IN_INVALID_ACCOUNT_MESSAGE" desc="Message of the alert displayed when the user sign in with a restricted account.">
         Your organization allows you to sign in only with certain accounts.
       </message>
@@ -4296,32 +4555,47 @@
       <message name="IDS_IOS_SIGN_IN_TO_CHROME_SETTING_SUBTITLE_SYNC_MANAGED" desc="The subtitle for the setting item of the signed in user when sync is managed by policies [iOS only]">
         To sync and personalize across devices, turn on sync.
       </message>
-      <message name="IDS_IOS_SIGN_TRUSTED_VAULT_ERROR_DIALOG_TITLE" desc="Alert title to display an error after a reauthentication, related to IDS_IOS_SIGN_TRUSTED_VAULT_ERROR_DIALOG_MESSAGE [iOS only]">
-        Authentication Error
-      </message>
       <message name="IDS_IOS_SIGN_TRUSTED_VAULT_ERROR_DIALOG_MESSAGE" desc="Alert message to display an error after a reauthentication, related to IDS_IOS_SIGN_TRUSTED_VAULT_ERROR_DIALOG_TITLE [iOS only]">
         Error code: <ph name="ERROR_CODE">$1<ex>2</ex></ph>
       </message>
-      <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE_WITH_USERNAME" desc="Notification title for the user's signed-in state that includes the user's full name [iOS only]">
-      Signed in as <ph name="USER">$1<ex>Jane Doe</ex></ph>
+      <message name="IDS_IOS_SIGN_TRUSTED_VAULT_ERROR_DIALOG_TITLE" desc="Alert title to display an error after a reauthentication, related to IDS_IOS_SIGN_TRUSTED_VAULT_ERROR_DIALOG_MESSAGE [iOS only]">
+        Authentication Error
       </message>
-      <message name="IDS_IOS_SIGNOUT_DIALOG_CLEAR_DATA_BUTTON" desc="This button signs the user out and clear all the data from the user device. The data remain in their Google account. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
-        Clear Data
+      <message name="IDS_IOS_SNACKBAR_ACTION_GO_TO_FEED" desc="The iOS snackbar action when successfuly following a web content. [iOS only]">
+        GO TO FEED
       </message>
-      <message name="IDS_IOS_SIGNOUT_DIALOG_KEEP_DATA_BUTTON" desc="This button signs the user out and all its data stays on the device. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
-        Keep Data
+      <message name="IDS_IOS_SNACKBAR_ACTION_TRY_AGAIN" desc="The iOS snackbar message when failed to follow/unfollow a web content. [iOS only]">
+        TRY AGAIN
       </message>
-      <message name="IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_BUTTON" desc="This button signs the user out. Related to IDS_IOS_SIGNOUT_DIALOG_TITLE [iOS only].">
-        Sign Out
+      <message name="IDS_IOS_SNACKBAR_ACTION_UNDO" desc="The iOS snackbar action when succeed to unfollow a web content. [iOS only]">
+        UNDO
       </message>
-      <message name="IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_BUTTON" desc="Button title of a dialog shown to users when they sign out of Chrome but Chrome hasn't synced some data yet, which is permanently deleted if the user proceeds by pressing this button. Related to IDS_IOS_SIGNOUT_DIALOG_MESSAGE_WITH_NOT_SAVED_DATA and IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_TITLE [iOS only].">
-        Delete and Sign Out
+      <message name="IDS_IOS_SNACKBAR_MESSAGE_FOLLOW_FAILED" desc="The iOS snackbar message when failed to follow a web content. [iOS only]">
+        Can't follow. Something went wrong.
       </message>
-      <message name="IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_TITLE" desc="Title of a dialog shown to users when they sign out of Chrome but Chrome hasn't synced some data yet, which is permanently deleted if the user proceeds. IDS_IOS_SIGNOUT_DIALOG_MESSAGE_WITH_NOT_SAVED_DATA and IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_AND_DELETE_BUTTON [iOS only].">
-        Some Data Isn't Saved Yet
+      <message name="IDS_IOS_SNACKBAR_MESSAGE_FOLLOW_SUCCEED" desc="The iOS snackbar message when ssucceed to follow a web content. [iOS only]">
+        Following <ph name="CHANNEL_NAME">$1<ex>CNN</ex></ph>
       </message>
-      <message name="IDS_IOS_SIGNOUT_DIALOG_MESSAGE_WITH_SYNC" desc="The text describes that sync will be off when user signs out [iOS only].">
-        Signing out turns off sync.
+      <message name="IDS_IOS_SNACKBAR_MESSAGE_INCOGNITO_DISABLED" desc="The material toast message when incogonito mode is disabled by policy [iOS only].">
+        Your organization turned off Incognito mode
+      </message>
+      <message name="IDS_IOS_SNACKBAR_MESSAGE_INCOGNITO_DISABLED_BY_PARENT" desc="The material toast message when incogonito mode is disabled by parent [iOS only].">
+        Incognito Mode is Unavailable
+      </message>
+      <message name="IDS_IOS_SNACKBAR_MESSAGE_INCOGNITO_FORCED" desc="The material toast message when incogonito mode is forced by policy [iOS only].">
+        Your organization requires Incognito mode
+      </message>
+      <message name="IDS_IOS_SNACKBAR_MESSAGE_OFFLINE" desc="The iOS snackbar message when failed to follow/unfollow a web content because of offline. [iOS only]">
+        You're offline. Check your internet connection and try again.
+      </message>
+      <message name="IDS_IOS_SNACKBAR_MESSAGE_UNFOLLOW_FAILED" desc="The iOS snackbar message when failed to unfollow a web content. [iOS only]">
+        Can't unfollow. Something went wrong.
+      </message>
+      <message name="IDS_IOS_SNACKBAR_MESSAGE_UNFOLLOW_SUCCEED" desc="The iOS snackbar message when succeed to unfollow a web content. [iOS only]">
+        Unfollowed <ph name="CHANNEL_NAME">$1<ex>CNN</ex></ph>
+      </message>
+      <message name="IDS_IOS_SPEECH_RECOGNITION_USAGE_DESCRIPTION" desc="Specifies the reason for sending user data to Apple's speech recognition servers.">
+        This will let you use your voice with certain features on websites.
       </message>
       <message name="IDS_IOS_SPOTLIGHT_KEYWORD_EIGHT" desc="Keyword used in Spotlight that will be linked to the Chrome App. [iOS only]">
         Online
@@ -4338,15 +4612,6 @@
       <message name="IDS_IOS_SPOTLIGHT_KEYWORD_ONE" desc="Keyword used in Spotlight that will be linked to the Chrome App. [iOS only]">
         Incognito
       </message>
-      <message name="IDS_IOS_SYNC_ADDRESSES_DIALOG_TITLE" desc="Title of a dialog to enable saving addresses to the Google Account. This is shown to users who have chosen to encrypt their data with a custom passphrase. The dialog informs users that newly saved addresses will not be encrypted with their passphrase.">
-        Save Without Encryption
-      </message>
-      <message name="IDS_IOS_SYNC_ADDRESSES_DIALOG_MESSAGE" desc="Message of a dialog to enable saving addresses to the Google Account. This is shown to users who have chosen to encrypt their data with a custom passphrase. The dialog informs users that newly saved addresses will not be encrypted with their passphrase.">
-        Addresses aren't encrypted with your passphrase. This lets you use them in other Google services.
-      </message>
-      <message name="IDS_IOS_SYNC_ADDRESSES_DIALOG_CONTINUE" desc="Action of a dialog to enable saving addresses to the Google Account. If the user chose to continue, addresses will start syncing.">
-        Continue
-      </message>
       <message name="IDS_IOS_SPOTLIGHT_KEYWORD_SEVEN" desc="Keyword used in Spotlight that will be linked to the Chrome App. [iOS only]">
         Network
       </message>
@@ -4362,9 +4627,27 @@
       <message name="IDS_IOS_SPOTLIGHT_KEYWORD_TWO" desc="Keyword used in Spotlight that will be linked to the Chrome App. [iOS only]">
         Internet
       </message>
+      <message name="IDS_IOS_SPOTLIGHT_OPEN_TAB_LABEL" desc="Tag label title displayed for opent tabs spotlight items. [iOS only]">
+        Open Tab
+      </message>
+      <message name="IDS_IOS_SUGGESTED_STRONG_PASSWORD" desc="Text that shows a suggested generated password at user's request [Length: unlimited] [iOS only]">
+        Use Strong Password:
+      </message>
       <message name="IDS_IOS_SUGGESTIONS_DONE" desc="Label of the navigation bar button to close the view.">
         Done
       </message>
+      <message name="IDS_IOS_SUPERVISED_USER_UNAVAILABLE_SETTING_MESSAGE" desc="Text displayed to inform that the setting is not available for supervised user.">
+        This setting is unavailable.
+      </message>
+      <message name="IDS_IOS_SYNC_ADDRESSES_DIALOG_CONTINUE" desc="Action of a dialog to enable saving addresses to the Google Account. If the user chose to continue, addresses will start syncing.">
+        Continue
+      </message>
+      <message name="IDS_IOS_SYNC_ADDRESSES_DIALOG_MESSAGE" desc="Message of a dialog to enable saving addresses to the Google Account. This is shown to users who have chosen to encrypt their data with a custom passphrase. The dialog informs users that newly saved addresses will not be encrypted with their passphrase.">
+        Addresses aren't encrypted with your passphrase. This lets you use them in other Google services.
+      </message>
+      <message name="IDS_IOS_SYNC_ADDRESSES_DIALOG_TITLE" desc="Title of a dialog to enable saving addresses to the Google Account. This is shown to users who have chosen to encrypt their data with a custom passphrase. The dialog informs users that newly saved addresses will not be encrypted with their passphrase.">
+        Save Without Encryption
+      </message>
       <message name="IDS_IOS_SYNC_AUTHENTICATION_ERROR_ALERT_VIEW_TITLE" desc="The title of the alert view displaying authentication errors. [Length: 20em] [iOS only]">
         Error
       </message>
@@ -4383,9 +4666,6 @@
       <message name="IDS_IOS_SYNC_ENCRYPTION_DESCRIPTION" desc="The short description to display when the user need to enter its sync passphrase. [Length: 60em] [iOS only]">
         Passphrase required
       </message>
-      <message name="IDS_IOS_SYNC_VERIFY_ITS_YOU_BUTTON" desc="Button title displayed when the signed in user needs to reauthenticate. Syncing of encrypted types (e.g. passwords) is blocked until the user completes the reauth flow.">
-        Verify It's You
-      </message>
       <message name="IDS_IOS_SYNC_ENCRYPTION_TITLE" desc="The title for the Sync Encryption item [iOS only]">
         Encryption
       </message>
@@ -4398,9 +4678,6 @@
       <message name="IDS_IOS_SYNC_ERROR_DESCRIPTION" desc="The error message to display when a generic error prevents sync from starting.">
         Sync Isn't Working.
       </message>
-      <message name="IDS_IOS_SYNC_PASSWORDS_ERROR_DESCRIPTION" desc="The error message to display when a generic error prevents encrypted sync datatypes (passwords) from working.">
-        Password sync isn't working
-      </message>
       <message name="IDS_IOS_SYNC_ERROR_INFO_OUT_OF_DATE" desc="The error message to display when the accounts info are out of date. [Length: 100em, can be multiple lines] [iOS only]">
         Account sign-in details are out of date. Update to start sync.
       </message>
@@ -4428,101 +4705,117 @@
       <message name="IDS_IOS_SYNC_PASSPHRASE_ENCRYPTING" desc="The title for the passphrase page while it is encrypting. [Length: 21em] [iOS only]">
         Encrypting…
       </message>
+      <message name="IDS_IOS_SYNC_PASSWORDS_ERROR_DESCRIPTION" desc="The error message to display when a generic error prevents encrypted sync datatypes (passwords) from working.">
+        Password sync isn't working
+      </message>
       <message name="IDS_IOS_SYNC_PASSWORDS_ERROR_TITLE" desc="Title of the error message shown for sync errors when it affects passwords only. [iOS only]">
         Password Sync Isn't Working
       </message>
-      <message name="IDS_SYNC_NEEDS_VERIFICATION_TITLE" desc="Title of the error message shown when sync needs to verify the user. [iOS only]">
-        Sync Needs To Verify It's You
-      </message>
-      <message name="IDS_IOS_PARENT_MANAGED_POPOVER_TEXT" desc="This text is shown when parental controls are enabled for a supervised user which affects settings.">
-      Managed by your parent
+      <message name="IDS_IOS_SYNC_PROMO_TURN_ON_SYNC" desc="Button that the user can press if they want to turn on sync with this account. [iOS only]">
+        Turn On Sync
       </message>
       <message name="IDS_IOS_SYNC_SETTINGS_DISABLED_POPOVER_TEXT" desc="This text is shown when sync is disabled by an enterprise policy and the user taps on the info pop-over of the Sync button in the settings.">
        Your organization requires you to turn off sync.
       </message>
+      <message name="IDS_IOS_SYNC_SETTINGS_TITLE" desc="Title for the navigation item in Advanced Settings. [Length: 26em] [iOS only]">
+        Sync
+      </message>
       <message name="IDS_IOS_SYNC_SIGN_IN_AGAIN_BUTTON" desc="Button title displayed when the signed in user needs sign in again. [Length: 20em] [iOS only]">
         Sign in again
       </message>
       <message name="IDS_IOS_SYNC_STATUS_UNRECOVERABLE_ERROR" desc="Message shown throughout the sync settings screens when there is an unrecoverable error. [Length: 80em, can be multiple lines] [iOS only]">
         Sync has stopped working.
       </message>
-      <message name="IDS_IOS_SYNC_UPDATE_CREDENTIALS_BUTTON" desc="Button title displayed when the signed in user needs to update its credentials. [Length: 20em] [iOS only]">
-        Update
-      </message>
       <message name="IDS_IOS_SYNC_SYNC_DISABLED_CONTINUE" desc="The text in the 'Continue' button, displayed in a one-time alert when sync is disabled by policy.">
         Continue
       </message>
       <message name="IDS_IOS_SYNC_SYNC_DISABLED_LEARN_MORE" desc="The text in the 'Learn More' button, displayed in a one-time alert when sync is disabled by policy.">
         Learn More
       </message>
-      <message name="IDS_IOS_TAB_GRID_DONE_BUTTON" desc="Title of the Done button in the tab grid UI. [iOS only]">
-        Done
+      <message name="IDS_IOS_SYNC_UPDATE_CREDENTIALS_BUTTON" desc="Button title displayed when the signed in user needs to update its credentials. [Length: 20em] [iOS only]">
+        Update
       </message>
-      <message name="IDS_IOS_TAB_GRID_CANCEL_BUTTON" desc="Title of the Cancel button in the tab grid search UI. [iOS only]">
-        Cancel
+      <message name="IDS_IOS_SYNC_VERIFY_ITS_YOU_BUTTON" desc="Button title displayed when the signed in user needs to reauthenticate. Syncing of encrypted types (e.g. passwords) is blocked until the user completes the reauth flow.">
+        Verify It's You
       </message>
-      <message name="IDS_IOS_TAB_GRID_SEARCHBAR_PLACEHOLDER" desc="Placeholder text for the search bar used to search tabs on the tab grid. [iOS only]">
-        Search Tabs...
+      <message name="IDS_IOS_TABLE_VIEW_INFO_BUTTON_ITEM_ACCESSIBILITY_TAP" desc="Accessibility hint for info button items that have a tap functionality.">
+        Button
       </message>
-      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_BUTTON" desc="Title of the button in the tab grid UI that closes all the tabs in the grid. [iOS only]">
-        Close All
+      <message name="IDS_IOS_TABS_MANAGEMENT_SETTINGS" desc="Title for the tabs management panel in settings [Length: 30em] [iOS only]">
+        Tabs
       </message>
-      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_TABS" desc="Title of the button in the action sheet that close all tabs. [iOS only]">
-        Close All
+      <message name="IDS_IOS_TABS_SEARCH_OPEN_TABS_COUNT" desc="The number of the open tabs found as search results in the tab grid.">
+        <ph name="COUNT">$1<ex>2</ex></ph> Found
       </message>
-      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_TABS_ACTION_SHEET_TITLE" desc="Title of the action sheet that confirms closing all tabs or non-pinned tabs only. [iOS only]">
-        Close All Tabs?
+      <message name="IDS_IOS_TABS_SEARCH_OPEN_TABS_SECTION_HEADER_TITLE" desc="Section header for the section that contains all the open tabs from the search results.">
+        Open Tabs
       </message>
-      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_TABS_ACTION_SHEET_MESSAGE" desc="Message of the action sheet that confirms closing all tabs or non-pinned tabs only. [iOS only]">
-        Closing all tabs will close pinned tabs as well.
+      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTIONS" desc="Section header for the suggested actions section shown in the tab grid at the bottom of search results.">
+        Suggested
       </message>
-      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_TABS_CONFIRMATION" desc="Title of the button in the action sheet that close all tabs. COUNT refers to the number of tabs open. According to its value, the string goes from singular to plural. [iOS only]">
-        {COUNT, plural,
-             =1 {Close {COUNT} Tab}
-             other {Close {COUNT} Tabs}}
+      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_HISTORY" desc="Title for a suggested action presented at the end of search results to search through web history for the same search term. The number of matching items within history are shown inside the parenthesis.">
+        Search History (<ph name="COUNT">$1<ex>12</ex></ph> Found)
       </message>
-      <message name="IDS_IOS_TAB_GRID_UNDO_CLOSE_ALL_BUTTON" desc="Title of the button in the tab grid UI that revert the close all action recently taken by the user. [iOS only]">
-        Undo
+      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_HISTORY_UNKNOWN_RESULT_COUNT" desc="Title for a suggested action presented at the end of search results to search through web history for the same search term.">
+        Search History
       </message>
-      <message name="IDS_IOS_TAB_GRID_EDIT_BUTTON" desc="Title of the button in the tab grid UI that triggers a context menu with options to select tabs for bulk actions or to close all tabs. [iOS only]">
-        Edit
+      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_OPEN_TABS" desc="Title for a suggested action presented at the end of search results to search through open tabs for the same search term.">
+        Search Open Tabs
       </message>
-      <message name="IDS_IOS_TAB_GRID_CLOSE_TABS_BUTTON" desc="Title of the button in the tab grid UI that the closes selected tabs. count refers to the number of tabs selected. According to its value, the string goes from signular to plural. [iOS only]">
-        {count, plural,
-          =1 {Close Tab}
-          other {Close Tabs}}
+      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_RECENT_TABS" desc="Title for a suggested action presented at the end of search results to search through recent tabs for the same search term.">
+        Search Recent Tabs
+      </message>
+      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_WEB" desc="Title for a suggested action presented at the end of search results to search the web for the same search term.">
+        Search on Web
       </message>
       <message name="IDS_IOS_TAB_GRID_ADD_TO_BUTTON" desc="Title of the button in the tab grid UI that when tapped, will provide the user with a menu to add selected tabs to bookmarks or to the reading list. [iOS only]">
         Add To...
       </message>
+      <message name="IDS_IOS_TAB_GRID_CANCEL_BUTTON" desc="Title of the Cancel button in the tab grid search UI. [iOS only]">
+        Cancel
+      </message>
       <message name="IDS_IOS_TAB_GRID_CELL_DESELECTED" desc="Accessibility value of a tab grid cell while the tab grid is in edit mode. This string is read by VoiceOver to describe the state of a tab grid cell which is not currently selected.">
           Not Selected
       </message>
       <message name="IDS_IOS_TAB_GRID_CELL_SELECTED" desc="Accessibility value of a tab grid cell while the tab grid is in edit mode. This string is read by VoiceOver to describe the state of a tab grid cell which is currently selected.">
           Selected
       </message>
+      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_BUTTON" desc="Title of the button in the tab grid UI that closes all the tabs in the grid. [iOS only]">
+        Close All
+      </message>
+      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_TABS" desc="Title of the button in the action sheet that close all tabs. [iOS only]">
+        Close All
+      </message>
+      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_TABS_ACTION_SHEET_MESSAGE" desc="Message of the action sheet that confirms closing all tabs or non-pinned tabs only. [iOS only]">
+        Closing all tabs will close pinned tabs as well.
+      </message>
+      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_TABS_ACTION_SHEET_TITLE" desc="Title of the action sheet that confirms closing all tabs or non-pinned tabs only. [iOS only]">
+        Close All Tabs?
+      </message>
+      <message name="IDS_IOS_TAB_GRID_CLOSE_ALL_TABS_CONFIRMATION" desc="Title of the button in the action sheet that close all tabs. COUNT refers to the number of tabs open. According to its value, the string goes from singular to plural. [iOS only]">
+        {COUNT, plural,
+             =1 {Close {COUNT} Tab}
+             other {Close {COUNT} Tabs}}
+      </message>
+      <message name="IDS_IOS_TAB_GRID_CLOSE_TABS_BUTTON" desc="Title of the button in the tab grid UI that the closes selected tabs. count refers to the number of tabs selected. According to its value, the string goes from signular to plural. [iOS only]">
+        {count, plural,
+          =1 {Close Tab}
+          other {Close Tabs}}
+      </message>
+      <message name="IDS_IOS_TAB_GRID_CREATE_NEW_INCOGNITO_TAB" desc="The accessibility label for the button that creates new Incognito tabs. [iOS only]">
+        Create new Incognito tab.
+      </message>
+      <message name="IDS_IOS_TAB_GRID_CREATE_NEW_TAB" desc="The accessibility label for the button that creates new regular tabs (as opposed to Incognito tabs). [iOS only]">
+        Create New Tab
+      </message>
       <message name="IDS_IOS_TAB_GRID_DESELECT_ALL_BUTTON" desc="Title of the button in the tab grid UI selection mode, when tapped it will mark all tabs deselected.">
           Deselect All
           </message>
-      <message name="IDS_IOS_TAB_GRID_SELECT_ALL_BUTTON" desc="Title of the button in the tab grid UI selection mode, when tapped it will mark all tabs selected.">
-          Select All
-          </message>
-      <message name="IDS_IOS_TAB_GRID_SELECT_TABS_TITLE" desc="Title shown in the tab grid selection mode when no tab is selected. [iOS only]">
-              Select Tabs
+      <message name="IDS_IOS_TAB_GRID_DONE_BUTTON" desc="Title of the Done button in the tab grid UI. [iOS only]">
+        Done
       </message>
-      <message name="IDS_IOS_TAB_GRID_SELECTED_TABS_TITLE" desc="Title shown in the tab grid selection mode to indicate the number of selected tabs. count refers to the number of tabs selected. According to its value, the string goes from singular to plural. [iOS only]">
-        {count, plural,
-          =1 {{count} Tab}
-          other {{count} Tabs}}
-      </message>
-      <message name="IDS_IOS_TAB_GRID_INCOGNITO_TABS_TITLE" desc="The accessibility label of the Incognito Tabs page in the tab grid UI. [iOS only]">
-        Incognito Tabs
-      </message>
-      <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_TITLE" desc="The accessibility label of the Regular Tabs page (as opposed to the Incognito Tabs page) in the tab grid UI. [iOS only]">
-        Open Tabs
-      </message>
-      <message name="IDS_IOS_TAB_GRID_REMOTE_TABS_TITLE" desc="The accessibility label of the Remote Tabs page in the tab grid UI. [iOS only]">
-        Tabs from other devices
+      <message name="IDS_IOS_TAB_GRID_EDIT_BUTTON" desc="Title of the button in the tab grid UI that triggers a context menu with options to select tabs for bulk actions or to close all tabs. [iOS only]">
+        Edit
       </message>
       <message name="IDS_IOS_TAB_GRID_INCOGNITO_TABS_EMPTY_MESSAGE" desc="Message shown in the Incognito Tabs page when the grid is empty, explaining that the user can open a new tab.">
         To browse the web privately, add a new tab
@@ -4530,14 +4823,13 @@
       <message name="IDS_IOS_TAB_GRID_INCOGNITO_TABS_EMPTY_TITLE" desc="Title shown above a message on the Incognito tab switcher when there are no Incognito tabs. [iOS only]">
         You'll find your Incognito tabs here
       </message>
+      <message name="IDS_IOS_TAB_GRID_INCOGNITO_TABS_TITLE" desc="The accessibility label of the Incognito Tabs page in the tab grid UI. [iOS only]">
+        Incognito Tabs
+      </message>
       <message name="IDS_IOS_TAB_GRID_INCOGNITO_TABS_UNAVAILABLE_MESSAGE" desc="Message shown in the Incognito Tabs page of the tab grid when the IncognitoModeAvailability enterprise policy is set to disabled. [iOS only]">
         Your organization turned off private browsing.
 <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_TAB_GRID_SUPERVISED_INCOGNITO_MESSAGE" desc="Message shown in the Incognito Tabs page of the tab grid when a supervised user tries to access incognito mode. [iOS only]">
-        Your account is managed by your parent.
-<ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
-      </message>
       <message name="IDS_IOS_TAB_GRID_INCOGNITO_TABS_UNAVAILABLE_TITLE" desc="Title shown above a message in the Incognito Tabs page of the tab grid when the IncognitoModeAvailability enterprise policy is set to disabled. [iOS only]">
         Incognito Mode is Unavailable
       </message>
@@ -4548,11 +4840,14 @@
       <message name="IDS_IOS_TAB_GRID_RECENT_TABS_UNAVAILABLE_TITLE" desc="Title shown above a message in the Recent Tabs page of the tab grid when the IncognitoModeAvailability enterprise policy is set to forced. [iOS only]">
         Recent Tabs are Unavailable
       </message>
+      <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_EMPTY_MESSAGE" desc="Message shown underneath a title on the regular tab switcher when there are no tabs, explaining why to use the regular tab switcher. [iOS only]">
+        Open tabs to visit different pages at the same time
+      </message>
       <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_EMPTY_TITLE" desc="Title shown above a message on the regular tab switcher when there are no tabs. [iOS only]">
         You'll find your tabs here
       </message>
-      <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_EMPTY_MESSAGE" desc="Message shown underneath a title on the regular tab switcher when there are no tabs, explaining why to use the regular tab switcher. [iOS only]">
-        Open tabs to visit different pages at the same time
+      <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_TITLE" desc="The accessibility label of the Regular Tabs page (as opposed to the Incognito Tabs page) in the tab grid UI. [iOS only]">
+        Open Tabs
       </message>
       <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_UNAVAILABLE_MESSAGE" desc="Message shown in the Regular Tabs page of the tab grid when the IncognitoModeAvailability enterprise policy is set to forced. [iOS only]">
         Your organization requires you to browse privately.
@@ -4561,14 +4856,32 @@
       <message name="IDS_IOS_TAB_GRID_REGULAR_TABS_UNAVAILABLE_TITLE" desc="Title shown above a message in the Regular Tabs page of the tab grid when the IncognitoModeAvailability enterprise policy is set to forced. [iOS only]">
         Only Incognito Mode is Available
       </message>
+      <message name="IDS_IOS_TAB_GRID_REMOTE_TABS_TITLE" desc="The accessibility label of the Remote Tabs page in the tab grid UI. [iOS only]">
+        Tabs from other devices
+      </message>
+      <message name="IDS_IOS_TAB_GRID_SEARCHBAR_PLACEHOLDER" desc="Placeholder text for the search bar used to search tabs on the tab grid. [iOS only]">
+        Search Tabs...
+      </message>
       <message name="IDS_IOS_TAB_GRID_SEARCH_RESULTS_EMPTY_TITLE" desc="Title shown above a message on the  tab switcher when there are no matching tabs for the given search terms. [iOS only]">
         No Results Found
       </message>
-      <message name="IDS_IOS_TAB_GRID_CREATE_NEW_INCOGNITO_TAB" desc="The accessibility label for the button that creates new Incognito tabs. [iOS only]">
-        Create new Incognito tab.
+      <message name="IDS_IOS_TAB_GRID_SELECTED_TABS_TITLE" desc="Title shown in the tab grid selection mode to indicate the number of selected tabs. count refers to the number of tabs selected. According to its value, the string goes from singular to plural. [iOS only]">
+        {count, plural,
+          =1 {{count} Tab}
+          other {{count} Tabs}}
       </message>
-      <message name="IDS_IOS_TAB_GRID_CREATE_NEW_TAB" desc="The accessibility label for the button that creates new regular tabs (as opposed to Incognito tabs). [iOS only]">
-        Create New Tab
+      <message name="IDS_IOS_TAB_GRID_SELECT_ALL_BUTTON" desc="Title of the button in the tab grid UI selection mode, when tapped it will mark all tabs selected.">
+          Select All
+          </message>
+      <message name="IDS_IOS_TAB_GRID_SELECT_TABS_TITLE" desc="Title shown in the tab grid selection mode when no tab is selected. [iOS only]">
+              Select Tabs
+      </message>
+      <message name="IDS_IOS_TAB_GRID_SUPERVISED_INCOGNITO_MESSAGE" desc="Message shown in the Incognito Tabs page of the tab grid when a supervised user tries to access incognito mode. [iOS only]">
+        Your account is managed by your parent.
+<ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      </message>
+      <message name="IDS_IOS_TAB_GRID_UNDO_CLOSE_ALL_BUTTON" desc="Title of the button in the tab grid UI that revert the close all action recently taken by the user. [iOS only]">
+        Undo
       </message>
       <message name="IDS_IOS_TAB_PICKUP_BANNER_BUTTON" desc="Infobar button to open a previously opened tab from another device.">
         Open
@@ -4576,51 +4889,24 @@
       <message name="IDS_IOS_TAB_PICKUP_BANNER_TITLE" desc="Infobar title to open a previously opened tab from another device.">
         Last Tab Used on <ph name="SOURCE_DEVICE">$1<ex>iPad</ex></ph>
       </message>
-      <message name="IDS_IOS_TAB_RESUMPTION_JUST_NOW" desc="String indicating that the presented tab was synced less than 1 minute ago.">
-        just now
-      </message>
       <message name="IDS_IOS_TAB_RESUMPTION_CONTEXT_MENU_DESCRIPTION" desc="Descripiton for the long-press context menu of the module that presents the last opened tab, on the new tab page.">
         Hide "Continue Browsing"
       </message>
       <message name="IDS_IOS_TAB_RESUMPTION_CONTEXT_MENU_TITLE" desc="Title for the long-press context menu of the module that presents the last opened tab, on the new tab page.">
           This card shows your last used open tab across all your synced devices within the last 24 hours.
       </message>
+      <message name="IDS_IOS_TAB_RESUMPTION_JUST_NOW" desc="String indicating that the presented tab was synced less than 1 minute ago.">
+        just now
+      </message>
       <message name="IDS_IOS_TAB_RESUMPTION_TAB_TITLE_PLACEHOLDER" desc="Label displayed when the last opened tab title is empty. This module presents the last open tab, on the new tab page.">
         Your Last Open Tab
       </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_CONTEXT_MENU_DESCRIPTION" desc="Descripiton for the long-press context menu of the parcel tracking module.">
-        Hide "<ph name="Module_Name"><ex>Package Tracking</ex>$1</ph>"
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_CONTEXT_MENU_TITLE" desc="Title for the long-press context menu of the parcel tracking module.">
-          This card helps you keep track of your packages and give you important delivery updates.
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_CONTEXT_MENU_UNTRACK" desc="Title for the untrack parcel option of the parcel tracking module.">
-          Untrack this package
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_TITLE" desc="Title for the alert dialog warning the user they are about to hide the parcel tracking module.">
-          Hiding This Card Will Turn Off Package Tracking and Remove All Your Data
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_CANCEL" desc="Title for the item to cancel disabling the Parcel Tracking feature. ">
-          Cancel
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_UNTRACK_SNACKBAR_TITLE" desc="Title for the snackbar indicating a parcel has been untracked. ">
-          Stopped tracking this package
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_CARRIER_FEDEX" desc="Name of FEDEX Carrier">
-          FEDEX
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_CARRIER_UPS" desc="Name of UPS Carrier">
-          UPS
-      </message>
-      <message name="IDS_IOS_PARCEL_TRACKING_CARRIER_USPS" desc="Name of USPS Carrier">
-          USPS
+      <message name="IDS_IOS_TAB_RESUMPTION_TILE_HOST_LABEL" desc="Label that displays the name of the last synced device. This module presents the last open tab, on the new tab page.">
+        From "<ph name="SOURCE_DEVICE">$1<ex>iPad</ex></ph>"
       </message>
       <message name="IDS_IOS_TAB_RESUMPTION_TITLE" desc="Title for the module that presents the last opened tab, on the new tab page.">
         Continue Browsing
       </message>
-      <message name="IDS_IOS_TAB_RESUMPTION_TILE_HOST_LABEL" desc="Label that displays the name of the last synced device. This module presents the last open tab, on the new tab page.">
-        From "<ph name="SOURCE_DEVICE">$1<ex>iPad</ex></ph>"
-      </message>
       <message name="IDS_IOS_TAB_STRIP_ENTER_TAB_SWITCHER" desc="The accessibility label of the tab strip button to enter the tab switcher. The tab switcher is a view showing the opened tabs, and allows users to switch, close, and open new tabs. [iOS only]">
         Enter Tab Switcher
       </message>
@@ -4669,65 +4955,35 @@
       <message name="IDS_IOS_TAB_SWITCHER_SYNC_IS_OFF" desc="Short paragraph(s) encouraging the user to enable sync on device [Length: 300em, may be line wrapped to multiple lines at run time.] [iOS only]">
           To get your tabs from your other devices, turn on sync.
       </message>
-      <message name="IDS_IOS_TABS_SEARCH_OPEN_TABS_SECTION_HEADER_TITLE" desc="Section header for the section that contains all the open tabs from the search results.">
-        Open Tabs
+      <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_TITLE" desc="Title shown in the iOS message when the account tailored security setting is disabled for a consented primary account">
+        Enhanced Protection is Off
       </message>
-      <message name="IDS_IOS_TABS_SEARCH_OPEN_TABS_COUNT" desc="The number of the open tabs found as search results in the tab grid.">
-        <ph name="COUNT">$1<ex>2</ex></ph> Found
+      <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_TITLE" desc="Title shown in the iOS message when the account tailored security setting is enabled for a consented primary account">
+        Enhanced Protection is On
       </message>
-      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTIONS" desc="Section header for the suggested actions section shown in the tab grid at the bottom of search results.">
-        Suggested
+      <message name="IDS_IOS_TAILORED_SECURITY_TURN_ON_ACTION_TITLE" desc="Action shown in the iOS message when the account tailored security setting is enabled for an unconsented primary account">
+        Turn On
       </message>
-      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_HISTORY" desc="Title for a suggested action presented at the end of search results to search through web history for the same search term. The number of matching items within history are shown inside the parenthesis.">
-        Search History (<ph name="COUNT">$1<ex>12</ex></ph> Found)
+      <message name="IDS_IOS_TAILORED_SECURITY_UNCONSENTED_ENABLE_MESSAGE_TITLE" desc="Title shown in the iOS message when the account tailored security setting is enabled for an unconsented primary account">
+        More Security?
       </message>
-      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_HISTORY_UNKNOWN_RESULT_COUNT" desc="Title for a suggested action presented at the end of search results to search through web history for the same search term.">
-        Search History
-      </message>
-      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_OPEN_TABS" desc="Title for a suggested action presented at the end of search results to search through open tabs for the same search term.">
-        Search Open Tabs
-      </message>
-      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_RECENT_TABS" desc="Title for a suggested action presented at the end of search results to search through recent tabs for the same search term.">
-        Search Recent Tabs
-      </message>
-      <message name="IDS_IOS_TABS_SEARCH_SUGGESTED_ACTION_SEARCH_WEB" desc="Title for a suggested action presented at the end of search results to search the web for the same search term.">
-        Search on Web
-      </message>
-      <message name="IDS_IOS_TANGIBLE_SYNC_DISCLAIMER" desc="This string appears in the footer on a full-page screen that asks users if they want to turn on sync. 'Sync' is short for 'synchronization'. The first sentence informs the user where they can go to change their mind or to customize what Chrome/Chromium data types they choose to sync (a user's Chrome/Chromium data includes their bookmarks, passwords, history, settings, and more). The second sentence informs the user that if they choose to sync, then their history may be used to personalize Search and other services. Translate 'history' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=59c3162. [iOS only][CHAR_LIMIT=200].">
-        You can always choose what to sync in <ph name="BEGIN_LINK">BEGIN_LINK</ph>settings<ph name="END_LINK">END_LINK</ph>. Google may personalize Search and other services based on your history.
-      </message>
+      <message name="IDS_IOS_TANGIBLE_SYNC_DATA_TYPE_AUTOFILL" desc="This string appears as an item in a list of sync data types on a full-page screen that asks users if they want to turn on sync. Translate 'autofill' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=77d3626. [iOS only][CHAR_LIMIT=25]">
+        Autofill
+        </message>
       <message name="IDS_IOS_TANGIBLE_SYNC_DATA_TYPE_BOOKMARKS" desc="This string appears as an item in a list of sync data types on a full-page screen that asks users if they want to turn on sync. Translate 'bookmarks' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=59c31bb. [iOS only][CHAR_LIMIT=25]">
         Bookmarks
       </message>
       <message name="IDS_IOS_TANGIBLE_SYNC_DATA_TYPE_HISTORY" desc="This string appears as an item in a list of sync data types on a full-page screen that asks users if they want to turn on sync. Translate 'history' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=59c3162. Translate 'and more' so that it conveys that there are additional similar items that are not listed. [iOS only][CHAR_LIMIT=30]">
         History and more
       </message>
-      <message name="IDS_IOS_TANGIBLE_SYNC_DATA_TYPE_AUTOFILL" desc="This string appears as an item in a list of sync data types on a full-page screen that asks users if they want to turn on sync. Translate 'autofill' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=77d3626. [iOS only][CHAR_LIMIT=25]">
-        Autofill
-        </message>
-      <message name="IDS_IOS_TANGIBLE_SYNC_TITLE_TURN_ON_SYNC" desc="This string appears as a heading on a full-page screen that asks users if they want to turn on sync. 'Sync' is short for 'synchronization'. The tone should be informative and inviting. [iOS only][CHAR_LIMIT=35]">
-        Turn On Sync
+      <message name="IDS_IOS_TANGIBLE_SYNC_DISCLAIMER" desc="This string appears in the footer on a full-page screen that asks users if they want to turn on sync. 'Sync' is short for 'synchronization'. The first sentence informs the user where they can go to change their mind or to customize what Chrome/Chromium data types they choose to sync (a user's Chrome/Chromium data includes their bookmarks, passwords, history, settings, and more). The second sentence informs the user that if they choose to sync, then their history may be used to personalize Search and other services. Translate 'history' according to https://localization.google.com/glossary/termset?gid=27517723&amp;tsid=59c3162. [iOS only][CHAR_LIMIT=200].">
+        You can always choose what to sync in <ph name="BEGIN_LINK">BEGIN_LINK</ph>settings<ph name="END_LINK">END_LINK</ph>. Google may personalize Search and other services based on your history.
       </message>
       <message name="IDS_IOS_TANGIBLE_SYNC_SUBTITLE_BACK_UP" desc="This string appears as a subheading a full-page screen that asks users if they want to turn on sync. This string explains to users that they can back up their Chrome/Chromium data and use it on all their computers, phones, and other devices; a user's Chrome/Chromium data includes their bookmarks, passwords, history, settings, and more. The word 'stuff' can be translated as 'data' or similar if there is no natural translation of 'stuff'. Maintain the level of formality that your language generally uses in the Chrome/Chromium app. The tone should be informative and inviting. [iOS only][CHAR_LIMIT=100]">
         Back up your stuff and use it on any device.
       </message>
-      <message name="IDS_IOS_HISTORY_SYNC_TITLE" desc="Title of a page that asks users to start syncing their tabs and browsing history, so they can get back to sites they visited more quickly without having to type them, for example by seeing these sites suggested in the Omnibox.">
-        Save Time, Type Less
-      </message>
-      <message name="IDS_IOS_HISTORY_SYNC_SUBTITLE" desc="Text of a page that asks users to start syncing their tabs and browsing history, so they can get back to sites they visited more quickly without having to type them, for example by seeing these sites suggested in the Omnibox.">
-        To quickly get back to sites you've visited, sync your tabs and history.
-      </message>
-      <message name="IDS_IOS_HISTORY_SYNC_PRIMARY_ACTION" desc="Title of the button to validate the user consent to sync their history and tabs data.">
-        Yes, I'm In
-      </message>
-      <message name="IDS_IOS_HISTORY_SYNC_SECONDARY_ACTION" desc="Title of the button to refuse to give the  consent to sync their history and tabs data.">
-        No Thanks
-      </message>
-      <message name="IDS_IOS_HISTORY_SYNC_FOOTER_WITH_EMAIL" desc="Small text above the main button on a page that asks users to start syncing their tabs and browsing history. The first sentence reminds the user that they're signed in with a certain account. The second sentence is meant to reassure users that they can always change their mind and opt out again. The third sentence explains how history data may be used to personalise the user's experience in other services. The tone should be friendly and reassuring.">
-        You are signed in as <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>. You can stop syncing anytime in settings. Google may personalize Search and other services based on your history.
-      </message>
-      <message name="IDS_IOS_HISTORY_SYNC_FOOTER_WITHOUT_EMAIL" desc="Small text above the main button on a page that asks users to start syncing their tabs and browsing history. The first sentence is meant to reassure users that they can always change their mind and opt out again. Separately, the second sentence explains how history data may be used to personalise the user's experience in other services.  The tone should be friendly and reassuring.">
-        You can stop syncing anytime in settings. Google may personalize Search and other services based on your history.
+      <message name="IDS_IOS_TANGIBLE_SYNC_TITLE_TURN_ON_SYNC" desc="This string appears as a heading on a full-page screen that asks users if they want to turn on sync. 'Sync' is short for 'synchronization'. The tone should be informative and inviting. [iOS only][CHAR_LIMIT=35]">
+        Turn On Sync
       </message>
       <message name="IDS_IOS_TERMS_OF_SERVICE" desc="The label to access the terms of service, displayed in the application settings, with no product name. [Length: 30em] [iOS only]">
         Terms of Service
@@ -4747,6 +5003,12 @@
       <message name="IDS_IOS_TOOLBAR_CLOSE_MENU" desc="The accessibility label for the toolbar close settings menu button [iOS only].">
         Close Menu
       </message>
+      <message name="IDS_IOS_TOOLBAR_MENU_BOTTOM_OMNIBOX" desc="The iOS menu item for moving the address bar to the bottom of the screen [iOS only]. In title case.">
+        Move Address Bar To Bottom
+      </message>
+      <message name="IDS_IOS_TOOLBAR_MENU_TOP_OMNIBOX" desc="The iOS menu item for moving the address bar to the top of the screen [iOS only]. In title case.">
+        Move Address Bar To Top
+      </message>
       <message name="IDS_IOS_TOOLBAR_SEARCH" desc="Label of the button allowing the user to focus the address bar when tapped. As usual, when the address bar is focused, the user can type a URL or a text to be searched on the internet. Read by Text-to-Speech." meaning="Search the internet. Read by Text-to-Speech.">
         Search
       </message>
@@ -4759,12 +5021,6 @@
       <message name="IDS_IOS_TOOLBAR_SHOW_TAB_GRID" desc="The accessibility label for the toolbar show tab grid button [iOS only].">
         Show Tab Grid
       </message>
-      <message name="IDS_IOS_TOOLBAR_MENU_TOP_OMNIBOX" desc="The iOS menu item for moving the address bar to the top of the screen [iOS only]. In title case.">
-        Move Address Bar To Top
-      </message>
-      <message name="IDS_IOS_TOOLBAR_MENU_BOTTOM_OMNIBOX" desc="The iOS menu item for moving the address bar to the bottom of the screen [iOS only]. In title case.">
-        Move Address Bar To Bottom
-      </message>
       <message name="IDS_IOS_TOOLS_MENU" desc="The accessibility label for the iOS tools menu [iOS only]">
         Tools Menu
       </message>
@@ -4774,6 +5030,9 @@
       <message name="IDS_IOS_TOOLS_MENU_BOOKMARKS" desc="The iOS menu item for opening the bookmarks manager [Length: 15em] [iOS only]">
         Bookmarks
       </message>
+      <message name="IDS_IOS_TOOLS_MENU_CELL_NEW_FEATURE_BADGE" desc="Title and accessibility label of the badge displayed on a tools menu item when it represents a new feature [Length: 20em]" meaning="A badge with this title is displayed informing the user that this feature that is new to them.">
+        New
+      </message>
       <message name="IDS_IOS_TOOLS_MENU_CLEAR_BROWSING_DATA" desc="The iOS menu item to open the Clear Browsing Data screen [iOS only]" meaning="[Length: unlimited]">
         Clear Browsing Data
       </message>
@@ -4786,33 +5045,24 @@
       <message name="IDS_IOS_TOOLS_MENU_CLOSE_TAB" desc="The iOS menu item for closing a tab [iOS only]" meaning="[Length: unlimited]">
         Close Tab
       </message>
+      <message name="IDS_IOS_TOOLS_MENU_DOWNLOADS" desc="The iOS menu item for opening the downloads folder [iOS only]" meaning="[Length: unlimited]">
+        Downloads
+      </message>
       <message name="IDS_IOS_TOOLS_MENU_EDIT_BOOKMARK" desc="The iOS menu item for editing a bookmark. This is a verb." meaning="Edit the current bookmark [Length: unlimited] [Verb]">
         Edit Bookmark
       </message>
-      <message name="IDS_IOS_TOOLS_MENU_ENTERPRISE_MANAGED" desc="Text displayed to inform the user that the browser is managed by Enterprise policies at the bottom of the overflow menu (without link). [iOS only]">
-        Managed by your organization
-      </message>
       <message name="IDS_IOS_TOOLS_MENU_ENTERPRISE_LEARN_MORE" desc="Link displayed to allow the user to learn more why the browser is managed by Enterprise policies. Shown at the bottom of the overflow menu. [iOS only]">
         Learn More
       </message>
-      <message name="IDS_IOS_TOOLS_MENU_PARENT_MANAGED" desc="Text displayed to inform the user that the browser is managed by their parent at the bottom of the overflow menu (without link). [iOS only]">
-        Managed by your parent
-      </message>
-      <message name="IDS_IOS_TOOLS_MENU_PARENT_LEARN_MORE" desc="Link displayed to allow the user to learn more why the browser is managed by their parent. Shown at the bottom of the overflow menu. [iOS only]">
-        Learn More
-      </message>
-      <message name="IDS_IOS_TOOLS_MENU_FOLLOW" desc="The iOS menu item for following web content. [iOS only]">
-        Follow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_TOOLS_MENU_UNFOLLOW" desc="The iOS menu item for unfollowing web content. [iOS only]">
-        Unfollow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_TOOLS_MENU_TRANSLATE" desc="The iOS menu item for translating the current page [iOS only]" meaning="Open the translate infobar [Length: unlimited]">
-        Translate
+      <message name="IDS_IOS_TOOLS_MENU_ENTERPRISE_MANAGED" desc="Text displayed to inform the user that the browser is managed by Enterprise policies at the bottom of the overflow menu (without link). [iOS only]">
+        Managed by your organization
       </message>
       <message name="IDS_IOS_TOOLS_MENU_FIND_IN_PAGE" desc="The iOS menu item for searching in the current page [iOS only]" meaning="Open the Find In Page menu [Length: unlimited]">
         Find in Page…
       </message>
+      <message name="IDS_IOS_TOOLS_MENU_FOLLOW" desc="The iOS menu item for following web content. [iOS only]">
+        Follow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
+      </message>
       <message name="IDS_IOS_TOOLS_MENU_HELP_MOBILE" desc="The Tools menu item for bringing up online help page." meaning="Open the help menu [Length: unlimited]">
         Help
       </message>
@@ -4822,6 +5072,9 @@
       <message name="IDS_IOS_TOOLS_MENU_HISTORY" desc="The Tools menu item for opening the navigation history menu">
         History
       </message>
+      <message name="IDS_IOS_TOOLS_MENU_LENS_CAMERA_SEARCH" desc="The iOS menu item for searching images with the device camera using Google Lens.">
+        Lens Camera Search
+      </message>
       <message name="IDS_IOS_TOOLS_MENU_LENS_COPIED_IMAGE" desc="If a user has an image on their clipboard, this string will appear as an option when the user long-presses on Chrome's search icon and Lens is enabled. The user can select this option to search the image using Lens. This string is a complete sentence. If necessary for your language, you can translate as 'Lens Image That You Copied.'" meaning="[Length:Unlimited]">
         Lens Image You Copied
       </message>
@@ -4837,6 +5090,15 @@
       <message name="IDS_IOS_TOOLS_MENU_NEW_TAB" desc="The iOS menu item for opening a new tab [iOS only]" meaning="Tools menu entry to create a new tab. [Length: Unlimited]">
         New Tab
       </message>
+      <message name="IDS_IOS_TOOLS_MENU_NEW_WINDOW" desc="The iOS menu item for opening a new window [iOS only]" meaning="[Length: unlimited]">
+        New Window
+      </message>
+      <message name="IDS_IOS_TOOLS_MENU_PARENT_LEARN_MORE" desc="Link displayed to allow the user to learn more why the browser is managed by their parent. Shown at the bottom of the overflow menu. [iOS only]">
+        Learn More
+      </message>
+      <message name="IDS_IOS_TOOLS_MENU_PARENT_MANAGED" desc="Text displayed to inform the user that the browser is managed by their parent at the bottom of the overflow menu (without link). [iOS only]">
+        Managed by your parent
+      </message>
       <message name="IDS_IOS_TOOLS_MENU_PASSWORD_MANAGER" desc="The iOS menu item for opening the passwords list [iOS only]">
         Password Manager
       </message>
@@ -4846,108 +5108,12 @@
       <message name="IDS_IOS_TOOLS_MENU_QR_SCANNER" desc="The iOS menu item for opening the QR Code Scanner screen, allowing the user to scan QR code.">
         Scan QR Code
       </message>
-      <message name="IDS_IOS_TOOLS_MENU_LENS_CAMERA_SEARCH" desc="The iOS menu item for searching images with the device camera using Google Lens.">
-        Lens Camera Search
-      </message>
       <message name="IDS_IOS_TOOLS_MENU_READING_LIST" desc="The iOS menu item for opening the reading list [iOS only]" meaning="Open the Reading List menu. [Length: Unlimited]">
         Reading List
       </message>
       <message name="IDS_IOS_TOOLS_MENU_RECENT_TABS" desc="The iOS menu item for opening the panel showing the recently closed tabs and the tabs from other devices." meaning="[In Title case] [iOS only] [Length: Unlimited]">
         Recent Tabs
       </message>
-      <message name="IDS_IOS_TOOLS_MENU_SAVE_IMAGE_TO_PHOTOS" desc="The iOS menu item for saving images to Google Photos.">
-        Save in Google Photos
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_CUSTOMIZE_MENU_CANCEL" desc="The title of the button on the overflow menu customization screen for users to cancel customization." meaning="[In Title case] [iOS only]">
-        Cancel
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_CUSTOMIZE_MENU_DONE" desc="The title of the button on the overflow menu customization screen for users to finish and save customization." meaning="[In Title case] [iOS only]">
-        Done
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_CUSTOMIZE_MENU_TITLE" desc="The title of the screen on the overflow menu where users can customize the items in the menu." meaning="[In Title case] [iOS only]">
-        Customize Menu
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDDEN_BOOKMARKS_SUBTITLE" desc="The subtitle of the Add to Bookmarks action alerting users that the Bookmark destination is hidden." meaning="[In Title case] [iOS only]">
-        Bookmarks are hidden
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDDEN_READING_LIST_SUBTITLE" desc="The subtitle of the Add to Reading List action alerting users that the Reading List destination is hidden." meaning="[In Title case] [iOS only]">
-        Reading List is hidden
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ITEM_ACCESSIBILITY_HINT" desc="Accessibility hint telling users what will happen if they take action on a shown item." meaning="[In Title case] [iOS only]">
-        Hides this item
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SHOW_ITEM_ACCESSIBILITY_HINT" desc="Accessibility hint telling users what will happen if they take action on a hidden item." meaning="[In Title case] [iOS only]">
-        Shows this item
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_EDIT_ACTIONS" desc="The iOS menu item for starting the process to edit actions on the overflow menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Customize Menu
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_EDIT_SECTION_HIDDEN_TITLE" desc="The title for the overflow menu edit section showing hidden destinations" meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hidden
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_ADD_TO_BOOKMARKS" desc="The title for the context menu item to hide Add to Bookmarks. This should match the title of the Add to Bookmarks action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Add to Bookmarks
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_CLEAR_BROWSING_DATA" desc="The title for the context menu item to hide Clear Browsing Data. This should match the title of the Clear Browsing Data action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Clear Browsing Data
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_DESKTOP_SITE" desc="The title for the context menu item to hide Request Desktop Site. This should match the title of the Request Desktop Site action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Request Desktop Site
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_EDIT_BOOKMARK" desc="The title for the context menu item to hide Edit Bookmarks. This should match the title of the Edit Bookmarks action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Edit Bookmark
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_FIND_IN_PAGE" desc="The title for the context menu item to hide Find in Page. This should match the title of the Find in Page action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Find in Page
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_FOLLOW" desc="The title for the context menu item to hide Follow. This should match the title of the Follow action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Follow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_MOBILE_SITE" desc="The title for the context menu item to hide Request Mobile Site. This should match the title of the Request Mobile Site action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Request Mobile Site
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_READING_LIST" desc="The title for the context menu item to hide Add to Reading List. This should match the title of the Add to Reading List action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Add to Reading List
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_TEXT_ZOOM" desc="The title for the context menu item to hide Zoom Text. This should match the title of the Zoom Text action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Zoom Text
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_TRANSLATE" desc="The title for the context menu item to hide Translate. This should match the title of the Translate action in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Translate
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ACTION_UNFOLLOW" desc="The title for the context menu item to hide Unfollow. This should match the title of the Unfollow action in the menu. [iOS only]">
-        Hide Unfollow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_BOOKMARKS" desc="The title for the context menu item to hide Bookmarks. This should match the title of the Bookmarks destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Bookmarks
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_DOWNLOADS" desc="The title for the context menu item to hide Downloads. This should match the title of the Downloads destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Downloads
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_HISTORY" desc="The title for the context menu item to hide History. This should match the title of the History destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide History
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_READING_LIST" desc="The title for the context menu item to hide Reading List. This should match the title of the Reading List destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Reading List
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_RECENT_TABS" desc="The title for the context menu item to hide Recent Tabs. This should match the title of the Recent Tabs destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Recent Tabs
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_PASSWORDS" desc="The title for the context menu item to hide Passwords. This should match the title of the Passwords destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Password Manager
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_PRICE_NOTIFICATIONS" desc="The title for the context menu item to hide Price Tracking. This should match the title of the Price Tracking destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide Track Price
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_HIDE_DESTINATION_WHATS_NEW" desc="The title for the context menu item to hide What's New. This should match the title of the What's New destination in the menu." meaning="[In Title case] [iOS only] [Length: Unlimited]">
-        Hide What's New
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SORT_TITLE" desc="The title of the overflow menu option where the menu will be auto-sorted by frequency." meaning="[iOS only] [Length: Unlimited]">
-        Smart Sort Menu Bar
-      </message>
-      <message name="IDS_IOS_OVERFLOW_MENU_SORT_DESCRIPTION" desc="The description of the overflow menu option where the menu will be auto-sorted by frequency." meaning="[iOS only] [Length: Unlimited]">
-        Show frequently used items first.
-      </message>
       <message name="IDS_IOS_TOOLS_MENU_RELOAD" desc="The title of the button in the menu allowing the user to reload the page.">
         Reload
       </message>
@@ -4957,6 +5123,9 @@
       <message name="IDS_IOS_TOOLS_MENU_REQUEST_MOBILE_SITE" desc="The iOS menu item for requesting the mobile site [iOS only]" meaning="Request the mobile version of the current web site. [Length: Unlimited]">
         Request Mobile Site
       </message>
+      <message name="IDS_IOS_TOOLS_MENU_SAVE_IMAGE_TO_PHOTOS" desc="The iOS menu item for saving images to Google Photos.">
+        Save in Google Photos
+      </message>
       <message name="IDS_IOS_TOOLS_MENU_SEARCH_COPIED_IMAGE" desc="If a user has an image on their clipboard, this string will appear as an option when the user long-presses on Chrome's search icon. The user can select this option to search the default search engine for the image. This string is a complete sentence. If necessary for your language, you can translate as 'Search for Image That You Copied.'" meaning="[Length:Unlimited]">
         Search for Image You Copied
       </message>
@@ -4978,44 +5147,50 @@
       <message name="IDS_IOS_TOOLS_MENU_TEXT_ZOOM" desc="The iOS menu item for zooming the page's text.">
         Zoom Text…
       </message>
+      <message name="IDS_IOS_TOOLS_MENU_TRANSLATE" desc="The iOS menu item for translating the current page [iOS only]" meaning="Open the translate infobar [Length: unlimited]">
+        Translate
+      </message>
+      <message name="IDS_IOS_TOOLS_MENU_UNFOLLOW" desc="The iOS menu item for unfollowing web content. [iOS only]">
+        Unfollow <ph name="DOMAIN_NAME">$1<ex>google.com</ex></ph>
+      </message>
       <message name="IDS_IOS_TOOLS_MENU_VISIT_COPIED_LINK" desc="If a user has a URL on their clipboard, this string will appear as an option when the user long-presses on Chrome's search icon. The user can select this option to visit the URL. This string is a complete sentence. If necessary for your language, you can translate as 'Visit Link That You Copied.'" meaning="[Lenth: unlimited]">
           Visit Link You Copied
       </message>
       <message name="IDS_IOS_TOOLS_MENU_VOICE_SEARCH" desc="The iOS menu item for opening Voice Search.">
         Voice Search
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_OPTIONS_ACCESSIBILITY_LABEL" desc="The accessibility label read by Voice Over for the gear icon in the translate infobar that opens the translate options menu. [Length: unlimited] [iOS only]">
-        Translate Options
+      <message name="IDS_IOS_TOP_ADDRESS_BAR_OPTION" desc="Tag label title displayed for the top address bar preference option. [iOS only]">
+        Top
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_DEFAULT_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the Translate Infobar UI is shown in default mode. [Length: unlimited] [iOS only]">
-        Translate is available. Options available near bottom of the screen.
+      <message name="IDS_IOS_TRACKING_PRICE_EMAIL_NOTIFICATIONS_DETAILS" desc="Subtitle that describes to which email address price tracking notifications would be sent.">
+        Send to <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_ACTION" desc="The button text for the action to translate the page. [iOS only]">
-        Translate
+      <message name="IDS_IOS_TRACKING_PRICE_EMAIL_NOTIFICATIONS_TITLE" desc="Title for Tracking Price email notifications row.">
+        Email Notifications
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_TRY_AGAIN_ACTION" desc="The button text for the action to try again the translation after failure. [iOS only]">
-        Try Again
+      <message name="IDS_IOS_TRACKING_PRICE_HEADER_TEXT" desc="Text for Tracking Price header.">
+        Manage how you receive price drop alerts for products you track
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_UNDO_ACTION" desc="The button text for the action to undo the translation. [iOS only]">
-        Show Original
+      <message name="IDS_IOS_TRACKING_PRICE_MOBILE_NOTIFICATIONS_TITLE" desc="Title for Tracking Price mobile notifications row.">
+        Mobile Notifications
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_ALWAYS_TRANSLATE_SOURCE_BUTTON_TITLE" desc="The text for the button in the Translate Infobar modal to always translate the source language. The variable inserted will be the source language.[iOS only]">
-        Always translate <ph name="LANGUAGE">$1</ph>
+      <message name="IDS_IOS_TRACK_PRICES_ON_TABS" desc="This text shows in the price tracking settings dialog. It tells users the switch on the side can be used to turn on/off the 'Track prices on tabs' feature.">
+        Track Prices on Tabs
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_OFFER_TRANSLATE_SOURCE_BUTTON_TITLE" desc="The text for the button in the Translate Infobar modal to revert back to asking the user to translate. The variable inserted will be the source language.[iOS only]">
-        Offer to translate <ph name="LANGUAGE">$1</ph>
+      <message name="IDS_IOS_TRACK_PRICES_ON_TABS_DESCRIPTION" desc="This text shows below 'Track prices on tabs'. It describes what will happen when turning on this feature.">
+        See price drops on your tabs.
       </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_AFTER_TRANSLATE_BANNER_TITLE" desc="The text for the title of the Translate Message Banner after translate was successful. [iOS only]">
         Page Translated
       </message>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_ALWAYS_TRANSLATE_SOURCE_BUTTON_TITLE" desc="The text for the button in the Translate Infobar modal to always translate the source language. The variable inserted will be the source language.[iOS only]">
+        Always translate <ph name="LANGUAGE">$1</ph>
+      </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_BEFORE_TRANSLATE_BANNER_TITLE" desc="The text for the title of the Translate Message Banner asking the user to translate the page [iOS only]">
         Translate Page?
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_ON_ERROR_BANNER_TITLE" desc="The text for the title of the Translate Message Banner in case of an error [iOS only]">
-        Translation Failed
-      </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_MODAL_SOURCE_LANGUAGE_FIELD_NAME" desc="The text field name for the source language in the Translate Infobar modal. [iOS only]">
-        From
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_DEFAULT_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the Translate Infobar UI is shown in default mode. [Length: unlimited] [iOS only]">
+        Translate is available. Options available near bottom of the screen.
       </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_MODAL_LANGUAGE_FIELD_NAME_HINT" desc="Text accompanying the language field name to indicate that the user can tap the row to show options to change the language. [iOS only]">
         Tap to change language.
@@ -5023,6 +5198,9 @@
       <message name="IDS_IOS_TRANSLATE_INFOBAR_MODAL_SELECT_LANGUAGE_HINT" desc="Text alongside the language to indicate to the user change the language by selecting the row. [iOS only]">
         Tap to change to this language.
       </message>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_MODAL_SOURCE_LANGUAGE_FIELD_NAME" desc="The text field name for the source language in the Translate Infobar modal. [iOS only]">
+        From
+      </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_MODAL_TARGET_LANGUAGE_FIELD_NAME" desc="The text field name for the target language in the Translate Infobar modal. [iOS only]">
         To
       </message>
@@ -5032,54 +5210,42 @@
       <message name="IDS_IOS_TRANSLATE_INFOBAR_NEVER_TRANSLATE_SITE_BUTTON_TITLE" desc="The text for the button in the Translate Infobar modal to never translate the current site. [iOS only]">
         Never translate this site
       </message>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_NEVER_TRANSLATE_SOURCE_BUTTON_TITLE" desc="The text for the button in the Translate Infobar modal to never translate the source language. The variable inserted will be the source language.[iOS only]">
+        Never translate <ph name="LANGUAGE">$1</ph>
+      </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_OFFER_TRANSLATE_SITE_BUTTON_TITLE" desc="The text for the button in the Translate Infobar modal to revert back to asking the user to translate the current site. [iOS only]">
         Offer to translate this site
       </message>
-      <message name="IDS_IOS_TRANSLATE_INFOBAR_NEVER_TRANSLATE_SOURCE_BUTTON_TITLE" desc="The text for the button in the Translate Infobar modal to never translate the source language. The variable inserted will be the source language.[iOS only]">
-        Never translate <ph name="LANGUAGE">$1</ph>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_OFFER_TRANSLATE_SOURCE_BUTTON_TITLE" desc="The text for the button in the Translate Infobar modal to revert back to asking the user to translate. The variable inserted will be the source language.[iOS only]">
+        Offer to translate <ph name="LANGUAGE">$1</ph>
+      </message>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_ON_ERROR_BANNER_TITLE" desc="The text for the title of the Translate Message Banner in case of an error [iOS only]">
+        Translation Failed
+      </message>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_OPTIONS_ACCESSIBILITY_LABEL" desc="The accessibility label read by Voice Over for the gear icon in the translate infobar that opens the translate options menu. [Length: unlimited] [iOS only]">
+        Translate Options
       </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_SELECT_LANGUAGE_MODAL_TITLE" desc="The title of the Translate Infobar Select Langage Modal Title. [iOS only]">
         Select Language
       </message>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_ACTION" desc="The button text for the action to translate the page. [iOS only]">
+        Translate
+      </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_BANNER_SUBTITLE" desc="The text for the subtitle of the Translate Message Banner asking the user to translate the page. The variables inserted will be the source language and the target language from left to right. [iOS only]">
         <ph name="SOURCE_LANGUAGE">$1</ph> to <ph name="TARGET_LANGUAGE">$2</ph>
       </message>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_TRY_AGAIN_ACTION" desc="The button text for the action to try again the translation after failure. [iOS only]">
+        Try Again
+      </message>
+      <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_UNDO_ACTION" desc="The button text for the action to undo the translation. [iOS only]">
+        Show Original
+      </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATING_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the Translate Infobar UI is shown in translating mode. [Length: unlimited] [iOS only]">
         Translating the page to <ph name="language">$1<ex>French</ex></ph>. Options available near bottom of the screen.
       </message>
       <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATING_BANNER_TITLE" desc="The text for the title of the Translate Message Banner while translating is in progress. [iOS only]">
         Translating...
       </message>
-      <message name="IDS_IOS_LANGUAGE_SETTINGS_TITLE" desc="Title for the language settings menu entry and page. [Length: 25em] [iOS only]">
-        Languages
-      </message>
-      <message name="IDS_IOS_LANGUAGE_SETTINGS_ADD_LANGUAGE_TITLE" desc="Title for the add language page of language settings. [Length: 25em] [iOS only]">
-        Add Language
-      </message>
-      <message name="IDS_IOS_LANGUAGE_SETTINGS_HEADER" desc="Header for the fluent languages section in the language settings page. [Length: unlimited] [iOS only]">
-        Websites will show text in your preferred language, when possible.
-      </message>
-      <message name="IDS_IOS_LANGUAGE_SETTINGS_ADD_LANGUAGE_BUTTON_TITLE" desc="Title for the button to add a language to the list of fluent languages in the language settings page. [Length: 30em] [iOS only]">
-        Add Language...
-      </message>
-      <message name="IDS_IOS_LANGUAGE_SETTINGS_TRANSLATE_SWITCH_TITLE" desc="Title for the switch to enable or disable translation in the language settings page. [Length: 30em] [iOS only]" meaning="Turning this switch on enables offering translation and turning it off disables offering translation.">
-        Translate Pages
-      </message>
-      <message name="IDS_IOS_LANGUAGE_SETTINGS_TRANSLATE_SWITCH_SUBTITLE" desc="Subtitle for the switch to enable or disable translation in the language settings page. [Length: unlimited] [iOS only]" meaning="This switch controls offering translation for pages in languages other than the languages listed above.">
-        Offer to translate pages in other languages
-      </message>
-      <message name="IDS_IOS_LANGUAGE_SETTINGS_NEVER_TRANSLATE_TITLE" desc="Label shown next to a language for which translation is not offered. [Length: 25em] [iOS only]">
-        Never Translate
-      </message>
-      <message name="IDS_IOS_LANGUAGE_SETTINGS_OFFER_TO_TRANSLATE_TITLE" desc="Label shown next to a language for which translation is offered. [Length: 25em] [iOS only]">
-        Offer to Translate
-      </message>
-      <message name="IDS_IOS_LINK_TO_TEXT_ERROR_DESCRIPTION" desc="Description message in the alert dialog shown when link-to-text link generation failed. [iOS only]">
-        A link to the highlight can not be created.
-      </message>
-      <message name="IDS_IOS_LINK_TO_TEXT_ERROR_TITLE" desc="Title of the alert dialog shown when link-to-text link generation failed. [iOS only]">
-        Unable to Create Link
-      </message>
       <message name="IDS_IOS_TRANSLATE_SETTING" desc="Title for the view and option in Settings for Translate. [Length: 25em] [iOS only]">
         Google Translate
       </message>
@@ -5089,137 +5255,23 @@
       <message name="IDS_IOS_TRANSLATE_SETTING_RESET_NOTIFICATION" desc="Message appearing after the user pressed the button to reset the translate settings. [Length: 30em] [iOS only]">
         Your translate settings have been reset.
       </message>
+      <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_SWITCH_WINDOW_ACTION" desc="Button label that appears on a button to switch to some other window, when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used.">
+          Switch to Open Window
+      </message>
+      <message name="IDS_IOS_UNITS_MEASUREMENTS_ACCESSIBILITY_HINT_UNIT_SELECTOR" desc="Accessibility Hint for the unit conversion source and target unit buttons that display a menu of units. This is spoken by VoiceOver.   [Length:Unlimited] [iOS only]">
+          Unit selector
+      </message>
+      <message name="IDS_IOS_UNITS_MEASUREMENTS_ACCESSIBILITY_HINT_UNIT_TYPE_SELECTOR" desc="Accessibility Hint for the unit conversion title button that displays a menu of unit types. This is spoken by VoiceOver.   [Length:Unlimited] [iOS only]">
+          Unit type selector
+      </message>
+      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_SUBTITLE" desc="This string is on a sign-in page, shown several weeks after the user has installed Chrome. It explains the overarching user benefit of signing in (access to bookmarks, passwords, history, settings, etc.). We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account. The tone should be informative and lightweight.">
+        Get your bookmarks, passwords, and more on all your devices.
+      </message>
       <message name="IDS_IOS_UPGRADE_AVAILABLE_BUTTON" desc="Displayed on a button the user can use to upgrade the a more recent version of the application. [Length: 10em]">
         Update
       </message>
-      <message name="IDS_IOS_VISIT_COPIED_LINK" desc="If a user has a URL on their clipboard, this string will appear as an option when the user long-presses on Chrome's address bar. The user can select this option to visit the URL. This string is a complete sentence. If necessary for your language, you can translate as 'Visit Link That You Copied.' [iOS only]" meaning="Maximum characters: 32">
-          Visit Copied Link
-      </message>
-      <message name="IDS_IOS_VERSION" desc="The label for the Chrome version on which the application is based, displayed in the About Chrome settings page [Length: 30em] [iOS only]">
-        Version <ph name="PRODUCT_VERSION">$1<ex>31.0.1650.18</ex></ph>
-      </message>
-      <message name="IDS_IOS_VERSION_COPIED" desc="The message displayed when the version label is tapped (in About settings) [Length: 10em] [iOS only]">
-        Copied
-      </message>
-      <message name="IDS_IOS_VOICE_SEARCH_SETTINGS_DEFAULT_LOCALE" desc="The label for the default locale option in the voice search settings [iOS only]">
-        Default - <ph name="DEFAULT_LOCALE">$1<ex>English (United States)</ex></ph>
-      </message>
-      <message name="IDS_IOS_VOICE_SEARCH_SETTING_TITLE" desc="The title for Voice Search setting [Length: 29em] [iOS only]">
-        Voice Search
-      </message>
-      <message name="IDS_IOS_VOICE_SEARCH_SETTING_TTS" desc="The label for setting switch enabling text-to-speech response after voice search [Length: 29em] [iOS only]">
-        Speak Answers Back
-      </message>
-      <message name="IDS_IOS_SIGNIN_PROMO_READING_LIST" desc="This string is on a promo intended to promote signing in to Chrome with the user's Google Account. It appears on the Reading List page when the user is not signed in. We want users to read this promo and click 'Continue as {name}' to sign in to their Google Account. The tone should be informative and lightweight.">
-        Sign in to get your reading list on all your devices.
-      </message>
-      <message name="IDS_IOS_SIGNIN_PROMO_BOOKMARKS" desc="This string is on a promo intended to promote signing in to Chrome with the user's Google Account. It appears on the Bookmarks page when the user is not signed in. We want users to read this promo and click 'Continue as name' to sign in to their Google Account. The tone should be informative and lightweight. [Length: 90em]">
-        Sign in to get your bookmarks on all your devices.
-      </message>
-      <message name="IDS_IOS_SIGNIN_PROMO_CHANGE_ACCOUNT" desc="Button that the user can press if they are not the profile that Chrome found (opposite of 'Continue as Joe Doe'). The user will be able to choose another account and sign-in with it.">
-        Choose Another Account
-      </message>
-      <message name="IDS_IOS_SIGNIN_PROMO_CLOSE_ACCESSIBILITY" desc="Accessibility label to describe the close button action in the sign-in promo element.">
-        Close sign-in promo
-      </message>
-      <message name="IDS_IOS_SIGNIN_PROMO_CONTINUE_AS" desc="Button that the user can press to login without asking the password and continue using Chrome with this acccount. [Length: 9em]">
-        Continue as <ph name="NAME">$1<ex>John Doe</ex></ph>
-      </message>
-      <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>
-      <message name="IDS_IOS_BOOKMARK_SNACKBAR_EDIT_BOOKMARK" desc="This string is found on a button that takes the user to the Edit Bookmark screen when the user taps it. The button is on a confirmation message that users see when they save a bookmark to their device or in their Google Account. This text is a verb and is short for the longer phrase 'edit the bookmark.' The tone should be informative. Use Apple-style title case. [CHAR_LIMIT=15]">
-        Edit
-      </message>
-      <message name="IDS_IOS_BOOKMARK_SNACKBAR_VIEW_BOOKMARKS" desc="This string is found on a button that takes the user to the Bookmarks screen when the user taps it. The button is on a confirmation message that users see when they bulk save bookmarks to their device or in their Google Account. This text is a verb and is short for the longer phrase 'view bookmarks.' The tone should be informative. Use Apple-style title case. [CHAR_LIMIT=15]">
-        View
-      </message>
-      <message name="IDS_IOS_SIGNIN_SNACKBAR_UNDO" desc="This string is found on a button that signs the user out when the user taps it. It is on a confirmation message that users see when they sign in to Chrome with their Google Account. This text is a verb and is short for the longer phrase 'Undo my sign-in.' The tone should be informative. [Length: 15em] [iOS only]">
-        Undo
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_NEW_FOLDER" desc="Text on the bookmarks context bar to create new folder">
-        New Folder
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_DELETE" desc="Text on the bookmarks context bar for delete action">
-       Delete
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_SELECT" desc="Text on the bookmarks context bar for select action">
-        Select
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_EDIT" desc="Text on the bookmarks context bar for edit action">
-        Edit
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_BAR_MORE" desc="Text on the bookmarks context bar to show more context menu">
-        More...
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_OPEN" desc="Text on the bookmarks context menu to open all selected bookmarks">
-        Open All
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_OPEN_INCOGNITO" desc="Text on the bookmarks context menu to open selected bookmark in Incognito">
-        Open in Incognito
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_MOVE" desc="Text on the bookmarks context menu to move selected bookmark">
-        Move
-      </message>
-      <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_EDIT" desc="Text on the bookmarks context menu to edit selected bookmark">
-        Edit Bookmark
-      </message>
-       <message name="IDS_IOS_BOOKMARK_CONTEXT_MENU_EDIT_FOLDER" desc="Text on the bookmarks context menu to edit selected bookmark folder">
-        Edit Folder
-      </message>
-      <message name="IDS_IOS_VIEW_CONTROLLER_DISMISS_SAVE_CHANGES" desc="Text displayed on an alert button for Saving changes whenever trying
-      to dismiss a presented view with pending changes.">
-        Save Changes
-      </message>
-      <message name="IDS_IOS_VIEW_CONTROLLER_DISMISS_DISCARD_CHANGES" desc="Text displayed on an alert button for Discarding changes whenever trying
-      to dismiss a presented view with pending changes.">
-        Discard Changes
-      </message>
-      <message name="IDS_IOS_VIEW_CONTROLLER_DISMISS_CANCEL_CHANGES" desc="Text displayed on an alert button to prevent dismissal of the view whenever trying
-      to dismiss a presented view with pending changes.">
-        Keep Editing
-      </message>
-      <message name="IDS_IOS_ADD_CREDIT_CARD_VIEW_CONTROLLER_DISMISS_ALERT_TITLE" desc="Text displayed on an alert as a title whenever trying to dismiss a presented 'add new credit card view' with pending changes.">
-          Are you sure you want to discard this new card?
-      </message>
-      <message name="IDS_IOS_OPEN_ANOTHER_APP_ALLOW" desc="Text on the button, when tapped will allow opening an external application. [iOS only]">
-          Allow
-      </message>
-      <message name="IDS_IOS_OPEN_ANOTHER_APP_BLOCK" desc="Text on the button, when tapped will block opening an external application for this browsing session. [iOS only]">
-          Don't allow
-      </message>
-      <message name="IDS_IOS_OPEN_ANOTHER_APP_FAILED" desc="Alert to let the user know that external app could not be opened. [iOS only]">
-          Something went wrong. The application couldn’t be opened.
-      </message>
-      <message name="IDS_IOS_OPEN_ANOTHER_APP_FAILED_CONFIRM" desc="Button to acknowledge that opening application failed.">
-          Got it
-      </message>
-      <message name="IDS_IOS_OPEN_ANOTHER_APP_FROM_INCOGNITO" desc="Alert to let the user know that the website is trying to open another application from incognito. [iOS only]">
-          This site is trying to open an application.  This will take you out of Incognito.
-      </message>
-      <message name="IDS_IOS_OPEN_REPEATEDLY_ANOTHER_APP" desc="Alert to let the user know that the website is trying repeatedly to open another application. [iOS only]">
-          This site is repeatedly trying to open another application.
-      </message>
-      <message name="IDS_IOS_NAVIGATION_BAR_ADD_BUTTON" desc="Label of the button allowing the user to add a new credit card to the list of their saved credit cards.">
-          Add
-      </message>
-      <message name="IDS_IOS_LOCATION_BAR_SIGN_IN" desc="Text shown in the location bar while an HTTP authentication dialog is displayed.">
-          Sign in to website
-      </message>
-      <message name="IDS_IOS_SHARE_LINK_TO_TEXT" desc="Option that appears in the iOS Edit Menu when highlighting text (alongside options like Copy, Paste, and Share). When selected, this generates a special URL that will open the current page and jump to/highlight the user's current selection. The user will then have the chance to share this special URL through the normal iOS sharing menu.">
-          Create Link
-      </message>
-      <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_SWITCH_WINDOW_ACTION" desc="Button label that appears on a button to switch to some other window, when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used.">
-          Switch to Open Window
+      <message name="IDS_IOS_USERNAME_ALREADY_USED" desc="Error description telling the user that entered username is already used for this site [iOS only]">
+        You already saved this username for this site
       </message>
       <message name="IDS_IOS_USER_POLICY_CONTINUE" desc="Label of the button to continue with the current managed account in the User Policy notification dialog. [iOS only] [300em]">
         Continue
@@ -5230,322 +5282,244 @@
       <message name="IDS_IOS_USER_POLICY_SIGNOUT_AND_CLEAR_DATA" desc="Label of the button to sign out the current managed account and clear its data in the User Policy notification dialog. [iOS only] [300em]">
         Sign Out and Clear Data
       </message>
-      <message name="IDS_IOS_APP_SWITCHER_SCENE_TITLE" desc="Shown under the Application title in the OS-level app switcher with the number of tabs in the window">
-        {count, plural,
-          =0 {{domain}}
-          =1 {{domain} and 1 other}
-          other {{domain} and {count} others}}
+      <message name="IDS_IOS_USE_SUGGESTED_PASSWORD" desc="Button title in a suggested password popup asking user if they want to use the suggested password. [Length: 20em] [iOS only]">
+        Use Suggested Password
       </message>
-      <message name="IDS_IOS_WHATS_NEW_TITLE" desc="Title of the What's new Feature">
-        What's New
+      <message name="IDS_IOS_USE_SUGGESTED_STRONG_PASSWORD" desc="Button title in a suggested password popup asking user if they want to use the suggested password. [Length: 20em] [iOS only]">
+        Use Password
       </message>
-      <message name="IDS_IOS_WHATS_NEW_NAVIGATION_BACK_BUTTON_TITLE" desc="Title of the What's new navigation back button.">
-        Back
+      <message name="IDS_IOS_VERSION" desc="The label for the Chrome version on which the application is based, displayed in the About Chrome settings page [Length: 30em] [iOS only]">
+        Version <ph name="PRODUCT_VERSION">$1<ex>31.0.1650.18</ex></ph>
       </message>
-      <message name="IDS_IOS_WHATS_NEW_SHOW_INSTRUCTIONS_TITLE" desc="Title of a secondary button in What's New to show instructions.">
-        Show instructions
-      </message>
-      <message name="IDS_IOS_WHATS_HOW_TO_ENABLE_TITLE" desc="Title of a section in What's New that show users the instructions to enable the feature.">
-        How do I enable this feature?
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_LEARN_MORE_ACTION_TITLE" desc="Label of the button for users to learn more about a feature or a chrome tip.">
-        Learn More
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_SECTION_NEW_TITLE" desc="Title of a section in a table view to inform users about new features.">
-        New
-      </message>
-      <message name="IDS_IOS_WHATS_NEW_IPH_TEXT" desc="An in product help message to inform the user about the feature What's New.">
-        Explore new features and tips in What’s New
-      </message>
-      <message name="IDS_IOS_CARD_WILL_BE_SAVED_TO_ACCOUNT" desc="A message to inform the user that a credit card will be saved to their Google Account.">
-        Cards are saved to your Google Account.
-      </message>
-      <message name="IDS_IOS_SHARED_HIGHLIGHT_MENU_TITLE" desc="The title at the top of a menu which appears after a user taps on a highlighted passage in a web page. Title-cased.">
-        Highlighted Text
-      </message>
-      <message name="IDS_IOS_SHARED_HIGHLIGHT_LEARN_MORE" desc="An option in a menu which appears after a user taps on a highlighted passage in a web page. When selected, the user will be taken to a help article explaining how the highlighting feature works. Title-cased. [Length: 25em]">
-        Learn More...
-      </message>
-      <message name="IDS_IOS_SHARED_HIGHLIGHT_RESHARE" desc="An option in a menu which appears after a user taps on a highlighted passage in a web page. Selecting this option allows the user to share a link directly to the passage on which they tapped. Title-cased. [Length: 25em]">
-        Share Highlight
-      </message>
-      <message name="IDS_IOS_SHARED_HIGHLIGHT_REMOVE" desc="An option in a menu which appears after a user taps on a highlighted passage in a web page. Selecting this option causes the passage to no longer be highlighted. Title-cased. [Length: 25em]">
-        Remove
-      </message>
-      <message name="IDS_IOS_IPH_BUBBLE_SNOOZE" desc="Label of a button that appears in an in-product help Tip. Pressing this button will dismiss the Tip, the user will be reminded of the same Tip later on. Used as a button title in an info bubble." meaning="Used as a button title in an info bubble.">
-        Remind Me Later
-      </message>
-      <message name="IDS_IOS_IPH_SIDE_SWIPE_DISMISS_BUTTON" desc="Label of a button that appears in an in-product help view instructing user about side swiping. Pressing this button will dismiss the view. Used as a button title in an info bubble." meaning="Used as a button title in an info bubble in a side swipe in-product help.">
-        Dismiss
-      </message>
-      <message name="IDS_IOS_KEYBOARD_ACCESSORY_VIEW_PASTE_SEARCH" desc="Accessibility label for a button that starts a Paste and Search [iOS only]">
-        Paste and Search
-      </message>
-      <message name="IDS_IOS_VIEW_BROWSING_HISTORY_FROM_MENU_ANNOUNCEMENT" desc="The announcement of the tip explaining to the user they can find the browsing history from the menu. The tip is displayed as a bubble pointing to the menu button. Read by Text To Speech. [iOS only]">
-        You can find all your browsing history from the <ph name="HISTORY_BUTTON_ACCESSIBILITY_LABEL">$1<ex>Menu</ex></ph>.
+      <message name="IDS_IOS_VERSION_COPIED" desc="The message displayed when the version label is tapped (in About settings) [Length: 10em] [iOS only]">
+        Copied
       </message>
       <message name="IDS_IOS_VIEW_BROWSING_HISTORY_BY_SELECTING_HISTORY_TIP_ANNOUNCEMENT" desc="The announcement of the tip explaining to the user they can find the browsing history by selecting the History. The tip is displayed as a bubble pointing to the History item in the menu. Read by Text To Speech. [iOS only]">
         You can access all your browsing history by selecting <ph name="HISTORY_BUTTON_ACCESSIBILITY_LABEL">$1<ex>History</ex></ph>.
       </message>
+      <message name="IDS_IOS_VIEW_BROWSING_HISTORY_FROM_MENU_ANNOUNCEMENT" desc="The announcement of the tip explaining to the user they can find the browsing history from the menu. The tip is displayed as a bubble pointing to the menu button. Read by Text To Speech. [iOS only]">
+        You can find all your browsing history from the <ph name="HISTORY_BUTTON_ACCESSIBILITY_LABEL">$1<ex>Menu</ex></ph>.
+      </message>
       <message name="IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP" desc="The text of the tip explaining to the user they can use the history item in the overflow menu. [iOS only]">
         You can find all your browsing history here.
       </message>
-      <message name="IDS_IOS_AUTOFILL_ADDRESS_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of address suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has address suggestions available for autofill purposes. According to the number of available addresses, the string goes from singular to plural. [iOS only]">
-        {count, plural,
-           =1 {{count} saved address available above your keyboard.}
-           other {{count} saved addresses available above your keyboard.}}
+      <message name="IDS_IOS_VIEW_CONTROLLER_DISMISS_CANCEL_CHANGES" desc="Text displayed on an alert button to prevent dismissal of the view whenever trying       to dismiss a presented view with pending changes.">
+        Keep Editing
       </message>
-      <message name="IDS_IOS_AUTOFILL_PASSWORD_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of password suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has password suggestions available for autofill purposes. According to the number of available passwords, the string goes from singular to plural. [iOS only]">
-        {count, plural,
-           =1 {{count} saved password available above your keyboard.}
-           other {{count} saved passwords available above your keyboard.}}
+      <message name="IDS_IOS_VIEW_CONTROLLER_DISMISS_DISCARD_CHANGES" desc="Text displayed on an alert button for Discarding changes whenever trying       to dismiss a presented view with pending changes.">
+        Discard Changes
       </message>
-      <message name="IDS_IOS_AUTOFILL_PAYMENT_METHOD_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of payment method suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has payment method suggestions available for autofill purposes. According to the number of available payment methods, the string goes from singular to plural. [iOS only]">
-        {count, plural,
-           =1 {{count} saved payment method available above your keyboard.}
-           other {{count} saved payment methods available above your keyboard.}}
+      <message name="IDS_IOS_VIEW_CONTROLLER_DISMISS_SAVE_CHANGES" desc="Text displayed on an alert button for Saving changes whenever trying       to dismiss a presented view with pending changes.">
+        Save Changes
       </message>
-      <message name="IDS_IOS_AUTOFILL_PROFILE_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of profile suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has profile suggestions available for autofill purposes. According to the number of available profiles, the string goes from singular to plural. [iOS only]">
-        {count, plural,
-           =1 {{count} saved profile available above your keyboard.}
-           other {{count} saved profiles available above your keyboard.}}
+      <message name="IDS_IOS_VISIT_COPIED_LINK" desc="If a user has a URL on their clipboard, this string will appear as an option when the user long-presses on Chrome's address bar. The user can select this option to visit the URL. This string is a complete sentence. If necessary for your language, you can translate as 'Visit Link That You Copied.' [iOS only]" meaning="Maximum characters: 32">
+          Visit Copied Link
       </message>
-      <message name="IDS_IOS_AUTOFILL_AUTOCOMPLETE_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of autocomplete suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that only has autocomplete suggestions available for autofill purposes. According to the number of available autocomplete suggestions, the string goes from singular to plural. [iOS only]">
-        {count, plural,
-           =1 {{count} saved autocomplete suggestion available above your keyboard.}
-           other {{count} saved autocomplete suggestions available above your keyboard.}}
+      <message name="IDS_IOS_VOICE_SEARCH_SETTINGS_DEFAULT_LOCALE" desc="The label for the default locale option in the voice search settings [iOS only]">
+        Default - <ph name="DEFAULT_LOCALE">$1<ex>English (United States)</ex></ph>
       </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_ENTER_PASSPHRASE_BUTTON" desc="Label for the button to open the passphrase dialog from the accounts table. [iOS only]">
-        Enter Passphrase…
+      <message name="IDS_IOS_VOICE_SEARCH_SETTING_TITLE" desc="The title for Voice Search setting [Length: 29em] [iOS only]">
+        Voice Search
       </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ENTER_PASSPHRASE_MESSAGE" desc="The error message to show in the account table when there is a passphrase error. [iOS only]">
-        Sync is not working. To start sync enter your passphrase.
+      <message name="IDS_IOS_VOICE_SEARCH_SETTING_TTS" desc="The label for setting switch enabling text-to-speech response after voice search [Length: 29em] [iOS only]">
+        Speak Answers Back
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_TITLE" desc="In Title Case: Title for the compromised passwords item in the Password Checkup Homepage. [Length: 16em] [iOS only]" meaning="[In Title Case]">
-        {count, plural,
-          =0 {No Compromised Passwords}
-          =1 {{count} Compromised Password}
-          other {{count} Compromised Passwords}}
+      <message name="IDS_IOS_WEAK_PASSWORD_ISSUES_DESCRIPTION" desc="Header displayed on the password manager screen displaying credentials weak passwords [iOS only]" meaning="This header explains the risks of having weak passwords and provides a link to the support page explaining how create strong passwords.">
+        Weak passwords are easy to guess. Make sure you’re creating strong passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>See more security tips.<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_COMPROMISED_PASSWORDS_SUBTITLE" desc="Subitle for the compromised passwords item in the Password Checkup Homepage when there are no compromised passwords. [iOS only]">
-        If your passwords are compromised, we'll let you know
+      <message name="IDS_IOS_WEAK_PASSWORD_ISSUES_TITLE" desc="Title for the password manager screen displaying credentials with weak passwords [iOS only] [Length: 22em]">
+        {COUNT, plural,
+          =1 {{COUNT} Weak Password}
+          other {{COUNT} Weak Passwords}}
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_SUBTITLE" desc="Subitle for the compromised passwords item in the Password Checkup Homepage when there are compromised passwords. [iOS only]">
-        You should change these now
+      <message name="IDS_IOS_WEBSIGN_ERROR_GENERIC_ERROR" desc="Title displayed when sign in fails due to an authentication issue. [iOS only]">
+        Can't sign-in.
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_DISMISSED_WARNINGS_SUBTITLE" desc="Subitle for the compromised passwords item in the Password Checkup Homepage when there are dismissed compromised password warnings. [iOS only]">
-        {count, plural,
-          =1 {You dismissed {count} warning}
-          other {You dismissed {count} warnings}}
+      <message name="IDS_IOS_WEBSIGN_ERROR_TIMEOUT_ERROR" desc="Title displayed when sign in fails due to an authentication issue. [iOS only]">
+        Check your connection and try signing in again.
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_REUSED_PASSWORDS_TITLE" desc="Title for the reused passwords item in the Password Checkup Homepage when there are no reused passwords. [Length: 16em] [iOS only]">
-        Your Passwords are Unique
+      <message name="IDS_IOS_WEBSIGN_ERROR_TITLE" desc="Title displayed when sign in fails due to an authentication issue. [iOS only]">
+        Something Went Wrong
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_REUSED_PASSWORDS_TITLE" desc="In Title Case: Title for the reused passwords item in the Password Checkup Homepage when there are reused passwords. User can only have 2 or more reused passwords, so this string will always be plural. [Length: 16em] [iOS only]" meaning="[In Title Case]">
-        <ph name="COUNT">$1<ex>2</ex></ph> Reused Passwords
+      <message name="IDS_IOS_WEB_INSPECTOR_LABEL" desc="The label of the cell used to display whether Web Inspector support is enabled">
+        Web Inspector
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_REUSED_PASSWORDS_SUBTITLE" desc="Subitle for the reused passwords item in the Password Checkup Homepage when there are no reused passwords. [iOS only]">
-        You're not reusing any passwords
+      <message name="IDS_IOS_WEB_INSPECTOR_SUBTITLE_IPAD" desc="The subtitle explaining how to use Web Inspector">
+        To use the Web Inspector, connect to Safari on your computer using a cable and access your iPad from the Develop menu. You can enable the develop menu in the Advanced section of Safari settings on your computer.
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_REUSED_PASSWORDS_SUBTITLE" desc="Subitle for the reused passwords item in the Password Checkup Homepage when there are reused passwords. [iOS only]">
-        Create unique passwords
+      <message name="IDS_IOS_WEB_INSPECTOR_SUBTITLE_IPHONE" desc="The subtitle explaining how to use Web Inspector">
+        To use the Web Inspector, connect to Safari on your computer using a cable and access your iPhone from the Develop menu. You can enable the develop menu in the Advanced section of Safari settings on your computer.
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_WEAK_PASSWORDS_TITLE" desc="Title for the weak passwords item in the Password Checkup Homepage when there are no weak passwords. [Length: 16em] [iOS only]">
-        Your Passwords look Strong
+      <message name="IDS_IOS_WEB_INSPECTOR_TITLE" desc="The title of the screen in which the user can enable Web Inspector support, to allow debugging web pages">
+        Web Inspector
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_WEAK_PASSWORDS_TITLE" desc="In Title Case: Title for the weak passwords item in the Password Checkup Homepage when there are weak passwords. [Length: 16em] [iOS only]" meaning="[In Title Case]">
-        {count, plural,
-          =1 {{count} Weak Password}
-          other {{count} Weak Passwords}}
+      <message name="IDS_IOS_WHATS_HOW_TO_ENABLE_TITLE" desc="Title of a section in What's New that show users the instructions to enable the feature.">
+        How do I enable this feature?
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_WEAK_PASSWORDS_SUBTITLE" desc="Subitle for the weak passwords item in the Password Checkup Homepage when there are no weak passwords. [iOS only]">
-        You're using passwords that look hard to guess
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_ADD_TITLE" desc="Text in image displaying a placeholder for the title of the Google calendar event. [iOS only]">
+        Add title
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_WEAK_PASSWORDS_SUBTITLE" desc="Subitle for the weak passwords item in the Password Checkup Homepage when there are weak passwords. [iOS only]">
-        Create strong passwords
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_ALL_DAY" desc="Text in image indicating whether or not the Google calendar event is applied to the whole day. [iOS only]">
+        All day
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_CHECK_AGAIN_BUTTON" desc="Label of a button which starts a new password checkup [Length: 22em] [iOS only]">
-        Check Again
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_CALENDAR" desc="Text in image displaying Google calendar title. [iOS only]">
+        Calendar
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_ERROR_DIALOG_TITLE" desc="Title of the error dialog presented to the user when a password checkup failed. [iOS only]">
-        Something went wrong
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_DATE" desc="Text in image displaying a date in the Google calendar event. [iOS only]">
+        Oct 25, 2023
       </message>
-      <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_FOOTER" desc="Footer message for the Password Checkup Homepage explaining the purpose of Password Checkup. [iOS only]">
-        Make sure your passwords are safe, find out if they’ve been compromised, and get advice to help protect yourself online. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_ENDS" desc="Text in image indicating the end of the Google calendar event. [iOS only]">
+        Ends
       </message>
-      <message name="IDS_IOS_ITEM_ACCOUNT_ERROR_BADGE_ACCESSIBILITY_HINT" desc="Accessibility hint to let the user know that there is an error badge associated with the listed item. The hint is appended to the a11y message that describes the item. For example, the 'settings' message will become 'settings, account error' when there is an account error badge on the item. [iOS only]">
-        Account error
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_EVENTS" desc="Text in image indicating previous Google Calendar events. [iOS only]">
+        Events
       </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_VERIFY_ITS_YOU_BUTTON" desc="Label for the button to show the trusted vault reauthentication dialog. [iOS only]">
-        Verify It's You…
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_NEVER" desc="Text in image indicating that the Google calendar event should not be repreated. [iOS only]">
+        Never
       </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_NEEDS_TRUSTED_VAULT_KEY_FOR_PASSWORDS_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault key for passwords. [iOS only]">
-        To use and save passwords in your Google Account, verify it's you.
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_REPEAT" desc="Text in image indicating the frequency of the Google calendat event. [iOS only]">
+        Repeat
       </message>
-      <message name="IDS_IOS_ACCOUNT_TABLE_ERROR_HAS_TRUSTED_VAULT_RECOVERABILITY_DEGRADED_FOR_PASSWORDS_MESSAGE" desc="The error message to show in the account table when there is an error related to trusted vault recoverability degraded for passwords. [iOS only]">
-        To make sure you can always use the passwords in your Google Account, verify it's you.
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_STARTS" desc="Text in image indicating the start of the Google calendar event. [iOS only]">
+        Starts
       </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_ENTER_PASSPHRASE_TITLE" desc="The title of the identity error info bar when the passphrase is required. [iOS only]">
-        Enter your passphrase
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SCREENSHOT_TEXT_TIME" desc="Text in image displaying a time in the Google calendar event. [iOS only]">
+        5:30 PM
       </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_ITS_YOU_TITLE" desc="The title of the identity error info bar when identity verification is needed. [iOS only]">
-        Verify it's you
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_STEP_1" desc="Text of the row indicating the first step of creating a Google calandar event. [iOS only]">
+        Touch &amp; hold a date.
       </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_KEEP_USING_PASSWORDS_MESSAGE" desc="The error message in the identity error info bar related to keep using passwords. [iOS only]">
-        Keep using the passwords in your Google Account
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_STEP_2" desc="Text of the row indicating the second step of creating a Google calandar event. [iOS only]">
+        Select “Add to Google Calendar“ or “Add to Apple Calendar.“
       </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_MAKE_SURE_YOU_CAN_ALWAYS_USE_PASSWORDS_MESSAGE" desc="The error message in the identity error info bar related to making sure you can always use your passwords. [iOS only]">
-        Make sure you can always use the passwords in your Google Account
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_STEP_3" desc="Text of the row indicating the third step of creating a Google calandar event. [iOS only]">
+        Edit the event details and tap “Save.“
       </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_ENTER_BUTTON_LABEL" desc="The label of the enter passphrase action button in the identity error info bar. [iOS only]">
-        Enter
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_SUBTITLE" desc="Google calendar subtitle displayed in What's New. [iOS only]">
+        Create Calendar events directly by clicking on a date in a web page.
       </message>
-      <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_BUTTON_LABEL" desc="The label of the verify your account action button in the identity error info bar. [iOS only]">
-        Verify
+      <message name="IDS_IOS_WHATS_NEW_CALENDAR_TITLE" desc="Google calendar title displayed in What's New. [iOS only]">
+        Create calendar events from dates
       </message>
-      <message name="IDS_IOS_SPOTLIGHT_OPEN_TAB_LABEL" desc="Tag label title displayed for opent tabs spotlight items. [iOS only]">
-        Open Tab
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SCREENSHOT_TEXT_MANAGE_PASSWORDS" desc="Text in image displaying the result of Chrome Actions query. [iOS only]">
+        Manage Passwords
       </message>
-      <message name="IDS_IOS_ADDRESS_BAR_SETTING" desc="Tag label title displayed in the address bar setting section. [iOS only]">
-        Address Bar
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SCREENSHOT_TEXT_MENU" desc="Text in image displaying the first step of the Chrome Actions query result. [iOS only]">
+        Menu
       </message>
-      <message name="IDS_IOS_ADDRESS_BAR_TIP_NOTE" desc="Tag label footer note displayed in the address bar setting section. [iOS only]">
-        You can also touch and hold the address bar to change the position.
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SCREENSHOT_TEXT_PASSWORDS" desc="Text in image displaying the third step of the Chrome Actions query result. [iOS only]">
+        Passwords
       </message>
-      <message name="IDS_IOS_TOP_ADDRESS_BAR_OPTION" desc="Tag label title displayed for the top address bar preference option. [iOS only]">
-        Top
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SCREENSHOT_TEXT_SETTINGS" desc="Text in image displaying the second step of the Chrome Actions query result. [iOS only]">
+        Settings
       </message>
-      <message name="IDS_IOS_BOTTOM_ADDRESS_BAR_OPTION" desc="Tag label title displayed for the bottom address bar preference option. [iOS only]">
-        Bottom
-      </message>
-      <message name="IDS_IOS_UNO_UPGRADE_PROMO_SIGNIN_SUBTITLE" desc="This string is on a sign-in page, shown several weeks after the user has installed Chrome. It explains the overarching user benefit of signing in (access to bookmarks, passwords, history, settings, etc.). We want users to understand why signing in is beneficial, and click 'Continue as name' to sign in to their Google Account. The tone should be informative and lightweight.">
-        Get your bookmarks, passwords, and more on all your devices.
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_CONTEXT_MENU_TITLE" desc="Title for the long-press context menu of the module that presents the Safety Check.">
-          This card shows any privacy or security issues that Safety Check automatically detects for you.
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_CONTEXT_MENU_DESCRIPTION" desc="Descripiton for the long-press context menu of the module that presents the Safety Check.">
-        Hide "Safety Check"
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_TITLE_ALL_SAFE" desc="Tag label title displayed for the Safety Check module in the Magic Stack when there are no Safety Check issue found. [iOS only]">
-        Your Browser Looks Good
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_ALL_SAFE" desc="Tag label description displayed for the Safety Check module in the Magic Stack when there are no Safety Check issue found. [iOS only]">
-        Safety Check didn't find any security issues for you to fix.
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_RUNNING" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Safety Check is running. [iOS only]">
-        Safety Check is running…
-      </message>
-      <message name="IDS_IOS_SAFETY_CHECK_TITLE_UPDATE_CHROME" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]">
-        Update Your Browser
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_STEP_1" desc="Text of the row indicating the first step of Chrome Actions. [iOS only]">
+        In the address bar, enter a task like “clear my history” or “edit passwords.”
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_TITLE_PASSWORD" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Password check finds an issue. [iOS only]">
-        Change Your Passwords
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_STEP_2" desc="Text of the row indicating the second step of Chrome Actions. [iOS only]">
+        Tap the shortcut that appears under the address bar.
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_COMPROMISED_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a compromised password issue. [iOS only]">
-        You have 1 compromised password. Fix it now to stay safe.
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_STEP_3" desc="Text of the row indicating the third step of Chrome Actions. [iOS only]">
+        Complete your task.
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_COMPROMISED_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a compromised password issue. [iOS only]">
-        You have compromised passwords.
+      <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SUBTITLE" desc="Chrome Actions subtitle displayed in What's New. [iOS only]">
+        Shortcuts to quickly modify settings and use features from the address bar.
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_REUSED_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a reused password issue. [iOS only]">
-        You have 1 reused password. Fix it now to stay safe.
+      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_1" desc="Text of the row indicating the first step of Use Chrome By Default in What's New. [iOS only]">
+        Open Settings
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_REUSED_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a reused password issue. [iOS only]">
-        You have reused passwords.
+      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_2" desc="Text of the row indicating the second step of Use Chrome By Default in What's New. [iOS only]">
+        Tap Default Browser App
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_WEAK_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a weak password issue. [iOS only]">
-        You have 1 weak password. Fix it now to stay safe.
+      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_1" desc="Text of the row indicating the first step of Passwords In Other Apps in What's New. [iOS only]">
+        Open AutoFill Password Settings
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_WEAK_PASSWORD" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds a weak password issue. [iOS only]">
-        You have weak passwords.
+      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_1_IOS16" desc="Text of the row indicating the first step of Passwords In Other Apps in What's New. [iOS only]">
+        Open Password Options
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_MULTIPLE_COMPROMISED_PASSWORDS" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple compromised passwords. [iOS only]">
-        You have <ph name="NUMBER_OF_PASSWORDS">$1<ex>2</ex></ph> compromised passwords that could put your security at risk.
+      <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2_IOS16" desc="Text of the row indicating the first step of shortened instruction of of turning on iOS auto-fill from Chrome password manager on iOS 16 and above [iOS only]">
+        Turn on AutoFill Passwords
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_MULTIPLE_REUSED_PASSWORDS" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple reused passwords. [iOS only]">
-        You have <ph name="NUMBER_OF_PASSWORDS">$1<ex>2</ex></ph> reused passwords that could put your security at risk.
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_2" desc="Text of the row indicating the second step of New Menu in What's New. [iOS only]">
+        Explore the options in the menu bar
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_MULTIPLE_WEAK_PASSWORDS" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple weak passwords. [iOS only]">
-        You have <ph name="NUMBER_OF_PASSWORDS">$1<ex>2</ex></ph> weak passwords that could put your security at risk.
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_SUBTITLE" desc="New Menu subtitle displayed in What's New. [iOS only]">
+        Now your saved bookmarks, passwords and more are at the top.
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_MULTIPLE_PASSWORD_ISSUES" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple password issues of different type (e.g. compromised, reused, weak). [iOS only]">
-        You have several password issues that could put your security at risk.
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_TITLE" desc="New Menu title displayed in What's New. [iOS only]">
+        Explore the New Menu
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_MULTIPLE_PASSWORD_ISSUES" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Password check finds multiple password issues of different type (e.g. compromised, reused, weak). [iOS only]">
-        You have several password issues.
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_1" desc="Text of the row indicating the first step of Search Tabs in What's New. [iOS only]">
+        Open the Tab Grid
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_TITLE_SAFE_BROWSING" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Safe Browsing check finds an issue. [iOS only]">
-        Add Browsing Protection
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_2" desc="Text of the row indicating the second step of Search Tabs in What's New. [iOS only]">
+        At the Top of the Screen, Tap the Search Icon
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_SAFE_BROWSING" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Safe Browsing check finds an issue. [iOS only]">
-        Get protection from dangerous sites, downloads, and extensions.
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_SUBTITLE" desc="Search Tabs subtitle displayed in What's New. [iOS only]">
+        Quickly find open and recently closed tabs across your synced devices.
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_SAFE_BROWSING" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Safe Browsing check finds an issue. [iOS only]">
-        Get protection from dangerous sites.
+      <message name="IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_TITLE" desc="Search Tabs title displayed in What's New. [iOS only]">
+        Search Tabs Across Synced Devices
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_TITLE_DEFAULT" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Safety Check has not been run yet. [iOS only]">
-        Run Safety Check
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_SCREENSHOT_TEXT_UNLOCK" desc="Text in image indicating the user to unlock with face ID. [iOS only]">
+        Unlock With Face ID
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_DEFAULT" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Safety Check has not been run yet. [iOS only]">
-        Stay safe from data breaches, unsafe websites and more.
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_STEP_2" desc="Text of the row indicating the second step to turn on Incognito Lock. [iOS only]">
+        Tap “Privacy &amp; Security.”
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_TITLE" desc="Tag label title displayed for the Safety Check module in the Magic Stack. [iOS only]">
-        Safety Check
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_LOCK_TITLE" desc="Incognito Lock title displayed in What's New. [iOS only]">
+        Incognito Lock
       </message>
-      <message name="IDS_IOS_SAFETY_CHECK_LAST_COMPLETED_CHECK" desc="Subtitle for Safety Check (Magic Stack) module which shows the timestamp of the last check." meaning="Time when the Safety Check was last run.">
-        Last run <ph name="TIME">$1<ex>10 minutes ago</ex></ph>
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_SCREENSHOT_TEXT_OPEN_IN_INCOGNITO" desc="Text in image asking the user to open a url in incognito. [iOS only]">
+        Open in Incognito?
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_THIS_FILE_COULD_NOT_BE_UPLOADED_TITLE" desc="Title of an alert that is presented if the user's attempt to upload an image to Google Photos fails. [iOS only]">
-        This File Could Not Be Uploaded
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_SCREENSHOT_TEXT_URL" desc="Text in image representing a url to open in incognito tabs from other apps. [iOS only]">
+        https://www.amazon.com/Wife-Gifts/s?k=for+Wife+Gifts
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_THIS_FILE_COULD_NOT_BE_UPLOADED_MESSAGE" desc="Message of an alert that is presented if the user's attempt to upload an image to Google Photos fails. [iOS only]">
-        <ph name="FILENAME">$1<ex>image.jpeg</ex></ph> (<ph name="FILESIZE">$2<ex>4 MB</ex></ph>) could not be uploaded
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_STEP_2" desc="Text of the row indicating the second step of opening in incognito tabs from other apps. [iOS only]">
+        Tap “Privacy &amp; Security.”
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_THIS_FILE_COULD_NOT_BE_UPLOADED_TRY_AGAIN" desc="Button in an alert that is presented if the user's attempt to upload an image to Google Photos fails. The button lets the user try to upload the image again. [iOS only]">
-        Try Again
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_STEP_3" desc="Text of the row indicating the third step of opening in incognito tabs from other apps. [iOS only]">
+        Turn on "Ask to Open Links from Other Apps in Incognito."
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_SNACKBAR_SAVING_IMAGE_MESSAGE" desc="Message of snackbar that is shown when the user started saving an image to Google Photos. [iOS only]">
-        Saving image in Google Photos for <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>...
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_SUBTITLE" desc="Open in incognito tabs from other apps subtitle displayed in What's New. [iOS only]">
+        You can choose to open incoming URLs from other apps in Incognito.
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_SNACKBAR_IMAGE_SAVED_MESSAGE" desc="Message of snackbar that is shown when the image selected by the user to be saved in Google Photos has been saved successfully. [iOS only]">
-        Image saved in Google Photos for <ph name="USER_EMAIL">$1<ex>peter.parker@gmail.com</ex></ph>
+      <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_TITLE" desc="Open in incognito tabs from other apps title displayed in What's New. [iOS only]">
+        Open links from other apps in Incognito
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_SNACKBAR_IMAGE_SAVED_OPEN_BUTTON" desc="Label of snackbar button that is shown when the image selected by the user to be saved in Google Photos has been saved successfully. The button opens the saved image i.e. it either shows the Google Photos app in the App Store if it is not installed, or opens the image in the Google Photos app. [iOS only]">
-        Open
+      <message name="IDS_IOS_WHATS_NEW_IPH_TEXT" desc="An in product help message to inform the user about the feature What's New.">
+        Explore new features and tips in What’s New
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_TITLE" desc="Dialog title to invite the user to pick an account to save an image to Google Photos. [iOS only]">
-        Save in Google Photos
+      <message name="IDS_IOS_WHATS_NEW_LEARN_MORE_ACTION_TITLE" desc="Label of the button for users to learn more about a feature or a chrome tip.">
+        Learn More
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_BODY" desc="Text when a user attempts to save an image to Google Photos, then is presented with the account picker dialog to select which account they want to use to save the image. [iOS only]">
-        Select the account you want to use to save <ph name="FILENAME">$1<ex>image.jpeg</ex></ph> - <ph name="FILESIZE">$2<ex>4 MB</ex></ph>
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_SCREENSHOT_TEXT_MAPS" desc="Text in image displaying Google maps title. [iOS only]">
+        Maps
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_ASK_EVERY_TIME" desc="Switch label to let the user choose whether they want to pick an account every time. [iOS only]">
-        Ask which account to use every time
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_SCREENSHOT_TEXT_OPEN_IN_APP" desc="Text in image displaying Open in App. [iOS only]">
+        Open in App…
       </message>
-      <message name="IDS_IOS_SAVE_TO_PHOTOS_ACCOUNT_PICKER_SUBMIT" desc="Dialog primary button label to validate the account picked to save an image to Google Photos. [iOS only]" meaning="This button saves the image to the user's Google Photos library i.e. this means 'Save' as in 'Save in Google Photos'.">
-        Save
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_STEP_1" desc="Text of the row indicating the first step of of the Mini Maps feature. [iOS only]">
+        Touch &amp; Hold an address.
       </message>
-      <message name="IDS_IOS_SETTINGS_DOWNLOADS_TITLE" desc="Title for the Downloads settings dialog [iOS only]" meaning="Title for the Downloads settings dialog [Length: 29em] [iOS only]">
-        Downloads
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_STEP_3" desc="Text of the row indicating the third step of of the Mini Maps feature. [iOS only]">
+        For route options, tap “Get Directions.”
       </message>
-      <message name="IDS_IOS_SETTINGS_DOWNLOADS_SAVE_TO_PHOTOS_HEADER" desc="Header of Save to Photos settings section in Downloads settings. This should be the name of the Google branded application Google Photos. [iOS only]">
-        Google Photos
+      <message name="IDS_IOS_WHATS_NEW_MINI_MAPS_SUBTITLE" desc="Mini Maps subtitle displayed in What's New. [iOS only]">
+        Use addresses on web pages to get local info and directions.
       </message>
-      <message name="IDS_IOS_SETTINGS_DOWNLOADS_ACCOUNT_SELECTION_HEADER" desc="Header of Google Photos account selection section in Downloads settings. The section contains the list of accounts on the device among which the user can choose to save images to Google Photos. [iOS only]">
-        Accounts on this Device
-</message>
-      <message name="IDS_IOS_PASSWORD_MANAGER_WIDGET_PROMO_TEXT" desc="Descriptive text for the Password Manager widget promo shown in the Password Manager.">
-        Securely access your passwords from the home screen with the Password Manager widget.
+      <message name="IDS_IOS_WHATS_NEW_NAVIGATION_BACK_BUTTON_TITLE" desc="Title of the What's new navigation back button.">
+        Back
       </message>
-      <message name="IDS_IOS_PASSWORD_MANAGER_WIDGET_PROMO_BUTTON_TITLE" desc="Title of the button for the Password Manager widget promo shown in the Password Manager." meaning="Title-cased">
-        Show Me How
+      <message name="IDS_IOS_WHATS_NEW_SECTION_NEW_TITLE" desc="Title of a section in a table view to inform users about new features.">
+        New
       </message>
-      <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_TITLE" desc="Title of the instruction screen for the Password Manager widget's installation.">
-        Get to passwords from the home screen
+      <message name="IDS_IOS_WHATS_NEW_SHOW_INSTRUCTIONS_TITLE" desc="Title of a secondary button in What's New to show instructions.">
+        Show instructions
       </message>
-      <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_SUBTITLE" desc="Subtitle of the instruction screen for the Password Manager widget's installation.">
-        Easy and secure access with the Google Password Manager widget.
+      <message name="IDS_IOS_WHATS_NEW_TITLE" desc="Title of the What's new Feature">
+        What's New
       </message>
       <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_1" desc="First step of the instructions for the Password Manager widget's installation.">
         Touch and hold the home screen
@@ -5556,11 +5530,32 @@
       <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_4" desc="Fourth step of the instructions for the Password Manager widget's installation.">
         Select Password Manager, then tap Add Widget
       </message>
-      <message name="IDS_IOS_UNITS_MEASUREMENTS_ACCESSIBILITY_HINT_UNIT_TYPE_SELECTOR" desc="Accessibility Hint for the unit conversion title button that displays a menu of unit types. This is spoken by VoiceOver.   [Length:Unlimited] [iOS only]">
-          Unit type selector
+      <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_SUBTITLE" desc="Subtitle of the instruction screen for the Password Manager widget's installation.">
+        Easy and secure access with the Google Password Manager widget.
       </message>
-      <message name="IDS_IOS_UNITS_MEASUREMENTS_ACCESSIBILITY_HINT_UNIT_SELECTOR" desc="Accessibility Hint for the unit conversion source and target unit buttons that display a menu of units. This is spoken by VoiceOver.   [Length:Unlimited] [iOS only]">
-          Unit selector
+      <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_TITLE" desc="Title of the instruction screen for the Password Manager widget's installation.">
+        Get to passwords from the home screen
+      </message>
+      <message name="IDS_SAVE_PASSWORD_FOOTER" desc="The footer text of the infobar that offers user to save/update a password to Chrome.">
+        Passwords are saved in your Google Account so you can use them on any device.
+      </message>
+      <message name="IDS_SAVE_PASSWORD_FOOTER_DISPLAYING_USER_EMAIL" desc="The footer text of the infobar that offers user to save/update a password to Chrome; also display's current user's email.">
+        You can use saved passwords on any device. They're saved to Google Password Manager for <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>.
+      </message>
+      <message name="IDS_SEND_TAB_TO_SELF_INFOBAR_MESSAGE" desc="The message text for the infobar when a user receives a shared tab from another device.">
+        Tab received.
+      </message>
+      <message name="IDS_SEND_TAB_TO_SELF_INFOBAR_MESSAGE_URL" desc="Clickable text displayed as part of a URL in the inforbar displayed when a user receives a shared tab from another device.">
+        Open
+      </message>
+      <message name="IDS_SEND_TAB_TO_SELF_MANAGE_DEVICES_LINK" desc="Text with a link to a page where the user can manage the devices they can share a tab to.">
+        <ph name="BEGIN_LINK">BEGIN_LINK</ph>Your devices<ph name="END_LINK">END_LINK</ph> · <ph name="EMAIL">$1<ex>foo@gmail.com</ex></ph>
+      </message>
+      <message name="IDS_SIGNIN_DISABLED_ACTION_SHEET_LABEL" desc="Body of a message that is shown when the user starts to sign out. This string precedes the confirmation button 'Sign Out'. If the user chooses to continue to sign out, then the data in their Google Account (such as bookmarks, passwords, history, settings, and more) won't be available on their device. If they sign back in to their Google Account, their data will come back. The tone should be helpful and instructive. [iOS only]">
+        After you sign out, the bookmarks, passwords, and more in your Google Account will be removed from this device.
+      </message>
+      <message name="IDS_SYNC_NEEDS_VERIFICATION_TITLE" desc="Title of the error message shown when sync needs to verify the user. [iOS only]">
+        Sync Needs To Verify It's You
       </message>
       <message name="IDS_UNITS_MEASUREMENTS_AREA" desc="Title of the button that allows the user to use and convert area type units" meaning="Button menu entry that allows the user to change the unit category to Area.">
         Area
@@ -5588,4 +5583,4 @@
       </message>
     </messages>
   </release>
-</grit>
+</grit>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 9b52495..5a41efb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Този сайт да не се превежда никога</translation>
 <translation id="1291506870746876680">Разрешенията за сайта <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> ще бъдат изключени, когато го напуснете.</translation>
 <translation id="1295289763199166823">Персонализиране на менюто</translation>
+<translation id="1296581780163690620">Да се изтегли ли файлът? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Потвърдете, че това сте вие, така че винаги да можете да използвате паролите в профила си в Google.</translation>
 <translation id="1312721752506309252">Режимът за подобрена защита е включен</translation>
 <translation id="1321993286294231467">При запазване на изображението възникна грешка.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Отворете настройките.</translation>
 <translation id="2059166748188874810">Община</translation>
 <translation id="2062410130322589403">Ръководство за настройките ви за поверителност</translation>
+<translation id="20638360198452347">Инструмент за избор на тип мерна единица</translation>
 <translation id="2073572773299281212">Активно преди <ph name="DAYS" /> дни</translation>
 <translation id="2074131957428911366">Винаги можете да изберете какво да се синхронизира от <ph name="BEGIN_LINK" />настройките<ph name="END_LINK" />.</translation>
 <translation id="2079545284768500474">Отмяна</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Редактиране на въртележката</translation>
 <translation id="2316709634732130529">Ползване на предложената парола</translation>
 <translation id="2320166752086256636">Скриване на клавиатурата</translation>
+<translation id="2326302612031521902">Инструмент за избор на мерна единица</translation>
 <translation id="2348630484974447747">Пратка</translation>
 <translation id="2351097562818989364">Настройките ви за превод са нулирани.</translation>
 <translation id="235789365079050412">Декларация за поверителност на Google</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">В адресната лента въведете задача, като например „Изчистване на историята ми“ или „Редактиране на паролите“.</translation>
 <translation id="2461070143328828326">Настройки за паролите</translation>
 <translation id="2462736546165239215">Тук можете да намерите цялата си история на сърфиране.</translation>
+<translation id="2468132863574325555">Диск</translation>
 <translation id="2469960372084740698">Да се изключи ли „Безопасно сърфиране“?</translation>
 <translation id="2473876017985765807">Вече запазихте парола за <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Не е избрано</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Ползване на паролата</translation>
 <translation id="6152406514676263192">Включете синхронизирането, за да виждате най-подходящото съдържание въз основа на интересите си.</translation>
 <translation id="6159839020698489198">незадължително</translation>
+<translation id="6160780110287872296">Да се изтегли ли файлът?</translation>
 <translation id="6170450281939467187">Преводът не бе успешен</translation>
 <translation id="6173499589275053515">Паролата е запазена в профила ви в Google <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Показване на разделите</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">„Бисквитки“</translation>
 <translation id="6453018583485750254">Проверката не се е изпълнявала.</translation>
 <translation id="6459307836338400162">За още настройки за поверителността, сигурността и събирането на данни вижте <ph name="BEGIN_LINK" />Синхронизиране<ph name="END_LINK" /> и <ph name="BEGIN_LINK" />Услуги на Google<ph name="END_LINK" />.</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">Отв. в нов раздел „инкогнито“</translation>
 <translation id="6464397691496239022">Сайтовете могат да използват „бисквитки“ с цел по-добро сърфиране, например за да оставате в профила си или за да запомнят артикулите в пазарската ви кошница.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 44c30f5..5393fbd7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Diese Website nie übersetzen</translation>
 <translation id="1291506870746876680">Die Berechtigungen für <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> werden zurückgesetzt und damit deaktiviert, wenn du diese Website verlässt.</translation>
 <translation id="1295289763199166823">Menü anpassen</translation>
+<translation id="1296581780163690620">Datei herunterladen? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Bestätige deine Identität, damit du jederzeit die Passwörter in deinem Google-Konto verwenden kannst.</translation>
 <translation id="1312721752506309252">Erweiterter Schutz ist aktiviert</translation>
 <translation id="1321993286294231467">Beim Speichern des Bilds ist ein Fehler aufgetreten.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Öffne die Einstellungen.</translation>
 <translation id="2059166748188874810">Gemeinde</translation>
 <translation id="2062410130322589403">Leitfaden für deine Datenschutzeinstellungen</translation>
+<translation id="20638360198452347">Auswahl des Einheitentyps</translation>
 <translation id="2073572773299281212">Vor <ph name="DAYS" /> Tagen aktiv</translation>
 <translation id="2074131957428911366">Du kannst in den <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> auswählen, was du synchronisieren möchtest.</translation>
 <translation id="2079545284768500474">Rückgängig machen</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Karussell bearbeiten</translation>
 <translation id="2316709634732130529">Vorgeschlagenes Passwort verwenden</translation>
 <translation id="2320166752086256636">Tastatur ausblenden</translation>
+<translation id="2326302612031521902">Auswahl der Einheit</translation>
 <translation id="2348630484974447747">Paket</translation>
 <translation id="2351097562818989364">Übersetzungseinstellungen zurückgesetzt</translation>
 <translation id="235789365079050412">Datenschutzerklärung von Google</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Gib in die Adressleiste eine Aufgabe wie „Meinen Verlauf löschen“ oder „Passwörter bearbeiten“ ein.</translation>
 <translation id="2461070143328828326">Passworteinstellungen</translation>
 <translation id="2462736546165239215">Hier findest du deinen gesamten Browserverlauf.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">Safe Browsing deaktivieren?</translation>
 <translation id="2473876017985765807">Du hast bereits ein Passwort für <ph name="WEBSITE" /> gespeichert</translation>
 <translation id="2476359652512522418">Nicht ausgewählt</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Passwort verwenden</translation>
 <translation id="6152406514676263192">Aktiviere die Synchronisierung, um die relevantesten Inhalte zu erhalten, die deinen Interessen entsprechen.</translation>
 <translation id="6159839020698489198">optional</translation>
+<translation id="6160780110287872296">Datei herunterladen?</translation>
 <translation id="6170450281939467187">Fehler beim Übersetzen</translation>
 <translation id="6173499589275053515">Passwort in deinem Google-Konto <ph name="EMAIL" /> gespeichert</translation>
 <translation id="6184086493125982861">Tabs anzeigen</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookies</translation>
 <translation id="6453018583485750254">Überprüfung nie durchgeführt.</translation>
 <translation id="6459307836338400162">Weitere Einstellungen in Verbindung mit Datenschutz, Sicherheit und der Erhebung von Daten findest du unter <ph name="BEGIN_LINK" />Synchronisierung<ph name="END_LINK" /> und <ph name="BEGIN_LINK" />Google-Dienste<ph name="END_LINK" />.</translation>
+<translation id="646394917185284261">Dateien</translation>
 <translation id="6464071786529933911">In neuem Inkognitotab öffnen</translation>
 <translation id="6464397691496239022">Websites können Cookies verwenden, um dir das Surfen zu erleichtern; zum Beispiel, damit du angemeldet bleibst oder Artikel in deinem Einkaufswagen gespeichert bleiben.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 6515aa69..d0f5108 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Ära kunagi seda saiti tõlgi</translation>
 <translation id="1291506870746876680">Saidi <ph name="BEGIN_BOLD" />„<ph name="SITE_NAME" />“<ph name="END_BOLD" /> load lähtestatakse väljalülitatud olekusse, kui saidilt lahkute.</translation>
 <translation id="1295289763199166823">Menüü kohandamine</translation>
+<translation id="1296581780163690620">Kas laadida fail alla? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Selleks, et saaksite oma Google'i kontol alati kasutada paroole, kinnitage oma isik.</translation>
 <translation id="1312721752506309252">Täiustatud kaitse on sisse lülitatud</translation>
 <translation id="1321993286294231467">Viga pildi salvestamisel.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Avage valik Seaded.</translation>
 <translation id="2059166748188874810">Vald</translation>
 <translation id="2062410130322589403">Teie privaatsusvalikute juhend</translation>
+<translation id="20638360198452347">Ühikutüübi valija</translation>
 <translation id="2073572773299281212">Aktiivne <ph name="DAYS" /> päeva tagasi</translation>
 <translation id="2074131957428911366">Jaotises <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" /> saate igal ajal valida, mida sünkroonida.</translation>
 <translation id="2079545284768500474">Võta tagasi</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Karusselli muutmine</translation>
 <translation id="2316709634732130529">Kasuta soovitatud parooli</translation>
 <translation id="2320166752086256636">Peida klaviatuur</translation>
+<translation id="2326302612031521902">Ühikuvalija</translation>
 <translation id="2348630484974447747">Saadetis</translation>
 <translation id="2351097562818989364">Teie tõlkeseaded on lähtestatud.</translation>
 <translation id="235789365079050412">Google'i privaatsuseeskirjad</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Sisestage aadressiribale soovitud ülesanne, näiteks „ajaloo kustutamine“ või „paroolide muutmine“.</translation>
 <translation id="2461070143328828326">Parooli seaded</translation>
 <translation id="2462736546165239215">Kogu oma sirvimisajaloo leiate siit.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">Kas lülitada Google'i ohutu sirvimine välja?</translation>
 <translation id="2473876017985765807">Salvestasite saidi <ph name="WEBSITE" /> jaoks juba parooli</translation>
 <translation id="2476359652512522418">Ei ole valitud</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Kasuta parooli</translation>
 <translation id="6152406514676263192">Lubage sünkroonimine, et näha kõige asjakohasemat sisu, mis põhineb teie huvidel.</translation>
 <translation id="6159839020698489198">valikuline</translation>
+<translation id="6160780110287872296">Kas laadida fail alla?</translation>
 <translation id="6170450281939467187">Tõlkimine ebaõnnestus</translation>
 <translation id="6173499589275053515">Parool salvestati teie Google'i kontole <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Kuva vahelehed</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Küpsised</translation>
 <translation id="6453018583485750254">Pole kunagi kontrollitud.</translation>
 <translation id="6459307836338400162">Privaatsuse, turvalisuse ning andmete kogumisega seotud lisaseadete nägemiseks vaadake jaotisi <ph name="BEGIN_LINK" />Sünkroonimine<ph name="END_LINK" /> ja <ph name="BEGIN_LINK" />Google'i teenused<ph name="END_LINK" />.</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">Ava uuel inkognito lehel</translation>
 <translation id="6464397691496239022">Saidid võivad kasutada küpsisefaile teie sirvimiskogemuse täiustamiseks, näiteks selleks, et hoida teid sisselogituna või jätta meelde teie ostukorvis olevad esemed.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index 35e3af2..b4bbef8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">این سایت هرگز ترجمه نشود</translation>
 <translation id="1291506870746876680">هرگاه این سایت را ترک کنید، اجازه‌های <ph name="BEGIN_BOLD" />«<ph name="SITE_NAME" />»<ph name="END_BOLD" /> به حالت خاموش برمی‌گردد.</translation>
 <translation id="1295289763199166823">سفارشی‌سازی منو</translation>
+<translation id="1296581780163690620">فایل بارگیری شود؟ (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">‏برای اطمینان از اینکه همیشه می‌توانید از گذرواژه‌های ذخیره‌شده در «حساب Google» خود استفاده کنید، هویتتان را به‌تأیید برسانید.</translation>
 <translation id="1312721752506309252">محافظت بهبودیافته روشن است</translation>
 <translation id="1321993286294231467">خطایی هنگام ذخیره کردن تصویر روی داد.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">«تنظیمات» را باز کنید.</translation>
 <translation id="2059166748188874810">شهرداری</translation>
 <translation id="2062410130322589403">راهنمای گزینه‌های حریم خصوصی</translation>
+<translation id="20638360198452347">گزینشگر نوع واحد</translation>
 <translation id="2073572773299281212">آخرین فعالیت: <ph name="DAYS" /> روز قبل</translation>
 <translation id="2074131957428911366">هرزمان خواستید می‌توانید مواردی را که می‌خواهید همگام‌سازی شود در <ph name="BEGIN_LINK" />تنظیمات<ph name="END_LINK" /> انتخاب کنید.</translation>
 <translation id="2079545284768500474">لغو</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">ویرایش گردونه</translation>
 <translation id="2316709634732130529">استفاده از گذرواژه پیشنهادی</translation>
 <translation id="2320166752086256636">پنهان کردن صفحه‌کلید</translation>
+<translation id="2326302612031521902">گزینشگر واحد</translation>
 <translation id="2348630484974447747">بسته</translation>
 <translation id="2351097562818989364">تنظیمات ترجمه شما بازنشانی شده است.</translation>
 <translation id="235789365079050412">‏خط‌مشی رازداری Google</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">در نوار نشانی، کاری مثل «پاک کردن سابقه من» یا «ویرایش گذرواژه‌ها» را وارد کنید.</translation>
 <translation id="2461070143328828326">تنظیمات رمز عبور</translation>
 <translation id="2462736546165239215">می‌توانید همه سابقه مرورتان را در اینجا ببینید.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">«مرور ایمن» خاموش شود؟</translation>
 <translation id="2473876017985765807">قبلاً گذرواژه‌ای برای <ph name="WEBSITE" /> ذخیره کرده‌اید</translation>
 <translation id="2476359652512522418">انتخاب نشده</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">استفاده از گذرواژه</translation>
 <translation id="6152406514676263192">برای دریافت مرتبط‌ترین محتوا براساس علایقتان، همگام‌سازی کنید.</translation>
 <translation id="6159839020698489198">اختیاری</translation>
+<translation id="6160780110287872296">فایل بارگیری شود؟</translation>
 <translation id="6170450281939467187">ترجمه نشد</translation>
 <translation id="6173499589275053515">‏گذرواژه در «حساب Google» شما ذخیره شد، <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">نمایش برگه‌ها</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">کوکی‌ها</translation>
 <translation id="6453018583485750254">بررسی هرگز انجام نشده است.</translation>
 <translation id="6459307836338400162">‏برای تنظیمات بیشتر مربوط به حریم خصوصی، امنیت، و جمع‌آوری داده، <ph name="BEGIN_LINK" />همگام‌سازی<ph name="END_LINK" /> و <ph name="BEGIN_LINK" />سرویس‌های Google<ph name="END_LINK" /> را ببینید.</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">در برگه ناشناس جدید</translation>
 <translation id="6464397691496239022">سایت‌ها می‌توانند از کوکی‌ها برای بهبود تجربه مرورتان استفاده کنند، مثلاً برای اینکه شما را درحالت واردشده به سیستم نگه دارند یا موارد موجود در سبد خریدتان را به‌خاطر بسپارند.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
index a920ac02..52afab5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Ne jamais traduire ce site</translation>
 <translation id="1291506870746876680">Les autorisations de <ph name="BEGIN_BOLD" />« <ph name="SITE_NAME" /> »<ph name="END_BOLD" />» seront désactivées lorsque vous quitterez ce site.</translation>
 <translation id="1295289763199166823">Personnaliser le menu</translation>
+<translation id="1296581780163690620">Télécharger le fichier? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Pour vous assurer de toujours pouvoir utiliser les mots de passe dans votre compte Google, vérifiez qu'il s'agit bien de vous.</translation>
 <translation id="1312721752506309252">La protection renforcée est activée</translation>
 <translation id="1321993286294231467">Une erreur s'est produite lors de l'enregistrement de l'image.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Ouvrez « Paramètres ».</translation>
 <translation id="2059166748188874810">Municipalité</translation>
 <translation id="2062410130322589403">Un guide de vos choix en matière de confidentialité</translation>
+<translation id="20638360198452347">Sélecteur de type d'unité</translation>
 <translation id="2073572773299281212">Actif il y a <ph name="DAYS" /> jours</translation>
 <translation id="2074131957428911366">Vous pouvez toujours choisir les éléments à synchroniser dans les <ph name="BEGIN_LINK" />paramètres<ph name="END_LINK" />.</translation>
 <translation id="2079545284768500474">Annuler</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Modifier le carrousel</translation>
 <translation id="2316709634732130529">Utiliser le mot de passe suggéré</translation>
 <translation id="2320166752086256636">Masquer le clavier</translation>
+<translation id="2326302612031521902">Sélecteur d'unité</translation>
 <translation id="2348630484974447747">Colis</translation>
 <translation id="2351097562818989364">Les paramètres de traduction ont été réinitialisés.</translation>
 <translation id="235789365079050412">Politique de confidentialité de Google</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Dans la barre d'adresse, entrez une tâche comme « effacer mon historique » ou « modifier les mots de passe ».</translation>
 <translation id="2461070143328828326">Paramètres des mots de passe</translation>
 <translation id="2462736546165239215">Vous pouvez retrouver tout votre historique de navigation ici.</translation>
+<translation id="2468132863574325555">Disque</translation>
 <translation id="2469960372084740698">Désactiver la navigation sécurisée?</translation>
 <translation id="2473876017985765807">Vous avez déjà enregistré un mot de passe pour le site <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Non sélectionné</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Utilis. mot de passe</translation>
 <translation id="6152406514676263192">Activez la synchronisation pour voir le contenu le plus pertinent en fonction de vos centres d'intérêt.</translation>
 <translation id="6159839020698489198">facultatif</translation>
+<translation id="6160780110287872296">Télécharger le fichier?</translation>
 <translation id="6170450281939467187">Échec de la traduction</translation>
 <translation id="6173499589275053515">Mot de passe enregistré dans votre compte Google, <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Afficher les onglets</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Témoins</translation>
 <translation id="6453018583485750254">La vérification n'a jamais été effectuée.</translation>
 <translation id="6459307836338400162">Pour voir plus de paramètres relatifs à la confidentialité, à la sécurité et à la collecte de données, reportez-vous aux rubriques <ph name="BEGIN_LINK" />Synchronisation<ph name="END_LINK" /> et <ph name="BEGIN_LINK" />Services Google<ph name="END_LINK" />.</translation>
+<translation id="646394917185284261">Fichiers</translation>
 <translation id="6464071786529933911">Ouvrir ds nv ong nav priv</translation>
 <translation id="6464397691496239022">Les sites peuvent utiliser des témoins afin d'améliorer votre expérience de navigation, par exemple en vous permettant de rester connecté ou en mémorisant des articles de votre panier d'achats.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 0410617..e20189b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">कभी भी इस साइट का अनुवाद न करें</translation>
 <translation id="1291506870746876680"><ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> को छोड़ने पर, इससे जुड़ी अनुमतियों को रीसेट करके, बंद कर दिया जाएगा.</translation>
 <translation id="1295289763199166823">मेन्यू को पसंद के मुताबिक बनाएं</translation>
+<translation id="1296581780163690620">क्या आपको फ़ाइल डाउनलोड करनी है? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">यह पक्का करने के लिए कि आप जब चाहें, अपने Google खाते में सेव किए गए पासवर्ड का इस्तेमाल कर पाएं, अपनी पहचान की पुष्टि करें.</translation>
 <translation id="1312721752506309252">बेहतर सुरक्षा की सुविधा चालू है</translation>
 <translation id="1321993286294231467">इमेज सेव करने के दौरान कोई गड़बड़ी हुई.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">"सेटिंग" खोलें.</translation>
 <translation id="2059166748188874810">नगरपालिका</translation>
 <translation id="2062410130322589403">आपकी निजता के विकल्पों की गाइड</translation>
+<translation id="20638360198452347">यूनिट टाइप चुनने की सुविधा</translation>
 <translation id="2073572773299281212"><ph name="DAYS" /> दिन पहले चालू था</translation>
 <translation id="2074131957428911366">आपके पास <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में जाकर अपने हिसाब से चीज़ें सिंक करने का विकल्प है.</translation>
 <translation id="2079545284768500474">पहले जैसा करें</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">कैरसेल में बदलाव करें</translation>
 <translation id="2316709634732130529">सुझाए गए पासवर्ड का इस्तेमाल करें</translation>
 <translation id="2320166752086256636">कीबोर्ड छिपाएं</translation>
+<translation id="2326302612031521902">यूनिट चुनने की सुविधा</translation>
 <translation id="2348630484974447747">पैकेज</translation>
 <translation id="2351097562818989364">आपकी अनुवाद सेटिंग रीसेट कर दी गई हैं.</translation>
 <translation id="235789365079050412">Google निजता नीति</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">पता बार में, “मेरा इतिहास मिटाएं” या “पासवर्ड में बदलाव करें” जैसा कोई टास्क डालें.</translation>
 <translation id="2461070143328828326">पासवर्ड सेटिंग</translation>
 <translation id="2462736546165239215">आपको अपने ब्राउज़िंग का पूरा इतिहास यहां मिल सकता है.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">सुरक्षित ब्राउज़िंग की सुविधा बंद को करना है?</translation>
 <translation id="2473876017985765807">आपने <ph name="WEBSITE" /> पर, पासवर्ड पहले ही सेव कर दिया है</translation>
 <translation id="2476359652512522418">नहीं चुना गया</translation>
@@ -514,7 +518,7 @@
 <translation id="3792713031001122343">{count,plural, =1{अपने Google खाते में 1 बुकमार्क सेव करें}one{अपने Google खाते में {count} बुकमार्क सेव करें}other{अपने Google खाते में {count} बुकमार्क सेव करें}}</translation>
 <translation id="380329542618494757">नाम</translation>
 <translation id="3803696231112616155">इस साइट का अनुवाद करने के लिए पूछें</translation>
-<translation id="3810973564298564668">प्रबंधित करें</translation>
+<translation id="3810973564298564668">मैनेज करें</translation>
 <translation id="3818045793209708987">इस पैकेज को ट्रैक करना बंद किया गया</translation>
 <translation id="3818293389945649617">अगला खोजें</translation>
 <translation id="3819183753496523827">आप ऑफ़लाइन हैं. अपने इंटरनेट कनेक्शन की जांच करें और फिर से कोशिश करें.</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">पासवर्ड का उपयोग करें</translation>
 <translation id="6152406514676263192">अपनी पसंद के हिसाब से, सबसे काम का कॉन्टेंट देखने के लिए सिंक करें.</translation>
 <translation id="6159839020698489198">ज़रूरी नहीं</translation>
+<translation id="6160780110287872296">क्या आपको फ़ाइल डाउनलोड करनी है?</translation>
 <translation id="6170450281939467187">अनुवाद नहीं हुआ</translation>
 <translation id="6173499589275053515">आपके Google खाते, <ph name="EMAIL" /> में पासवर्ड सेव किया गया</translation>
 <translation id="6184086493125982861">टैब दिखाएं</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">कुकी</translation>
 <translation id="6453018583485750254">कभी जांच नहीं हुई.</translation>
 <translation id="6459307836338400162">निजता, सुरक्षा, और डेटा इकट्ठा करने से जुड़ी ज़्यादा सेटिंग के लिए, <ph name="BEGIN_LINK" />सिंक करने की सुविधा<ph name="END_LINK" /> और <ph name="BEGIN_LINK" />Google की सेवाएं<ph name="END_LINK" />, दोनों देखें.</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">नए गुप्त टैब में खोलें</translation>
 <translation id="6464397691496239022">साइटें आपके ब्राउज़ करने के अनुभव को बेहतर बनाने के लिए कुकी का इस्तेमाल कर सकती हैं. जैसे कि आपको साइन इन बनाए रखने के लिए या आपने शॉपिंग कार्ट में जो आइटम सेव किए हैं उन्हें याद रखने के लिए.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
index c24102f..8f69dd9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Երբեք չթարգմանել այս կայքը</translation>
 <translation id="1291506870746876680">Երբ դուրս գաք <ph name="BEGIN_BOLD" />«<ph name="SITE_NAME" />»<ph name="END_BOLD" /> կայքից, դրա բոլոր թույլտվությունները կանջատվեն։</translation>
 <translation id="1295289763199166823">Ընտրացանկի անհատականացում</translation>
+<translation id="1296581780163690620">Ներբեռնե՞լ ֆայլը (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Հաստատեք ձեր ինքնությունը, որպեսզի միշտ կարողանաք օգտագործել գաղտնաբառերը ձեր Google հաշվում</translation>
 <translation id="1312721752506309252">Բարելավված պաշտպանությունը միացված է</translation>
 <translation id="1321993286294231467">Չհաջողվեց պահել պատկերը։</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Բացեք «Կարգավորումներ» բաժինը։</translation>
 <translation id="2059166748188874810">Մունիցիպալիտետ</translation>
 <translation id="2062410130322589403">Գաղտնիության կարգավորումների ուղեցույց</translation>
+<translation id="20638360198452347">Միավորի տեսակի ընտրիչ</translation>
 <translation id="2073572773299281212">Ակտիվ է եղել <ph name="DAYS" /> օր առաջ</translation>
 <translation id="2074131957428911366">Ցանկացած ժամանակ կարող եք անցնել <ph name="BEGIN_LINK" />կարգավորումներ<ph name="END_LINK" /> և ընտրել, թե ինչն եք ուզում համաժամացնել:</translation>
 <translation id="2079545284768500474">Հետարկել</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Կարուսելի փոփոխում</translation>
 <translation id="2316709634732130529">Օգտագործել առաջարկված գաղտնաբառը</translation>
 <translation id="2320166752086256636">Թաքցնել ստեղնաշարը</translation>
+<translation id="2326302612031521902">Միավորի ընտրիչ</translation>
 <translation id="2348630484974447747">Առաքանի</translation>
 <translation id="2351097562818989364">Ձեր թարգմանության կայանքները զրոյացվել են:</translation>
 <translation id="235789365079050412">Google-ի գաղտնիության քաղաքականություն</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Հասցեագոտում մուտքագրեք որևէ առաջադրանք, օրինակ՝ «մաքրել իմ պատմությունը» կամ «փոփոխել գաղտնաբառերը»։</translation>
 <translation id="2461070143328828326">Գաղտնաբառերի կարգավորումներ</translation>
 <translation id="2462736546165239215">Ձեր այցելությունների ամբողջ պատմությունը կգտնեք այստեղ։</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">Անջատե՞լ ապահով դիտարկումը</translation>
 <translation id="2473876017985765807">Դուք <ph name="WEBSITE" /> կայքի համար արդեն պահել եք գաղտնաբառ։</translation>
 <translation id="2476359652512522418">Ընտրված չէ</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Օգտագործել գաղտնաբառը</translation>
 <translation id="6152406514676263192">Միացրեք համաժամացումը՝ ձեր հետաքրքրություններին համապատասխան բովանդակություն տեսնելու համար։</translation>
 <translation id="6159839020698489198">կամընտիր</translation>
+<translation id="6160780110287872296">Ներբեռնե՞լ ֆայլը</translation>
 <translation id="6170450281939467187">Չհաջողվեց թարգմանել</translation>
 <translation id="6173499589275053515">Գաղտնաբառը պահվեց ձեր Google հաշվում (<ph name="EMAIL" />)</translation>
 <translation id="6184086493125982861">Ցույց տալ ներդիրները</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookie ֆայլեր</translation>
 <translation id="6453018583485750254">Ստուգում երբեք չի կատարվել։</translation>
 <translation id="6459307836338400162">Գաղտնիության, անվտանգության և տվյալների հավաքման հետ կապված լրացուցիչ կարգավորումներին կարող եք ծանոթանալ <ph name="BEGIN_LINK" />Համաժամացում<ph name="END_LINK" /> և <ph name="BEGIN_LINK" />Google-ի ծառայություններ<ph name="END_LINK" /> բաժիններում։</translation>
+<translation id="646394917185284261">Ֆայլեր</translation>
 <translation id="6464071786529933911">Բացել նոր ինկոգնիտո ներդիրում</translation>
 <translation id="6464397691496239022">Կայքերը կարող են օգտագործել քուքիներ՝ ձեր աշխատանքն ավելի հարմարավետ դարձնելու, օրինակ, ձեր մուտքը հաշիվ հիշելու կամ ձեր ընտրած ապրանքները զամբյուղում պահելու համար։
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 493e79a..e4781a4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Jangan pernah terjemahkan situs ini</translation>
 <translation id="1291506870746876680">Izin <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> akan direset ke nonaktif saat Anda menutup situs ini.</translation>
 <translation id="1295289763199166823">Sesuaikan Menu</translation>
+<translation id="1296581780163690620">Download file? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Untuk memastikan Anda selalu dapat menggunakan sandi yang tersimpan di Akun Google Anda, verifikasi diri Anda.</translation>
 <translation id="1312721752506309252">Perlindungan yang ditingkatkan aktif</translation>
 <translation id="1321993286294231467">Error saat menyimpan gambar.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Buka "Settings".</translation>
 <translation id="2059166748188874810">Kotamadya</translation>
 <translation id="2062410130322589403">Panduan Terkait Pilihan Privasi Anda</translation>
+<translation id="20638360198452347">Pemilih jenis satuan</translation>
 <translation id="2073572773299281212">Aktif <ph name="DAYS" /> Hari Lalu</translation>
 <translation id="2074131957428911366">Anda dapat memilih konten apa yang akan disinkronkan di <ph name="BEGIN_LINK" />setelan<ph name="END_LINK" /> kapan saja.</translation>
 <translation id="2079545284768500474">Urungkan</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Edit Carousel</translation>
 <translation id="2316709634732130529">Gunakan Sandi yang Disarankan</translation>
 <translation id="2320166752086256636">Sembunyikan keyboard</translation>
+<translation id="2326302612031521902">Pemilih satuan</translation>
 <translation id="2348630484974447747">Paket</translation>
 <translation id="2351097562818989364">Setelan terjemah telah direset.</translation>
 <translation id="235789365079050412">Kebijakan Privasi Google</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Di kolom URL, masukkan tugas seperti “hapus histori saya” atau “edit sandi”.</translation>
 <translation id="2461070143328828326">Setelan Sandi</translation>
 <translation id="2462736546165239215">Anda dapat menemukan semua histori penjelajahan Anda di sini.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">Nonaktifkan Safe Browsing?</translation>
 <translation id="2473876017985765807">Anda sudah menyimpan sandi untuk <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Tidak Dipilih</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Gunakan Sandi</translation>
 <translation id="6152406514676263192">Sinkronkan untuk melihat konten yang paling relevan berdasarkan minat Anda.</translation>
 <translation id="6159839020698489198">opsional</translation>
+<translation id="6160780110287872296">Download file?</translation>
 <translation id="6170450281939467187">Terjemahan Gagal</translation>
 <translation id="6173499589275053515">Sandi disimpan di Akun Google Anda, <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Tampilkan Tab</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookie</translation>
 <translation id="6453018583485750254">Pemeriksaan tidak pernah dijalankan.</translation>
 <translation id="6459307836338400162">Untuk setelan lainnya yang berkaitan dengan privasi, keamanan, dan pengumpulan data, lihat <ph name="BEGIN_LINK" />Sinkronisasi<ph name="END_LINK" /> dan <ph name="BEGIN_LINK" />Layanan Google<ph name="END_LINK" />.</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">Buka di Tab Samaran Baru</translation>
 <translation id="6464397691496239022">Situs dapat menggunakan cookie untuk menyempurnakan pengalaman penjelajahan Anda, misalnya untuk membuat Anda tetap login atau untuk mengingat item di keranjang belanja Anda.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 4b49e33f..be5836a1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">このサイトは翻訳しない</translation>
 <translation id="1291506870746876680"><ph name="BEGIN_BOLD" />「<ph name="SITE_NAME" />」<ph name="END_BOLD" />権限は、このサイトから離れるとオフにリセットされます。</translation>
 <translation id="1295289763199166823">メニューをカスタマイズ</translation>
+<translation id="1296581780163690620">ファイルをダウンロードしますか(<ph name="FILE_SIZE" />)?</translation>
 <translation id="1305822519689023679">Google アカウントのパスワードを常に使用できるようにするには、本人確認を行ってください。</translation>
 <translation id="1312721752506309252">保護強化機能がオンになっています</translation>
 <translation id="1321993286294231467">画像の保存中にエラーが発生しました。</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">[設定] を開きます。</translation>
 <translation id="2059166748188874810">市区町村</translation>
 <translation id="2062410130322589403">プライバシー設定のガイド</translation>
+<translation id="20638360198452347">単位タイプセレクタ</translation>
 <translation id="2073572773299281212">最終同期: <ph name="DAYS" /> 日前</translation>
 <translation id="2074131957428911366">同期する項目はいつでも [<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />] で選択できます。</translation>
 <translation id="2079545284768500474">元に戻す</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">カルーセルの編集</translation>
 <translation id="2316709634732130529">推奨されたパスワードを使用</translation>
 <translation id="2320166752086256636">キーボードを非表示</translation>
+<translation id="2326302612031521902">単位セレクタ</translation>
 <translation id="2348630484974447747">荷物</translation>
 <translation id="2351097562818989364">翻訳設定をリセットしました。</translation>
 <translation id="235789365079050412">Google プライバシー ポリシー</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">アドレスバーに「履歴の消去」や「パスワードの編集」などのタスクを入力します。</translation>
 <translation id="2461070143328828326">パスワードの設定</translation>
 <translation id="2462736546165239215">こちらですべての閲覧履歴を確認できます。</translation>
+<translation id="2468132863574325555">ドライブ</translation>
 <translation id="2469960372084740698">セーフ ブラウジングをオフにしますか?</translation>
 <translation id="2473876017985765807"><ph name="WEBSITE" /> のパスワードは保存済みです</translation>
 <translation id="2476359652512522418">選択されていません</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">パスワードを使用</translation>
 <translation id="6152406514676263192">同期すると、興味や関心と最も関連性の高いコンテンツが表示されます。</translation>
 <translation id="6159839020698489198">任意</translation>
+<translation id="6160780110287872296">ファイルをダウンロードしますか?</translation>
 <translation id="6170450281939467187">翻訳できませんでした</translation>
 <translation id="6173499589275053515">Google アカウント(<ph name="EMAIL" />)に保存されたパスワード</translation>
 <translation id="6184086493125982861">タブを表示</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookie</translation>
 <translation id="6453018583485750254">一度も確認されていません。</translation>
 <translation id="6459307836338400162">プライバシー、セキュリティ、データ収集に関連するその他の設定については、<ph name="BEGIN_LINK" />同期<ph name="END_LINK" />と <ph name="BEGIN_LINK" />Google サービス<ph name="END_LINK" />をご覧ください。</translation>
+<translation id="646394917185284261">ファイル</translation>
 <translation id="6464071786529933911">新しいシークレット タブで開く</translation>
 <translation id="6464397691496239022">サイトは、Cookie を使用してブラウジングの利便性を改善することができます。たとえばログイン状態の維持や、ショッピング カートの中身の保存が可能になります。
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index f9bda06..03ffc6f4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Бұл сайтты ешқашан аудармау</translation>
 <translation id="1291506870746876680">Сайттан шыққанда, <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> рұқсаттары өшіріледі.</translation>
 <translation id="1295289763199166823">Мәзірді бейімдеу</translation>
+<translation id="1296581780163690620">Файлды жүктеп алу керек пе? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Google аккаунтыңыздағы құпия сөздерді үнемі пайдалана алатыныңызға көз жеткізу үшін жеке басыңызды растаңыз.</translation>
 <translation id="1312721752506309252">Күшейтілген қорғаныс қосулы.</translation>
 <translation id="1321993286294231467">Сурет сақтау кезінде қате шықты.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">"Параметрлер" бөлімін ашыңыз.</translation>
 <translation id="2059166748188874810">Қала әкімшілігі</translation>
 <translation id="2062410130322589403">Құпиялық параметрлерінің нұсқаулығы</translation>
+<translation id="20638360198452347">Өлшем бірлігі түрін таңдау құралы</translation>
 <translation id="2073572773299281212"><ph name="DAYS" /> күн бұрын қосылған.</translation>
 <translation id="2074131957428911366">Синхрондалатын контентті кез келген уақытта <ph name="BEGIN_LINK" />Параметрлер<ph name="END_LINK" /> бөлімінде таңдай аласыз.</translation>
 <translation id="2079545284768500474">Қайтару</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Карусельді өзгерту</translation>
 <translation id="2316709634732130529">Ұсынылған құпия сөзді қолдану</translation>
 <translation id="2320166752086256636">Пернетақтаны жасыру</translation>
+<translation id="2326302612031521902">Өлшем бірлігін таңдау құралы</translation>
 <translation id="2348630484974447747">Пакет</translation>
 <translation id="2351097562818989364">Аудару параметрлеріңіз қалпына келтірілді.</translation>
 <translation id="235789365079050412">Google құпиялық саясаты</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Мекенжай жолағында "тарихымды өшіру" немесе "құпия сөздерді өзгерту" сияқты тапсырманы енгізіңіз.</translation>
 <translation id="2461070143328828326">Құпия сөз параметрлері</translation>
 <translation id="2462736546165239215">Браузерді қолданудың толық тарихын осы жерден көруге болады.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">Safe Browsing функциясы өшірілсін бе?</translation>
 <translation id="2473876017985765807"><ph name="WEBSITE" /> веб-сайты үшін құпия сөзді сақтап қойғансыз.</translation>
 <translation id="2476359652512522418">Таңдалмады</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Құпия сөз қолдану</translation>
 <translation id="6152406514676263192">Қызығушылықтарыңызға негізделген барынша сәйкес контентті көру үшін синхрондау функциясын қосыңыз.</translation>
 <translation id="6159839020698489198">міндетті емес</translation>
+<translation id="6160780110287872296">Файлды жүктеп алу керек пе?</translation>
 <translation id="6170450281939467187">Аударылмады</translation>
 <translation id="6173499589275053515">Google аккаунтыңызда (<ph name="EMAIL" />) сақталған құпия сөз.</translation>
 <translation id="6184086493125982861">Қойындыларды көрсету</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookie файлдары</translation>
 <translation id="6453018583485750254">Ешқашан тексерілмеді.</translation>
 <translation id="6459307836338400162">Құпиялыққа, қауіпсіздікке және дерек жинауға қатысты басқа да параметрлерді <ph name="BEGIN_LINK" />Синхрондау<ph name="END_LINK" /> және <ph name="BEGIN_LINK" />Google қызметтері<ph name="END_LINK" /> бөлімінен қараңыз.</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">Жаңа инкогнито қой. ашу</translation>
 <translation id="6464397691496239022">Сайттар шолуды жақсарту (мысалы, аккаунттан шығармау не сатып алу себетіңіздегі нәрселерді есте сақтау) үшін cookie файлдарын пайдалана алады.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
index 534544f..6cccd1c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Бул сайт эч качан которулбасын</translation>
 <translation id="1291506870746876680"><ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> сайтынан чыкканыңызда ага берилген уруксаттар өчүрүлөт.</translation>
 <translation id="1295289763199166823">Менюну тууралоо</translation>
+<translation id="1296581780163690620">Файлды жүктөп аласызбы? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Google аккаунтуңуздагы сырсөздөрдү каалаган убакта колдонуу үчүн бул өзүңүз экениңизди ырастаңыз.</translation>
 <translation id="1312721752506309252">Өркүндөтүлгөн коргоо күйүк</translation>
 <translation id="1321993286294231467">Сүрөттү сактоодо ката кетти.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">"Параметрлерди" ачыңыз.</translation>
 <translation id="2059166748188874810">Муниципалитет</translation>
 <translation id="2062410130322589403">Купуялык параметрлери боюнча жетектеме</translation>
+<translation id="20638360198452347">Бирдик түрүн тандагыч</translation>
 <translation id="2073572773299281212"><ph name="DAYS" /> күн мурун жигердүү болгон</translation>
 <translation id="2074131957428911366">Эмнени шайкештирүү керек экенин <ph name="BEGIN_LINK" />жөндөөлөрдөн<ph name="END_LINK" /> ар дайым тандай аласыз.</translation>
 <translation id="2079545284768500474">Кайтаруу</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Айлампаны түзөтүү</translation>
 <translation id="2316709634732130529">Сунушталган сырсөздү колдонуу</translation>
 <translation id="2320166752086256636">Баскычтопту жашыруу</translation>
+<translation id="2326302612031521902">Бирдик тандагыч</translation>
 <translation id="2348630484974447747">Таңгак</translation>
 <translation id="2351097562818989364">Которуу параметрлериңиз баштапкы абалга келтирилди.</translation>
 <translation id="235789365079050412">Google Купуялык эрежелери</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">"Таржымалды өчүрүү" же "сырсөздөрдү өзгөртүү" сыяктуу жасалчу ишти дарек тилкесине жазыңыз.</translation>
 <translation id="2461070143328828326">Сырсөздүн параметрлери</translation>
 <translation id="2462736546165239215">Көргөн вебсайттарыңыздын баарын бул жерден таба аласыз.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">Коопсуз серептөө өчүрүлсүнбү?</translation>
 <translation id="2473876017985765807"><ph name="WEBSITE" /> үчүн сырсөздү сактап койгонсуз</translation>
 <translation id="2476359652512522418">Тандалган жок</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Сырсөз колдонуу</translation>
 <translation id="6152406514676263192">Контентти кызыккан нерселериңиздин негизинде шайкештириңиз.</translation>
 <translation id="6159839020698489198">кошумча</translation>
+<translation id="6160780110287872296">Файлды жүктөп аласызбы?</translation>
 <translation id="6170450281939467187">Которулбай калды</translation>
 <translation id="6173499589275053515">Сырсөз Google аккаунтуңузга сакталды, <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Өтмөктөрдү көрсөтүү</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Кукилер</translation>
 <translation id="6453018583485750254">Эч качан текшерилбейт.</translation>
 <translation id="6459307836338400162">Купуялыкка, коопсуздукка жана дайындарды чогултууга байланыштуу дагы башка параметрлерди көрүү үчүн <ph name="BEGIN_LINK" />Шайкештирүү<ph name="END_LINK" /> жана <ph name="BEGIN_LINK" />Google кызматтары<ph name="END_LINK" /> бөлүмүнө өтүңүз.</translation>
+<translation id="646394917185284261">Файлдар</translation>
 <translation id="6464071786529933911">Жаңы жашруун өтмктө ачуу</translation>
 <translation id="6464397691496239022">Серептөөнү ыңгайлаштыруу, мисалы, аккаунттан чыгарбоо же арабадагы сатып алган нерселериңизди эстеп калуу үчүн сайттар cookie файлдарын колдоно алышат.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index 2ed2ae66..4a45bf1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">ഈ സൈറ്റ് ഒരിക്കലും വിവര്‍‌ത്തനം ചെയ്യരുത്</translation>
 <translation id="1291506870746876680">നിങ്ങൾ സൈറ്റിൽ നിന്ന് പുറത്ത് കടക്കുമ്പോൾ "<ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> അനുമതികൾ ഓഫാക്കി റീസെറ്റ് ചെയ്യും.</translation>
 <translation id="1295289763199166823">മെനു ഇഷ്ടാനുസൃതമാക്കുക</translation>
+<translation id="1296581780163690620">ഫയൽ ഡൗൺലോഡ് ചെയ്യണോ? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">നിങ്ങളുടെ Google അക്കൗണ്ടിലെ പാസ്‌വേഡുകൾ എല്ലായ്‌പ്പോഴും ഉപയോഗിക്കാനാകുമെന്ന് ഉറപ്പാക്കാൻ, ഇത് നിങ്ങൾ തന്നെയാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക.</translation>
 <translation id="1312721752506309252">മെച്ചപ്പെടുത്തിയ പരിരക്ഷ ഓണാക്കിയിരിക്കുന്നു</translation>
 <translation id="1321993286294231467">ചിത്രം സംരക്ഷിക്കുന്നതിൽ പിശക്.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">"ക്രമീകരണം" തുറക്കുക.</translation>
 <translation id="2059166748188874810">മുൻസിപ്പാലിറ്റി</translation>
 <translation id="2062410130322589403">നിങ്ങളുടെ സ്വകാര്യതാ ചോയ്‌സുകളെ കുറിച്ചുള്ള ഗൈഡ്</translation>
+<translation id="20638360198452347">യൂണിറ്റ് തരം സെലക്‌ടർ</translation>
 <translation id="2073572773299281212"><ph name="DAYS" /> ദിവസം മുമ്പ് സജീവമായിരുന്നു</translation>
 <translation id="2074131957428911366">എന്തൊക്കെ സമന്വയിക്കണമെന്നത് <ph name="BEGIN_LINK" />ക്രമീകരണത്തിൽ<ph name="END_LINK" /> നിങ്ങൾക്ക് എപ്പോഴും തിരഞ്ഞെടുക്കാം.</translation>
 <translation id="2079545284768500474">പഴയപടിയാക്കുക</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">കറൗസൽ എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="2316709634732130529">നിർദ്ദേശിച്ച പാസ്‌വേഡ് ഉപയോഗിക്കുക</translation>
 <translation id="2320166752086256636">കീബോർഡ് മറയ്‌ക്കുക</translation>
+<translation id="2326302612031521902">യൂണിറ്റ് സെലക്‌ടർ</translation>
 <translation id="2348630484974447747">പാക്കേജ്</translation>
 <translation id="2351097562818989364">നിങ്ങളുടെ വിവർത്തന ക്രമീകരണം റീസെറ്റ് ചെയ്‌തു.</translation>
 <translation id="235789365079050412">Google സ്വകാര്യതാ നയം</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">വിലാസ ബാറിൽ, "എന്റെ ചരിത്രം മായ്‌ക്കുക" അല്ലെങ്കിൽ "പാസ്‌വേഡുകൾ എഡിറ്റ് ചെയ്യുക" പോലുള്ള ഒരു ടാസ്‌ക് നൽകുക.</translation>
 <translation id="2461070143328828326">പാസ്‌വേഡ് ക്രമീകരണം</translation>
 <translation id="2462736546165239215">നിങ്ങളുടെ എല്ലാ ബ്രൗസിംഗ് ചരിത്രവും ഇവിടെ കണ്ടെത്താനാകും.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">സുരക്ഷിത ബ്രൗസിംഗ് ഓഫാക്കണോ?</translation>
 <translation id="2473876017985765807"><ph name="WEBSITE" /> എന്നതിനുള്ള പാസ്‌വേഡ് നിങ്ങൾ മുമ്പേ സംരക്ഷിച്ചു</translation>
 <translation id="2476359652512522418">തിരഞ്ഞെടുത്തിട്ടില്ല</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">പാസ്‌വേഡ് ഉപയോഗിക്കുക</translation>
 <translation id="6152406514676263192">നിങ്ങളുടെ താൽപ്പര്യങ്ങൾ അടിസ്ഥാനമാക്കി എറ്റവും പ്രസക്തമായ ഉള്ളടക്കം കാണാൻ സമന്വയിപ്പിക്കൂ.</translation>
 <translation id="6159839020698489198">ഓപ്‌ഷണൽ</translation>
+<translation id="6160780110287872296">ഫയൽ ഡൗൺലോഡ് ചെയ്യണോ?</translation>
 <translation id="6170450281939467187">വിവർത്തനം ചെയ്യാനായില്ല</translation>
 <translation id="6173499589275053515">നിങ്ങളുടെ <ph name="EMAIL" /> എന്ന Google അക്കൗണ്ടിൽ സംരക്ഷിച്ച പാസ്‌വേഡ്</translation>
 <translation id="6184086493125982861">ടാബുകൾ കാണിക്കുക</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">കുക്കികള്‍</translation>
 <translation id="6453018583485750254">പരിശോധന ഒരിക്കലും നടന്നില്ല.</translation>
 <translation id="6459307836338400162">സ്വകാര്യത, സുരക്ഷ, ഡാറ്റാ ശേഖരണം എന്നിവയുമായി ബന്ധപ്പെട്ട കൂടുതൽ ക്രമീകരണത്തിന് <ph name="BEGIN_LINK" />സമന്വയവും<ph name="END_LINK" /> <ph name="BEGIN_LINK" />Google സേവനങ്ങളും<ph name="END_LINK" />കാണുക.</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">പുതിയ അദൃശ്യ ടാബിൽ തുറക്കുക</translation>
 <translation id="6464397691496239022">നിങ്ങളുടെ ബ്രൗസിംഗ് അനുഭവം മെച്ചപ്പെടുത്താൻ സൈറ്റുകൾക്ക് കുക്കികൾ ഉപയോഗിക്കാവുന്നതാണ്, ഉദാഹരണത്തിന്, സൈൻ ഇൻ ചെയ്‌ത നിലയിൽ തുടരാനോ ഷോപ്പിംഗ് കാർട്ടിലെ ഇനങ്ങൾ ഓർമ്മിക്കാനോ.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index 25cd0d8..341aba367 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Энэ сайтыг хэзээ ч бүү хөрвүүл</translation>
 <translation id="1291506870746876680">Таныг энэ сайтаас гарах үед <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" />-н зөвшөөрлийг унтраасан болгож шинэчилнэ.</translation>
 <translation id="1295289763199166823">Цэсийг өөрчлөх</translation>
+<translation id="1296581780163690620">Файлыг татах уу? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Та нууц үгнүүдийг Google Бүртгэлдээ үргэлж ашиглах боломжтой болохоо баталгаажуулахын тулд өөрийгөө мөн болохыг бататгана уу.</translation>
 <translation id="1312721752506309252">Сайжруулсан хамгаалалт асаалттай байна</translation>
 <translation id="1321993286294231467">Зургийг хадгалахад алдаа гарлаа.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">"Тохиргоо"-г нээнэ үү.</translation>
 <translation id="2059166748188874810">Хотын захиргаа</translation>
 <translation id="2062410130322589403">Таны нууцлалын сонголтуудын чиглүүлэгч</translation>
+<translation id="20638360198452347">Нэгжийн төрөл сонгогч</translation>
 <translation id="2073572773299281212"><ph name="DAYS" /> өдрийн өмнөөс идэвхтэй</translation>
 <translation id="2074131957428911366">Та синк хийх зүйлээ хүссэн үедээ <ph name="BEGIN_LINK" />тохиргооноос<ph name="END_LINK" /> сонгож болно.</translation>
 <translation id="2079545284768500474">Буцаах</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Тойруулгыг засах</translation>
 <translation id="2316709634732130529">Санал болгосон нууц үгийг ашиглах</translation>
 <translation id="2320166752086256636">Компьютерийн гарыг нуух</translation>
+<translation id="2326302612031521902">Нэгж сонгогч</translation>
 <translation id="2348630484974447747">Илгээмж</translation>
 <translation id="2351097562818989364">Таны орчуулгын тохиргоо дахин шинэчлэгдсэн байна.</translation>
 <translation id="235789365079050412">Google-н нууцлалын бодлого</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Хаяг оруулах хэсэгт “миний түүхийг арилгах” эсвэл “нууц үгнүүдийг засах” зэрэг ажлууд оруулна уу.</translation>
 <translation id="2461070143328828326">Нууц үгний тохиргоо</translation>
 <translation id="2462736546165239215">Та бүх хөтчийн түүхээ эндээс олох боломжтой.</translation>
+<translation id="2468132863574325555">Драйв</translation>
 <translation id="2469960372084740698">Аюулгүй үзэхийг унтраах уу?</translation>
 <translation id="2473876017985765807">Та <ph name="WEBSITE" />-н нууц үгийг аль хэдийн хадгалсан</translation>
 <translation id="2476359652512522418">Сонгоогүй</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Нууц үг ашиглах</translation>
 <translation id="6152406514676263192">Таны сонирхолд тулгуурласан хамгийн хамааралтай контент харахын тулд синк хийнэ үү.</translation>
 <translation id="6159839020698489198">заавал биш</translation>
+<translation id="6160780110287872296">Файлыг татах уу?</translation>
 <translation id="6170450281939467187">Орчуулж чадсангүй</translation>
 <translation id="6173499589275053515">Таны <ph name="EMAIL" /> Google Бүртгэлд нууц үг хадгалсан</translation>
 <translation id="6184086493125982861">Цонхнуудыг харуул</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookies</translation>
 <translation id="6453018583485750254">Огт шалгаж байгаагүй.</translation>
 <translation id="6459307836338400162">Нууцлал, аюулгүй байдал болон өгөгдөл цуглуулахтай холбоотой бусад тохиргооны хувьд <ph name="BEGIN_LINK" />Синк хийх<ph name="END_LINK" /> ба <ph name="BEGIN_LINK" />Google-н үйлчилгээнүүд<ph name="END_LINK" />-ийн аль алиныг харна уу.</translation>
+<translation id="646394917185284261">Файлс</translation>
 <translation id="6464071786529933911">Нууцлалын шинэ табад нээх</translation>
 <translation id="6464397691496239022">Сайтууд нь, жишээлбэл таныг нэвтэрсэн хэвээр байлгах эсвэл таны худалдан авалтын сагсан дахь зүйлсийг санах зэргээр таны хөтчийн туршлагыг сайжруулахын тулд күүки ашиглах боломжтой.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 64293b19..555c810 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Deze site nooit vertalen</translation>
 <translation id="1291506870746876680">De rechten voor <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> worden weer uitgezet als je deze site verlaat.</translation>
 <translation id="1295289763199166823">Menu aanpassen</translation>
+<translation id="1296581780163690620">Bestand downloaden? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Bevestig dat jij het bent zodat je de wachtwoorden in je Google-account altijd kunt gebruiken.</translation>
 <translation id="1312721752506309252">Geoptimaliseerde beveiliging staat aan</translation>
 <translation id="1321993286294231467">Fout bij opslaan van afbeelding.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Open Instellingen.</translation>
 <translation id="2059166748188874810">Gemeente</translation>
 <translation id="2062410130322589403">Een gids met je privacykeuzes</translation>
+<translation id="20638360198452347">Kiezer voor type eenheid</translation>
 <translation id="2073572773299281212"><ph name="DAYS" /> dagen geleden actief</translation>
 <translation id="2074131957428911366">Je kunt altijd in de <ph name="BEGIN_LINK" />instellingen<ph name="END_LINK" /> bepalen wat je wilt synchroniseren.</translation>
 <translation id="2079545284768500474">Ongedaan maken</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Carrousel bewerken</translation>
 <translation id="2316709634732130529">Voorgesteld wachtwoord gebruiken</translation>
 <translation id="2320166752086256636">Toetsenbord verbergen</translation>
+<translation id="2326302612031521902">Eenheidskiezer</translation>
 <translation id="2348630484974447747">Pakket</translation>
 <translation id="2351097562818989364">Je vertaalinstellingen zijn opnieuw ingesteld.</translation>
 <translation id="235789365079050412">Privacybeleid van Google</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Geef in de adresbalk een taak op, zoals 'mijn geschiedenis wissen' of 'wachtwoorden bewerken'.</translation>
 <translation id="2461070143328828326">Wachtwoordinstellingen</translation>
 <translation id="2462736546165239215">Hier vind je je hele browsegeschiedenis.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">Safe Browsing uitzetten?</translation>
 <translation id="2473876017985765807">Je hebt al een wachtwoord opgeslagen voor <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Niet geselecteerd</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Wachtwoord gebruiken</translation>
 <translation id="6152406514676263192">Synchroniseer voor de meest relevante content op basis van je interesses.</translation>
 <translation id="6159839020698489198">optioneel</translation>
+<translation id="6160780110287872296">Bestand downloaden?</translation>
 <translation id="6170450281939467187">Vertalen mislukt</translation>
 <translation id="6173499589275053515">Wachtwoord opgeslagen in je Google-account, <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Tabbladen bekijken</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookies</translation>
 <translation id="6453018583485750254">Check nooit uitgevoerd.</translation>
 <translation id="6459307836338400162">Bekijk <ph name="BEGIN_LINK" />Synchronisatie<ph name="END_LINK" /> en <ph name="BEGIN_LINK" />Google-services<ph name="END_LINK" /> voor meer instellingen over privacy, beveiliging en gegevensverzameling.</translation>
+<translation id="646394917185284261">Bestanden</translation>
 <translation id="6464071786529933911">Openen op nieuw incognitotabblad</translation>
 <translation id="6464397691496239022">Sites mogen cookies gebruiken om de browsefunctionaliteit te verbeteren, bijvoorbeeld door je ingelogd te houden of door artikelen in je winkelwagen te onthouden.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index e0e62b0..4bc4274 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Oversett aldri dette nettstedet</translation>
 <translation id="1291506870746876680">Tillatelsene for <ph name="BEGIN_BOLD" />«<ph name="SITE_NAME" />»<ph name="END_BOLD" /> blir tilbakestilt til å være avslått når du forlater dette nettstedet.</translation>
 <translation id="1295289763199166823">Tilpass menyen</translation>
+<translation id="1296581780163690620">Vil du laste ned filen? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">For å sikre at du alltid kan bruke passordene i Google-kontoen din, må du bekrefte at det er deg.</translation>
 <translation id="1312721752506309252">Økt beskyttelse er på</translation>
 <translation id="1321993286294231467">Feil ved lagring av bilde.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Åpne «Innstillinger».</translation>
 <translation id="2059166748188874810">Kommune</translation>
 <translation id="2062410130322589403">En veiledning til personvernvalgene dine</translation>
+<translation id="20638360198452347">Enhetstypevelger</translation>
 <translation id="2073572773299281212">Aktiv for <ph name="DAYS" /> dager siden</translation>
 <translation id="2074131957428911366">Du kan når som helst velge hva du vil synkronisere, i <ph name="BEGIN_LINK" />innstillingene<ph name="END_LINK" />.</translation>
 <translation id="2079545284768500474">Angre</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Rediger karusell</translation>
 <translation id="2316709634732130529">Bruk foreslått passord</translation>
 <translation id="2320166752086256636">Skjul tastaturet</translation>
+<translation id="2326302612031521902">Enhetsvelger</translation>
 <translation id="2348630484974447747">Pakke</translation>
 <translation id="2351097562818989364">Oversettelsesinnstillingene dine er tilbakestilt.</translation>
 <translation id="235789365079050412">Googles personvernregler</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Skriv inn en oppgave i adressefeltet, for eksempel «tøm loggen» eller «rediger passord».</translation>
 <translation id="2461070143328828326">Passordinnstillinger</translation>
 <translation id="2462736546165239215">Du finner hele nettleserloggen din her.</translation>
+<translation id="2468132863574325555">Disk</translation>
 <translation id="2469960372084740698">Vil du slå av Safe Browsing?</translation>
 <translation id="2473876017985765807">Du har allerede lagret et passord for <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Ikke valgt</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Bruk passord</translation>
 <translation id="6152406514676263192">Synkroniser for å få det mest relevante innholdet basert på interessene dine.</translation>
 <translation id="6159839020698489198">valgfritt</translation>
+<translation id="6160780110287872296">Vil du laste ned filen?</translation>
 <translation id="6170450281939467187">Kunne ikke oversette</translation>
 <translation id="6173499589275053515">Passordet er lagret i Google-kontoen din, <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Vis faner</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Informasjonskapsler</translation>
 <translation id="6453018583485750254">Sjekken har aldri vært kjørt.</translation>
 <translation id="6459307836338400162">For flere innstillinger knyttet til personvern, sikkerhet og datainnsamling, se både <ph name="BEGIN_LINK" />Synkronisering<ph name="END_LINK" /> og <ph name="BEGIN_LINK" />Google-tjenester<ph name="END_LINK" /> .</translation>
+<translation id="646394917185284261">Filer</translation>
 <translation id="6464071786529933911">Åpne i en ny inkognitofane</translation>
 <translation id="6464397691496239022">Nettsteder kan bruke informasjonskapsler for å gi deg en bedre surfeopplevelse, for eksempel for å holde deg pålogget eller huske varene i handlekurven din.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 9571159..3a020d1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Nu traduce niciodată acest site</translation>
 <translation id="1291506870746876680">Permisiunile pentru <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> vor fi resetate la starea dezactivat când părăsești site-ul.</translation>
 <translation id="1295289763199166823">Personalizează meniul</translation>
+<translation id="1296581780163690620">Descarci fișierul? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Pentru a te asigura că poți folosi oricând parolele din Contul Google, confirmă-ți identitatea.</translation>
 <translation id="1312721752506309252">Protecția îmbunătățită este activată</translation>
 <translation id="1321993286294231467">Eroare la salvarea imaginii.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Deschide Setări.</translation>
 <translation id="2059166748188874810">Municipiu</translation>
 <translation id="2062410130322589403">Un ghid pentru opțiunile de confidențialitate</translation>
+<translation id="20638360198452347">Selector pentru tipul de unitate</translation>
 <translation id="2073572773299281212">Activ acum <ph name="DAYS" /> zile</translation>
 <translation id="2074131957428911366">Poți să alegi oricând ce să sincronizezi în <ph name="BEGIN_LINK" />setări<ph name="END_LINK" />.</translation>
 <translation id="2079545284768500474">Anulează</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Editează caruselul</translation>
 <translation id="2316709634732130529">Folosește parola sugerată</translation>
 <translation id="2320166752086256636">Ascunde tastatura</translation>
+<translation id="2326302612031521902">Selector de unități</translation>
 <translation id="2348630484974447747">Colet</translation>
 <translation id="2351097562818989364">Setările de traducere au fost resetate.</translation>
 <translation id="235789365079050412">Politica de confidențialitate Google</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">În bara de adrese, introdu o activitate, cum ar fi „șterge istoricul” sau „editează parolele”.</translation>
 <translation id="2461070143328828326">Setări parolă</translation>
 <translation id="2462736546165239215">Aici găsești întregul istoric de navigare.</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">Dezactivezi Navigarea sigură?</translation>
 <translation id="2473876017985765807">Ai salvat deja o parolă pentru <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Neselectat</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Folosește parola</translation>
 <translation id="6152406514676263192">Sincronizează pentru conținutul cel mai relevant în funcție de interesele tale.</translation>
 <translation id="6159839020698489198">opțional</translation>
+<translation id="6160780110287872296">Descarci fișierul?</translation>
 <translation id="6170450281939467187">Traducere nereușită</translation>
 <translation id="6173499589275053515">Parola s-a salvat în Contul Google, <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Afișează butonul File</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookie-uri</translation>
 <translation id="6453018583485750254">Nu s-a făcut niciodată verificarea.</translation>
 <translation id="6459307836338400162">Pentru mai multe setări privind confidențialitatea, securitatea și colectarea datelor, consultă <ph name="BEGIN_LINK" />Sincronizarea<ph name="END_LINK" /> și <ph name="BEGIN_LINK" />Serviciile Google<ph name="END_LINK" />.</translation>
+<translation id="646394917185284261">Fișiere</translation>
 <translation id="6464071786529933911">Deschide în Filă incognito nouă</translation>
 <translation id="6464397691496239022">Site-urile pot folosi cookie-uri pentru a-ți îmbunătăți experiența de navigare, de exemplu, pentru a te menține conectat(ă) sau pentru a reține articolele din coșul de cumpărături.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 7ecd2aa..00e6646c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Nikdy neprekladať tieto webové stránky</translation>
 <translation id="1291506870746876680">Keď web <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> opustíte, povolenia preň sa resetujú na možnosť Vypnuté.</translation>
 <translation id="1295289763199166823">Prispôsobiť ponuku</translation>
+<translation id="1296581780163690620">Chcete súbor stiahnuť? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Ak sa chcete uistiť, že vo svojom účte Google môžete kedykoľvek použiť heslá, overte svoju totožnosť.</translation>
 <translation id="1312721752506309252">Je zapnutá rozšírená ochrana</translation>
 <translation id="1321993286294231467">Chyba pri ukladaní obrázka.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Otvorte Nastavenia.</translation>
 <translation id="2059166748188874810">Správna jednotka</translation>
 <translation id="2062410130322589403">Sprievodca vašimi voľbami ochrany súkromia</translation>
+<translation id="20638360198452347">Výber typu jednotky</translation>
 <translation id="2073572773299281212">Aktívne pred <ph name="DAYS" /> dňami</translation>
 <translation id="2074131957428911366">Položky, ktoré chcete synchronizovať, môžete vybrať v <ph name="BEGIN_LINK" />nastaveniach<ph name="END_LINK" />.</translation>
 <translation id="2079545284768500474">Späť</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Úprava posuvného pása</translation>
 <translation id="2316709634732130529">Použiť navrhnuté heslo</translation>
 <translation id="2320166752086256636">Skryť klávesnicu</translation>
+<translation id="2326302612031521902">Výber jednotky</translation>
 <translation id="2348630484974447747">Zásielka</translation>
 <translation id="2351097562818989364">Nastavenia prekladov boli resetované.</translation>
 <translation id="235789365079050412">Pravidlá ochrany súkromia spoločnosti Google</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">Do panela s adresou zadajte úlohu, napríklad „vymazať moju históriu“ alebo „upraviť heslá“.</translation>
 <translation id="2461070143328828326">Nastavenia hesla</translation>
 <translation id="2462736546165239215">Tu nájdete celú históriu prehliadania.</translation>
+<translation id="2468132863574325555">Disk</translation>
 <translation id="2469960372084740698">Chcete vypnúť Bezpečné prehliadanie?</translation>
 <translation id="2473876017985765807">Už ste si uložili heslo pre web <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Nevybrané</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Použiť heslo</translation>
 <translation id="6152406514676263192">Synchronizujte a získavajte tak najrelevantnejší obsah na základe svojich záujmov.</translation>
 <translation id="6159839020698489198">nepovinné</translation>
+<translation id="6160780110287872296">Chcete súbor stiahnuť?</translation>
 <translation id="6170450281939467187">Nepodarilo sa preložiť</translation>
 <translation id="6173499589275053515">Heslo bolo uložené do vášho účtu Google, <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Zobraziť karty</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Súbory cookie</translation>
 <translation id="6453018583485750254">Kontrola nebola nikdy spustená.</translation>
 <translation id="6459307836338400162">Ďalšie nastavenia týkajúce sa ochrany súkromia, zabezpečenia a zhromažďovania údajov nájdete v sekciách <ph name="BEGIN_LINK" />Synchronizácia<ph name="END_LINK" /> a <ph name="BEGIN_LINK" />Služby Googlu<ph name="END_LINK" />.</translation>
+<translation id="646394917185284261">Súbory</translation>
 <translation id="6464071786529933911">Otvoriť na novej karte inkognito</translation>
 <translation id="6464397691496239022">Weby môžu pomocou súborov cookie zlepšovať vaše prostredie prehliadania, napríklad zabrániť odhláseniu alebo zapamätať si položky vo vašom nákupnom košíku.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index 4423922..dc9d318 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">Nikoli ne prevedi tega spletnega mesta</translation>
 <translation id="1291506870746876680">Dovoljenja za spletno mesto <ph name="BEGIN_BOLD" />»<ph name="SITE_NAME" />«<ph name="END_BOLD" /> bodo ponastavljena na izklopljena, ko zapustite to spletno mesto.</translation>
 <translation id="1295289763199166823">Prilagodi meni</translation>
+<translation id="1296581780163690620">Želite prenesti datoteko? (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">Če želite zagotoviti, da boste lahko v računu Google vedno uporabljali gesla, potrdite, da ste to vi.</translation>
 <translation id="1312721752506309252">Izboljšana zaščita je vklopljena.</translation>
 <translation id="1321993286294231467">Napaka pri shranjevanju slike.</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">Odprite nastavitve.</translation>
 <translation id="2059166748188874810">Občina</translation>
 <translation id="2062410130322589403">Vodnik po vaših izbirah zasebnosti</translation>
+<translation id="20638360198452347">Izbirnik vrste enote</translation>
 <translation id="2073572773299281212">Aktivna pred toliko dnevi: <ph name="DAYS" /></translation>
 <translation id="2074131957428911366">V <ph name="BEGIN_LINK" />nastavitvah<ph name="END_LINK" /> lahko kadar koli izberete, kaj želite sinhronizirati.</translation>
 <translation id="2079545284768500474">Razveljavi</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">Urejanje vrtiljaka</translation>
 <translation id="2316709634732130529">Uporabi predlagano geslo</translation>
 <translation id="2320166752086256636">Skrij tipkovnico</translation>
+<translation id="2326302612031521902">Izbirnik enot</translation>
 <translation id="2348630484974447747">Paket</translation>
 <translation id="2351097562818989364">Nastavitve za prevajanje so ponastavljene.</translation>
 <translation id="235789365079050412">Googlov pravilnik o zasebnosti</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">V naslovni vrstici vnesite opravilo, kot je »clear my history« (počisti mojo zgodovino) ali »edit passwords« (uredi gesla).</translation>
 <translation id="2461070143328828326">Nastavitve gesel</translation>
 <translation id="2462736546165239215">Tukaj je na voljo celotna zgodovina brskanja.</translation>
+<translation id="2468132863574325555">Google Drive</translation>
 <translation id="2469960372084740698">Želite izklopiti varno brskanje?</translation>
 <translation id="2473876017985765807">Geslo za <ph name="WEBSITE" /> ste že shranili.</translation>
 <translation id="2476359652512522418">Ni izbrano</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">Use Password</translation>
 <translation id="6152406514676263192">Sinhronizirajte za najpomembnejšo vsebino glede na vaša zanimanja.</translation>
 <translation id="6159839020698489198">izbirno</translation>
+<translation id="6160780110287872296">Želite prenesti datoteko?</translation>
 <translation id="6170450281939467187">Prevajanje ni uspelo</translation>
 <translation id="6173499589275053515">Geslo je shranjeno v računu Google, <ph name="EMAIL" /></translation>
 <translation id="6184086493125982861">Pokaži zavihke</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Piškotki</translation>
 <translation id="6453018583485750254">Preverjanje še ni bilo izvedeno.</translation>
 <translation id="6459307836338400162">Če vas zanima več nastavitev, povezanih z zasebnostjo, varnostjo in zbiranjem podatkov, si oglejte razdelka <ph name="BEGIN_LINK" />Sinhronizacija<ph name="END_LINK" /> in <ph name="BEGIN_LINK" />Googlove storitve<ph name="END_LINK" />.</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">Open in New Incognito Tab</translation>
 <translation id="6464397691496239022">Spletna mesta lahko uporabljajo piškotke za izboljšanje izkušnje brskanja, na primer tako, da poskrbijo, da ostanete prijavljeni, ali si zapomnijo izdelke v nakupovalnem vozičku.
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
index 4310541..3ca82b6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">اس سائٹ کا ترجمہ کبھی نہ کریں</translation>
 <translation id="1291506870746876680">جب آپ اس سائٹ کو چھوڑ دیتے ہیں تو <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> اجازتیں ری سیٹ ہو جائیں گی۔</translation>
 <translation id="1295289763199166823">مینیو کو حسب ضرورت بنائیں</translation>
+<translation id="1296581780163690620">فائل ڈاؤن لوڈ کریں؟ (<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">‏یہ یقینی بنانے کیلئے کہ آپ ہمیشہ اپنے Google اکاؤنٹ میں پاس ورڈز استعمال کر سکتے ہیں، تصدیق کریں کہ یہ آپ ہی ہیں۔</translation>
 <translation id="1312721752506309252">بہتر کردہ تحفظ آن ہے</translation>
 <translation id="1321993286294231467">تصویر محفوظ کرنے میں خرابی۔</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">"ترتیبات" کھولیں۔</translation>
 <translation id="2059166748188874810">میونسپلٹی</translation>
 <translation id="2062410130322589403">آپ کی رازداری کے انتخابات کی گائیڈ</translation>
+<translation id="20638360198452347">یونٹ کی قسم کا منتخب کنندہ</translation>
 <translation id="2073572773299281212"><ph name="DAYS" /> دن پہلے فعال تھا</translation>
 <translation id="2074131957428911366">آپ <ph name="BEGIN_LINK" />ترتیبات<ph name="END_LINK" /> میں کسی بھی وقت اس بات کا انتخاب کر سکتے ہیں کہ کس چیز کی مطابقت پذیری کرنی ہے۔</translation>
 <translation id="2079545284768500474">کالعدم کریں</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">کیراسیل میں ترمیم کریں</translation>
 <translation id="2316709634732130529">تجویز کردہ پاس ورڈ استعمال کریں</translation>
 <translation id="2320166752086256636">کی بورڈ چھپائیں</translation>
+<translation id="2326302612031521902">یونٹ کا منتخب کنندہ</translation>
 <translation id="2348630484974447747">پیکیج</translation>
 <translation id="2351097562818989364">ترجمہ کی آپ کی ترتیبات دوبارہ ترتیب دی گئیں ہیں۔</translation>
 <translation id="235789365079050412">‏Google کی رازداری کی پالیسی</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">ایڈریس بار میں، "میری سرگزشت صاف کریں" یا "پاس ورڈز میں ترمیم کریں" جیسا کام درج کریں۔</translation>
 <translation id="2461070143328828326">پاس ورڈ کی ترتیبات</translation>
 <translation id="2462736546165239215">آپ یہاں اپنی تمام براؤزنگ کی سرگزشت تلاش کر سکتے ہیں۔</translation>
+<translation id="2468132863574325555">Drive</translation>
 <translation id="2469960372084740698">محفوظ براؤزنگ آف کریں؟</translation>
 <translation id="2473876017985765807">آپ نے پہلے ہی <ph name="WEBSITE" /> کے لیے ایک پاس ورڈ محفوظ کیا ہے</translation>
 <translation id="2476359652512522418">انتخاب نہیں کیا گیا</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">پاس ورڈ استعمال کریں</translation>
 <translation id="6152406514676263192">اپنی دلچسپیوں کی بنیاد پر انتہائی متعلقہ مواد کے لیے مطابقت پذیری کریں۔</translation>
 <translation id="6159839020698489198">اختیاری</translation>
+<translation id="6160780110287872296">فائل ڈاؤن لوڈ کریں؟</translation>
 <translation id="6170450281939467187">ترجمہ نہیں ہو سکا</translation>
 <translation id="6173499589275053515">‏آپ کے Google اکاؤنٹ <ph name="EMAIL" /> میں پاس ورڈ محفوظ کیا گیا ہے</translation>
 <translation id="6184086493125982861">ٹیبز دکھائیں</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">کوکیز</translation>
 <translation id="6453018583485750254">چیک کبھی نہیں چلتا ہے۔</translation>
 <translation id="6459307836338400162">‏رازداری، سیکیورٹی اور ڈیٹا جمع کرنے سے متعلق مزید ترتیبات کے لیے، <ph name="BEGIN_LINK" />مطابقت پذیری<ph name="END_LINK" /> اور <ph name="BEGIN_LINK" />Google سروسز<ph name="END_LINK" /> دونوں دیکھیں۔</translation>
+<translation id="646394917185284261">Files</translation>
 <translation id="6464071786529933911">نئے پوشیدگی ٹیب میں کھولیں</translation>
 <translation id="6464397691496239022">سائٹس آپ کے براؤزنگ کے تجربہ کو بہتر بنانے کے لیے کوکیز کا استعمال کر سکتی ہیں، مثال کے طور پر آپ کو سائن ان رکھنا یا آپ کی شاپنگ کارٹ میں آئٹمز کو یاد رکھنا۔
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 436bb9d..74ddfa0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">一律不翻译此网站</translation>
 <translation id="1291506870746876680">您离开<ph name="BEGIN_BOLD" />“<ph name="SITE_NAME" />”<ph name="END_BOLD" />后,这个网站的权限将重置为停用。</translation>
 <translation id="1295289763199166823">自定义菜单</translation>
+<translation id="1296581780163690620">下载文件?(<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">为了确保您可以一直使用 Google 账号的密码,请验证是您本人在操作。</translation>
 <translation id="1312721752506309252">增强型保护已开启</translation>
 <translation id="1321993286294231467">保存图片时出错。</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">打开“设置”。</translation>
 <translation id="2059166748188874810">自治市</translation>
 <translation id="2062410130322589403">隐私控制选项指南</translation>
+<translation id="20638360198452347">单位类型选择器</translation>
 <translation id="2073572773299281212"><ph name="DAYS" /> 天前曾有活动</translation>
 <translation id="2074131957428911366">您始终可在<ph name="BEGIN_LINK" />设置<ph name="END_LINK" />中选择要同步的内容。</translation>
 <translation id="2079545284768500474">撤消</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">编辑轮播界面</translation>
 <translation id="2316709634732130529">使用建议的密码</translation>
 <translation id="2320166752086256636">隐藏键盘</translation>
+<translation id="2326302612031521902">单位选择器</translation>
 <translation id="2348630484974447747">包裹</translation>
 <translation id="2351097562818989364">您的翻译设置已重置。</translation>
 <translation id="235789365079050412">Google 隐私权政策</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">在地址栏中输入任务,例如“清除我的历史记录”或“修改密码”。</translation>
 <translation id="2461070143328828326">密码设置</translation>
 <translation id="2462736546165239215">您可在此处找到您的所有浏览记录。</translation>
+<translation id="2468132863574325555">云端硬盘</translation>
 <translation id="2469960372084740698">关闭“安全浏览”功能?</translation>
 <translation id="2473876017985765807">您已经保存了在 <ph name="WEBSITE" /> 上使用的密码</translation>
 <translation id="2476359652512522418">未选中</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">使用密码</translation>
 <translation id="6152406514676263192">开启同步功能后,您便会看到系统根据您的兴趣推荐的最相关的内容。</translation>
 <translation id="6159839020698489198">可选</translation>
+<translation id="6160780110287872296">下载文件?</translation>
 <translation id="6170450281939467187">翻译失败</translation>
 <translation id="6173499589275053515">密码已保存到您的 Google 账号 <ph name="EMAIL" /> 中</translation>
 <translation id="6184086493125982861">显示标签页</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookie</translation>
 <translation id="6453018583485750254">从未检查过。</translation>
 <translation id="6459307836338400162">如需了解更多与隐私、安全和数据收集相关的设置,请前往<ph name="BEGIN_LINK" />同步<ph name="END_LINK" />和 <ph name="BEGIN_LINK" />Google 服务<ph name="END_LINK" />这两个部分。</translation>
+<translation id="646394917185284261">Google 文件极客</translation>
 <translation id="6464071786529933911">在新的无痕式标签页中打开</translation>
 <translation id="6464397691496239022">网站可以使用 Cookie 来提升您的浏览体验,例如让您保持登录状态或记住您购物车中的商品。
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index 9dc3782..9c8f123f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">永不翻譯此網站</translation>
 <translation id="1291506870746876680"><ph name="BEGIN_BOLD" />「<ph name="SITE_NAME" />」<ph name="END_BOLD" />的權限會在您離開此網站後重設為停用。</translation>
 <translation id="1295289763199166823">自訂選單</translation>
+<translation id="1296581780163690620">要下載檔案嗎?(<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">為確保您可隨時使用 Google 帳戶中的密碼,請驗證身分。</translation>
 <translation id="1312721752506309252">已開啟「強化保護功能」</translation>
 <translation id="1321993286294231467">儲存圖片時發生錯誤。</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">開啟「設定」。</translation>
 <translation id="2059166748188874810">自治市</translation>
 <translation id="2062410130322589403">私隱選項指南</translation>
+<translation id="20638360198452347">單位類型選取器</translation>
 <translation id="2073572773299281212">曾於 <ph name="DAYS" /> 天前在線</translation>
 <translation id="2074131957428911366">您隨時可在<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />中選擇要同步的資料。</translation>
 <translation id="2079545284768500474">復原</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">編輯輪播</translation>
 <translation id="2316709634732130529">使用建議的密碼</translation>
 <translation id="2320166752086256636">隱藏鍵盤</translation>
+<translation id="2326302612031521902">單位選取器</translation>
 <translation id="2348630484974447747">包裹</translation>
 <translation id="2351097562818989364">您的翻譯設定已重設。</translation>
 <translation id="235789365079050412">Google 私隱權政策</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">在網址列中輸入要執行的工作,例如「清除記錄」或「編輯密碼」。</translation>
 <translation id="2461070143328828326">密碼設定</translation>
 <translation id="2462736546165239215">你可在此找到所有瀏覽記錄。</translation>
+<translation id="2468132863574325555">雲端硬碟</translation>
 <translation id="2469960372084740698">要關閉安全瀏覽功能嗎?</translation>
 <translation id="2473876017985765807">您已儲存 <ph name="WEBSITE" /> 的密碼</translation>
 <translation id="2476359652512522418">無揀</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">使用密碼</translation>
 <translation id="6152406514676263192">系統會根據您的興趣同步最相關的內容。</translation>
 <translation id="6159839020698489198">選填</translation>
+<translation id="6160780110287872296">要下載檔案嗎?</translation>
 <translation id="6170450281939467187">無法翻譯</translation>
 <translation id="6173499589275053515">密碼已儲存至您的 Google 帳戶 (<ph name="EMAIL" />)</translation>
 <translation id="6184086493125982861">顯示分頁</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookie</translation>
 <translation id="6453018583485750254">從未檢查過。</translation>
 <translation id="6459307836338400162">如需更多與私隱權、安全性和資料收集相關的設定,請參閱<ph name="BEGIN_LINK" />同步處理<ph name="END_LINK" />和 <ph name="BEGIN_LINK" />Google 服務<ph name="END_LINK" />。</translation>
+<translation id="646394917185284261">檔案</translation>
 <translation id="6464071786529933911">在新無痕式分頁中開啟</translation>
 <translation id="6464397691496239022">網站可使用 Cookie 來改善瀏覽體驗,例如讓您保持登入狀態或記住購物車中的商品。
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index f2133930..a8b802c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -60,6 +60,7 @@
 <translation id="1285320974508926690">一律不翻譯此網站</translation>
 <translation id="1291506870746876680"><ph name="BEGIN_BOLD" />「<ph name="SITE_NAME" />」<ph name="END_BOLD" />的權限會在你離開該網站後重設為停用。</translation>
 <translation id="1295289763199166823">自訂選單</translation>
+<translation id="1296581780163690620">要下載檔案嗎?(<ph name="FILE_SIZE" />)</translation>
 <translation id="1305822519689023679">為確保你隨時可以使用 Google 帳戶中的密碼,請驗證身分。</translation>
 <translation id="1312721752506309252">已啟用強化防護功能</translation>
 <translation id="1321993286294231467">儲存圖片時發生錯誤。</translation>
@@ -200,6 +201,7 @@
 <translation id="2055515971416882518">開啟「設定」。</translation>
 <translation id="2059166748188874810">縣/市</translation>
 <translation id="2062410130322589403">隱私權選項指南</translation>
+<translation id="20638360198452347">單位類型選取器</translation>
 <translation id="2073572773299281212">上次使用時間:<ph name="DAYS" /> 天前</translation>
 <translation id="2074131957428911366">你隨時可以在<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />中選擇要同步處理的資料。</translation>
 <translation id="2079545284768500474">復原</translation>
@@ -244,6 +246,7 @@
 <translation id="2310154074101836012">編輯輪轉介面</translation>
 <translation id="2316709634732130529">使用建議的密碼</translation>
 <translation id="2320166752086256636">隱藏鍵盤</translation>
+<translation id="2326302612031521902">單位選取器</translation>
 <translation id="2348630484974447747">包裹</translation>
 <translation id="2351097562818989364">您的翻譯設定已重設。</translation>
 <translation id="235789365079050412">Google 隱私權政策</translation>
@@ -267,6 +270,7 @@
 <translation id="2459155039684421202">在網址列中輸入要執行的工作,例如「清除歷史記錄」或「編輯密碼」。</translation>
 <translation id="2461070143328828326">密碼設定</translation>
 <translation id="2462736546165239215">這裡會顯示你的所有瀏覽記錄。</translation>
+<translation id="2468132863574325555">雲端硬碟</translation>
 <translation id="2469960372084740698">要停用安全瀏覽功能嗎?</translation>
 <translation id="2473876017985765807">你已儲存過 <ph name="WEBSITE" /> 的密碼</translation>
 <translation id="2476359652512522418">未選取</translation>
@@ -939,6 +943,7 @@
 <translation id="6149061208933997199">使用密碼</translation>
 <translation id="6152406514676263192">系統會根據你的興趣同步處理最相關的內容。</translation>
 <translation id="6159839020698489198">選填</translation>
+<translation id="6160780110287872296">要下載檔案嗎?</translation>
 <translation id="6170450281939467187">無法翻譯</translation>
 <translation id="6173499589275053515">密碼已儲存到 Google 帳戶 (<ph name="EMAIL" />)</translation>
 <translation id="6184086493125982861">顯示分頁</translation>
@@ -1006,6 +1011,7 @@
 <translation id="6447842834002726250">Cookie</translation>
 <translation id="6453018583485750254">未曾執行過檢查。</translation>
 <translation id="6459307836338400162">如需更多有關隱私權、安全性和資料收集的設定,請參閱 <ph name="BEGIN_LINK" />Google Sync<ph name="END_LINK" /> 和 <ph name="BEGIN_LINK" />Google 服務<ph name="END_LINK" />。</translation>
+<translation id="646394917185284261">檔案</translation>
 <translation id="6464071786529933911">在新無痕分頁中開啟</translation>
 <translation id="6464397691496239022">網站可使用 Cookie 改善瀏覽體驗,例如讓你保持登入狀態,或記住購物車中的商品。
 
diff --git a/ios/chrome/browser/invalidation/model/BUILD.gn b/ios/chrome/browser/invalidation/model/BUILD.gn
index 2db0a1d..580015e43 100644
--- a/ios/chrome/browser/invalidation/model/BUILD.gn
+++ b/ios/chrome/browser/invalidation/model/BUILD.gn
@@ -16,7 +16,6 @@
     "//components/prefs",
     "//ios/chrome/browser/gcm/model",
     "//ios/chrome/browser/gcm/model/instance_id",
-    "//ios/chrome/browser/json_parser",
     "//ios/chrome/browser/shared/model/browser_state",
     "//ios/chrome/browser/signin/model",
     "//ios/web",
diff --git a/ios/chrome/browser/json_parser/BUILD.gn b/ios/chrome/browser/json_parser/BUILD.gn
deleted file mode 100644
index 177ed37..0000000
--- a/ios/chrome/browser/json_parser/BUILD.gn
+++ /dev/null
@@ -1,22 +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.
-
-source_set("json_parser") {
-  sources = [
-    "in_process_json_parser.cc",
-    "in_process_json_parser.h",
-  ]
-  public_deps = [ "//base" ]
-}
-
-source_set("unit_tests") {
-  testonly = true
-  sources = [ "in_process_json_parser_unittest.cc" ]
-  deps = [
-    ":json_parser",
-    "//base",
-    "//base/test:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/ios/chrome/browser/json_parser/in_process_json_parser.cc b/ios/chrome/browser/json_parser/in_process_json_parser.cc
deleted file mode 100644
index 241dd0fa..0000000
--- a/ios/chrome/browser/json_parser/in_process_json_parser.cc
+++ /dev/null
@@ -1,49 +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 "ios/chrome/browser/json_parser/in_process_json_parser.h"
-
-#include "base/functional/bind.h"
-#include "base/json/json_reader.h"
-#include "base/strings/stringprintf.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/task/thread_pool.h"
-#include "base/values.h"
-
-namespace {
-void ParseJsonOnBackgroundThread(
-    scoped_refptr<base::TaskRunner> task_runner,
-    const std::string& unsafe_json,
-    InProcessJsonParser::SuccessCallback success_callback,
-    InProcessJsonParser::ErrorCallback error_callback) {
-  DCHECK(task_runner);
-  auto value_with_error = base::JSONReader::ReadAndReturnValueWithError(
-      unsafe_json, base::JSON_PARSE_RFC);
-  if (value_with_error.has_value()) {
-    task_runner->PostTask(FROM_HERE,
-                          base::BindOnce(std::move(success_callback),
-                                         std::move(*value_with_error)));
-  } else {
-    task_runner->PostTask(
-        FROM_HERE, base::BindOnce(std::move(error_callback),
-                                  base::StringPrintf(
-                                      "%s (%d:%d)",
-                                      value_with_error.error().message.c_str(),
-                                      value_with_error.error().line,
-                                      value_with_error.error().column)));
-  }
-}
-}  // namespace
-
-// static
-void InProcessJsonParser::Parse(const std::string& unsafe_json,
-                                SuccessCallback success_callback,
-                                ErrorCallback error_callback) {
-  base::ThreadPool::PostTask(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-      base::BindOnce(&ParseJsonOnBackgroundThread,
-                     base::SingleThreadTaskRunner::GetCurrentDefault(),
-                     unsafe_json, std::move(success_callback),
-                     std::move(error_callback)));
-}
diff --git a/ios/chrome/browser/json_parser/in_process_json_parser.h b/ios/chrome/browser/json_parser/in_process_json_parser.h
deleted file mode 100644
index ac03727..0000000
--- a/ios/chrome/browser/json_parser/in_process_json_parser.h
+++ /dev/null
@@ -1,39 +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 IOS_CHROME_BROWSER_JSON_PARSER_IN_PROCESS_JSON_PARSER_H_
-#define IOS_CHROME_BROWSER_JSON_PARSER_IN_PROCESS_JSON_PARSER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/functional/callback.h"
-
-namespace base {
-class Value;
-}
-
-// Mimics SafeJsonParser but parses in-process using base::JSONReader. This
-// is potentially unsafe (if there are bug in the JSON parsing logic), but
-// there is no way to parse in a separate process like on other platforms.
-// This class should be used when code depends on SafeJsonParser-like API.
-//
-// If iOS ever partially adaopt Swift, pre-sanitization in that language,
-// like Android version does), would be a better option. The support would
-// have to be added to SafeJsonParser and this class removed.
-class InProcessJsonParser {
- public:
-  using SuccessCallback = base::OnceCallback<void(base::Value)>;
-  using ErrorCallback = base::OnceCallback<void(const std::string&)>;
-
-  // As with SafeJsonParser, runs either `success_callback` or `error_callback`
-  // on the calling thread, but not before the call returns.
-  static void Parse(const std::string& unsafe_json,
-                    SuccessCallback success_callback,
-                    ErrorCallback error_callback);
-
-  InProcessJsonParser() = delete;
-};
-
-#endif  // IOS_CHROME_BROWSER_JSON_PARSER_IN_PROCESS_JSON_PARSER_H_
diff --git a/ios/chrome/browser/json_parser/in_process_json_parser_unittest.cc b/ios/chrome/browser/json_parser/in_process_json_parser_unittest.cc
deleted file mode 100644
index 7b9586c..0000000
--- a/ios/chrome/browser/json_parser/in_process_json_parser_unittest.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 "ios/chrome/browser/json_parser/in_process_json_parser.h"
-
-#include "base/functional/callback_helpers.h"
-#include "base/run_loop.h"
-#include "base/test/task_environment.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-TEST(InProcessJsonParserTest, TestSuccess) {
-  base::test::TaskEnvironment environment;
-
-  base::RunLoop run_loop;
-  InProcessJsonParser::Parse(
-      R"json({"key": 1})json",
-      base::BindOnce(
-          [](base::OnceClosure quit_closure, base::Value value) {
-            auto* dict = value.GetIfDict();
-            ASSERT_TRUE(dict);
-            ASSERT_TRUE(dict->FindInt("key"));
-            EXPECT_EQ(1, *dict->FindInt("key"));
-            std::move(quit_closure).Run();
-          },
-          run_loop.QuitClosure()),
-      base::BindOnce(
-          [](base::OnceClosure quit_closure, const std::string& error) {
-            EXPECT_FALSE(true) << "unexpected json parse error: " << error;
-            std::move(quit_closure).Run();
-          },
-          run_loop.QuitClosure()));
-  run_loop.Run();
-}
-
-TEST(InProcessJsonParserTest, TestFailure) {
-  base::test::TaskEnvironment environment;
-
-  base::RunLoop run_loop;
-  InProcessJsonParser::Parse(
-      R"json(invalid)json",
-      base::BindOnce(
-          [](base::OnceClosure quit_closure, base::Value value) {
-            EXPECT_FALSE(true) << "unexpected json parse success: " << value;
-            std::move(quit_closure).Run();
-          },
-          run_loop.QuitClosure()),
-      base::BindOnce(
-          [](base::OnceClosure quit_closure, const std::string& error) {
-            EXPECT_TRUE(!error.empty());
-            std::move(quit_closure).Run();
-          },
-          run_loop.QuitClosure()));
-  run_loop.Run();
-}
diff --git a/ios/chrome/browser/ntp_tiles/model/BUILD.gn b/ios/chrome/browser/ntp_tiles/model/BUILD.gn
index 277bf127..c9825f6b 100644
--- a/ios/chrome/browser/ntp_tiles/model/BUILD.gn
+++ b/ios/chrome/browser/ntp_tiles/model/BUILD.gn
@@ -20,7 +20,6 @@
     "//components/ntp_tiles",
     "//ios/chrome/browser/favicon",
     "//ios/chrome/browser/history/model",
-    "//ios/chrome/browser/json_parser",
     "//ios/chrome/browser/search_engines/model",
     "//ios/chrome/browser/shared/model/application_context",
     "//ios/chrome/browser/shared/model/browser_state",
diff --git a/ios/chrome/browser/sessions/session_migration.h b/ios/chrome/browser/sessions/session_migration.h
index e920d92..7446c6e4 100644
--- a/ios/chrome/browser/sessions/session_migration.h
+++ b/ios/chrome/browser/sessions/session_migration.h
@@ -6,6 +6,7 @@
 #define IOS_CHROME_BROWSER_SESSIONS_SESSION_MIGRATION_H_
 
 #include <string>
+#include <vector>
 
 namespace base {
 class FilePath;
@@ -17,6 +18,12 @@
 
 namespace ios::sessions {
 
+// Status of the storage migration.
+enum class MigrationStatus {
+  kSuccess,
+  kFailure,
+};
+
 // Migrates session named `name` in `path` from legacy to optimized.
 //
 // If the legacy session was successfully loaded, but could not be
@@ -47,6 +54,24 @@
     const std::string& name,
     ::sessions::TabRestoreService* restore_service);
 
+// Migrates all sessions found in `paths` from legacy to optimized format
+// and returns the status of the migration.
+//
+// If the migration was a success, all storage is in optimized format and
+// all legacy data has been deleted. Otherwise, the original data is left
+// untouched and the partially migrated data deleted.
+MigrationStatus MigrateSessionsInPathsToOptimized(
+    const std::vector<base::FilePath>& paths);
+
+// Migrates all sessions found in `paths` from optimized to legacy format
+// and returns the status of the migration.
+//
+// If the migration was a success, all storage is in optimized format and
+// all optimized data has been deleted. Otherwise, the original data is
+// left untouched and the partially migrated data deleted.
+MigrationStatus MigrateSessionsInPathsToLegacy(
+    const std::vector<base::FilePath>& paths);
+
 }  // namespace ios::sessions
 
 #endif  // IOS_CHROME_BROWSER_SESSIONS_SESSION_MIGRATION_H_
diff --git a/ios/chrome/browser/sessions/session_migration.mm b/ios/chrome/browser/sessions/session_migration.mm
index 959d2ed..434474ad 100644
--- a/ios/chrome/browser/sessions/session_migration.mm
+++ b/ios/chrome/browser/sessions/session_migration.mm
@@ -557,6 +557,94 @@
   }
 }
 
+// Helper for MigrateSessionsInPathsToOptimized(...) that migrate the data
+// but performs no cleanup. It stops at the first failure.
+MigrationStatus MigrateSessionsInPathsToOptimizedNoCleanup(
+    const std::vector<base::FilePath>& paths) {
+  for (const base::FilePath& path : paths) {
+    const base::FilePath from_dir = path.Append(kLegacySessionsDirname);
+    const base::FilePath dest_dir = path.Append(kSessionRestorationDirname);
+    const base::FilePath sessions = path.Append(kLegacyWebSessionsDirname);
+
+    const int file_types = base::FileEnumerator::DIRECTORIES;
+    base::FileEnumerator iter(from_dir, false, file_types);
+    for (base::FilePath name = iter.Next(); !name.empty(); name = iter.Next()) {
+      const base::FilePath basename = name.BaseName();
+      const MigrationResult result = MigrateSessionToOptimizedInternal(
+          from_dir.Append(basename), dest_dir.Append(basename), sessions);
+
+      switch (result.status) {
+        case MigrationResult::Status::kSkipped:
+        case MigrationResult::Status::kSuccess:
+          break;
+
+        case MigrationResult::Status::kFailure:
+          return MigrationStatus::kFailure;
+      }
+    }
+  }
+
+  return MigrationStatus::kSuccess;
+}
+
+// Helper for MigrateSessionsInPathsToLegacy(...) that migrate the data
+// but performs no cleanup. It stops at the first failure.
+MigrationStatus MigrateSessionsInPathsToLegacyNoCleanup(
+    const std::vector<base::FilePath>& paths) {
+  for (const base::FilePath& path : paths) {
+    const base::FilePath from_dir = path.Append(kSessionRestorationDirname);
+    const base::FilePath dest_dir = path.Append(kLegacySessionsDirname);
+    const base::FilePath sessions = path.Append(kLegacyWebSessionsDirname);
+
+    const int file_types = base::FileEnumerator::DIRECTORIES;
+    base::FileEnumerator iter(from_dir, false, file_types);
+    for (base::FilePath name = iter.Next(); !name.empty(); name = iter.Next()) {
+      const base::FilePath basename = name.BaseName();
+      const MigrationResult result = MigrateSessionToLegacyInternal(
+          from_dir.Append(basename), dest_dir.Append(basename), sessions);
+
+      switch (result.status) {
+        case MigrationResult::Status::kSkipped:
+        case MigrationResult::Status::kSuccess:
+          break;
+
+        case MigrationResult::Status::kFailure:
+          return MigrationStatus::kFailure;
+      }
+    }
+  }
+
+  return MigrationStatus::kSuccess;
+}
+
+// Deletes optimized session directories in `paths`.
+void DeleteOptimizedSessions(const std::vector<base::FilePath>& paths) {
+  for (const base::FilePath& path : paths) {
+    const base::FilePath optimized = path.Append(kSessionRestorationDirname);
+    std::ignore = DeleteRecursively(optimized);
+  }
+}
+
+// Deletes legacy session directories in `paths` taking care of leaving
+// any unrelated content unaffected.
+void DeleteLegacySessions(const std::vector<base::FilePath>& paths) {
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy = path.Append(kLegacySessionsDirname);
+
+    const int file_types = base::FileEnumerator::DIRECTORIES;
+    base::FileEnumerator iter(legacy, false, file_types);
+    for (base::FilePath name = iter.Next(); !name.empty(); name = iter.Next()) {
+      std::ignore = DeleteRecursively(name);
+    }
+    if (ios::sessions::DirectoryEmpty(legacy)) {
+      std::ignore = DeleteRecursively(legacy);
+    }
+
+    const base::FilePath sessions = path.Append(kLegacyWebSessionsDirname);
+    std::ignore = DeleteRecursively(sessions);
+  }
+}
+
 }  // namespace
 
 void MigrateNamedSessionToOptimized(
@@ -579,4 +667,55 @@
       path.Append(kLegacyWebSessionsDirname), restore_service);
 }
 
+MigrationStatus MigrateSessionsInPathsToOptimized(
+    const std::vector<base::FilePath>& paths) {
+  // Try to perform the migration, stopping at the first failure.
+  const MigrationStatus status =
+      MigrateSessionsInPathsToOptimizedNoCleanup(paths);
+
+  // Cleanup after the migration by deleting either the partially migrated
+  // data (in case of failure) or original data (in case of success).
+  switch (status) {
+    case MigrationStatus::kSuccess:
+      // The data has been successfully migrated to optimized storage,
+      // delete the legacy storage (including the cache of WKWebView
+      // native session data).
+      DeleteLegacySessions(paths);
+      break;
+
+    case MigrationStatus::kFailure:
+      // The migration to optimized format failed, delete any data that
+      // may have been written in the optimised storage directory.
+      DeleteOptimizedSessions(paths);
+      break;
+  }
+
+  return status;
+}
+
+MigrationStatus MigrateSessionsInPathsToLegacy(
+    const std::vector<base::FilePath>& paths) {
+  // Try to perform the migration, stopping at the first failure.
+  const MigrationStatus status = MigrateSessionsInPathsToLegacyNoCleanup(paths);
+
+  // Cleanup after the migration by deleting either the partially migrated
+  // data (in case of failure) or original data (in case of success).
+  switch (status) {
+    case MigrationStatus::kSuccess:
+      // The data has been successfully migrated to legacy storage,
+      // delete the optimized storage.
+      DeleteOptimizedSessions(paths);
+      break;
+
+    case MigrationStatus::kFailure:
+      // The migration to legacy format failed, delete any data that
+      // may have been written in the legacy storage directory. Also
+      // delete the cache of WKWebView native session data.
+      DeleteLegacySessions(paths);
+      break;
+  }
+
+  return status;
+}
+
 }  // namespace ios::sessions
diff --git a/ios/chrome/browser/sessions/session_migration_unittest.mm b/ios/chrome/browser/sessions/session_migration_unittest.mm
index 6368e894..4a288678 100644
--- a/ios/chrome/browser/sessions/session_migration_unittest.mm
+++ b/ios/chrome/browser/sessions/session_migration_unittest.mm
@@ -40,21 +40,29 @@
 
 // Information about a session.
 struct SessionInfo {
-  const size_t active_index = 0;
-  const size_t pinned_tab_count = 0;
+  const int active_index = -1;
+  const int pinned_tab_count = 0;
   const base::span<const TabInfo> tabs;
 };
 
-// Name of the session used by the tests (random string obtained by
+// Name of the sessions used by the tests (random string obtained by
 // running `uuidgen` on the command-line, no meaning to it).
-const char kSessionName[] = "CB5AC1AF-8E93-407B-AE48-65ECE7C241C0";
+const char kSessionName1[] = "CB5AC1AF-8E93-407B-AE48-65ECE7C241C0";
+const char kSessionName2[] = "B829AD40-FD11-4874-B5BF-B56C13DC2496";
+
+// Name of the sub-directory of the off-the-record BrowserState data.
+const base::FilePath::CharType kOTRDirectory[] = FILE_PATH_LITERAL("OTR");
 
 // Constants used to populate navigation items.
 const char kPageURL[] = "https://www.example.com";
 const char kPageTitle[] = "Example Domain";
 
+// Name of unrelated files.
+const base::FilePath::CharType kUnrelatedFilename[] =
+    FILE_PATH_LITERAL("Tabs_13346873882166178");
+
 // Constants representing the default session used for tests.
-constexpr TabInfo kTabs[] = {
+constexpr TabInfo kTabs1[] = {
     TabInfo{},
     TabInfo{},
     TabInfo{.create_web_session = false},
@@ -62,10 +70,21 @@
     TabInfo{.opener_index = 2, .opener_navigation_index = 0},
 };
 
-constexpr SessionInfo kSessionInfo = {
+constexpr SessionInfo kSessionInfo1 = {
     .active_index = 1,
     .pinned_tab_count = 2,
-    .tabs = base::make_span(kTabs),
+    .tabs = base::make_span(kTabs1),
+};
+
+constexpr TabInfo kTabs2[] = {
+    TabInfo{},
+    TabInfo{},
+};
+
+constexpr SessionInfo kSessionInfo2 = {
+    .active_index = 0,
+    .pinned_tab_count = 0,
+    .tabs = base::make_span(kTabs2),
 };
 
 // Returns the path to the directory containing the optimized session
@@ -99,6 +118,12 @@
       base::StringPrintf("%08x", identifier.identifier()));
 }
 
+// Converts an active index into a selected index.
+NSUInteger SelectedIndexFromActiveIndex(int active_index) {
+  return active_index < 0 ? static_cast<NSUInteger>(NSNotFound)
+                          : static_cast<NSUInteger>(active_index);
+}
+
 // Creates a CRWNavigationItemStorage.
 CRWNavigationItemStorage* CreateNavigationItemStorage() {
   CRWNavigationItemStorage* item = [[CRWNavigationItemStorage alloc] init];
@@ -125,6 +150,7 @@
   session.uniqueIdentifier = web::WebStateID::NewUnique();
   session.itemStorages = @[ CreateNavigationItemStorage() ];
   session.creationTime = base::Time::Now();
+  session.lastActiveTime = base::Time::Now();
   session.userData = user_data;
   return session;
 }
@@ -142,7 +168,8 @@
   NSMutableArray<CRWSessionStorage*>* sessions = [[NSMutableArray alloc] init];
   for (size_t index = 0; index < session_info.tabs.size(); ++index) {
     // Create a fake tab with a single navigation item.
-    const bool is_pinned = index < session_info.pinned_tab_count;
+    const bool is_pinned =
+        static_cast<int>(index) < session_info.pinned_tab_count;
     CRWSessionStorage* session =
         CreateSessionStorage(session_info.tabs[index], is_pinned);
 
@@ -162,9 +189,12 @@
     [sessions addObject:session];
   }
 
+  const NSUInteger selected_index =
+      SelectedIndexFromActiveIndex(session_info.active_index);
+
   SessionWindowIOS* session =
       [[SessionWindowIOS alloc] initWithSessions:sessions
-                                   selectedIndex:session_info.active_index];
+                                   selectedIndex:selected_index];
 
   // Write the session file.
   const base::FilePath filename =
@@ -175,10 +205,13 @@
 // Creates a WebStateMetadataStorage.
 web::proto::WebStateMetadataStorage CreateWebStateMetadataStorage() {
   web::proto::WebStateMetadataStorage storage;
+  storage.set_navigation_item_count(1);
   storage.mutable_active_page()->set_page_title(kPageTitle);
   storage.mutable_active_page()->set_page_url(kPageURL);
   web::SerializeTimeToProto(base::Time::Now(),
                             *storage.mutable_creation_time());
+  web::SerializeTimeToProto(base::Time::Now(),
+                            *storage.mutable_last_active_time());
   return storage;
 }
 
@@ -310,6 +343,140 @@
   return ios::sessions::WriteProto(filename, storage);
 }
 
+// Checks whether the optimized session in `root` named `name` corresponds
+// to the session described by `session_info`.
+void CheckOptimizedSession(const base::FilePath& root,
+                           const std::string& name,
+                           SessionInfo session_info) {
+  const base::FilePath session_dir = GetOptimizedSessionDir(root, name);
+
+  // Load the optimized session from disk.
+  ios::proto::WebStateListStorage storage;
+  ASSERT_TRUE(ios::sessions::ParseProto(
+      session_dir.Append(kSessionMetadataFilename), storage));
+
+  // Check that the session metadata are correct.
+  EXPECT_EQ(storage.active_index(), session_info.active_index);
+  EXPECT_EQ(storage.pinned_item_count(), session_info.pinned_tab_count);
+
+  // Check that each tab metadata and data are correct.
+  ASSERT_EQ(storage.items_size(), static_cast<int>(session_info.tabs.size()));
+  for (size_t index = 0; index < session_info.tabs.size(); ++index) {
+    const ios::proto::WebStateListItemStorage& item_info = storage.items(index);
+    const TabInfo& tab_info = session_info.tabs[index];
+
+    // Check the opener-opener relationship for correctness.
+    if (tab_info.opener_index != -1 && tab_info.opener_navigation_index != -1) {
+      EXPECT_TRUE(item_info.has_opener());
+      const ios::proto::OpenerStorage& opener = item_info.opener();
+      EXPECT_EQ(opener.index(), tab_info.opener_index);
+      EXPECT_EQ(opener.navigation_index(), tab_info.opener_navigation_index);
+    } else {
+      EXPECT_FALSE(item_info.has_opener());
+    }
+
+    // Check the tab metadata for correctness.
+    ASSERT_TRUE(item_info.has_metadata());
+    const web::proto::WebStateMetadataStorage& metadata = item_info.metadata();
+
+    EXPECT_EQ(metadata.navigation_item_count(), 1);
+    EXPECT_NE(web::TimeFromProto(metadata.creation_time()), base::Time());
+    EXPECT_NE(web::TimeFromProto(metadata.last_active_time()), base::Time());
+    EXPECT_TRUE(metadata.has_active_page());
+    EXPECT_EQ(metadata.active_page().page_title(), kPageTitle);
+    EXPECT_EQ(GURL(metadata.active_page().page_url()), GURL(kPageURL));
+
+    ASSERT_TRUE(web::WebStateID::IsValidValue(item_info.identifier()));
+    const base::FilePath item_dir = GetOptimizedWebStateDir(
+        session_dir,
+        web::WebStateID::FromSerializedValue(item_info.identifier()));
+
+    // Check the tab data for correctness.
+    web::proto::WebStateStorage item_storage;
+    ASSERT_TRUE(ios::sessions::ParseProto(
+        item_dir.Append(kWebStateStorageFilename), item_storage));
+
+    EXPECT_FALSE(item_storage.has_metadata());
+    EXPECT_EQ(item_storage.navigation().last_committed_item_index(), 0);
+    ASSERT_EQ(item_storage.navigation().items_size(), 1);
+
+    const web::proto::NavigationItemStorage& navigation_item =
+        item_storage.navigation().items(0);
+    EXPECT_EQ(navigation_item.title(), kPageTitle);
+    EXPECT_EQ(GURL(navigation_item.virtual_url()), GURL(kPageURL));
+
+    // Check that the native session file exists if created.
+    EXPECT_EQ(
+        ios::sessions::FileExists(item_dir.Append(kWebStateSessionFilename)),
+        tab_info.create_web_session);
+  }
+}
+
+// Checks whether the legacy session in `root` named `name` corresponds
+// to the session described by `session_info`.
+void CheckLegacySession(const base::FilePath& root,
+                        const std::string& name,
+                        SessionInfo session_info) {
+  const base::FilePath session_dir = GetLegacySessionDir(root, name);
+  const base::FilePath web_sessions = root.Append(kLegacyWebSessionsDirname);
+
+  // Load the legacy session from disk.
+  SessionWindowIOS* session_window = ios::sessions::ReadSessionWindow(
+      session_dir.Append(kLegacySessionFilename));
+  ASSERT_TRUE(session_window);
+
+  EXPECT_EQ(session_window.selectedIndex,
+            SelectedIndexFromActiveIndex(session_info.active_index));
+
+  // Check that the information for each tab is correct.
+  ASSERT_EQ(session_window.sessions.count, session_info.tabs.size());
+  for (size_t index = 0; index < session_info.tabs.size(); ++index) {
+    CRWSessionStorage* session = session_window.sessions[index];
+    const TabInfo& tab_info = session_info.tabs[index];
+
+    // Check the opener-opener relationship for correctness.
+    CRWSessionUserData* user_data = session.userData;
+    if (tab_info.opener_index != -1 && tab_info.opener_navigation_index != -1) {
+      EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data
+                      objectForKey:kLegacyWebStateListOpenerIndexKey]),
+                  @(tab_info.opener_index));
+      EXPECT_NSEQ(
+          base::apple::ObjCCast<NSNumber>([user_data
+              objectForKey:kLegacyWebStateListOpenerNavigationIndexKey]),
+          @(tab_info.opener_navigation_index));
+    }
+
+    // Check the pinned status for correctness.
+    if (static_cast<int>(index) < session_info.pinned_tab_count) {
+      EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data
+                      objectForKey:kLegacyWebStateListPinnedStateKey]),
+                  @YES);
+    } else {
+      EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data
+                      objectForKey:kLegacyWebStateListPinnedStateKey]),
+                  nil);
+    }
+
+    // Check that a stable identifier was generated (randomized).
+    EXPECT_TRUE(session.stableIdentifier);
+    EXPECT_NE(session.uniqueIdentifier, web::WebStateID());
+
+    // Check the tab data for correctness.
+    EXPECT_EQ(session.lastCommittedItemIndex, 0);
+    EXPECT_NE(session.creationTime, base::Time());
+    EXPECT_NE(session.lastActiveTime, base::Time());
+    ASSERT_EQ(session.itemStorages.count, 1u);
+
+    CRWNavigationItemStorage* navigation_item = session.itemStorages[0];
+    EXPECT_EQ(base::UTF16ToUTF8(navigation_item.title), kPageTitle);
+    EXPECT_EQ(navigation_item.virtualURL, GURL(kPageURL));
+
+    // Check that the native session file exists if created.
+    EXPECT_EQ(ios::sessions::FileExists(GetLegacyWebSessionsFile(
+                  web_sessions, session.uniqueIdentifier)),
+              tab_info.create_web_session);
+  }
+}
 }  // namespace
 
 // Tests migrating a session from legacy to optimized works correctly.
@@ -319,11 +486,11 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Generate a legacy session.
-  EXPECT_TRUE(GenerateLegacySession(root, kSessionName, kSessionInfo));
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName1, kSessionInfo1));
 
   // Ask to migrate the legacy session.
   FakeTabRestoreService restore_service;
-  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName,
+  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName1,
                                                 &restore_service);
 
   // Check that the tabs have not been recorded.
@@ -331,7 +498,7 @@
 
   // Check that the legacy session directory was deleted and its parent too
   // since it was empty.
-  const base::FilePath from_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir));
   EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir.DirName()));
 
@@ -341,63 +508,11 @@
   EXPECT_FALSE(ios::sessions::DirectoryExists(web_sessions));
 
   // Check that an optimized session was created.
-  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_TRUE(ios::sessions::DirectoryExists(dest_dir));
 
-  // Load the session metadata and check that it agrees with `kSessionInfo`.
-  ios::proto::WebStateListStorage storage;
-  EXPECT_TRUE(ios::sessions::ParseProto(
-      dest_dir.Append(kSessionMetadataFilename), storage));
-
-  EXPECT_EQ(storage.active_index(),
-            static_cast<int>(kSessionInfo.active_index));
-  EXPECT_EQ(storage.pinned_item_count(),
-            static_cast<int>(kSessionInfo.pinned_tab_count));
-
-  // Check that the information for each tab is correct.
-  ASSERT_EQ(storage.items_size(), static_cast<int>(kSessionInfo.tabs.size()));
-  for (size_t index = 0; index < kSessionInfo.tabs.size(); ++index) {
-    const ios::proto::WebStateListItemStorage& item_info = storage.items(index);
-    const TabInfo& tab_info = kSessionInfo.tabs[index];
-
-    if (tab_info.opener_index != -1 && tab_info.opener_navigation_index != -1) {
-      EXPECT_TRUE(item_info.has_opener());
-      EXPECT_EQ(item_info.opener().index(), tab_info.opener_index);
-      EXPECT_EQ(item_info.opener().navigation_index(),
-                tab_info.opener_navigation_index);
-    }
-
-    ASSERT_TRUE(web::WebStateID::IsValidValue(item_info.identifier()));
-    const base::FilePath item_dir = GetOptimizedWebStateDir(
-        dest_dir, web::WebStateID::FromSerializedValue(item_info.identifier()));
-
-    // Check the tab metadata for correctness.
-    ASSERT_TRUE(item_info.has_metadata());
-    const web::proto::WebStateMetadataStorage& metadata = item_info.metadata();
-
-    EXPECT_TRUE(metadata.has_active_page());
-    EXPECT_EQ(metadata.navigation_item_count(), 1);
-    EXPECT_EQ(metadata.active_page().page_title(), kPageTitle);
-    EXPECT_EQ(GURL(metadata.active_page().page_url()), GURL(kPageURL));
-
-    // Load the tab data and check for correctnesss.
-    web::proto::WebStateStorage item_storage;
-    EXPECT_TRUE(ios::sessions::ParseProto(
-        item_dir.Append(kWebStateStorageFilename), item_storage));
-
-    EXPECT_FALSE(item_storage.has_metadata());
-    EXPECT_EQ(item_storage.navigation().last_committed_item_index(), 0);
-    ASSERT_EQ(item_storage.navigation().items_size(), 1);
-
-    const auto& navigation_item = item_storage.navigation().items(0);
-    EXPECT_EQ(navigation_item.title(), kPageTitle);
-    EXPECT_EQ(GURL(navigation_item.virtual_url()), GURL(kPageURL));
-
-    // Check that the web session file exists (if created).
-    EXPECT_EQ(
-        ios::sessions::FileExists(item_dir.Append(kWebStateSessionFilename)),
-        tab_info.create_web_session);
-  }
+  // Check the migrated session is correct.
+  CheckOptimizedSession(root, kSessionName1, kSessionInfo1);
 }
 
 // Tests migrating a session from legacy to optimized when there is no session.
@@ -407,10 +522,10 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Ask to migrate the non-existent legacy session.
-  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName, nullptr);
+  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName1, nullptr);
 
   // Check that no optimized session was created.
-  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 }
 
@@ -422,16 +537,16 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Create empty directories.
-  const base::FilePath from_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetLegacySessionDir(root, kSessionName1);
   const base::FilePath web_sessions = root.Append(kLegacyWebSessionsDirname);
   EXPECT_TRUE(ios::sessions::CreateDirectory(from_dir));
   EXPECT_TRUE(ios::sessions::CreateDirectory(web_sessions));
 
   // Ask to migrate the non-existent legacy session.
-  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName, nullptr);
+  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName1, nullptr);
 
   // Check that no optimized session was created.
-  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the empty directories have been deleted.
@@ -447,7 +562,7 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Write incorrect data to the session file.
-  const base::FilePath from_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetLegacySessionDir(root, kSessionName1);
   NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
   EXPECT_TRUE(
       ios::sessions::WriteFile(from_dir.Append(kLegacySessionFilename), data));
@@ -462,10 +577,10 @@
       data));
 
   // Ask to migrate the invalid legacy session.
-  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName, nullptr);
+  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName1, nullptr);
 
   // Check that no optimized session was created.
-  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the session directory has been deleted.
@@ -484,22 +599,22 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Generate a legacy session.
-  EXPECT_TRUE(GenerateLegacySession(root, kSessionName, kSessionInfo));
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName1, kSessionInfo1));
 
   // Create a file with the same name as the optimized session directory
   // which should prevent migrating the session.
   NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
-  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_TRUE(ios::sessions::WriteFile(dest_dir, data));
 
   // Ask to migrate the legacy session.
-  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName, nullptr);
+  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName1, nullptr);
 
   // Check that no optimized session was created.
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the session directory has been deleted.
-  const base::FilePath from_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir));
 
   // Check that the web sessions directory has been deleted.
@@ -516,24 +631,24 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Generate a legacy session.
-  EXPECT_TRUE(GenerateLegacySession(root, kSessionName, kSessionInfo));
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName1, kSessionInfo1));
 
   // Create a file with the same name as the optimized session directory
   // which should prevent migrating the session.
   NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
-  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_TRUE(ios::sessions::WriteFile(dest_dir, data));
 
   // Ask to migrate the legacy session.
   FakeTabRestoreService restore_service;
-  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName,
+  ios::sessions::MigrateNamedSessionToOptimized(root, kSessionName1,
                                                 &restore_service);
 
   // Check that no optimized session was created.
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the tabs have been recorded.
-  EXPECT_EQ(restore_service.entries().size(), kSessionInfo.tabs.size());
+  EXPECT_EQ(restore_service.entries().size(), kSessionInfo1.tabs.size());
 }
 
 // Tests migrating a session from optimize to legacy works correctly.
@@ -543,11 +658,11 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Generate an optimized session.
-  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName, kSessionInfo));
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName1, kSessionInfo1));
 
   // Ask to migrate the session.
   FakeTabRestoreService restore_service;
-  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName,
+  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName1,
                                              &restore_service);
 
   // Check that the tabs have not been recorded.
@@ -555,12 +670,12 @@
 
   // Check that the optimized session directory was deleted and its parent too
   // since it was empty.
-  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir));
   EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir.DirName()));
 
   // Check that an optimized session was created.
-  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_TRUE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the directory containing the web sessions was also created
@@ -569,53 +684,8 @@
   EXPECT_TRUE(ios::sessions::DirectoryExists(web_sessions));
   EXPECT_FALSE(ios::sessions::DirectoryEmpty(web_sessions));
 
-  // Load the session and check that it agress with `kSessionInfo`.
-  SessionWindowIOS* session_window =
-      ios::sessions::ReadSessionWindow(dest_dir.Append(kLegacySessionFilename));
-  ASSERT_TRUE(session_window);
-
-  EXPECT_EQ(session_window.selectedIndex, kSessionInfo.active_index);
-
-  // Check that the information for each tab is correct.
-  ASSERT_EQ(session_window.sessions.count, kSessionInfo.tabs.size());
-  for (size_t index = 0; index < kSessionInfo.tabs.size(); ++index) {
-    CRWSessionStorage* session = session_window.sessions[index];
-    const TabInfo& tab_info = kSessionInfo.tabs[index];
-
-    CRWSessionUserData* user_data = session.userData;
-    if (tab_info.opener_index != -1 && tab_info.opener_navigation_index != -1) {
-      EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data
-                      objectForKey:kLegacyWebStateListOpenerIndexKey]),
-                  @(tab_info.opener_index));
-      EXPECT_NSEQ(
-          base::apple::ObjCCast<NSNumber>([user_data
-              objectForKey:kLegacyWebStateListOpenerNavigationIndexKey]),
-          @(tab_info.opener_navigation_index));
-    }
-
-    if (index < kSessionInfo.pinned_tab_count) {
-      EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data
-                      objectForKey:kLegacyWebStateListPinnedStateKey]),
-                  @YES);
-    }
-
-    // Check that a stable identifier was generated (randomized).
-    EXPECT_TRUE(session.stableIdentifier);
-
-    // Check the data for correctness.
-    EXPECT_EQ(session.lastCommittedItemIndex, 0);
-    EXPECT_NE(session.creationTime, base::Time());
-    ASSERT_EQ(session.itemStorages.count, 1u);
-
-    CRWNavigationItemStorage* navigation_item = session.itemStorages[0];
-    EXPECT_EQ(base::UTF16ToUTF8(navigation_item.title), kPageTitle);
-    EXPECT_EQ(navigation_item.virtualURL, GURL(kPageURL));
-
-    // Check that the web session file exists (if created).
-    EXPECT_EQ(ios::sessions::FileExists(GetLegacyWebSessionsFile(
-                  web_sessions, session.uniqueIdentifier)),
-              tab_info.create_web_session);
-  }
+  // Check the migrated session is correct.
+  CheckLegacySession(root, kSessionName1, kSessionInfo1);
 }
 
 // Tests migrating a session from optimize (pre M-122) to legacy works
@@ -627,11 +697,11 @@
 
   // Generate an optimized session.
   EXPECT_TRUE(
-      GenerateOptimizedSessionPreM122(root, kSessionName, kSessionInfo));
+      GenerateOptimizedSessionPreM122(root, kSessionName1, kSessionInfo1));
 
   // Ask to migrate the session.
   FakeTabRestoreService restore_service;
-  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName,
+  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName1,
                                              &restore_service);
 
   // Check that the tabs have not been recorded.
@@ -639,12 +709,12 @@
 
   // Check that the optimized session directory was deleted and its parent too
   // since it was empty.
-  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir));
   EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir.DirName()));
 
   // Check that an optimized session was created.
-  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_TRUE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the directory containing the web sessions was also created
@@ -653,53 +723,8 @@
   EXPECT_TRUE(ios::sessions::DirectoryExists(web_sessions));
   EXPECT_FALSE(ios::sessions::DirectoryEmpty(web_sessions));
 
-  // Load the session and check that it agress with `kSessionInfo`.
-  SessionWindowIOS* session_window =
-      ios::sessions::ReadSessionWindow(dest_dir.Append(kLegacySessionFilename));
-  ASSERT_TRUE(session_window);
-
-  EXPECT_EQ(session_window.selectedIndex, kSessionInfo.active_index);
-
-  // Check that the information for each tab is correct.
-  ASSERT_EQ(session_window.sessions.count, kSessionInfo.tabs.size());
-  for (size_t index = 0; index < kSessionInfo.tabs.size(); ++index) {
-    CRWSessionStorage* session = session_window.sessions[index];
-    const TabInfo& tab_info = kSessionInfo.tabs[index];
-
-    CRWSessionUserData* user_data = session.userData;
-    if (tab_info.opener_index != -1 && tab_info.opener_navigation_index != -1) {
-      EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data
-                      objectForKey:kLegacyWebStateListOpenerIndexKey]),
-                  @(tab_info.opener_index));
-      EXPECT_NSEQ(
-          base::apple::ObjCCast<NSNumber>([user_data
-              objectForKey:kLegacyWebStateListOpenerNavigationIndexKey]),
-          @(tab_info.opener_navigation_index));
-    }
-
-    if (index < kSessionInfo.pinned_tab_count) {
-      EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data
-                      objectForKey:kLegacyWebStateListPinnedStateKey]),
-                  @YES);
-    }
-
-    // Check that a stable identifier was generated (randomized).
-    EXPECT_TRUE(session.stableIdentifier);
-
-    // Check the data for correctness.
-    EXPECT_EQ(session.lastCommittedItemIndex, 0);
-    EXPECT_NE(session.creationTime, base::Time());
-    ASSERT_EQ(session.itemStorages.count, 1u);
-
-    CRWNavigationItemStorage* navigation_item = session.itemStorages[0];
-    EXPECT_EQ(base::UTF16ToUTF8(navigation_item.title), kPageTitle);
-    EXPECT_EQ(navigation_item.virtualURL, GURL(kPageURL));
-
-    // Check that the web session file exists (if created).
-    EXPECT_EQ(ios::sessions::FileExists(GetLegacyWebSessionsFile(
-                  web_sessions, session.uniqueIdentifier)),
-              tab_info.create_web_session);
-  }
+  // Check the migrated session is correct.
+  CheckLegacySession(root, kSessionName1, kSessionInfo1);
 }
 
 // Tests migrating a session from optimized to legacy when there is no session.
@@ -709,10 +734,10 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Ask to migrate the non-existent optimized session.
-  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName, nullptr);
+  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName1, nullptr);
 
   // Check that no legacy session was created.
-  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the web sessions directory was not created.
@@ -728,14 +753,14 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Create empty directory.
-  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_TRUE(ios::sessions::CreateDirectory(from_dir));
 
   // Ask to migrate the optimized session.
-  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName, nullptr);
+  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName1, nullptr);
 
   // Check that no optimized session was created.
-  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the web sessions directory was not created.
@@ -754,16 +779,16 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Write incorrect data to the session file.
-  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName1);
   NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
   EXPECT_TRUE(ios::sessions::WriteFile(
       from_dir.Append(kSessionMetadataFilename), data));
 
   // Ask to migrate the invalid optimized session.
-  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName, nullptr);
+  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName1, nullptr);
 
   // Check that no legacy session was created.
-  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the session directory has been deleted.
@@ -778,22 +803,22 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Generate an optimized session.
-  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName, kSessionInfo));
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName1, kSessionInfo1));
 
   // Create a file with the same name as the legacy session directory
   // which should prevent migrating the session.
   NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
-  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_TRUE(ios::sessions::WriteFile(dest_dir, data));
 
   // Ask to migrate the session.
-  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName, nullptr);
+  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName1, nullptr);
 
   // Check that no legacy session was created.
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the session directory has been deleted.
-  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName);
+  const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName1);
   EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir));
 
   // Check that the web sessions directory has not been created.
@@ -810,22 +835,554 @@
   const base::FilePath root = scoped_temp_dir.GetPath();
 
   // Generate an optimized session.
-  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName, kSessionInfo));
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName1, kSessionInfo1));
 
   // Create a file with the same name as the legacy session directory
   // which should prevent migrating the session.
   NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
-  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName);
+  const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName1);
   EXPECT_TRUE(ios::sessions::WriteFile(dest_dir, data));
 
   // Ask to migrate the session.
   FakeTabRestoreService restore_service;
-  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName,
+  ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName1,
                                              &restore_service);
 
   // Check that no legacy session was created.
   EXPECT_FALSE(ios::sessions::DirectoryExists(dest_dir));
 
   // Check that the tabs have been recorded.
-  EXPECT_EQ(restore_service.entries().size(), kSessionInfo.tabs.size());
+  EXPECT_EQ(restore_service.entries().size(), kSessionInfo1.tabs.size());
+}
+
+// Tests batch migrating sessions from legacy to optimized works correctly.
+TEST_F(SessionMigrationTest, BatchToOptimized) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few legacy sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(GenerateLegacySession(otr, kSessionName1, SessionInfo()));
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToOptimized(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the directories containing legacy sessions and WKWebView
+  // native session data have been deleted in all paths.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(legacy_dir));
+
+    const base::FilePath native_dir = path.Append(kLegacyWebSessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(native_dir));
+  }
+
+  // Check that the sessions have been correctly converted.
+  CheckOptimizedSession(root, kSessionName1, kSessionInfo1);
+  CheckOptimizedSession(root, kSessionName2, kSessionInfo2);
+  CheckOptimizedSession(otr, kSessionName1, SessionInfo());
+}
+
+// Tests batch migrating sessions from legacy to optimized works correctly
+// when there are no sessions.
+TEST_F(SessionMigrationTest, BatchToOptimized_NoSession) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToOptimized(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the optimized session directories have not been created.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath optimized_dir =
+        path.Append(kSessionRestorationDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(optimized_dir));
+  }
+}
+
+// Tests batch migrating sessions from legacy to optimized works correctly
+// when there are no sessions but empty directory laying around.
+TEST_F(SessionMigrationTest, BatchToOptimized_NoSessionEmptyDirs) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Create empty directories.
+  for (const base::FilePath& path : paths) {
+    using ios::sessions::CreateDirectory;
+    ASSERT_TRUE(CreateDirectory(GetLegacySessionDir(path, kSessionName1)));
+    ASSERT_TRUE(CreateDirectory(GetLegacySessionDir(path, kSessionName2)));
+    ASSERT_TRUE(CreateDirectory(path.Append(kLegacyWebSessionsDirname)));
+  }
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToOptimized(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the directories containing legacy sessions and WKWebView
+  // native session data have been deleted in all paths.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(legacy_dir));
+
+    const base::FilePath native_dir = path.Append(kLegacyWebSessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(native_dir));
+  }
+
+  // Check that the optimized session directories have not been created.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath optimized_dir =
+        path.Append(kSessionRestorationDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(optimized_dir));
+  }
+}
+
+// Tests batch migrating sessions from legacy to optimized works correctly
+// and does nothing if the sessions are already in the optimized format.
+TEST_F(SessionMigrationTest, BatchToOptimized_SessionAreOptimized) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few optimized sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(GenerateOptimizedSession(otr, kSessionName1, SessionInfo()));
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToOptimized(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the sessions have been left untouched.
+  CheckOptimizedSession(root, kSessionName1, kSessionInfo1);
+  CheckOptimizedSession(root, kSessionName2, kSessionInfo2);
+  CheckOptimizedSession(otr, kSessionName1, SessionInfo());
+}
+
+// Tests batch migrating sessions from legacy to optimized works correctly
+// and leave unrelated files in the legacy session directories untouched.
+TEST_F(SessionMigrationTest, BatchToOptimized_UnrelatedFilesUnaffected) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few legacy sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(GenerateLegacySession(otr, kSessionName1, SessionInfo()));
+
+  // Create a few unrelated files in the legacy session directories (they
+  // corresponds to files saved by //components/sessions).
+  NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    const base::FilePath filename = legacy_dir.Append(kUnrelatedFilename);
+    EXPECT_TRUE(ios::sessions::WriteFile(filename, data));
+  }
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToOptimized(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the directories containing legacy sessions and WKWebView
+  // native session data have been deleted in all paths.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    const base::FilePath filename = legacy_dir.Append(kUnrelatedFilename);
+    EXPECT_TRUE(ios::sessions::DirectoryExists(legacy_dir));
+    EXPECT_NSEQ(ios::sessions::ReadFile(filename), data);
+
+    const base::FilePath native_dir = path.Append(kLegacyWebSessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(native_dir));
+  }
+
+  // Check that the sessions have been correctly converted.
+  CheckOptimizedSession(root, kSessionName1, kSessionInfo1);
+  CheckOptimizedSession(root, kSessionName2, kSessionInfo2);
+  CheckOptimizedSession(otr, kSessionName1, SessionInfo());
+}
+
+// Tests batch migrating sessions from legacy to optimized when one session
+// is invalid and cannot be loaded.
+TEST_F(SessionMigrationTest, BatchToOptimized_FailureInvalidSessions) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few legacy sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateLegacySession(otr, kSessionName1, SessionInfo()));
+
+  // Write invalid data in one sessions.
+  const base::FilePath session_path =
+      GetLegacySessionDir(root, kSessionName2).Append(kLegacySessionFilename);
+  NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
+  EXPECT_TRUE(ios::sessions::WriteFile(session_path, data));
+
+  // Check that the migration is a failure.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToOptimized(paths),
+            ios::sessions::MigrationStatus::kFailure);
+
+  // Check that the legacy sessions have been left untouched, including the
+  // invalid session.
+  CheckLegacySession(root, kSessionName1, kSessionInfo1);
+  CheckLegacySession(otr, kSessionName1, SessionInfo());
+  EXPECT_NSEQ(ios::sessions::ReadFile(session_path), data);
+
+  // Check that the optimized session directory was not created.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath optimized_dir =
+        path.Append(kSessionRestorationDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(optimized_dir));
+  }
+}
+
+// Tests batch migrating sessions from legacy to optimized when one session
+// cannot be migrated.
+TEST_F(SessionMigrationTest, BatchToOptimized_FailureMigration) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few legacy sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(GenerateLegacySession(otr, kSessionName1, SessionInfo()));
+
+  // Create a file with the same name as one of the optimized session
+  // directory which should prevent migrating the sessions.
+  NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
+  const base::FilePath dest_dir = GetOptimizedSessionDir(root, kSessionName2);
+  EXPECT_TRUE(ios::sessions::WriteFile(dest_dir, data));
+
+  // Check that the migration is a failure.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToOptimized(paths),
+            ios::sessions::MigrationStatus::kFailure);
+
+  // Check that the legacy sessions have been left untouched.
+  CheckLegacySession(root, kSessionName1, kSessionInfo1);
+  CheckLegacySession(root, kSessionName2, kSessionInfo2);
+  CheckLegacySession(otr, kSessionName1, SessionInfo());
+
+  // Check that the optimized session directory was not created, and
+  // that any pre-existing data was deleted.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath optimized_dir =
+        path.Append(kSessionRestorationDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(optimized_dir));
+  }
+}
+
+// Tests batch migrating sessions from optimized to legacy works correctly.
+TEST_F(SessionMigrationTest, BatchToLegacy) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few optimized sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(GenerateOptimizedSession(otr, kSessionName1, SessionInfo()));
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToLegacy(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the directories containing optimized sessions have been
+  // deleted in all paths.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath optimized_dir =
+        path.Append(kSessionRestorationDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(optimized_dir));
+  }
+
+  // Check that the sessions have been correctly converted.
+  CheckLegacySession(root, kSessionName1, kSessionInfo1);
+  CheckLegacySession(root, kSessionName2, kSessionInfo2);
+  CheckLegacySession(otr, kSessionName1, SessionInfo());
+}
+
+// Tests batch migrating sessions from optimized (pre M-122) to legacy works
+// correctly.
+TEST_F(SessionMigrationTest, BatchToLegacyPreM122) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few optimized (pre M-122) sessions for the main and OTR
+  // BrowserStates.
+  EXPECT_TRUE(
+      GenerateOptimizedSessionPreM122(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(
+      GenerateOptimizedSessionPreM122(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(
+      GenerateOptimizedSessionPreM122(otr, kSessionName1, SessionInfo()));
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToLegacy(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the directories containing optimized sessions have been
+  // deleted in all paths.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath optimized_dir =
+        path.Append(kSessionRestorationDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(optimized_dir));
+  }
+
+  // Check that the sessions have been correctly converted.
+  CheckLegacySession(root, kSessionName1, kSessionInfo1);
+  CheckLegacySession(root, kSessionName2, kSessionInfo2);
+  CheckLegacySession(otr, kSessionName1, SessionInfo());
+}
+
+// Tests batch migrating sessions from optimized to legacy works correctly
+// when there are no sessions.
+TEST_F(SessionMigrationTest, BatchToLegacy_NoSession) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToLegacy(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the legacy session and WKWebView native session data
+  // directories have not been created.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(legacy_dir));
+
+    const base::FilePath native_dir = path.Append(kLegacyWebSessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(native_dir));
+  }
+}
+
+// Tests batch migrating sessions from optimized to legacy works correctly
+// when there are no sessions but empty directory laying around.
+TEST_F(SessionMigrationTest, BatchToLegacy_NoSessionEmptyDirs) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Create empty directories.
+  for (const base::FilePath& path : paths) {
+    using ios::sessions::CreateDirectory;
+    ASSERT_TRUE(CreateDirectory(GetOptimizedSessionDir(path, kSessionName1)));
+    ASSERT_TRUE(CreateDirectory(GetOptimizedSessionDir(path, kSessionName2)));
+  }
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToLegacy(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the directories containing optimized sessions have been
+  // deleted in all paths.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath optimized_dir =
+        path.Append(kSessionRestorationDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(optimized_dir));
+  }
+
+  // Check that the legacy session and WKWebView native session data
+  // directories have not been created.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(legacy_dir));
+
+    const base::FilePath native_dir = path.Append(kLegacyWebSessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(native_dir));
+  }
+}
+
+// Tests batch migrating sessions from optimized to legacy works correctly
+// and does nothing if the sessions are already in the legacy format.
+TEST_F(SessionMigrationTest, BatchToLegacy_SessionAreLegacy) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few legacy sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateLegacySession(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(GenerateLegacySession(otr, kSessionName1, SessionInfo()));
+
+  // Check that the migration is a success.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToLegacy(paths),
+            ios::sessions::MigrationStatus::kSuccess);
+
+  // Check that the sessions have been left untouched.
+  CheckLegacySession(root, kSessionName1, kSessionInfo1);
+  CheckLegacySession(root, kSessionName2, kSessionInfo2);
+  CheckLegacySession(otr, kSessionName1, SessionInfo());
+}
+
+// Tests batch migrating sessions from optimized to legacy when one session
+// is invalid and cannot be loaded.
+TEST_F(SessionMigrationTest, BatchToLegacy_FailureInvalidSessions) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few optimized sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateOptimizedSession(otr, kSessionName1, SessionInfo()));
+
+  // Write invalid data in one sessions.
+  const base::FilePath session_path =
+      GetOptimizedSessionDir(root, kSessionName2)
+          .Append(kSessionMetadataFilename);
+  NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
+  EXPECT_TRUE(ios::sessions::WriteFile(session_path, data));
+
+  // Check that the migration is a failure.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToLegacy(paths),
+            ios::sessions::MigrationStatus::kFailure);
+
+  // Check that the optimized sessions have been left untouched, including the
+  // invalid session.
+  CheckOptimizedSession(root, kSessionName1, kSessionInfo1);
+  CheckOptimizedSession(otr, kSessionName1, SessionInfo());
+  EXPECT_NSEQ(ios::sessions::ReadFile(session_path), data);
+
+  // Check that the legacy session and WKWebView native session data
+  // directories have not been created.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(legacy_dir));
+
+    const base::FilePath native_dir = path.Append(kLegacyWebSessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(native_dir));
+  }
+}
+
+// Tests batch migrating sessions from optimized to legacy when one session
+// cannot be migrated.
+TEST_F(SessionMigrationTest, BatchToLegacy_FailureMigration) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few optimized sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(GenerateOptimizedSession(otr, kSessionName1, SessionInfo()));
+
+  // Create a file with the same name as one of the legacy session
+  // directory which should prevent migrating the sessions.
+  NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
+  const base::FilePath dest_dir = GetLegacySessionDir(otr, kSessionName1);
+  EXPECT_TRUE(ios::sessions::WriteFile(dest_dir, data));
+
+  // Check that the migration is a failure.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToLegacy(paths),
+            ios::sessions::MigrationStatus::kFailure);
+
+  // Check that the optimized sessions have been left untouched.
+  CheckOptimizedSession(root, kSessionName1, kSessionInfo1);
+  CheckOptimizedSession(root, kSessionName2, kSessionInfo2);
+  CheckOptimizedSession(otr, kSessionName1, SessionInfo());
+
+  // Check that the legacy session and WKWebView native session data
+  // directories have not been created and that any pre-existing data
+  // was deleted.
+  for (const base::FilePath& path : paths) {
+    if (path != otr) {
+      const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+      EXPECT_FALSE(ios::sessions::DirectoryExists(legacy_dir));
+    }
+
+    const base::FilePath native_dir = path.Append(kLegacyWebSessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(native_dir));
+  }
+
+  // Check that the pre-existing invalid file is still present.
+  EXPECT_NSEQ(ios::sessions::ReadFile(dest_dir), data);
+}
+
+// Tests batch migrating sessions from optimized to legacy when one session
+// cannot be migrated, with unrelated files in the legacy session directory
+// which should be unaffected.
+TEST_F(SessionMigrationTest, BatchToLegacy_FailureUnrelatedFilesUnaffected) {
+  base::ScopedTempDir scoped_temp_dir;
+  ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
+  const base::FilePath root = scoped_temp_dir.GetPath();
+  const base::FilePath otr = root.Append(kOTRDirectory);
+  const std::vector<base::FilePath> paths{root, otr};
+
+  // Generate a few optimized sessions for the main and OTR BrowserStates.
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName1, kSessionInfo1));
+  EXPECT_TRUE(GenerateOptimizedSession(root, kSessionName2, kSessionInfo2));
+  EXPECT_TRUE(GenerateOptimizedSession(otr, kSessionName1, SessionInfo()));
+
+  // Create a few unrelated files in the legacy session directories (they
+  // corresponds to files saved by //components/sessions).
+  NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    const base::FilePath filename = legacy_dir.Append(kUnrelatedFilename);
+    EXPECT_TRUE(ios::sessions::WriteFile(filename, data));
+  }
+
+  // Write invalid data in one sessions.
+  const base::FilePath session_path = GetOptimizedSessionDir(otr, kSessionName2)
+                                          .Append(kSessionMetadataFilename);
+  EXPECT_TRUE(ios::sessions::WriteFile(session_path, data));
+
+  // Check that the migration is a failure.
+  ASSERT_EQ(ios::sessions::MigrateSessionsInPathsToLegacy(paths),
+            ios::sessions::MigrationStatus::kFailure);
+
+  // Check that the optimized sessions have been left untouched, including
+  // the invalid session.
+  CheckOptimizedSession(root, kSessionName1, kSessionInfo1);
+  CheckOptimizedSession(root, kSessionName2, kSessionInfo2);
+  CheckOptimizedSession(otr, kSessionName1, SessionInfo());
+  EXPECT_NSEQ(ios::sessions::ReadFile(session_path), data);
+
+  // Check that the legacy session and WKWebView native session data
+  // directories have not been created and that any pre-existing data
+  // was deleted.
+  for (const base::FilePath& path : paths) {
+    const base::FilePath legacy_dir = path.Append(kLegacySessionsDirname);
+    const base::FilePath filename = legacy_dir.Append(kUnrelatedFilename);
+    EXPECT_TRUE(ios::sessions::DirectoryExists(legacy_dir));
+    EXPECT_NSEQ(ios::sessions::ReadFile(filename), data);
+
+    const base::FilePath native_dir = path.Append(kLegacyWebSessionsDirname);
+    EXPECT_FALSE(ios::sessions::DirectoryExists(native_dir));
+  }
 }
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
index 9b79e41..6fa25901 100644
--- a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
+++ b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
@@ -105,7 +105,16 @@
 
 @implementation AuthenticationFlowPerformer {
   __weak id<AuthenticationFlowPerformerDelegate> _delegate;
-  AlertCoordinator* _alertCoordinator;
+  // This code uses three variables for alert coordinators in order to clarify
+  // crash reports related to crbug.com/1482623
+  // TODO(crbug.com/1482623): The 3 alert coordinator variables can be merged
+  // into one alert coordinator once the bug is fixed.
+  // Dialog for the managed confirmation dialog.
+  AlertCoordinator* _managedConfirmationAlertCoordinator;
+  // Dialog to display an error.
+  AlertCoordinator* _errorAlertCoordinator;
+  // Dialog to ask the user before switching users.
+  AlertCoordinator* _promptSwitchAlertCoordinator;
   SettingsNavigationController* _navigationController;
   std::unique_ptr<base::OneShotTimer> _watchdogTimer;
 }
@@ -124,8 +133,12 @@
 
 - (void)interruptWithAction:(SigninCoordinatorInterrupt)action
                  completion:(ProceduralBlock)completion {
-  [_alertCoordinator stop];
-  _alertCoordinator = nil;
+  [_managedConfirmationAlertCoordinator stop];
+  _managedConfirmationAlertCoordinator = nil;
+  [_errorAlertCoordinator stop];
+  _errorAlertCoordinator = nil;
+  [_promptSwitchAlertCoordinator stop];
+  _promptSwitchAlertCoordinator = nil;
   if (_navigationController) {
     [_navigationController cleanUpSettings];
     _navigationController = nil;
@@ -367,20 +380,22 @@
                                 viewController:(UIViewController*)viewController
                                        browser:(Browser*)browser
                                    syncConsent:(BOOL)syncConsent {
-  DCHECK(!_alertCoordinator);
+  DCHECK(!_managedConfirmationAlertCoordinator);
+  DCHECK(!_errorAlertCoordinator);
+  DCHECK(!_promptSwitchAlertCoordinator);
 
   ManagedConfirmationDialogContent* content =
       [self managedConfirmationDialogContentForHostedDomain:hostedDomain
                                                 syncConsent:syncConsent];
 
-  _alertCoordinator =
+  _managedConfirmationAlertCoordinator =
       [[AlertCoordinator alloc] initWithBaseViewController:viewController
                                                    browser:browser
                                                      title:content.title
                                                    message:content.subtitle];
 
   __weak AuthenticationFlowPerformer* weakSelf = self;
-  __weak AlertCoordinator* weakAlert = _alertCoordinator;
+  __weak AlertCoordinator* weakAlert = _managedConfirmationAlertCoordinator;
 
   ProceduralBlock acceptBlock = ^{
     AuthenticationFlowPerformer* strongSelf = weakSelf;
@@ -411,14 +426,16 @@
     [[strongSelf delegate] didCancelManagedConfirmation];
   };
 
-  [_alertCoordinator addItemWithTitle:content.cancelLabel
-                               action:cancelBlock
-                                style:UIAlertActionStyleCancel];
-  [_alertCoordinator addItemWithTitle:content.acceptLabel
-                               action:acceptBlock
-                                style:UIAlertActionStyleDefault];
-  _alertCoordinator.noInteractionAction = cancelBlock;
-  [_alertCoordinator start];
+  [_managedConfirmationAlertCoordinator
+      addItemWithTitle:content.cancelLabel
+                action:cancelBlock
+                 style:UIAlertActionStyleCancel];
+  [_managedConfirmationAlertCoordinator
+      addItemWithTitle:content.acceptLabel
+                action:acceptBlock
+                 style:UIAlertActionStyleDefault];
+  _managedConfirmationAlertCoordinator.noInteractionAction = cancelBlock;
+  [_managedConfirmationAlertCoordinator start];
 }
 
 - (void)showSnackbarWithSignInIdentity:(id<SystemIdentity>)identity
@@ -463,24 +480,28 @@
                  withCompletion:(ProceduralBlock)callback
                  viewController:(UIViewController*)viewController
                         browser:(Browser*)browser {
-  DCHECK(!_alertCoordinator);
+  DCHECK(!_managedConfirmationAlertCoordinator);
+  DCHECK(!_errorAlertCoordinator);
+  DCHECK(!_promptSwitchAlertCoordinator);
 
-  _alertCoordinator = ErrorCoordinatorNoItem(error, viewController, browser);
+  _errorAlertCoordinator =
+      ErrorCoordinatorNoItem(error, viewController, browser);
 
   __weak AuthenticationFlowPerformer* weakSelf = self;
-  __weak AlertCoordinator* weakAlert = _alertCoordinator;
+  __weak AlertCoordinator* weakAlert = _errorAlertCoordinator;
   ProceduralBlock dismissAction = ^{
     [weakSelf alertControllerDidDisappear:weakAlert];
-    if (callback)
+    if (callback) {
       callback();
+    }
   };
 
   NSString* okButtonLabel = l10n_util::GetNSString(IDS_OK);
-  [_alertCoordinator addItemWithTitle:okButtonLabel
-                               action:dismissAction
-                                style:UIAlertActionStyleDefault];
+  [_errorAlertCoordinator addItemWithTitle:okButtonLabel
+                                    action:dismissAction
+                                     style:UIAlertActionStyleDefault];
 
-  [_alertCoordinator start];
+  [_errorAlertCoordinator start];
 }
 
 - (void)registerUserPolicy:(ChromeBrowserState*)browserState
@@ -710,7 +731,9 @@
                              toEmail:(NSString*)toEmail
                       viewController:(UIViewController*)viewController
                              browser:(Browser*)browser {
-  DCHECK(!_alertCoordinator);
+  DCHECK(!_managedConfirmationAlertCoordinator);
+  DCHECK(!_errorAlertCoordinator);
+  DCHECK(!_promptSwitchAlertCoordinator);
   NSString* title = l10n_util::GetNSString(IDS_IOS_MANAGED_SWITCH_TITLE);
   NSString* subtitle = l10n_util::GetNSStringF(
       IDS_IOS_MANAGED_SWITCH_SUBTITLE, base::SysNSStringToUTF16(managedEmail),
@@ -720,14 +743,14 @@
       l10n_util::GetNSString(IDS_IOS_MANAGED_SWITCH_ACCEPT_BUTTON);
   NSString* cancelLabel = l10n_util::GetNSString(IDS_CANCEL);
 
-  _alertCoordinator =
+  _promptSwitchAlertCoordinator =
       [[AlertCoordinator alloc] initWithBaseViewController:viewController
                                                    browser:browser
                                                      title:title
                                                    message:subtitle];
 
   __weak AuthenticationFlowPerformer* weakSelf = self;
-  __weak AlertCoordinator* weakAlert = _alertCoordinator;
+  __weak AlertCoordinator* weakAlert = _promptSwitchAlertCoordinator;
   ProceduralBlock acceptBlock = ^{
     AuthenticationFlowPerformer* strongSelf = weakSelf;
     if (!strongSelf)
@@ -744,26 +767,27 @@
     [[strongSelf delegate] didChooseCancel];
   };
 
-  [_alertCoordinator addItemWithTitle:cancelLabel
-                               action:cancelBlock
-                                style:UIAlertActionStyleCancel];
-  [_alertCoordinator addItemWithTitle:acceptLabel
-                               action:acceptBlock
-                                style:UIAlertActionStyleDefault];
-  _alertCoordinator.noInteractionAction = cancelBlock;
-  [_alertCoordinator start];
+  [_promptSwitchAlertCoordinator addItemWithTitle:cancelLabel
+                                           action:cancelBlock
+                                            style:UIAlertActionStyleCancel];
+  [_promptSwitchAlertCoordinator addItemWithTitle:acceptLabel
+                                           action:acceptBlock
+                                            style:UIAlertActionStyleDefault];
+  _promptSwitchAlertCoordinator.noInteractionAction = cancelBlock;
+  [_promptSwitchAlertCoordinator start];
 }
 
 // Callback for when the alert is dismissed.
 - (void)alertControllerDidDisappear:(AlertCoordinator*)alertCoordinator {
-  if (_alertCoordinator != alertCoordinator) {
-    // Do not reset the `_alertCoordinator` if it has changed. This typically
-    // happens when the user taps on any of the actions on "Clear Data Before
-    // Syncing?" dialog, as the sign-in confirmation dialog is created before
-    // the "Clear Data Before Syncing?" dialog is dismissed.
-    return;
+  if (_managedConfirmationAlertCoordinator == alertCoordinator) {
+    _managedConfirmationAlertCoordinator = nil;
+  } else if (_errorAlertCoordinator == alertCoordinator) {
+    _errorAlertCoordinator = nil;
+  } else if (_promptSwitchAlertCoordinator == alertCoordinator) {
+    _promptSwitchAlertCoordinator = nil;
   }
-  _alertCoordinator = nil;
+  // TODO(crbug.com/1482623): This code needs to be simpler and clearer.
+  // At least NOTREACHED should be added here.
 }
 
 @end
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h b/ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h
index c91c2db..da2e0e67 100644
--- a/ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h
+++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h
@@ -32,12 +32,12 @@
 
 // Signs the primary account out of Chrome through the accounts list screen.
 // Taps the "Sign Out" button and dismisses the confirmation snackbar. Assumes
-// that sync sync is replaced by sign-in.
+// that sync is replaced by sign-in.
 + (void)signOut;
 
 // Signs the primary account out of Chrome through the accounts list screen.
 // Taps the "Sign Out" button, and then validated the confirmation dialog
-// according to `confirmation`.
+// according to `confirmation`. Assumes that sync is not replaced by sign-in.
 + (void)signOutWithConfirmationChoice:(SignOutConfirmationChoice)confirmation;
 
 // Taps the sign in confirmation page, scrolls first to make the OK button
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.mm b/ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.mm
index 2912e17..f55c9cd 100644
--- a/ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.mm
+++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.mm
@@ -210,54 +210,32 @@
 }
 
 + (void)signOutWithConfirmationChoice:(SignOutConfirmationChoice)confirmation {
+  CHECK(![ChromeEarlGrey isReplaceSyncWithSigninEnabled]);
   [ChromeEarlGreyUI openSettingsMenu];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()];
 
-  if ([ChromeEarlGrey isReplaceSyncWithSigninEnabled]) {
-    // With ReplaceSyncWithSignin, we're now in the "manage sync" view, and
-    // the signout button is at the very bottom. Scroll there.
-    id<GREYMatcher> scrollViewMatcher =
-        grey_accessibilityID(kManageSyncTableViewAccessibilityIdentifier);
-    [[EarlGrey selectElementWithMatcher:scrollViewMatcher]
-        performAction:grey_scrollToContentEdge(kGREYContentEdgeBottom)];
-
-    // Tap the "Sign out" button.
-    [[EarlGrey selectElementWithMatcher:
-                   grey_text(l10n_util::GetNSString(
-                       IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_SIGN_OUT_ITEM))]
-        performAction:grey_tap()];
-    // Note that there's no confirmation of signout, so the `confirmation`
-    // param is ignored. However, there is a snackbar - close it, so that it
-    // can't obstruct other UI items.
-    NSString* snackbarLabel = l10n_util::GetNSString(
-        IDS_IOS_GOOGLE_ACCOUNT_SETTINGS_SIGN_OUT_SNACKBAR_MESSAGE);
-    // The tap checks the existence of the snackbar and also closes it.
-    [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(snackbarLabel)]
-        performAction:grey_tap()];
-  } else {
-    // Without ReplaceSyncWithSignin, we're now in the "accounts" view.
-    // Tap the "Sign out" button.
-    [ChromeEarlGreyUI tapAccountsMenuButton:SignOutAccountsButton()];
-    // Tap the appropriate confirmation button.
-    int confirmationLabelID = 0;
-    switch (confirmation) {
-      case SignOutConfirmationChoiceClearData:
-        confirmationLabelID = IDS_IOS_SIGNOUT_DIALOG_CLEAR_DATA_BUTTON;
-        break;
-      case SignOutConfirmationChoiceKeepData:
-        confirmationLabelID = IDS_IOS_SIGNOUT_DIALOG_KEEP_DATA_BUTTON;
-        break;
-      case SignOutConfirmationChoiceNotSyncing:
-        confirmationLabelID = IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_BUTTON;
-        break;
-    }
-    id<GREYMatcher> confirmationButtonMatcher = [ChromeMatchersAppInterface
-        buttonWithAccessibilityLabelID:confirmationLabelID];
-    [[EarlGrey
-        selectElementWithMatcher:grey_allOf(confirmationButtonMatcher,
-                                            grey_not(SignOutAccountsButton()),
-                                            nil)] performAction:grey_tap()];
+  // Without ReplaceSyncWithSignin, we're now in the "accounts" view.
+  // Tap the "Sign out" button.
+  [ChromeEarlGreyUI tapAccountsMenuButton:SignOutAccountsButton()];
+  // Tap the appropriate confirmation button.
+  int confirmationLabelID = 0;
+  switch (confirmation) {
+    case SignOutConfirmationChoiceClearData:
+      confirmationLabelID = IDS_IOS_SIGNOUT_DIALOG_CLEAR_DATA_BUTTON;
+      break;
+    case SignOutConfirmationChoiceKeepData:
+      confirmationLabelID = IDS_IOS_SIGNOUT_DIALOG_KEEP_DATA_BUTTON;
+      break;
+    case SignOutConfirmationChoiceNotSyncing:
+      confirmationLabelID = IDS_IOS_SIGNOUT_DIALOG_SIGN_OUT_BUTTON;
+      break;
   }
+  id<GREYMatcher> confirmationButtonMatcher = [ChromeMatchersAppInterface
+      buttonWithAccessibilityLabelID:confirmationLabelID];
+  [[EarlGrey
+      selectElementWithMatcher:grey_allOf(confirmationButtonMatcher,
+                                          grey_not(SignOutAccountsButton()),
+                                          nil)] performAction:grey_tap()];
 
   // Wait until the user is signed out. Use a longer timeout for cases where
   // sign out also triggers a clear browsing data.
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 88526d1e..67c7561 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -1293,7 +1293,11 @@
   _fakeStatusBarView = [[UIView alloc] initWithFrame:statusBarFrame];
   [_fakeStatusBarView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) {
-    _fakeStatusBarView.backgroundColor = UIColor.blackColor;
+    if (base::FeatureList::IsEnabled(kModernTabStrip)) {
+      _fakeStatusBarView.backgroundColor = [UIColor colorNamed:kGrey200Color];
+    } else {
+      _fakeStatusBarView.backgroundColor = UIColor.blackColor;
+    }
     _fakeStatusBarView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
     DCHECK(self.contentArea);
     [self.view insertSubview:_fakeStatusBarView aboveSubview:self.contentArea];
@@ -1384,7 +1388,8 @@
         constraintEqualToAnchor:self.tabStripView.leadingAnchor],
     [self.view.safeAreaLayoutGuide.trailingAnchor
         constraintEqualToAnchor:self.tabStripView.trailingAnchor],
-    [self.tabStripView.heightAnchor constraintEqualToConstant:kTabStripHeight],
+    [self.tabStripView.heightAnchor
+        constraintEqualToConstant:kModernTabStripHeight],
   ]];
 }
 
diff --git a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/BUILD.gn b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/BUILD.gn
index 4414e31..d485b1c 100644
--- a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/BUILD.gn
@@ -46,9 +46,8 @@
     "//base/test:test_support",
     "//components/autofill/core/browser:test_support",
     "//components/autofill/core/common:features",
-    "//components/strings:components_strings_grit",
-    "//ios/chrome/app/strings:ios_branded_strings_grit",
-    "//ios/chrome/app/strings:ios_strings_grit",
+    "//components/strings",
+    "//ios/chrome/app/strings",
     "//ios/chrome/browser/shared/ui/table_view",
     "//ios/chrome/browser/shared/ui/table_view:test_support",
     "//ios/chrome/browser/shared/ui/table_view:utils",
diff --git a/ios/chrome/browser/ui/post_restore_signin/BUILD.gn b/ios/chrome/browser/ui/post_restore_signin/BUILD.gn
index 6299d06..7855d8b 100644
--- a/ios/chrome/browser/ui/post_restore_signin/BUILD.gn
+++ b/ios/chrome/browser/ui/post_restore_signin/BUILD.gn
@@ -44,7 +44,7 @@
     "//base",
     "//base/test:test_support",
     "//components/sync:test_support",
-    "//ios/chrome/app/strings:ios_branded_strings_grit",
+    "//ios/chrome/app/strings",
     "//ios/chrome/browser/signin/model:signin_util",
     "//ios/chrome/test:test_support",
     "//third_party/ocmock",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn
index af80e89..a951b9c6 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn
@@ -97,6 +97,8 @@
     "grid_layout.mm",
     "grid_shareable_items_provider.h",
     "grid_theme.h",
+    "group_grid_cell.h",
+    "group_grid_cell.mm",
     "legacy_grid_layout.h",
     "legacy_grid_layout.mm",
   ]
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/group_grid_cell.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/group_grid_cell.h
new file mode 100644
index 0000000..652a99f
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/group_grid_cell.h
@@ -0,0 +1,50 @@
+// 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_UI_TAB_SWITCHER_TAB_GRID_GRID_GROUP_GRID_CELL_H_
+#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_GRID_GROUP_GRID_CELL_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_theme.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_cell.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/transitions/legacy_grid_to_tab_transition_view.h"
+
+@class GroupGridCell;
+
+// Informs the receiver of actions on the cell.
+@protocol GroupGridCellDelegate
+- (void)closeButtonTappedForGroupCell:(GroupGridCell*)cell;
+@end
+
+// Values describing the editing state of the cell.
+typedef NS_ENUM(NSUInteger, GroupGridCellState) {
+  GroupGridCellStateNotEditing = 1,
+  GroupGridCellStateEditingUnselected,
+  GroupGridCellStateEditingSelected,
+};
+
+// A square-ish cell in a grid. Contains the group's favicon, its title and
+// close button.
+@interface GroupGridCell : TabCell
+// Delegate to inform the grid of actions on the cell.
+@property(nonatomic, weak) id<GroupGridCellDelegate> delegate;
+// The look of the cell.
+@property(nonatomic, assign) GridTheme theme;
+// Settable UI elements of the group cell.
+@property(nonatomic, weak) UIImage* icon;
+@property(nonatomic, copy) NSString* title;
+@property(nonatomic, assign) BOOL titleHidden;
+// Sets to update and keep cell alpha in sync.
+@property(nonatomic, assign) CGFloat opacity;
+// The current state which the cell should display.
+@property(nonatomic, assign) GroupGridCellState state;
+
+// Starts the activity indicator animation.
+- (void)showActivityIndicator;
+// Stops the activity indicator animation.
+- (void)hideActivityIndicator;
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_GRID_GROUP_GRID_CELL_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/group_grid_cell.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/group_grid_cell.mm
new file mode 100644
index 0000000..fb57824a9
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/group_grid_cell.mm
@@ -0,0 +1,508 @@
+// 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/ui/tab_switcher/tab_grid/grid/group_grid_cell.h"
+
+#import <MaterialComponents/MaterialActivityIndicator.h>
+#import <ostream>
+
+#import "base/check.h"
+#import "base/check_op.h"
+#import "base/debug/dump_without_crashing.h"
+#import "base/notreached.h"
+#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
+#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_constants.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/util/constraints_ui_util.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ui/base/l10n/l10n_util.h"
+#import "ui/gfx/ios/uikit_util.h"
+
+namespace {
+
+// The size of symbol icons.
+NSInteger kIconSymbolPointSize = 13;
+
+// Size of activity indicator replacing fav icon when active.
+const CGFloat kIndicatorSize = 16.0;
+
+}  // namespace
+
+@interface GroupGridCell ()
+// The constraints enabled under accessibility font size.
+@property(nonatomic, strong)
+    NSArray<NSLayoutConstraint*>* accessibilityConstraints;
+// The constraints enabled under normal font size.
+@property(nonatomic, strong)
+    NSArray<NSLayoutConstraint*>* nonAccessibilityConstraints;
+// The constraints enabled while showing the close icon.
+@property(nonatomic, strong) NSArray<NSLayoutConstraint*>* closeIconConstraints;
+// The constraints enabled while showing the selection icon.
+@property(nonatomic, strong)
+    NSArray<NSLayoutConstraint*>* selectIconConstraints;
+// Header height of the cell.
+@property(nonatomic, strong) NSLayoutConstraint* topBarHeightConstraint;
+// Visual components of the cell.
+@property(nonatomic, weak) UIView* topBar;
+@property(nonatomic, weak) UIImageView* iconView;
+@property(nonatomic, weak) UIView* snapshotView;
+@property(nonatomic, weak) UILabel* titleLabel;
+@property(nonatomic, weak) UIImageView* closeIconView;
+@property(nonatomic, weak) UIImageView* selectIconView;
+@property(nonatomic, weak) MDCActivityIndicator* activityIndicator;
+// Since the close icon dimensions are smaller than the recommended tap target
+// size, use an overlaid tap target button.
+@property(nonatomic, weak) UIButton* closeTapTargetButton;
+@property(nonatomic, weak) UIView* border;
+// Whether or not the cell is currently displaying an editing state.
+@property(nonatomic, readonly) BOOL isInSelectionMode;
+@end
+
+@implementation GroupGridCell
+
+// `-dequeueReusableCellWithReuseIdentifier:forIndexPath:` calls this method to
+// initialize a cell.
+- (instancetype)initWithFrame:(CGRect)frame {
+  self = [super initWithFrame:frame];
+  if (self) {
+    _state = GroupGridCellStateNotEditing;
+
+    // The background color must be set to avoid the corners behind the rounded
+    // layer from showing when dragging and dropping. Unfortunately, using
+    // `UIColor.clearColor` here will not remain transparent, so a solid color
+    // must be chosen. Using the grid color prevents the corners from showing
+    // while it transitions to the presented context menu/dragging state.
+    self.backgroundColor = [UIColor colorNamed:kGridBackgroundColor];
+
+    [self setupSelectedBackgroundView];
+    UIView* contentView = self.contentView;
+    contentView.layer.cornerRadius = kGridCellCornerRadius;
+    contentView.layer.masksToBounds = YES;
+    UIView* topBar = [self setupTopBar];
+    UIView* snapshotView = [[UIView alloc] init];
+    snapshotView.translatesAutoresizingMaskIntoConstraints = NO;
+
+    UIButton* closeTapTargetButton =
+        [UIButton buttonWithType:UIButtonTypeCustom];
+    closeTapTargetButton.translatesAutoresizingMaskIntoConstraints = NO;
+    [closeTapTargetButton addTarget:self
+                             action:@selector(closeButtonTapped:)
+                   forControlEvents:UIControlEventTouchUpInside];
+    closeTapTargetButton.accessibilityIdentifier =
+        kGridCellCloseButtonIdentifier;
+    [contentView addSubview:topBar];
+    [contentView addSubview:snapshotView];
+    [contentView addSubview:closeTapTargetButton];
+    _topBar = topBar;
+    _snapshotView = snapshotView;
+    _closeTapTargetButton = closeTapTargetButton;
+    _opacity = 1.0;
+
+    self.contentView.backgroundColor = [UIColor colorNamed:kBackgroundColor];
+    self.snapshotView.backgroundColor = [UIColor colorNamed:kBackgroundColor];
+    self.topBar.backgroundColor = [UIColor colorNamed:kBackgroundColor];
+    self.titleLabel.textColor = [UIColor colorNamed:kTextPrimaryColor];
+    self.closeIconView.tintColor = [UIColor colorNamed:kCloseButtonColor];
+
+    self.layer.cornerRadius = kGridCellCornerRadius;
+    self.layer.shadowColor = [UIColor blackColor].CGColor;
+    self.layer.shadowOffset = CGSizeMake(0, 0);
+    self.layer.shadowRadius = 4.0f;
+    self.layer.shadowOpacity = 0.5f;
+    self.layer.masksToBounds = NO;
+    NSArray* constraints = @[
+      [topBar.topAnchor constraintEqualToAnchor:contentView.topAnchor],
+      [topBar.leadingAnchor constraintEqualToAnchor:contentView.leadingAnchor],
+      [topBar.trailingAnchor
+          constraintEqualToAnchor:contentView.trailingAnchor],
+      [snapshotView.topAnchor constraintEqualToAnchor:topBar.bottomAnchor],
+      [snapshotView.leadingAnchor
+          constraintEqualToAnchor:contentView.leadingAnchor],
+      [snapshotView.trailingAnchor
+          constraintEqualToAnchor:contentView.trailingAnchor],
+      [snapshotView.bottomAnchor
+          constraintEqualToAnchor:contentView.bottomAnchor],
+      [closeTapTargetButton.topAnchor
+          constraintEqualToAnchor:contentView.topAnchor],
+      [closeTapTargetButton.trailingAnchor
+          constraintEqualToAnchor:contentView.trailingAnchor],
+      [closeTapTargetButton.widthAnchor
+          constraintEqualToConstant:kGridCellCloseTapTargetWidthHeight],
+      [closeTapTargetButton.heightAnchor
+          constraintEqualToConstant:kGridCellCloseTapTargetWidthHeight],
+    ];
+    [NSLayoutConstraint activateConstraints:constraints];
+  }
+  return self;
+}
+
+#pragma mark - UIView
+
+- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection {
+  [super traitCollectionDidChange:previousTraitCollection];
+  BOOL isPreviousAccessibilityCategory =
+      UIContentSizeCategoryIsAccessibilityCategory(
+          previousTraitCollection.preferredContentSizeCategory);
+  BOOL isCurrentAccessibilityCategory =
+      UIContentSizeCategoryIsAccessibilityCategory(
+          self.traitCollection.preferredContentSizeCategory);
+  if (isPreviousAccessibilityCategory ^ isCurrentAccessibilityCategory) {
+    [self updateTopBarSize];
+  }
+}
+
+#pragma mark - UICollectionViewCell
+
+- (void)setHighlighted:(BOOL)highlighted {
+  // NO-OP to disable highlighting and only allow selection.
+}
+
+- (void)prepareForReuse {
+  [super prepareForReuse];
+  self.title = nil;
+  self.titleHidden = NO;
+  self.icon = nil;
+  self.selected = NO;
+  self.opacity = 1.0;
+  [self hideActivityIndicator];
+}
+
+#pragma mark - UIAccessibility
+
+- (BOOL)isAccessibilityElement {
+  // This makes the whole cell tappable in VoiceOver rather than the individual
+  // title and close button.
+  return YES;
+}
+// TODO(crbug.com/1511982): Add the accessibility custom actions.
+
+#pragma mark - Public
+
+// Updates the theme to either dark or light. Updating is only done if the
+// current theme is not the desired theme.
+- (void)setTheme:(GridTheme)theme {
+  if (_theme == theme) {
+    return;
+  }
+
+  self.overrideUserInterfaceStyle = (theme == GridThemeDark)
+                                        ? UIUserInterfaceStyleDark
+                                        : UIUserInterfaceStyleUnspecified;
+
+  // The light and dark themes have different colored borders based on the
+  // theme, regardless of dark mode, so `overrideUserInterfaceStyle` is not
+  // enough here.
+  switch (theme) {
+    case GridThemeLight:
+      self.border.layer.borderColor =
+          [UIColor colorNamed:kStaticBlue400Color].CGColor;
+      break;
+    case GridThemeDark:
+      self.border.layer.borderColor = UIColor.whiteColor.CGColor;
+      break;
+  }
+
+  _theme = theme;
+}
+
+- (void)setIcon:(UIImage*)icon {
+  self.iconView.image = icon;
+  _icon = icon;
+}
+
+- (void)showActivityIndicator {
+  [self.activityIndicator startAnimating];
+  [self.activityIndicator setHidden:NO];
+  [self.iconView setHidden:YES];
+}
+
+- (void)hideActivityIndicator {
+  [self.activityIndicator stopAnimating];
+  [self.activityIndicator setHidden:YES];
+  [self.iconView setHidden:NO];
+}
+
+- (void)setTitle:(NSString*)title {
+  self.titleLabel.text = title;
+  self.accessibilityLabel = title;
+  _title = title;
+}
+
+- (void)setTitleHidden:(BOOL)titleHidden {
+  self.titleLabel.hidden = titleHidden;
+  _titleHidden = titleHidden;
+}
+
+- (UIDragPreviewParameters*)dragPreviewParameters {
+  UIBezierPath* visiblePath = [UIBezierPath
+      bezierPathWithRoundedRect:self.bounds
+                   cornerRadius:self.contentView.layer.cornerRadius];
+  UIDragPreviewParameters* params = [[UIDragPreviewParameters alloc] init];
+  params.visiblePath = visiblePath;
+  return params;
+}
+
+- (void)setOpacity:(CGFloat)opacity {
+  _opacity = opacity;
+  self.alpha = opacity;
+}
+
+- (void)setAlpha:(CGFloat)alpha {
+  // Make sure alpha is synchronized with opacity.
+  super.alpha = _opacity;
+}
+
+#pragma mark - Private
+
+// Sets up the top bar with icon, title, and close button.
+- (UIView*)setupTopBar {
+  UIView* topBar = [[UIView alloc] init];
+  topBar.translatesAutoresizingMaskIntoConstraints = NO;
+
+  UIImageView* iconView = [[UIImageView alloc] init];
+  iconView.translatesAutoresizingMaskIntoConstraints = NO;
+  iconView.contentMode = UIViewContentModeScaleAspectFill;
+  iconView.layer.cornerRadius = kGridCellIconCornerRadius;
+  iconView.layer.masksToBounds = YES;
+  iconView.backgroundColor = UIColor.clearColor;
+  iconView.tintColor = [UIColor colorNamed:kGrey400Color];
+
+  CGRect indicatorFrame = CGRectMake(0, 0, kIndicatorSize, kIndicatorSize);
+  MDCActivityIndicator* activityIndicator =
+      [[MDCActivityIndicator alloc] initWithFrame:indicatorFrame];
+  activityIndicator.translatesAutoresizingMaskIntoConstraints = NO;
+  activityIndicator.cycleColors = @[ [UIColor colorNamed:kBlueColor] ];
+  activityIndicator.radius = ui::AlignValueToUpperPixel(kIndicatorSize / 2);
+
+  UILabel* titleLabel = [[UILabel alloc] init];
+  titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
+  titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote];
+  titleLabel.adjustsFontForContentSizeCategory = YES;
+
+  UIImageView* closeIconView = [[UIImageView alloc] init];
+  closeIconView.translatesAutoresizingMaskIntoConstraints = NO;
+  closeIconView.contentMode = UIViewContentModeCenter;
+  closeIconView.hidden = self.isInSelectionMode;
+  closeIconView.image =
+      DefaultSymbolTemplateWithPointSize(kXMarkSymbol, kIconSymbolPointSize);
+
+  UIImageView* selectIconView = [[UIImageView alloc] init];
+  selectIconView.translatesAutoresizingMaskIntoConstraints = NO;
+  selectIconView.contentMode = UIViewContentModeScaleAspectFit;
+  selectIconView.hidden = !self.isInSelectionMode;
+
+  selectIconView.image = [self selectIconImageForCurrentState];
+
+  [topBar addSubview:selectIconView];
+  _selectIconView = selectIconView;
+
+  [topBar addSubview:iconView];
+  [topBar addSubview:activityIndicator];
+  [topBar addSubview:titleLabel];
+  [topBar addSubview:closeIconView];
+
+  _iconView = iconView;
+  _activityIndicator = activityIndicator;
+  _titleLabel = titleLabel;
+  _closeIconView = closeIconView;
+
+  _accessibilityConstraints = @[
+    [titleLabel.leadingAnchor
+        constraintEqualToAnchor:topBar.leadingAnchor
+                       constant:kGridCellHeaderLeadingInset],
+    [iconView.widthAnchor constraintEqualToConstant:0],
+    [iconView.heightAnchor constraintEqualToConstant:0],
+  ];
+
+  _nonAccessibilityConstraints = @[
+    [iconView.leadingAnchor
+        constraintEqualToAnchor:topBar.leadingAnchor
+                       constant:kGridCellHeaderLeadingInset],
+    [iconView.centerYAnchor constraintEqualToAnchor:topBar.centerYAnchor],
+    [iconView.widthAnchor constraintEqualToConstant:kGridCellIconDiameter],
+    [iconView.heightAnchor constraintEqualToConstant:kGridCellIconDiameter],
+    [titleLabel.leadingAnchor
+        constraintEqualToAnchor:iconView.trailingAnchor
+                       constant:kGridCellHeaderLeadingInset],
+  ];
+
+  _topBarHeightConstraint =
+      [topBar.heightAnchor constraintEqualToConstant:kGridCellHeaderHeight];
+
+  _closeIconConstraints = @[
+    [titleLabel.trailingAnchor
+        constraintEqualToAnchor:closeIconView.leadingAnchor
+                       constant:-kGridCellTitleLabelContentInset],
+    [topBar.topAnchor constraintEqualToAnchor:closeIconView.centerYAnchor
+                                     constant:-kGridCellCloseButtonTopSpacing],
+    [closeIconView.trailingAnchor
+        constraintEqualToAnchor:topBar.trailingAnchor
+                       constant:-kGridCellCloseButtonContentInset],
+  ];
+
+  if (_selectIconView) {
+    _selectIconConstraints = @[
+      [_selectIconView.heightAnchor
+          constraintEqualToConstant:kGridCellSelectIconSize],
+      [_selectIconView.widthAnchor
+          constraintEqualToConstant:kGridCellSelectIconSize],
+      [titleLabel.trailingAnchor
+          constraintEqualToAnchor:_selectIconView.leadingAnchor
+                         constant:-kGridCellTitleLabelContentInset],
+      [topBar.topAnchor constraintEqualToAnchor:_selectIconView.topAnchor
+                                       constant:-kGridCellSelectIconTopSpacing],
+      [_selectIconView.trailingAnchor
+          constraintEqualToAnchor:topBar.trailingAnchor
+                         constant:-kGridCellSelectIconContentInset],
+
+    ];
+  }
+
+  [self updateTopBarSize];
+  [self configureCloseOrSelectIconConstraints];
+
+  NSArray* constraints = @[
+    _topBarHeightConstraint,
+    [titleLabel.centerYAnchor constraintEqualToAnchor:topBar.centerYAnchor],
+  ];
+
+  // Center indicator over favicon.
+  AddSameCenterXConstraint(self, iconView, activityIndicator);
+  AddSameCenterYConstraint(self, iconView, activityIndicator);
+
+  [NSLayoutConstraint activateConstraints:constraints];
+  [titleLabel
+      setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
+                                      forAxis:UILayoutConstraintAxisHorizontal];
+  [closeIconView
+      setContentCompressionResistancePriority:UILayoutPriorityRequired
+                                      forAxis:UILayoutConstraintAxisHorizontal];
+  [closeIconView setContentHuggingPriority:UILayoutPriorityRequired
+                                   forAxis:UILayoutConstraintAxisHorizontal];
+  if (_selectIconView) {
+    [_selectIconView
+        setContentCompressionResistancePriority:UILayoutPriorityRequired
+                                        forAxis:
+                                            UILayoutConstraintAxisHorizontal];
+    [_selectIconView
+        setContentHuggingPriority:UILayoutPriorityRequired
+                          forAxis:UILayoutConstraintAxisHorizontal];
+  }
+  return topBar;
+}
+
+- (UIImage*)selectIconImageForCurrentState {
+  if (_state == GroupGridCellStateEditingUnselected) {
+    return DefaultSymbolTemplateWithPointSize(kCircleSymbol,
+                                              kIconSymbolPointSize);
+  }
+  return DefaultSymbolTemplateWithPointSize(kCheckmarkCircleFillSymbol,
+                                            kIconSymbolPointSize);
+}
+
+// Update constraints of top bar when system font size changes. If accessibility
+// font size is chosen, the favicon will be hidden, and the title text will be
+// shown in two lines.
+- (void)updateTopBarSize {
+  self.topBarHeightConstraint.constant = [self topBarHeight];
+
+  if (UIContentSizeCategoryIsAccessibilityCategory(
+          self.traitCollection.preferredContentSizeCategory)) {
+    self.titleLabel.numberOfLines = 2;
+    [NSLayoutConstraint deactivateConstraints:_nonAccessibilityConstraints];
+    [NSLayoutConstraint activateConstraints:_accessibilityConstraints];
+  } else {
+    self.titleLabel.numberOfLines = 1;
+    [NSLayoutConstraint deactivateConstraints:_accessibilityConstraints];
+    [NSLayoutConstraint activateConstraints:_nonAccessibilityConstraints];
+  }
+}
+
+- (void)configureCloseOrSelectIconConstraints {
+  BOOL showSelectionMode = self.isInSelectionMode && _selectIconView;
+
+  self.closeIconView.hidden = showSelectionMode;
+  self.selectIconView.hidden = !showSelectionMode;
+
+  if (showSelectionMode) {
+    [NSLayoutConstraint deactivateConstraints:_closeIconConstraints];
+    [NSLayoutConstraint activateConstraints:_selectIconConstraints];
+  } else {
+    [NSLayoutConstraint deactivateConstraints:_selectIconConstraints];
+    [NSLayoutConstraint activateConstraints:_closeIconConstraints];
+  }
+}
+
+- (BOOL)isInSelectionMode {
+  return self.state != GroupGridCellStateNotEditing;
+}
+
+- (void)setState:(GroupGridCellState)state {
+  if (state == _state) {
+    return;
+  }
+
+  _state = state;
+  // TODO(crbug.com/1501837): Add the accessibility value for selected and
+  // unselected states.
+  self.accessibilityValue = nil;
+  _closeTapTargetButton.enabled = !self.isInSelectionMode;
+  self.selectIconView.image = [self selectIconImageForCurrentState];
+
+  [self configureCloseOrSelectIconConstraints];
+  self.border.hidden = self.isInSelectionMode;
+}
+
+// Sets up the selection border. The tint color is set when the theme is
+// selected.
+- (void)setupSelectedBackgroundView {
+  self.selectedBackgroundView = [[UIView alloc] init];
+  self.selectedBackgroundView.backgroundColor =
+      [UIColor colorNamed:kGridBackgroundColor];
+  UIView* border = [[UIView alloc] init];
+  border.hidden = self.isInSelectionMode;
+  border.translatesAutoresizingMaskIntoConstraints = NO;
+  border.backgroundColor = [UIColor colorNamed:kGridBackgroundColor];
+  border.layer.cornerRadius = kGridCellCornerRadius +
+                              kGridCellSelectionRingGapWidth +
+                              kGridCellSelectionRingTintWidth;
+  border.layer.borderWidth = kGridCellSelectionRingTintWidth;
+  [self.selectedBackgroundView addSubview:border];
+  _border = border;
+  [NSLayoutConstraint activateConstraints:@[
+    [border.topAnchor
+        constraintEqualToAnchor:self.selectedBackgroundView.topAnchor
+                       constant:-kGridCellSelectionRingTintWidth -
+                                kGridCellSelectionRingGapWidth],
+    [border.leadingAnchor
+        constraintEqualToAnchor:self.selectedBackgroundView.leadingAnchor
+                       constant:-kGridCellSelectionRingTintWidth -
+                                kGridCellSelectionRingGapWidth],
+    [border.trailingAnchor
+        constraintEqualToAnchor:self.selectedBackgroundView.trailingAnchor
+                       constant:kGridCellSelectionRingTintWidth +
+                                kGridCellSelectionRingGapWidth],
+    [border.bottomAnchor
+        constraintEqualToAnchor:self.selectedBackgroundView.bottomAnchor
+                       constant:kGridCellSelectionRingTintWidth +
+                                kGridCellSelectionRingGapWidth]
+  ]];
+}
+
+// Selector registered to the close button.
+- (void)closeButtonTapped:(id)sender {
+  [self.delegate closeButtonTappedForGroupCell:self];
+}
+
+// Returns the height of top bar in grid cell. The value depends on whether
+// accessibility font size is chosen.
+- (CGFloat)topBarHeight {
+  return UIContentSizeCategoryIsAccessibilityCategory(
+             self.traitCollection.preferredContentSizeCategory)
+             ? kGridCellHeaderAccessibilityHeight
+             : kGridCellHeaderHeight;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/BUILD.gn
index 8f35bdc5..5f25603 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/BUILD.gn
@@ -11,6 +11,7 @@
     "tab_strip_consumer.swift",
     "tab_strip_layout.swift",
     "tab_strip_new_tab_button.swift",
+    "tab_strip_new_tab_button_delegate.swift",
     "tab_strip_view_controller.swift",
     "tab_strip_view_controller_delegate.swift",
   ]
@@ -19,6 +20,7 @@
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/ui/menu",
     "//ios/chrome/browser/ui/tab_switcher",
+    "//ios/chrome/common/ui/colors",
   ]
 }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift
index 622b3cf..b0ff55c 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift
@@ -7,9 +7,14 @@
 /// Struct that contains constants used in the Tab Strip UI.
 struct TabStripConstants {
 
+  /// Collection view constants.
+  struct CollectionView {
+    static let inset: CGFloat = 4
+  }
+
   /// Tab item constants.
   struct TabItem {
-    static let height: CGFloat = 39
+    static let height: CGFloat = 40
     static let minWidth: CGFloat = 80
     static let maxWidth: CGFloat = 150
     static let horizontalSpacing: CGFloat = 0
@@ -18,8 +23,15 @@
 
   /// New tab button constants.
   struct NewTabButton {
-    static let contentInset: CGFloat = 6
-    static let symbolPointSize: CGFloat = 18
+    static let width: CGFloat = 46
+
+    static let topInset: CGFloat = 4
+    static let bottomInset: CGFloat = 8
+    static let leadingInset: CGFloat = 4
+    static let trailingInset: CGFloat = 10
+
+    static let cornerRadius: CGFloat = 16
+    static let symbolPointSize: CGFloat = 16
   }
 
 }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_new_tab_button.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_new_tab_button.swift
index e86633e..0c9ec67 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_new_tab_button.swift
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_new_tab_button.swift
@@ -4,13 +4,31 @@
 
 import UIKit
 
-/// An `UIButton` displayed in the tab strip that opens a new tab.
-class TabStripNewTabButton: UIButton {
+/// UIView that contains an `UIButton` that opens a new tab.
+class TabStripNewTabButton: UIView {
+
+  /// Delegate that informs the receiver of actions on the new tab button.
+  public var delegate: TabStripNewTabButtonDelegate?
+
+  private let button: UIButton = UIButton(type: .custom)
 
   override init(frame: CGRect) {
     super.init(frame: frame)
+    translatesAutoresizingMaskIntoConstraints = false
 
     configureButton()
+    addSubview(button)
+
+    NSLayoutConstraint.activate([
+      button.leadingAnchor.constraint(
+        equalTo: self.leadingAnchor, constant: TabStripConstants.NewTabButton.leadingInset),
+      button.trailingAnchor.constraint(
+        equalTo: self.trailingAnchor, constant: -TabStripConstants.NewTabButton.trailingInset),
+      button.topAnchor.constraint(
+        equalTo: self.topAnchor, constant: TabStripConstants.NewTabButton.topInset),
+      button.bottomAnchor.constraint(
+        equalTo: self.bottomAnchor, constant: -TabStripConstants.NewTabButton.bottomInset),
+    ])
   }
 
   required init?(coder: NSCoder) {
@@ -19,16 +37,28 @@
 
   // MARK: - Private
 
+  /// Called when the `button` has been tapped.
+  @objc func buttonTapped() {
+    delegate?.newTabButtonTapped()
+  }
+
   /// Configures the `UIButton`.
   private func configureButton() {
-    var config = UIButton.Configuration.borderless()
-    config.imagePadding = TabStripConstants.NewTabButton.contentInset
-    configuration = config
+    let closeSymbol: UIImage = DefaultSymbolWithPointSize(
+      kPlusSymbol, TabStripConstants.NewTabButton.symbolPointSize)
 
-    let closeSymbol: UIImage = CustomSymbolWithPointSize(
-      kPlusCircleFillSymbol, TabStripConstants.NewTabButton.symbolPointSize)
-    setImage(closeSymbol, for: .normal)
-    tintColor = UIColor.orange
-    translatesAutoresizingMaskIntoConstraints = false
+    var configuration = UIButton.Configuration.borderless()
+    configuration.contentInsets = .zero
+
+    configuration.image = closeSymbol
+    configuration.baseForegroundColor = UIColor(named: kTextSecondaryColor)
+    button.configuration = configuration
+
+    button.imageView?.contentMode = .center
+    button.layer.cornerRadius = TabStripConstants.NewTabButton.cornerRadius
+    button.backgroundColor = UIColor(named: kPrimaryBackgroundColor)
+
+    button.translatesAutoresizingMaskIntoConstraints = false
+    button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
   }
 }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_new_tab_button_delegate.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_new_tab_button_delegate.swift
new file mode 100644
index 0000000..ef96f40
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_new_tab_button_delegate.swift
@@ -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.
+
+import Foundation
+
+/// Informs the receiver of actions on the new tab button.
+protocol TabStripNewTabButtonDelegate {
+  /// Informs the receiver that the new tab button was tapped.
+  func newTabButtonTapped()
+}
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_ui_swift_bridge.h b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_ui_swift_bridge.h
index d7b34f6..464dc02 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_ui_swift_bridge.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_ui_swift_bridge.h
@@ -10,5 +10,6 @@
 #import "ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_mutator.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_item.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_STRIP_UI_TAB_STRIP_UI_SWIFT_BRIDGE_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_view_controller.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_view_controller.swift
index f0e43db..efb48eef 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_view_controller.swift
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_view_controller.swift
@@ -7,7 +7,7 @@
 /// View Controller displaying the TabStrip.
 @objcMembers
 class TabStripViewController: UIViewController, TabStripCellDelegate,
-  TabStripConsumer
+  TabStripConsumer, TabStripNewTabButtonDelegate
 {
 
   // The enum used by the data source to manage the sections.
@@ -52,20 +52,28 @@
 
   override func viewDidLoad() {
     super.viewDidLoad()
+    view.backgroundColor = UIColor(named: kGrey200Color)
+
     collectionView.translatesAutoresizingMaskIntoConstraints = false
-    self.view.addSubview(collectionView)
-    self.view.addSubview(newTabButton)
-    newTabButton.addTarget(self, action: #selector(newTabButtonTapped), for: .touchUpInside)
+    collectionView.backgroundColor = .clear
+    view.addSubview(collectionView)
+
+    newTabButton.delegate = self
+    view.addSubview(newTabButton)
 
     NSLayoutConstraint.activate([
-      self.view.leadingAnchor.constraint(equalTo: collectionView.leadingAnchor),
-      self.view.topAnchor.constraint(equalTo: collectionView.topAnchor),
-      self.view.bottomAnchor.constraint(equalTo: collectionView.bottomAnchor),
-      self.view.trailingAnchor.constraint(equalTo: newTabButton.trailingAnchor),
+      collectionView.leadingAnchor.constraint(
+        equalTo: view.leadingAnchor, constant: TabStripConstants.CollectionView.inset),
+      collectionView.topAnchor.constraint(
+        equalTo: view.topAnchor, constant: TabStripConstants.CollectionView.inset),
+      collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
 
-      newTabButton.heightAnchor.constraint(equalTo: collectionView.heightAnchor),
-      newTabButton.widthAnchor.constraint(equalTo: newTabButton.heightAnchor),
-      newTabButton.leadingAnchor.constraint(equalTo: collectionView.trailingAnchor),
+      newTabButton.leadingAnchor.constraint(
+        equalTo: collectionView.trailingAnchor, constant: TabStripConstants.CollectionView.inset),
+      newTabButton.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+      newTabButton.bottomAnchor.constraint(equalTo: view.bottomAnchor),
+      newTabButton.topAnchor.constraint(equalTo: view.topAnchor),
+      newTabButton.widthAnchor.constraint(equalToConstant: TabStripConstants.NewTabButton.width),
     ])
 
   }
@@ -224,7 +232,8 @@
     return UIMenu(children: [share, closeActions])
   }
 
-  /// Called when the `newTabButton` has been tapped.
+  // MARK: - TabStripNewTabButtonDelegate
+
   @objc func newTabButtonTapped() {
     mutator?.addNewItem()
   }
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_constants.h b/ios/chrome/browser/ui/tabs/tab_strip_constants.h
index f5e47c6..397010a 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_constants.h
+++ b/ios/chrome/browser/ui/tabs/tab_strip_constants.h
@@ -14,4 +14,7 @@
 // The size of the tab strip view.
 extern const CGFloat kTabStripHeight;
 
+// The size of the modern tab strip view.
+extern const CGFloat kModernTabStripHeight;
+
 #endif  // IOS_CHROME_BROWSER_UI_TABS_TAB_STRIP_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_constants.mm b/ios/chrome/browser/ui/tabs/tab_strip_constants.mm
index 5b8ad56..c7b96261 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_constants.mm
+++ b/ios/chrome/browser/ui/tabs/tab_strip_constants.mm
@@ -7,4 +7,6 @@
 NSString* const kRegularTabStripId = @"kRegularTabStripId";
 NSString* const kIncognitoTabStripId = @"kIncognitoTabStripId";
 
-const CGFloat kTabStripHeight = 39.0;
\ No newline at end of file
+const CGFloat kTabStripHeight = 39.0;
+
+const CGFloat kModernTabStripHeight = 44.0;
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index ce7b837..cd69aae 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -228,7 +228,6 @@
     "//ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/confirm:unit_tests",
     "//ios/chrome/browser/intents:unit_tests",
     "//ios/chrome/browser/itunes_urls/model:unit_tests",
-    "//ios/chrome/browser/json_parser:unit_tests",
     "//ios/chrome/browser/language/model:unit_tests",
     "//ios/chrome/browser/lens/model:unit_tests",
     "//ios/chrome/browser/link_to_text/model:unit_tests",
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 96d5425..bb13ac0 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-65103ee42abae3d75f41e25456bc8f1bdbf2f8de
\ No newline at end of file
+7277c53614cb2354216973f30f34066d6c47d107
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index ee207f1..c353fa70 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-59a1b6900e6b412a1ee1f93dda06847f94e66229
\ No newline at end of file
+6249106f7b3f2fcc7aad7b161af23268202f4f4f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 2bd90f7..cc380ab 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-e681c156f8df711763b30f3b2bca0a2e161c0bb7
\ No newline at end of file
+0def490275ac6de789f1ac630860ea4bd2f01cd4
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 14dbe78b..1bbec18 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-9ab780d4f1435a59e89d50c0c66ef96c96281007
\ No newline at end of file
+e225c7f938e7070bf514e3147e3ed5bd328ead43
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index a13dbba..07e72450 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-6ba0110dbf086737c83c6c93f871c7f48285512b
\ No newline at end of file
+b1944ec79e1adf7db66c3c39e7d382236f7d66e5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 4cf16287d6..a5b9b9b 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-41b00331ef12fffd3cc3c7d5178810654bd3d6ff
\ No newline at end of file
+aa159535b0eee9623f69a198ef3cf57ee04edb37
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index fd37f056..68cda35 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-d4305ecab7c2c8fc5d78c445a1d93b182a0e4d09
\ No newline at end of file
+e428ef1fc807847555dc310fad23be76d25a7d9c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 12a9a0b..bd55e08 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-88a9ce4ae971559866f781a38db829f4677df64d
\ No newline at end of file
+84300f6bfaf912f7ef8011700c70b429a9010683
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 597a850..816cee2 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-1abb39ef0ff2d83bc1c0b9083cba7d0bc192efb5
\ No newline at end of file
+0e5e338d8daec68c4e85fc6d5875bb076a199e83
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 5a46007..05be9e9 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-8dd56772ef73919e29dfe80960bb952a7e7782cd
\ No newline at end of file
+b8f3d59c7b609c98dc09f2877d1cbcbc7a8e0d00
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 7020b04..247252c5 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-9b491aa965c14732ce0964d8942b67628bb12553
\ No newline at end of file
+112c41a2c8cf0545f14e24e4a4c7da8bd0c05f69
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 37aee50..7297ac5a 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-f875eba30634387586025e3653955d05629d255a
\ No newline at end of file
+77967b883c3a849297864774f3e286e2141e3c5a
\ No newline at end of file
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn
index edf01d97..0b8d5f6e 100644
--- a/ios/third_party/material_components_ios/BUILD.gn
+++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -136,6 +136,8 @@
   "src/components/Chips/src/MDCChipView.h",
   "src/components/Chips/src/MDCChipViewAccessoryView.h",
   "src/components/Chips/src/MDCChipViewDeleteButton.h",
+  "src/components/Chips/src/MDCLegacyChipField.h",
+  "src/components/Chips/src/MDCLegacyChipFieldDelegate.h",
   "src/components/Chips/src/MaterialChips.h",
   "src/components/Chips/src/PerformantShadowMigration/MDCChipView+ShadowsPrivate.h",
   "src/components/Chips/src/Theming/MDCChipView+MaterialTheming.h",
@@ -922,6 +924,9 @@
   "src/components/Chips/src/MDCChipViewAccessoryView.m",
   "src/components/Chips/src/MDCChipViewDeleteButton.h",
   "src/components/Chips/src/MDCChipViewDeleteButton.m",
+  "src/components/Chips/src/MDCLegacyChipField.h",
+  "src/components/Chips/src/MDCLegacyChipField.m",
+  "src/components/Chips/src/MDCLegacyChipFieldDelegate.h",
   "src/components/Chips/src/MaterialChips.h",
   "src/components/Chips/src/PerformantShadowMigration/MDCChipView+ShadowsPrivate.h",
   "src/components/Chips/src/Theming/MDCChipView+MaterialTheming.h",
diff --git a/ios/third_party/material_components_ios/src b/ios/third_party/material_components_ios/src
index fa93c43..50dba9a 160000
--- a/ios/third_party/material_components_ios/src
+++ b/ios/third_party/material_components_ios/src
@@ -1 +1 @@
-Subproject commit fa93c43d0ebc382860647e74fbbd87acddcb5142
+Subproject commit 50dba9a91b59cdc77d7216807576ded5b8f4c65a
diff --git a/ios_internal b/ios_internal
index 3803d9c..b65722f 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 3803d9c28df7c8d5121cbc7d09c60a5a5c0c558c
+Subproject commit b65722f17a0133fb4d41b7610dfeb7f04e48f3c1
diff --git a/media/gpu/vaapi/av1_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/av1_vaapi_video_encoder_delegate.cc
index bda3618..5380243 100644
--- a/media/gpu/vaapi/av1_vaapi_video_encoder_delegate.cc
+++ b/media/gpu/vaapi/av1_vaapi_video_encoder_delegate.cc
@@ -465,7 +465,8 @@
 // 2. If we're transmitting keyframe, a sequence header OBU (section 5.5).
 // 3. Frame OBU (section 5.10), which consists of a FrameHeader (5.9) and
 //    compressed data.
-bool AV1VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) {
+VaapiVideoEncoderDelegate::PrepareEncodeJobResult
+AV1VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) {
   PicParamOffsets offsets;
 
   if (frame_num_ == current_params_.intra_period) {
@@ -474,13 +475,13 @@
 
   if (!SubmitTemporalDelimiter(offsets)) {
     LOG(ERROR) << "Failed to submit temporal delimiter";
-    return false;
+    return PrepareEncodeJobResult::kFail;
   }
 
   if (encode_job.IsKeyframeRequested()) {
     frame_num_ = 0;
     if (!SubmitSequenceHeader(offsets)) {
-      return false;
+      return PrepareEncodeJobResult::kFail;
     }
   }
 
@@ -488,17 +489,17 @@
 
   if (!SubmitFrame(encode_job, offsets)) {
     LOG(ERROR) << "Failed to submit frame";
-    return false;
+    return PrepareEncodeJobResult::kFail;
   }
 
   if (!SubmitTileGroup()) {
     LOG(ERROR) << "Failed to submit file group";
-    return false;
+    return PrepareEncodeJobResult::kFail;
   }
 
   frame_num_++;
 
-  return true;
+  return PrepareEncodeJobResult::kSuccess;
 }
 
 void AV1VaapiVideoEncoderDelegate::BitrateControlUpdate(
diff --git a/media/gpu/vaapi/av1_vaapi_video_encoder_delegate.h b/media/gpu/vaapi/av1_vaapi_video_encoder_delegate.h
index 3e3966f..f23a682 100644
--- a/media/gpu/vaapi/av1_vaapi_video_encoder_delegate.h
+++ b/media/gpu/vaapi/av1_vaapi_video_encoder_delegate.h
@@ -71,7 +71,7 @@
  private:
   BitstreamBufferMetadata GetMetadata(const EncodeJob& encode_job,
                                       size_t payload_size) override;
-  bool PrepareEncodeJob(EncodeJob& encode_job) override;
+  PrepareEncodeJobResult PrepareEncodeJob(EncodeJob& encode_job) override;
   void BitrateControlUpdate(const BitstreamBufferMetadata& metadata) override;
 
   bool SubmitTemporalDelimiter(PicParamOffsets& offsets);
diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc
index 10d73c7..c355691 100644
--- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc
+++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc
@@ -353,7 +353,8 @@
   return metadata;
 }
 
-bool H264VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) {
+VaapiVideoEncoderDelegate::PrepareEncodeJobResult
+H264VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   scoped_refptr<H264Picture> pic = GetH264Picture(encode_job);
@@ -399,7 +400,7 @@
                              current_pps_, pic, ref_pic_list0_,
                              ref_frame_index)) {
     DVLOGF(1) << "Failed submitting frame parameters";
-    return false;
+    return PrepareEncodeJobResult::kFail;
   }
 
   if (pic->type == H264SliceHeader::kISlice && submit_packed_headers_) {
@@ -407,7 +408,7 @@
     // operation on the generated stream.
     if (!SubmitPackedHeaders(*packed_sps_, *packed_pps_)) {
       DVLOGF(1) << "Failed submitting keyframe headers";
-      return false;
+      return PrepareEncodeJobResult::kFail;
     }
   }
 
@@ -421,7 +422,7 @@
 
   num_encoded_frames_++;
   num_encoded_frames_ %= kIDRPeriod;
-  return true;
+  return PrepareEncodeJobResult::kSuccess;
 }
 
 bool H264VaapiVideoEncoderDelegate::UpdateRates(
diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.h b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.h
index 55ad4be..d2d5e2e1 100644
--- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.h
+++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.h
@@ -75,7 +75,7 @@
 
   friend class H264VaapiVideoEncoderDelegateTest;
 
-  bool PrepareEncodeJob(EncodeJob& encode_job) override;
+  PrepareEncodeJobResult PrepareEncodeJob(EncodeJob& encode_job) override;
   BitstreamBufferMetadata GetMetadata(const EncodeJob& encode_job,
                                       size_t payload_size) override;
 
diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc
index 78fa7e04..18db197 100644
--- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc
+++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc
@@ -273,7 +273,8 @@
         .WillOnce(Return(true));
   }
 
-  EXPECT_TRUE(encoder_->PrepareEncodeJob(*encode_job.get()));
+  EXPECT_EQ(encoder_->PrepareEncodeJob(*encode_job.get()),
+            VaapiVideoEncoderDelegate::PrepareEncodeJobResult::kSuccess);
 
   const H264Picture& pic =
       *reinterpret_cast<H264Picture*>(encode_job->picture().get());
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
index 2cdc8249..5003c0b7 100644
--- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -467,27 +467,32 @@
     const EncodeResult& encode_result,
     const BitstreamBuffer& buffer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_sequence_checker_);
-  const base::UnsafeSharedMemoryRegion& shm_region = buffer.region();
-  DCHECK(shm_region.IsValid());
-  base::WritableSharedMemoryMapping shm_mapping = shm_region.Map();
-  uint8_t* target_data = shm_mapping.GetMemoryAs<uint8_t>();
-  size_t data_size = 0;
-  // vaSyncSurface() is not necessary because GetEncodedChunkSize() has been
-  // called in VaapiVideoEncoderDelegate::Encode().
-  if (!vaapi_wrapper_->DownloadFromVABuffer(
-          encode_result.coded_buffer_id(), /*sync_surface_id=*/absl::nullopt,
-          target_data, shm_mapping.size(), &data_size)) {
-    NotifyError({EncoderStatus::Codes::kEncoderHardwareDriverError,
-                 "Failed downloading coded buffer"});
-    return;
-  }
 
   auto metadata = encode_result.metadata();
-  DCHECK_NE(metadata.payload_size_bytes, 0u);
 
-  DVLOGF(4) << "Returning bitstream buffer "
-            << (metadata.key_frame ? "(keyframe)" : "")
-            << " id: " << buffer.id() << " size: " << data_size;
+  if (!encode_result.IsFrameDropped()) {
+    const base::UnsafeSharedMemoryRegion& shm_region = buffer.region();
+    DCHECK(shm_region.IsValid());
+    base::WritableSharedMemoryMapping shm_mapping = shm_region.Map();
+    uint8_t* target_data = shm_mapping.GetMemoryAs<uint8_t>();
+    size_t data_size = 0;
+    // vaSyncSurface() is not necessary because GetEncodedChunkSize() has been
+    // called in VaapiVideoEncoderDelegate::Encode().
+    if (!vaapi_wrapper_->DownloadFromVABuffer(
+            encode_result.coded_buffer_id(), /*sync_surface_id=*/absl::nullopt,
+            target_data, shm_mapping.size(), &data_size)) {
+      NotifyError({EncoderStatus::Codes::kEncoderHardwareDriverError,
+                   "Failed downloading coded buffer"});
+      return;
+    }
+    CHECK_EQ(metadata.payload_size_bytes, data_size);
+    DVLOGF(4) << "Returning bitstream buffer "
+              << (metadata.key_frame ? "(keyframe)" : "")
+              << " id: " << buffer.id() << " size: " << data_size;
+  } else {
+    CHECK_EQ(metadata.payload_size_bytes, 0u);
+    DVLOGF(4) << "Drop frame bitstream_buffer_id=" << buffer.id();
+  }
 
   TRACE_EVENT2("media,gpu", "VAVEA::BitstreamBufferReady", "timestamp",
                metadata.timestamp.InMicroseconds(), "bitstream_buffer_id",
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc
index 15dcad4..86e21fe 100644
--- a/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc
+++ b/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc
@@ -213,7 +213,7 @@
   MOCK_CONST_METHOD0(GetBitstreamBufferSize, size_t());
   MOCK_CONST_METHOD0(GetMaxNumOfRefFrames, size_t());
   MOCK_METHOD2(GetMetadata, BitstreamBufferMetadata(const EncodeJob&, size_t));
-  MOCK_METHOD1(PrepareEncodeJob, bool(EncodeJob&));
+  MOCK_METHOD1(PrepareEncodeJob, PrepareEncodeJobResult(EncodeJob&));
   MOCK_METHOD1(BitrateControlUpdate, void(const BitstreamBufferMetadata&));
   MOCK_METHOD0(GetSVCLayerResolutions, std::vector<gfx::Size>());
   bool UpdateRates(const VideoBitrateAllocation&, uint32_t) override {
@@ -427,7 +427,7 @@
             reinterpret_cast<VP9Picture*>(picture)->metadata_for_encoding =
                 Vp9Metadata();
           }
-          return true;
+          return VaapiVideoEncoderDelegate::PrepareEncodeJobResult::kSuccess;
         }));
     EXPECT_CALL(*mock_vaapi_wrapper_,
                 ExecuteAndDestroyPendingBuffers(kInputSurfaceId))
@@ -608,7 +608,7 @@
             CodecPicture* picture = job.picture().get();
             reinterpret_cast<VP9Picture*>(picture)->metadata_for_encoding =
                 Vp9Metadata();
-            return true;
+            return VaapiVideoEncoderDelegate::PrepareEncodeJobResult::kSuccess;
           }));
       EXPECT_CALL(*mock_vaapi_wrapper_, ExecuteAndDestroyPendingBuffers(_))
           .WillOnce(Return(true));
diff --git a/media/gpu/vaapi/vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/vaapi_video_encoder_delegate.cc
index 1c694899..783c03e1 100644
--- a/media/gpu/vaapi/vaapi_video_encoder_delegate.cc
+++ b/media/gpu/vaapi/vaapi_video_encoder_delegate.cc
@@ -55,6 +55,7 @@
 }
 
 VABufferID VaapiVideoEncoderDelegate::EncodeJob::coded_buffer_id() const {
+  CHECK(coded_buffer_);
   return coded_buffer_->id();
 }
 
@@ -80,6 +81,7 @@
 VaapiVideoEncoderDelegate::EncodeResult::operator=(EncodeResult&&) = default;
 
 VABufferID VaapiVideoEncoderDelegate::EncodeResult::coded_buffer_id() const {
+  CHECK(coded_buffer_);
   return coded_buffer_->id();
 }
 
@@ -119,11 +121,20 @@
 
 bool VaapiVideoEncoderDelegate::Encode(EncodeJob& encode_job) {
   TRACE_EVENT0("media,gpu", "VAVEDelegate::Encode");
-  if (!PrepareEncodeJob(encode_job)) {
+  PrepareEncodeJobResult result = PrepareEncodeJob(encode_job);
+  if (result == PrepareEncodeJobResult::kFail) {
     VLOGF(1) << "Failed preparing an encode job";
     return false;
   }
 
+  if (result == PrepareEncodeJobResult::kDrop) {
+    // An encoder must not drop a keyframe.
+    CHECK(!encode_job.IsKeyframeRequested());
+    DVLOGF(3) << "Drop frame";
+    encode_job.DropFrame();
+    return true;
+  }
+
   if (!vaapi_wrapper_->ExecuteAndDestroyPendingBuffers(
           encode_job.input_surface_id())) {
     VLOGF(1) << "Failed to execute encode";
@@ -137,6 +148,11 @@
 VaapiVideoEncoderDelegate::GetEncodeResult(
     std::unique_ptr<EncodeJob> encode_job) {
   TRACE_EVENT0("media,gpu", "VAVEDelegate::GetEncodeResult");
+  if (encode_job->IsFrameDropped()) {
+    return absl::make_optional<EncodeResult>(nullptr,
+                                             GetMetadata(*encode_job, 0u));
+  }
+
   const VASurfaceID va_surface_id = encode_job->input_surface_id();
   const uint64_t encoded_chunk_size = vaapi_wrapper_->GetEncodedChunkSize(
       encode_job->coded_buffer_id(), va_surface_id);
diff --git a/media/gpu/vaapi/vaapi_video_encoder_delegate.h b/media/gpu/vaapi/vaapi_video_encoder_delegate.h
index ec05f31..af7e5e7ef 100644
--- a/media/gpu/vaapi/vaapi_video_encoder_delegate.h
+++ b/media/gpu/vaapi/vaapi_video_encoder_delegate.h
@@ -39,10 +39,6 @@
 // clients, and associated with the EncodeJob object.
 class VaapiVideoEncoderDelegate {
  public:
-  VaapiVideoEncoderDelegate(scoped_refptr<VaapiWrapper> vaapi_wrapper,
-                            base::RepeatingClosure error_cb);
-  virtual ~VaapiVideoEncoderDelegate();
-
   struct Config {
     // Maximum number of reference frames.
     // For H.264 encoding, the value represents the maximum number of reference
@@ -66,6 +62,7 @@
 
     VABufferID coded_buffer_id() const;
     const BitstreamBufferMetadata& metadata() const;
+    bool IsFrameDropped() const { return !coded_buffer_; }
 
    private:
     std::unique_ptr<ScopedVABuffer> coded_buffer_;
@@ -111,13 +108,15 @@
     // Returns true if this job has been requested to produce a keyframe.
     bool IsKeyframeRequested() const { return keyframe_; }
 
+    void DropFrame() { coded_buffer_.reset(); }
+    bool IsFrameDropped() const { return !coded_buffer_; }
+
     base::TimeDelta timestamp() const;
 
     // VA-API specific methods.
     VABufferID coded_buffer_id() const;
     VASurfaceID input_surface_id() const;
     const scoped_refptr<CodecPicture>& picture() const;
-
    private:
     // True if this job is to produce a keyframe.
     bool keyframe_;
@@ -132,6 +131,10 @@
     std::unique_ptr<ScopedVABuffer> coded_buffer_;
   };
 
+  VaapiVideoEncoderDelegate(scoped_refptr<VaapiWrapper> vaapi_wrapper,
+                            base::RepeatingClosure error_cb);
+  virtual ~VaapiVideoEncoderDelegate();
+
   // Initializes the encoder with requested parameter set |config| and
   // |ave_config|. Returns false if the requested set of parameters is not
   // supported, true on success.
@@ -173,6 +176,17 @@
   virtual std::vector<gfx::Size> GetSVCLayerResolutions() = 0;
 
  protected:
+  // Friend in order o access PrepareEncodeJobResult declaration.
+  friend class H264VaapiVideoEncoderDelegateTest;
+  friend class VP9VaapiVideoEncoderDelegateTest;
+  friend class VaapiVideoEncodeAcceleratorTest;
+
+  enum class PrepareEncodeJobResult {
+    kSuccess,  // Submit the encode job successfully.
+    kFail,     // Error happens in submitting the encode job.
+    kDrop,     // Encode job is dropped. An returned encoded chunk is empty.
+  };
+
   virtual BitstreamBufferMetadata GetMetadata(const EncodeJob& encode_job,
                                               size_t payload_size);
 
@@ -183,10 +197,9 @@
   SEQUENCE_CHECKER(sequence_checker_);
 
  private:
-  // Prepares a new |encode_job| to be executed in Accelerator and returns true
-  // on success. The caller may then call ExecuteSetupCallbacks() on the job to
-  // run them.
-  virtual bool PrepareEncodeJob(EncodeJob& encode_job) = 0;
+  // Prepares a new |encode_job| to be executed in Accelerator. Returns
+  // kSuccess on success, and kFail on failure.
+  virtual PrepareEncodeJobResult PrepareEncodeJob(EncodeJob& encode_job) = 0;
 
   // Notifies the encoded chunk size in bytes with layers info through
   // BitstreamBufferMetadata to update a bitrate controller in
diff --git a/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc
index 5e4c4c6..1646cc8 100644
--- a/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc
+++ b/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc
@@ -113,6 +113,7 @@
     rc_cfg.ts_rate_decimator[tid] = 1u << (num_temporal_layers - tid - 1);
   }
 
+  rc_cfg.frame_drop_thresh = encode_params.drop_frame_thresh;
   return rc_cfg;
 }
 
@@ -254,7 +255,6 @@
 
 VP8VaapiVideoEncoderDelegate::EncodeParams::EncodeParams()
     : kf_period_frames(kKFPeriod),
-      framerate(0),
       min_qp(kMinQP),
       max_qp(kMaxQP) {}
 
@@ -330,6 +330,8 @@
     current_params_.max_qp = kScreenMaxQP;
   }
 
+  current_params_.drop_frame_thresh = config.drop_frame_thresh_percentage;
+
   // |rate_ctrl_| might be injected for tests.
   if (!rate_ctrl_) {
     rate_ctrl_ = libvpx::VP8RateControlRTC::Create(CreateRateControlConfig(
@@ -361,7 +363,8 @@
   return {visible_size_};
 }
 
-bool VP8VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) {
+VaapiVideoEncoderDelegate::PrepareEncodeJobResult
+VP8VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (encode_job.IsKeyframeRequested())
@@ -378,28 +381,31 @@
   // We only use |last_frame| for a reference frame. This follows the behavior
   // of libvpx encoder in chromium webrtc use case.
   std::array<bool, kNumVp8ReferenceBuffers> ref_frames_used;
-  SetFrameHeader(frame_num_, *picture, ref_frames_used);
+  if (auto result = SetFrameHeader(frame_num_, *picture, ref_frames_used);
+      result != PrepareEncodeJobResult::kSuccess) {
+    return result;
+  }
+
   DCHECK(!picture->frame_hdr->IsKeyframe() ||
          !base::Contains(ref_frames_used, true));
 
   if (!SubmitFrameParameters(encode_job, current_params_, picture,
                              reference_frames_, ref_frames_used)) {
     LOG(ERROR) << "Failed submitting frame parameters";
-    return false;
+    return PrepareEncodeJobResult::kFail;
   }
 
   UpdateReferenceFrames(picture);
 
   frame_num_ = (frame_num_ + 1) % current_params_.kf_period_frames;
 
-  return true;
+  return PrepareEncodeJobResult::kSuccess;
 }
 
 BitstreamBufferMetadata VP8VaapiVideoEncoderDelegate::GetMetadata(
     const EncodeJob& encode_job,
     size_t payload_size) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
   auto metadata =
       VaapiVideoEncoderDelegate::GetMetadata(encode_job, payload_size);
   auto picture = GetVP8Picture(encode_job);
@@ -422,7 +428,7 @@
   DVLOGF(4) << "temporal_idx="
             << (metadata.vp8 ? metadata.vp8->temporal_idx : 0)
             << ", encoded chunk size=" << metadata.payload_size_bytes;
-
+  CHECK_NE(metadata.payload_size_bytes, 0u);
   rate_ctrl_->PostEncodeUpdate(metadata.payload_size_bytes);
 }
 
@@ -474,7 +480,8 @@
   return true;
 }
 
-void VP8VaapiVideoEncoderDelegate::SetFrameHeader(
+VaapiVideoEncoderDelegate::PrepareEncodeJobResult
+VP8VaapiVideoEncoderDelegate::SetFrameHeader(
     size_t frame_num,
     VP8Picture& picture,
     std::array<bool, kNumVp8ReferenceBuffers>& ref_frames_used) {
@@ -515,7 +522,11 @@
           ? picture.metadata_for_encoding->temporal_idx
           : 0;
 
-  rate_ctrl_->ComputeQP(frame_params);
+  if (rate_ctrl_->ComputeQP(frame_params) == libvpx::FrameDropDecision::kDrop) {
+    CHECK(!keyframe);
+    DVLOGF(3) << "Drop frame";
+    return PrepareEncodeJobResult::kDrop;
+  }
   picture.frame_hdr->quantization_hdr.y_ac_qi = rate_ctrl_->GetQP();
   picture.frame_hdr->loopfilter_hdr.level =
       base::checked_cast<uint8_t>(rate_ctrl_->GetLoopfilterLevel());
@@ -528,6 +539,7 @@
                     ? " temporal id=" +
                           base::NumberToString(frame_params.temporal_layer_id)
                     : "");
+  return PrepareEncodeJobResult::kSuccess;
 }
 
 void VP8VaapiVideoEncoderDelegate::UpdateReferenceFrames(
diff --git a/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.h b/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.h
index c45db69..11817712 100644
--- a/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.h
+++ b/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.h
@@ -32,13 +32,16 @@
     VideoBitrateAllocation bitrate_allocation;
 
     // Framerate in FPS.
-    uint32_t framerate;
+    uint32_t framerate = 0;
 
     // Quantization parameter. They are vp8 ac/dc indices and their ranges are
     // 0-127.
     uint8_t min_qp;
     uint8_t max_qp;
 
+    // The rate controller drop frame threshold. 0-100 as this is percentage.
+    uint8_t drop_frame_thresh = 0;
+
     // Error resilient mode.
     bool error_resilient_mode = false;
   };
@@ -64,13 +67,13 @@
  private:
   void InitializeFrameHeader();
 
-  void SetFrameHeader(
+  PrepareEncodeJobResult SetFrameHeader(
       size_t frame_num,
       VP8Picture& picture,
       std::array<bool, kNumVp8ReferenceBuffers>& ref_frames_used);
   void UpdateReferenceFrames(scoped_refptr<VP8Picture> picture);
 
-  bool PrepareEncodeJob(EncodeJob& encode_job) override;
+  PrepareEncodeJobResult PrepareEncodeJob(EncodeJob& encode_job) override;
   BitstreamBufferMetadata GetMetadata(const EncodeJob& encode_job,
                                       size_t payload_size) override;
   void BitrateControlUpdate(const BitstreamBufferMetadata& metadata) override;
diff --git a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc
index ea94a20d..0df6dcd0e 100644
--- a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc
+++ b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc
@@ -393,7 +393,8 @@
   return kVp9NumRefFrames;
 }
 
-bool VP9VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) {
+VaapiVideoEncoderDelegate::PrepareEncodeJobResult
+VP9VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (svc_layers_) {
     // If keyframe is requested, then reset |svc_layers_|.
@@ -429,11 +430,11 @@
   if (!SubmitFrameParameters(encode_job, current_params_, picture,
                              reference_frames_, ref_frames_used)) {
     LOG(ERROR) << "Failed submitting frame parameters";
-    return false;
+    return PrepareEncodeJobResult::kFail;
   }
 
   UpdateReferenceFrames(picture);
-  return true;
+  return PrepareEncodeJobResult::kSuccess;
 }
 
 BitstreamBufferMetadata VP9VaapiVideoEncoderDelegate::GetMetadata(
diff --git a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.h b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.h
index 9c43615..03f7ecad 100644
--- a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.h
+++ b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.h
@@ -102,7 +102,7 @@
   bool RecreateSVCLayersIfNeeded(VideoBitrateAllocation& bitrate_allocation);
   bool ApplyPendingUpdateRates();
 
-  bool PrepareEncodeJob(EncodeJob& encode_job) override;
+  PrepareEncodeJobResult PrepareEncodeJob(EncodeJob& encode_job) override;
   BitstreamBufferMetadata GetMetadata(const EncodeJob& encode_job,
                                       size_t payload_size) override;
   void BitrateControlUpdate(const BitstreamBufferMetadata& metadata) override;
diff --git a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc
index 4045510f..0e4f019 100644
--- a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc
+++ b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc
@@ -429,7 +429,8 @@
                   sizeof(VAEncPictureParameterBufferVP9))))
       .WillOnce(Return(true));
 
-  EXPECT_TRUE(encoder_->PrepareEncodeJob(*encode_job.get()));
+  EXPECT_EQ(encoder_->PrepareEncodeJob(*encode_job.get()),
+            VaapiVideoEncoderDelegate::PrepareEncodeJobResult::kSuccess);
 
   // TODO(hiroh): Test for encoder_->reference_frames_.
 
diff --git a/net/third_party/quiche/src b/net/third_party/quiche/src
index 1d9a9a0..f51e747 160000
--- a/net/third_party/quiche/src
+++ b/net/third_party/quiche/src
@@ -1 +1 @@
-Subproject commit 1d9a9a0c6189282949fc56613fae3804f6b642c9
+Subproject commit f51e747d3714b8b7bebedb12bef5edfb912ff288
diff --git a/services/device/public/cpp/geolocation/system_geolocation_source_mac.mm b/services/device/public/cpp/geolocation/system_geolocation_source_mac.mm
index 2f695b44..68f2afe 100644
--- a/services/device/public/cpp/geolocation/system_geolocation_source_mac.mm
+++ b/services/device/public/cpp/geolocation/system_geolocation_source_mac.mm
@@ -114,8 +114,10 @@
 }
 
 void SystemGeolocationSourceMac::OpenSystemPermissionSetting() {
+#if BUILDFLAG(IS_MAC)
   base::mac::OpenSystemSettingsPane(
       base::mac::SystemSettingsPane::kPrivacySecurity_LocationServices);
+#endif
 }
 
 void SystemGeolocationSourceMac::RequestPermission() {
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index 06599089..c9e4ac4 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -601,8 +601,6 @@
     "test/fake_test_cert_verifier_params_factory.h",
     "test/mock_devtools_observer.cc",
     "test/mock_devtools_observer.h",
-    "test/oblivious_http_request_test_helper.cc",
-    "test/oblivious_http_request_test_helper.h",
     "test/test_cookie_manager.cc",
     "test/test_cookie_manager.h",
     "test/test_data_pipe_getter.cc",
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index cbcf626..f0a7d348 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -158,6 +158,7 @@
 // Enables visibility aware network service resource scheduler. When enabled,
 // request may be prioritized or de-prioritized based on the visibility of
 // requestors.
+// TODO(https://crbug.com/1457817): Remove this feature.
 COMPONENT_EXPORT(NETWORK_CPP)
 BASE_DECLARE_FEATURE(kVisibilityAwareResourceScheduler);
 
diff --git a/services/network/resource_scheduler/resource_scheduler.cc b/services/network/resource_scheduler/resource_scheduler.cc
index ca542121..cad7e22d 100644
--- a/services/network/resource_scheduler/resource_scheduler.cc
+++ b/services/network/resource_scheduler/resource_scheduler.cc
@@ -284,8 +284,6 @@
       priority_.priority = net::RequestPriority::IDLE;
       request_->SetPriority(priority_.priority);
     }
-    base::UmaHistogramBoolean(
-        "Network.VisibilityAwareResourceScheduler.Deprioritized", deprioritize);
     TRACE_EVENT_BEGIN("network.scheduler", "ScheduledResourceRequest",
                       trace_track_, "url", request->url(), "priority",
                       priority_.priority);
diff --git a/services/network/test/oblivious_http_request_test_helper.cc b/services/network/test/oblivious_http_request_test_helper.cc
deleted file mode 100644
index e29faa6..0000000
--- a/services/network/test/oblivious_http_request_test_helper.cc
+++ /dev/null
@@ -1,82 +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.
-
-#include "services/network/test/oblivious_http_request_test_helper.h"
-
-#include <string_view>
-
-#include "third_party/boringssl/src/include/openssl/hpke.h"
-
-namespace network {
-namespace test {
-
-namespace {
-
-// These keys were randomly generated as follows:
-// EVP_HPKE_KEY keys;
-// EVP_HPKE_KEY_generate(&keys, EVP_hpke_x25519_hkdf_sha256());
-// and then EVP_HPKE_KEY_public_key and EVP_HPKE_KEY_private_key were used to
-// extract the keys.
-const uint8_t kTestPrivateKey[] = {
-    0xff, 0x1f, 0x47, 0xb1, 0x68, 0xb6, 0xb9, 0xea, 0x65, 0xf7, 0x97,
-    0x4f, 0xf2, 0x2e, 0xf2, 0x36, 0x94, 0xe2, 0xf6, 0xb6, 0x8d, 0x66,
-    0xf3, 0xa7, 0x64, 0x14, 0x28, 0xd4, 0x45, 0x35, 0x01, 0x8f,
-};
-
-const uint8_t kTestPublicKey[] = {
-    0xa1, 0x5f, 0x40, 0x65, 0x86, 0xfa, 0xc4, 0x7b, 0x99, 0x59, 0x70,
-    0xf1, 0x85, 0xd9, 0xd8, 0x91, 0xc7, 0x4d, 0xcf, 0x1e, 0xb9, 0x1a,
-    0x7d, 0x50, 0xa5, 0x8b, 0x01, 0x68, 0x3e, 0x60, 0x05, 0x2d,
-};
-
-}  // namespace
-
-ObliviousHttpRequestTestHelper::ObliviousHttpRequestTestHelper()
-    : key_config_(quiche::ObliviousHttpHeaderKeyConfig::Create(
-                      1,
-                      EVP_HPKE_DHKEM_X25519_HKDF_SHA256,
-                      EVP_HPKE_HKDF_SHA256,
-                      EVP_HPKE_AES_256_GCM)
-                      .value()) {
-  ohttp_gateway_ = std::make_unique<quiche::ObliviousHttpGateway>(
-      quiche::ObliviousHttpGateway::Create(
-          std::string_view(reinterpret_cast<const char*>(&kTestPrivateKey[0]),
-                           sizeof(kTestPrivateKey)),
-          key_config_)
-          .value());
-}
-
-ObliviousHttpRequestTestHelper::~ObliviousHttpRequestTestHelper() = default;
-
-std::string ObliviousHttpRequestTestHelper::GetPublicKeyConfigs() {
-  auto configs =
-      quiche::ObliviousHttpKeyConfigs::Create(
-          key_config_,
-          std::string_view(reinterpret_cast<const char*>(&kTestPublicKey[0]),
-                           sizeof(kTestPrivateKey)))
-          .value();
-  return configs.GenerateConcatenatedKeys().value();
-}
-
-std::pair<std::string, quiche::ObliviousHttpRequest::Context>
-ObliviousHttpRequestTestHelper::DecryptRequest(
-    std::string_view ciphertext_request) {
-  auto request =
-      ohttp_gateway_->DecryptObliviousHttpRequest(ciphertext_request).value();
-  std::string request_plaintext(request.GetPlaintextData());
-  return std::make_pair(std::move(request_plaintext),
-                        std::move(request).ReleaseContext());
-}
-
-std::string ObliviousHttpRequestTestHelper::EncryptResponse(
-    std::string plaintext_response,
-    quiche::ObliviousHttpRequest::Context& context) {
-  auto response =
-      ohttp_gateway_->CreateObliviousHttpResponse(plaintext_response, context)
-          .value();
-  return response.EncapsulateAndSerialize();
-}
-
-}  // namespace test
-}  // namespace network
diff --git a/services/network/test/oblivious_http_request_test_helper.h b/services/network/test/oblivious_http_request_test_helper.h
deleted file mode 100644
index 0c6f06f9..0000000
--- a/services/network/test/oblivious_http_request_test_helper.h
+++ /dev/null
@@ -1,40 +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.
-
-#ifndef SERVICES_NETWORK_TEST_OBLIVIOUS_HTTP_REQUEST_TEST_HELPER_H_
-#define SERVICES_NETWORK_TEST_OBLIVIOUS_HTTP_REQUEST_TEST_HELPER_H_
-
-#include <memory>
-#include <string>
-
-#include "net/third_party/quiche/src/quiche/oblivious_http/buffers/oblivious_http_request.h"
-#include "net/third_party/quiche/src/quiche/oblivious_http/common/oblivious_http_header_key_config.h"
-#include "net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.h"
-
-namespace network {
-namespace test {
-
-// ObliviousHttpRequestTestHelper encapsulates server-side oblivious HTTP key
-// management and crypto logic.
-//
-class ObliviousHttpRequestTestHelper {
- public:
-  ObliviousHttpRequestTestHelper();
-  ~ObliviousHttpRequestTestHelper();
-
-  std::string GetPublicKeyConfigs();
-  std::pair<std::string, quiche::ObliviousHttpRequest::Context> DecryptRequest(
-      std::string_view ciphertext_request);
-  std::string EncryptResponse(std::string plaintext_response,
-                              quiche::ObliviousHttpRequest::Context& context);
-
- private:
-  std::unique_ptr<quiche::ObliviousHttpGateway> ohttp_gateway_;
-  quiche::ObliviousHttpHeaderKeyConfig key_config_;
-};
-
-}  // namespace test
-}  // namespace network
-
-#endif  // SERVICES_NETWORK_TEST_OBLIVIOUS_HTTP_REQUEST_SERVER_H_
diff --git a/services/webnn/dml/command_recorder.cc b/services/webnn/dml/command_recorder.cc
index f3255a1..22330de 100644
--- a/services/webnn/dml/command_recorder.cc
+++ b/services/webnn/dml/command_recorder.cc
@@ -108,13 +108,29 @@
     // It's safe to reset the command list while it is still being executed.
     RETURN_IF_FAILED(command_list_->Reset(command_allocator_.Get(), nullptr));
   }
+  command_resources_.clear();
   is_open_ = true;
   return S_OK;
 }
 
 HRESULT CommandRecorder::CloseAndExecute() {
+  RETURN_IF_FAILED(Close());
+  RETURN_IF_FAILED(Execute());
+  return S_OK;
+}
+
+HRESULT CommandRecorder::Close() {
   CHECK(is_open_);
   RETURN_IF_FAILED(command_list_->Close());
+  is_open_ = false;
+  return S_OK;
+}
+
+// `command_resources_` will be cleared in the `Open()` method when the command
+// list completes the previous execution and opens again. And the
+// `CommandRecorder` destructor will also clear it.
+HRESULT CommandRecorder::Execute() {
+  CHECK(!is_open_);
   RETURN_IF_FAILED(command_queue_->ExecuteCommandList(command_list_.Get()));
   last_submitted_fence_value_ = command_queue_->GetLastFenceValue();
 
@@ -126,11 +142,8 @@
   // command queue. The command queue would keep these resources alive until the
   // GPU work has been done.
   for (auto& resource : command_resources_) {
-    command_queue_->ReferenceUntilCompleted(std::move(resource));
+    command_queue_->ReferenceUntilCompleted(resource);
   }
-  command_resources_.clear();
-
-  is_open_ = false;
   return S_OK;
 }
 
diff --git a/services/webnn/dml/command_recorder.h b/services/webnn/dml/command_recorder.h
index 744abaf682..7c66521 100644
--- a/services/webnn/dml/command_recorder.h
+++ b/services/webnn/dml/command_recorder.h
@@ -55,6 +55,13 @@
   // delete this command recorder that ensures to release the references of all
   // recorded commands and their resources.
   HRESULT Open();
+
+  // Close the command list.
+  HRESULT Close();
+  // Submit the command list for execution and reference all resources required
+  // by this execution.
+  HRESULT Execute();
+  // This method will call the above `Close()` and `Execute()` methods.
   HRESULT CloseAndExecute();
 
   void ResourceBarrier(base::span<const D3D12_RESOURCE_BARRIER> barriers);
diff --git a/services/webnn/dml/command_recorder_test.cc b/services/webnn/dml/command_recorder_test.cc
index 41b665c2..9933707d 100644
--- a/services/webnn/dml/command_recorder_test.cc
+++ b/services/webnn/dml/command_recorder_test.cc
@@ -72,18 +72,8 @@
   ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateReadbackBuffer(
       buffer_size, L"Readback_Buffer", readback_buffer));
   // Copy the result from output buffer to readback buffer.
-  D3D12_RESOURCE_BARRIER barriers[1];
-
-  barriers[0] = CreateTransitionBarrier(src_resource.Get(),
-                                        D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
-                                        D3D12_RESOURCE_STATE_COPY_SOURCE);
-  command_recorder->ResourceBarrier(barriers);
-  command_recorder->CopyBufferRegion(readback_buffer, 0, src_resource, 0,
-                                     buffer_size);
-  barriers[0] = CreateTransitionBarrier(src_resource.Get(),
-                                        D3D12_RESOURCE_STATE_COPY_SOURCE,
-                                        D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
-  command_recorder->ResourceBarrier(barriers);
+  ReadbackBufferWithBarrier(command_recorder, readback_buffer,
+                            std::move(src_resource), buffer_size);
 
   // Close, execute and wait for completion.
   ASSERT_HRESULT_SUCCEEDED(command_recorder->CloseAndExecute());
@@ -328,6 +318,152 @@
   EXPECT_EQ(result, std::vector<float>({0.0, 0.0, 1.0, 2.0}));
 }
 
+TEST_F(WebNNCommandRecorderTest,
+       RecordOnceAndExecuteMultipleTimesForReluOperator) {
+  // Test initializing and executing a DirectML Relu operator.
+  //
+  // Create a Relu operator.
+  TensorDesc input_tensor_desc(DML_TENSOR_DATA_TYPE_FLOAT32, {1, 1, 2, 2});
+  DML_ACTIVATION_RELU_OPERATOR_DESC relu_operator_desc{
+      .InputTensor = &input_tensor_desc.GetDMLTensorDesc(),
+      .OutputTensor = &input_tensor_desc.GetDMLTensorDesc()};
+  DML_OPERATOR_DESC operator_desc{.Type = DML_OPERATOR_ACTIVATION_RELU,
+                                  .Desc = &relu_operator_desc};
+  ComPtr<IDMLOperator> dml_operator;
+  ASSERT_HRESULT_SUCCEEDED(adapter_->dml_device()->CreateOperator(
+      &operator_desc, IID_PPV_ARGS(&dml_operator)));
+
+  // Compile the operator.
+  ComPtr<IDMLCompiledOperator> compiled_operator;
+  ASSERT_HRESULT_SUCCEEDED(adapter_->dml_device()->CompileOperator(
+      dml_operator.Get(), DML_EXECUTION_FLAG_NONE,
+      IID_PPV_ARGS(&compiled_operator)));
+
+  // Relu operator should not require any persistent or temporary resources.
+  ASSERT_EQ(compiled_operator->GetBindingProperties().PersistentResourceSize,
+            0u);
+  ASSERT_EQ(compiled_operator->GetBindingProperties().TemporaryResourceSize,
+            0u);
+
+  // Initialize the operator.
+  auto command_recorder = CommandRecorder::Create(adapter_->command_queue(),
+                                                  adapter_->dml_device());
+  ASSERT_NE(command_recorder.get(), nullptr);
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->Open());
+  // Relu operator initializer deson't need to bind any input and persistent
+  // resources.
+  EXPECT_HRESULT_SUCCEEDED(command_recorder->InitializeOperator(
+      compiled_operator.Get(), absl::nullopt, absl::nullopt));
+  EXPECT_HRESULT_SUCCEEDED(command_recorder->CloseAndExecute());
+  EXPECT_HRESULT_SUCCEEDED(
+      command_recorder->GetCommandQueue()->WaitSyncForTesting());
+  adapter_->command_queue()->ReleaseCompletedResources();
+  EXPECT_HRESULT_SUCCEEDED(adapter_->dml_device()->GetDeviceRemovedReason());
+  EXPECT_HRESULT_SUCCEEDED(adapter_->d3d12_device()->GetDeviceRemovedReason());
+
+  // Create the descriptor heap for execution.
+  ComPtr<ID3D12DescriptorHeap> descriptor_heap;
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateDescriptorHeap(
+      compiled_operator->GetBindingProperties().RequiredDescriptorCount,
+      L"Descriptor_Heap_For_Execution", descriptor_heap));
+
+  // Create input and output resources that will be bound for operator for
+  // execution.
+  const uint64_t buffer_size = input_tensor_desc.GetTotalTensorSizeInBytes();
+  ComPtr<ID3D12Resource> input_buffer;
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateDefaultBuffer(
+      buffer_size, L"Input_Default_Buffer", input_buffer));
+  ComPtr<ID3D12Resource> output_buffer;
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateDefaultBuffer(
+      buffer_size, L"Output_Default_Buffer", output_buffer));
+
+  // Re-open the command recorder for recording operator execution commands.
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->Open());
+
+  // Create the input and output resources binding for operator execution.
+  DML_BUFFER_BINDING input_buffer_binding{
+      .Buffer = input_buffer.Get(), .Offset = 0, .SizeInBytes = buffer_size};
+  std::vector<DML_BINDING_DESC> input_bindings(
+      {{.Type = DML_BINDING_TYPE_BUFFER, .Desc = &input_buffer_binding}});
+  DML_BUFFER_BINDING output_buffer_binding{
+      .Buffer = output_buffer.Get(), .Offset = 0, .SizeInBytes = buffer_size};
+  std::vector<DML_BINDING_DESC> output_bindings(
+      {{.Type = DML_BINDING_TYPE_BUFFER, .Desc = &output_buffer_binding}});
+
+  ComPtr<ID3D12Resource> upload_buffer;
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateUploadBuffer(
+      buffer_size, L"Upload_Buffer", upload_buffer));
+  // Copy the input data from upload buffer to input buffer.
+  UploadBufferWithBarrier(command_recorder.get(), std::move(input_buffer),
+                          upload_buffer, buffer_size);
+
+  // Record the operator execution with input and output bindings once.
+  EXPECT_HRESULT_SUCCEEDED(command_recorder->ExecuteOperator(
+      std::move(compiled_operator), descriptor_heap, input_bindings,
+      output_bindings, absl::nullopt, absl::nullopt));
+
+  ComPtr<ID3D12Resource> readback_buffer;
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateReadbackBuffer(
+      buffer_size, L"Readback_Buffer", readback_buffer));
+  // Copy the result from output buffer to readback buffer.
+  ReadbackBufferWithBarrier(command_recorder.get(), readback_buffer,
+                            std::move(output_buffer), buffer_size);
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->Close());
+
+  std::vector<float> result(buffer_size / sizeof(float));
+
+  // Execute the command list and check the result for the first time.
+
+  // Upload input data to execute.
+  std::vector<float> input_data({-2.0, -1.0, 1.0, 2.0});
+  void* upload_buffer_data = nullptr;
+  ASSERT_HRESULT_SUCCEEDED(upload_buffer->Map(0, nullptr, &upload_buffer_data));
+  memcpy(upload_buffer_data, input_data.data(), buffer_size);
+  upload_buffer->Unmap(0, nullptr);
+
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->Execute());
+  ASSERT_HRESULT_SUCCEEDED(
+      command_recorder->GetCommandQueue()->WaitSyncForTesting());
+
+  // Release the resources referred by GPU execution.
+  adapter_->command_queue()->ReleaseCompletedResources();
+  ASSERT_HRESULT_SUCCEEDED(adapter_->dml_device()->GetDeviceRemovedReason());
+  ASSERT_HRESULT_SUCCEEDED(adapter_->d3d12_device()->GetDeviceRemovedReason());
+
+  // Copy the contents from readback buffer to destination buffer.
+  void* readback_buffer_data = nullptr;
+  ASSERT_HRESULT_SUCCEEDED(
+      readback_buffer->Map(0, nullptr, &readback_buffer_data));
+  memcpy(result.data(), readback_buffer_data, buffer_size);
+  readback_buffer->Unmap(0, nullptr);
+  // Compare the result against expected.
+  EXPECT_EQ(result, std::vector<float>({0.0, 0.0, 1.0, 2.0}));
+
+  // Execute the command list and check the result for the second time.
+
+  // Upload new input data to execute.
+  input_data = {2.0, 1.0, -1.0, -2.0};
+  ASSERT_HRESULT_SUCCEEDED(upload_buffer->Map(0, nullptr, &upload_buffer_data));
+  memcpy(upload_buffer_data, input_data.data(), buffer_size);
+  upload_buffer->Unmap(0, nullptr);
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->Execute());
+  ASSERT_HRESULT_SUCCEEDED(
+      command_recorder->GetCommandQueue()->WaitSyncForTesting());
+
+  // Release the resources referred by GPU execution.
+  adapter_->command_queue()->ReleaseCompletedResources();
+  ASSERT_HRESULT_SUCCEEDED(adapter_->dml_device()->GetDeviceRemovedReason());
+  ASSERT_HRESULT_SUCCEEDED(adapter_->d3d12_device()->GetDeviceRemovedReason());
+
+  // Copy the contents from readback buffer to destination buffer.
+  ASSERT_HRESULT_SUCCEEDED(
+      readback_buffer->Map(0, nullptr, &readback_buffer_data));
+  memcpy(result.data(), readback_buffer_data, buffer_size);
+  readback_buffer->Unmap(0, nullptr);
+  // Compare the result against expected.
+  EXPECT_EQ(result, std::vector<float>({2.0, 1.0, 0.0, 0.0}));
+}
+
 TEST_F(WebNNCommandRecorderTest, ExecuteReluOperatorForMultipleBindings) {
   // Test dispatching a DirectML Relu operator twice for different input and
   // output bindings before waiting for GPU work to complete.
diff --git a/services/webnn/dml/graph_impl.cc b/services/webnn/dml/graph_impl.cc
index b9ab291..7d345f11 100644
--- a/services/webnn/dml/graph_impl.cc
+++ b/services/webnn/dml/graph_impl.cc
@@ -131,14 +131,14 @@
       .key_to_d3d12_range_map = std::move(key_to_d3d12_range_map)};
 }
 
-// Upload constants/inputs buffers in one Direct3D 12 committed resource, the
+// Upload constants buffers in one Direct3D 12 committed resource, the
 // DML_BUFFER_BINDING specifies a resource binding described by a range of bytes
 // in the single buffer.
-template <typename Key>
-absl::optional<std::map<Key, DML_BUFFER_BINDING>> UploadAndCreateBufferBinding(
+absl::optional<std::map<uint64_t, DML_BUFFER_BINDING>>
+UploadAndCreateConstantBufferBinding(
     CommandRecorder* command_recorder,
-    const base::flat_map<Key, mojo_base::BigBuffer>& key_to_buffer_map,
-    const AlignedByteLength<Key>& aligned_byte_length,
+    const base::flat_map<uint64_t, mojo_base::BigBuffer>& key_to_buffer_map,
+    const AlignedByteLength<uint64_t>& aligned_byte_length,
     ComPtr<ID3D12Resource> upload_buffer,
     ComPtr<ID3D12Resource> default_buffer) {
   // Map entire resource to copy the array buffer of constant/input one by one
@@ -151,7 +151,7 @@
     return absl::nullopt;
   }
 
-  std::map<Key, DML_BUFFER_BINDING> key_to_buffer_binding_map;
+  std::map<uint64_t, DML_BUFFER_BINDING> key_to_buffer_binding_map;
   for (auto& [key, buffer] : key_to_buffer_map) {
     // Copy the input data to the upload heap with byte offset
     const auto& d3d12_range =
@@ -175,6 +175,26 @@
   return key_to_buffer_binding_map;
 }
 
+HRESULT CopyInputDataToUploadBuffer(
+    const base::flat_map<std::string, mojo_base::BigBuffer>& named_inputs,
+    const std::map<std::string, D3D12_RANGE>& input_name_to_d3d12_range_map,
+    ID3D12Resource* upload_buffer) {
+  // Map entire resource to copy the array buffer of input one by one
+  // with byte offset.
+  void* mapped_upload_buffer = nullptr;
+  RETURN_IF_FAILED(upload_buffer->Map(0, nullptr, &mapped_upload_buffer));
+
+  for (auto& [name, buffer] : named_inputs) {
+    // Copy the input data to the upload heap with byte offset
+    const auto& d3d12_range = input_name_to_d3d12_range_map.at(name);
+    memcpy(static_cast<uint8_t*>(mapped_upload_buffer) + d3d12_range.Begin,
+           buffer.data(), buffer.size());
+  }
+  upload_buffer->Unmap(0, nullptr);
+
+  return S_OK;
+}
+
 // Define some methods like CreateInputNode and CreateOperatorNodeForRelu here
 // to focus on converting the mojo graph struct to corresponding DML graph node
 // by using dml::GraphBuilder as a helper. dml::GraphBuilder should be decoupled
@@ -286,6 +306,7 @@
                 DML_ACTIVATION_LEAKY_RELU_OPERATOR_DESC,
                 DML_ACTIVATION_RELU_OPERATOR_DESC,
                 DML_ACTIVATION_SIGMOID_OPERATOR_DESC,
+                DML_ACTIVATION_SOFTPLUS_OPERATOR_DESC,
                 DML_ACTIVATION_TANH_OPERATOR_DESC>
       desc;
 
@@ -305,6 +326,10 @@
                    desc)) {
       return {DML_OPERATOR_ACTIVATION_SIGMOID,
               &absl::get<DML_ACTIVATION_SIGMOID_OPERATOR_DESC>(desc)};
+    } else if (absl::holds_alternative<DML_ACTIVATION_SOFTPLUS_OPERATOR_DESC>(
+                   desc)) {
+      return {DML_OPERATOR_ACTIVATION_SOFTPLUS,
+              &absl::get<DML_ACTIVATION_SOFTPLUS_OPERATOR_DESC>(desc)};
     } else if (absl::holds_alternative<DML_ACTIVATION_TANH_OPERATOR_DESC>(
                    desc)) {
       return {DML_OPERATOR_ACTIVATION_TANH,
@@ -335,6 +360,10 @@
     case mojom::Activation::Tag::kSigmoid:
       return ActivationOperatorDesc{.desc =
                                         DML_ACTIVATION_SIGMOID_OPERATOR_DESC{}};
+    case mojom::Activation::Tag::kSoftplus:
+      return ActivationOperatorDesc{
+          .desc = DML_ACTIVATION_SOFTPLUS_OPERATOR_DESC{
+              .Steepness = activation->get_softplus()->steepness}};
     case mojom::Activation::Tag::kTanh:
       return ActivationOperatorDesc{.desc =
                                         DML_ACTIVATION_TANH_OPERATOR_DESC{}};
@@ -1934,6 +1963,49 @@
   return base::ok();
 }
 
+base::expected<void, mojom::ErrorPtr> CreateOperatorNodeForSoftplus(
+    const IdToOperandMap& id_to_operand_map,
+    const mojom::SoftplusPtr& softplus,
+    GraphBuilder& graph_builder,
+    IdToNodeOutputMap& id_to_node_output_map) {
+  const NodeOutput* input = GetNodeOutputForOperand(id_to_node_output_map,
+                                                    softplus->input_operand_id);
+  const auto& input_tensor_desc = input->GetTensorDesc();
+
+  const uint64_t output_id = softplus->output_operand_id;
+  const auto output_tensor_desc =
+      CreateOutputTensorDesc(id_to_operand_map, output_id);
+
+  // The steepness must be greater than or equal to 1.0 when DML_FEATURE_LEVEL
+  // is less than DML_FEATURE_LEVEL_6_3:
+  // https://learn.microsoft.com/en-us/windows/win32/api/directml/ns-directml-dml_activation_softplus_operator_desc
+  if (softplus->steepness < 1.0f) {
+    return base::unexpected(CreateError(
+        mojom::Error::Code::kNotSupportedError,
+        "The steepness of softplus should be greater than or equal to 1.0."));
+  }
+
+  DML_ACTIVATION_SOFTPLUS_OPERATOR_DESC softplus_desc{
+      .InputTensor = &input_tensor_desc.GetDMLTensorDesc(),
+      .OutputTensor = &output_tensor_desc.GetDMLTensorDesc(),
+      .Steepness = softplus->steepness};
+
+  std::array<const NodeOutput*, 1> inputs = {input};
+  const OperatorNode* softplus_node = graph_builder.CreateOperatorNode(
+      DML_OPERATOR_ACTIVATION_SOFTPLUS, &softplus_desc, inputs);
+  if (!softplus_node) {
+    return base::unexpected(CreateError(mojom::Error::Code::kUnknownError,
+                                        "Failed to create softplus operator."));
+  }
+
+  const NodeOutput* node_output = graph_builder.CreateNodeOutput(
+      softplus_node, std::move(output_tensor_desc));
+  // The output id must be unique in the map.
+  CHECK(id_to_node_output_map.try_emplace(output_id, node_output).second);
+
+  return base::ok();
+}
+
 // Transpose is not a real DirectML operator. As for implementation, the input
 // tensor is remapped for reading elements following the strides after the
 // permutation, and an identity operator is appended to consume the remapped
@@ -2039,6 +2111,22 @@
 GraphImpl::GraphBufferBindingInfo& GraphImpl::GraphBufferBindingInfo::operator=(
     GraphBufferBindingInfo&&) = default;
 
+GraphImpl::PersistentResource::PersistentResource(
+    uint64_t persistent_buffer_byte_length,
+    ComPtr<ID3D12Resource> persistent_resource)
+    : persistent_buffer(std::move(persistent_resource)) {
+  CHECK_GT(persistent_buffer_byte_length, 0u);
+  CHECK_NE(persistent_buffer.Get(), nullptr);
+  persistent_buffer_binding =
+      DML_BUFFER_BINDING{.Buffer = persistent_buffer.Get(),
+                         .Offset = 0,
+                         .SizeInBytes = persistent_buffer_byte_length};
+  persistent_buffer_binding_desc = DML_BINDING_DESC{
+      .Type = DML_BINDING_TYPE_BUFFER, .Desc = &persistent_buffer_binding};
+}
+
+GraphImpl::PersistentResource::~PersistentResource() = default;
+
 GraphImpl::ComputeResources::ComputeResources(
     ComPtr<ID3D12DescriptorHeap> descriptor_heap,
     AlignedByteLength<std::string> input_aligned_byte_length,
@@ -2158,34 +2246,112 @@
       temporary_buffer_byte_length, std::move(temporary_buffer)));
 }
 
+// static
+HRESULT GraphImpl::RecordGraphExecution(
+    IDMLCompiledOperator* compiled_operator,
+    CommandRecorder* command_recorder,
+    const ComputeResources* compute_resources,
+    const PersistentResource* persistent_resource,
+    const GraphBufferBindingInfo& graph_buffer_binding_info) {
+  // Open the command recorder for recording the graph execution commands.
+  RETURN_IF_FAILED(command_recorder->Open());
+
+  // Create the input buffer bindings for the graph execution.
+  std::map<std::string, DML_BUFFER_BINDING>
+      graph_input_name_to_buffer_binding_map;
+  for (auto& [name, d3d12_range] :
+       compute_resources->input_aligned_byte_length.key_to_d3d12_range_map) {
+    auto size_in_bytes = d3d12_range.End - d3d12_range.Begin;
+    graph_input_name_to_buffer_binding_map[name] =
+        DML_BUFFER_BINDING{.Buffer = compute_resources->input_buffer.Get(),
+                           .Offset = d3d12_range.Begin,
+                           .SizeInBytes = size_in_bytes};
+  }
+
+  std::vector<DML_BINDING_DESC> input_buffer_binding_desc(
+      graph_buffer_binding_info.input_buffer_binding_count,
+      DML_BINDING_DESC{.Type = DML_BINDING_TYPE_NONE, .Desc = nullptr});
+
+  // The graph input tensors must be bound to the binding table during the
+  // graph execution.
+  for (auto& [name, buffer_binding] : graph_input_name_to_buffer_binding_map) {
+    // Get the graph input index with the name.
+    const auto graph_input_index_iterator =
+        graph_buffer_binding_info.graph_input_name_to_index_map.find(name);
+    CHECK(graph_input_index_iterator !=
+          graph_buffer_binding_info.graph_input_name_to_index_map.end());
+    uint32_t graph_input_index = graph_input_index_iterator->second;
+    input_buffer_binding_desc[graph_input_index] = {DML_BINDING_TYPE_BUFFER,
+                                                    &buffer_binding};
+  }
+
+  UploadBufferWithBarrier(
+      command_recorder, compute_resources->input_buffer,
+      compute_resources->upload_buffer,
+      compute_resources->input_aligned_byte_length.total_byte_length);
+
+  // Create the output buffer bindings for the graph execution.
+  size_t output_buffer_binding_count =
+      graph_buffer_binding_info.graph_output_name_to_index_map.size();
+  std::vector<DML_BINDING_DESC> output_buffer_binding_desc(
+      output_buffer_binding_count,
+      DML_BINDING_DESC{.Type = DML_BINDING_TYPE_NONE, .Desc = nullptr});
+  std::vector<DML_BUFFER_BINDING> output_buffer_binding;
+  output_buffer_binding.reserve(output_buffer_binding_count);
+
+  for (auto& [name, graph_output_index] :
+       graph_buffer_binding_info.graph_output_name_to_index_map) {
+    const auto graph_output_range_iterator =
+        compute_resources->output_aligned_byte_length.key_to_d3d12_range_map
+            .find(name);
+    CHECK(graph_output_range_iterator !=
+          compute_resources->output_aligned_byte_length.key_to_d3d12_range_map
+              .end());
+    const auto& d3d12_range = graph_output_range_iterator->second;
+    output_buffer_binding.push_back(
+        DML_BUFFER_BINDING{.Buffer = compute_resources->output_buffer.Get(),
+                           .Offset = d3d12_range.Begin,
+                           .SizeInBytes = d3d12_range.End - d3d12_range.Begin});
+    output_buffer_binding_desc[graph_output_index] = {
+        DML_BINDING_TYPE_BUFFER, &output_buffer_binding.back()};
+  }
+
+  absl::optional<DML_BINDING_DESC> persistent_buffer_binding_desc;
+  if (persistent_resource) {
+    persistent_buffer_binding_desc =
+        persistent_resource->persistent_buffer_binding_desc;
+  }
+
+  // Execute the graph with input, output and persistent buffer bindings.
+  RETURN_IF_FAILED(command_recorder->ExecuteOperator(
+      compiled_operator, compute_resources->descriptor_heap,
+      input_buffer_binding_desc, output_buffer_binding_desc,
+      persistent_buffer_binding_desc,
+      compute_resources->temporary_buffer_binding_desc));
+
+  ReadbackBufferWithBarrier(
+      command_recorder, compute_resources->readback_buffer,
+      compute_resources->output_buffer,
+      compute_resources->output_aligned_byte_length.total_byte_length);
+
+  RETURN_IF_FAILED(command_recorder->Close());
+  return S_OK;
+}
+
 GraphImpl::GraphImpl(std::unique_ptr<CommandRecorder> command_recorder,
-                     ComPtr<ID3D12Resource> persistent_buffer,
+                     std::unique_ptr<PersistentResource> persistent_resource,
                      ComPtr<IDMLCompiledOperator> compiled_operator,
                      ComputeResourceInfo compute_resource_info,
                      GraphBufferBindingInfo graph_buffer_binding_info,
                      std::unique_ptr<ComputeResources> compute_resources)
     : WebNNGraphImpl(std::move(compute_resource_info)),
-      persistent_buffer_(std::move(persistent_buffer)),
+      persistent_resource_(std::move(persistent_resource)),
       command_recorder_(std::move(command_recorder)),
       compiled_operator_(std::move(compiled_operator)),
       graph_buffer_binding_info_(std::move(graph_buffer_binding_info)),
       compute_resources_(std::move(compute_resources)) {
   command_queue_ = command_recorder_->GetCommandQueue();
   dml_device_ = command_recorder_->GetDMLDevice();
-
-  // Create the persistent buffer binding for the graph execution.
-  uint64_t persistent_buffer_size =
-      compiled_operator_->GetBindingProperties().PersistentResourceSize;
-  if (persistent_buffer_size) {
-    CHECK_NE(persistent_buffer_.Get(), nullptr);
-    persistent_buffer_binding_ =
-        DML_BUFFER_BINDING{.Buffer = persistent_buffer_.Get(),
-                           .Offset = 0,
-                           .SizeInBytes = persistent_buffer_size};
-    persistent_buffer_binding_desc_ =
-        DML_BINDING_DESC{.Type = DML_BINDING_TYPE_BUFFER,
-                         .Desc = &persistent_buffer_binding_.value()};
-  }
 }
 
 //  Notice that it's the CommandQueue's responsibility to wait for all of the
@@ -2288,7 +2454,7 @@
                       "Failed to create default input buffer for constants.")));
       return;
     }
-    auto constant_buffer_binding = UploadAndCreateBufferBinding<uint64_t>(
+    auto constant_buffer_binding = UploadAndCreateConstantBufferBinding(
         command_recorder.get(), constant_id_to_buffer_map,
         aligned_byte_length_of_constants.value(), std::move(upload_buffer),
         std::move(default_buffer));
@@ -2319,14 +2485,14 @@
 
   // Create the persistent resource which is bound as output of operator
   // initializer.
+  std::unique_ptr<PersistentResource> persistent_resource;
   absl::optional<DML_BINDING_DESC> persistent_buffer_binding_desc;
-  absl::optional<DML_BUFFER_BINDING> persistent_buffer_binding;
   DML_BINDING_PROPERTIES execution_binding_properties =
       compiled_operator->GetBindingProperties();
   uint64_t persistent_buffer_size =
       execution_binding_properties.PersistentResourceSize;
-  ComPtr<ID3D12Resource> persistent_buffer;
   if (persistent_buffer_size) {
+    ComPtr<ID3D12Resource> persistent_buffer;
     hr = command_recorder->CreateDefaultBuffer(
         persistent_buffer_size, L"WebNN_Default_Persistent_Buffer",
         persistent_buffer);
@@ -2339,14 +2505,10 @@
       return;
     }
 
-    persistent_buffer_binding =
-        DML_BUFFER_BINDING{.Buffer = persistent_buffer.Get(),
-                           .Offset = 0,
-                           .SizeInBytes = persistent_buffer_size};
-
+    persistent_resource = base::WrapUnique(new PersistentResource(
+        persistent_buffer_size, std::move(persistent_buffer)));
     persistent_buffer_binding_desc =
-        DML_BINDING_DESC{.Type = DML_BINDING_TYPE_BUFFER,
-                         .Desc = &persistent_buffer_binding.value()};
+        persistent_resource->persistent_buffer_binding_desc;
   }
 
   hr = command_recorder->InitializeOperator(compiled_operator.Get(),
@@ -2376,7 +2538,7 @@
 
   command_queue->WaitAsync(base::BindOnce(
       &GraphImpl::OnInitializationComplete, std::move(command_recorder),
-      std::move(persistent_buffer), std::move(compiled_operator),
+      std::move(persistent_resource), std::move(compiled_operator),
       std::move(compute_resource_info), std::move(graph_buffer_binding_info),
       std::move(callback)));
 }
@@ -2384,7 +2546,7 @@
 // static
 void GraphImpl::OnInitializationComplete(
     std::unique_ptr<CommandRecorder> command_recorder,
-    ComPtr<ID3D12Resource> persistent_buffer,
+    std::unique_ptr<PersistentResource> persistent_resource,
     ComPtr<IDMLCompiledOperator> compiled_operator,
     ComputeResourceInfo compute_resource_info,
     GraphBufferBindingInfo graph_buffer_binding_info,
@@ -2410,6 +2572,19 @@
     return;
   }
 
+  hr = RecordGraphExecution(compiled_operator.Get(), command_recorder.get(),
+                            compute_resources.get(), persistent_resource.get(),
+                            graph_buffer_binding_info);
+  if (FAILED(hr)) {
+    DLOG(ERROR)
+        << "Failed to record commands and bind resources for execution: "
+        << logging::SystemErrorCodeToString(hr);
+    std::move(callback).Run(mojom::CreateGraphResult::NewError(CreateError(
+        mojom::Error::Code::kUnknownError,
+        "Failed to record commands and bind resources for execution.")));
+    return;
+  }
+
   scoped_refptr<CommandQueue> command_queue(
       command_recorder->GetCommandQueue());
   // The remote sent to the renderer.
@@ -2417,7 +2592,7 @@
   // The receiver bound to GraphImpl.
   mojo::MakeSelfOwnedReceiver<mojom::WebNNGraph>(
       base::WrapUnique(new GraphImpl(
-          std::move(command_recorder), std::move(persistent_buffer),
+          std::move(command_recorder), std::move(persistent_resource),
           std::move(compiled_operator), std::move(compute_resource_info),
           std::move(graph_buffer_binding_info), std::move(compute_resources))),
       blink_remote.InitWithNewPipeAndPassReceiver());
@@ -2654,6 +2829,12 @@
                 id_to_node_output_map);
         break;
       }
+      case mojom::Operation::Tag::kSoftplus: {
+        create_operator_result = CreateOperatorNodeForSoftplus(
+            id_to_operand_map, operation->get_softplus(), graph_builder,
+            id_to_node_output_map);
+        break;
+      }
       case mojom::Operation::Tag::kSplit: {
         create_operator_result = CreateOperatorNodeForSplit(
             id_to_operand_map, operation->get_split(), graph_builder,
@@ -2781,7 +2962,15 @@
     base::flat_map<std::string, mojo_base::BigBuffer> named_inputs,
     mojom::WebNNGraph::ComputeCallback callback) {
   TRACE_EVENT0("gpu", "dml::GraphImpl::ComputeImpl");
+
+  // It indicates whether we need to record commands and bind resources again
+  // for the graph execution by calling `RecordGraphExecution` method. If either
+  // the `compute_resources_` or `command_recorder_` is not available during the
+  // graph execution, it must be set to true.
+  bool is_command_recording_needed = false;
+
   // Recreate the command recorder if it has been released by last failed
+  // computation or it is unavailable due to still being occupied by last
   // computation.
   if (!command_recorder_) {
     command_recorder_ = CommandRecorder::Create(command_queue_, dml_device_);
@@ -2790,21 +2979,18 @@
                                std::move(callback));
       return;
     }
-  }
-  // Re-open the command recorder for recording the graph execution commands.
-  HRESULT hr = command_recorder_->Open();
-  if (FAILED(hr)) {
-    HandleComputationFailure("Failed to open the command recorder.", hr,
-                             std::move(callback));
-    return;
+    is_command_recording_needed = true;
   }
 
-  // Use the existing compute resource if it is available, otherwise allocate a
-  // new one.
+  std::unique_ptr<CommandRecorder> command_recorder =
+      std::move(command_recorder_);
+
+  // Use the existing compute resource if it is available, otherwise allocate
+  // a new one.
   std::unique_ptr<ComputeResources> compute_resources =
       std::move(compute_resources_);
   if (!compute_resources) {
-    compute_resources = AllocateComputeResources(command_recorder_.get(),
+    compute_resources = AllocateComputeResources(command_recorder.get(),
                                                  compiled_operator_.Get(),
                                                  compute_resource_info());
     if (!compute_resources) {
@@ -2812,101 +2998,54 @@
                                std::move(callback));
       return;
     }
+    is_command_recording_needed = true;
   }
   CHECK(compute_resources);
 
-  // Create the input resource binding for graph execution.
-  auto input_buffer_binding = UploadAndCreateBufferBinding<std::string>(
-      command_recorder_.get(), named_inputs,
-      compute_resources->input_aligned_byte_length,
-      compute_resources->upload_buffer, compute_resources->input_buffer);
-  if (!input_buffer_binding) {
+  HRESULT hr = S_OK;
+
+  if (is_command_recording_needed) {
+    hr = RecordGraphExecution(compiled_operator_.Get(), command_recorder.get(),
+                              compute_resources.get(),
+                              persistent_resource_.get(),
+                              graph_buffer_binding_info_);
+    if (FAILED(hr)) {
+      HandleComputationFailure(
+          "Failed to record and bind resources for execution.", hr,
+          std::move(callback));
+      return;
+    }
+  }
+
+  hr = CopyInputDataToUploadBuffer(
+      named_inputs,
+      compute_resources->input_aligned_byte_length.key_to_d3d12_range_map,
+      compute_resources->upload_buffer.Get());
+  if (FAILED(hr)) {
     HandleComputationFailure(
-        "Failed to upload and create the input buffer binding.",
+        "Failed to copy the data from named inputs to the upload buffer.", hr,
         std::move(callback));
     return;
   }
 
-  std::vector<DML_BINDING_DESC> input_buffer_binding_desc(
-      graph_buffer_binding_info_.input_buffer_binding_count,
-      DML_BINDING_DESC{.Type = DML_BINDING_TYPE_NONE, .Desc = nullptr});
-
-  // The graph input tensors must be bound to the binding table during the graph
-  // execution.
-  for (auto& [name, buffer_binding] : input_buffer_binding.value()) {
-    // Get the graph input index with the name.
-    const auto graph_input_index_iterator =
-        graph_buffer_binding_info_.graph_input_name_to_index_map.find(name);
-    CHECK(graph_input_index_iterator !=
-          graph_buffer_binding_info_.graph_input_name_to_index_map.end());
-    uint32_t graph_input_index = graph_input_index_iterator->second;
-    input_buffer_binding_desc[graph_input_index] = {DML_BINDING_TYPE_BUFFER,
-                                                    &buffer_binding};
-  }
-
-  // Create the output buffer bindings for the graph execution.
-  size_t output_buffer_binding_count =
-      graph_buffer_binding_info_.graph_output_name_to_index_map.size();
-  std::vector<DML_BINDING_DESC> output_buffer_binding_desc(
-      output_buffer_binding_count,
-      DML_BINDING_DESC{.Type = DML_BINDING_TYPE_NONE, .Desc = nullptr});
-  std::vector<DML_BUFFER_BINDING> output_buffer_binding;
-  output_buffer_binding.reserve(output_buffer_binding_count);
-
-  for (auto& [name, graph_output_index] :
-       graph_buffer_binding_info_.graph_output_name_to_index_map) {
-    auto& d3d12_range = compute_resources->output_aligned_byte_length
-                            .key_to_d3d12_range_map[name];
-    output_buffer_binding.push_back(
-        DML_BUFFER_BINDING{.Buffer = compute_resources->output_buffer.Get(),
-                           .Offset = d3d12_range.Begin,
-                           .SizeInBytes = d3d12_range.End - d3d12_range.Begin});
-    output_buffer_binding_desc[graph_output_index] = {
-        DML_BINDING_TYPE_BUFFER, &output_buffer_binding.back()};
-  }
-
-  // Execute the graph with input, output and persistent buffer bindings.
-  hr = command_recorder_->ExecuteOperator(
-      compiled_operator_.Get(), compute_resources->descriptor_heap,
-      input_buffer_binding_desc, output_buffer_binding_desc,
-      persistent_buffer_binding_desc_,
-      compute_resources->temporary_buffer_binding_desc);
+  // Submit the command list for execution.
+  hr = command_recorder->Execute();
   if (FAILED(hr)) {
-    HandleComputationFailure("Failed to execute the operator.", hr,
+    HandleComputationFailure("Failed to execute the command list.", hr,
                              std::move(callback));
     return;
   }
 
-  // Copy the output data from output buffer to readback buffer.
-  D3D12_RESOURCE_BARRIER barriers[1];
-  barriers[0] = CreateTransitionBarrier(compute_resources->output_buffer.Get(),
-                                        D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
-                                        D3D12_RESOURCE_STATE_COPY_SOURCE);
-  command_recorder_->ResourceBarrier(barriers);
-  command_recorder_->CopyBufferRegion(
-      compute_resources->readback_buffer.Get(), 0,
-      compute_resources->output_buffer.Get(), 0,
-      compute_resources->output_aligned_byte_length.total_byte_length);
-  barriers[0] = CreateTransitionBarrier(compute_resources->output_buffer.Get(),
-                                        D3D12_RESOURCE_STATE_COPY_SOURCE,
-                                        D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
-  command_recorder_->ResourceBarrier(barriers);
-
-  hr = command_recorder_->CloseAndExecute();
-  if (FAILED(hr)) {
-    HandleComputationFailure("Failed to close and execute the command list.",
-                             hr, std::move(callback));
-    return;
-  }
-
   command_queue_->WaitAsync(base::BindOnce(
       &GraphImpl::OnComputationComplete, weak_factory_.GetWeakPtr(),
-      std::move(callback), std::move(compute_resources)));
+      std::move(callback), std::move(compute_resources),
+      std::move(command_recorder)));
 }
 
 void GraphImpl::OnComputationComplete(
     mojom::WebNNGraph::ComputeCallback callback,
     std::unique_ptr<ComputeResources> compute_resources,
+    std::unique_ptr<CommandRecorder> command_recorder,
     HRESULT hr) {
   TRACE_EVENT0("gpu", "dml::GraphImpl::OnComputationComplete");
   if (FAILED(hr)) {
@@ -2940,12 +3079,18 @@
 
   compute_resources->readback_buffer->Unmap(0, nullptr);
 
-  // If there is an existing free compute resource, release this compute
+  // If there is an existing available compute resource, release this compute
   // resource. Otherwise, recycle this compute resource for the next call.
   if (!compute_resources_) {
     compute_resources_ = std::move(compute_resources);
   }
 
+  // Similarly, if there is an existing available command_recorder, release
+  // it. Otherwise, recycle it for the next call.
+  if (!command_recorder_) {
+    command_recorder_ = std::move(command_recorder);
+  }
+
   command_queue_->ReleaseCompletedResources();
   std::move(callback).Run(ComputeResult::kOk, std::move(named_outputs));
 }
diff --git a/services/webnn/dml/graph_impl.h b/services/webnn/dml/graph_impl.h
index f7194bf..1f47e52 100644
--- a/services/webnn/dml/graph_impl.h
+++ b/services/webnn/dml/graph_impl.h
@@ -85,6 +85,24 @@
     std::unordered_map<std::string, uint32_t> graph_output_name_to_index_map;
   };
 
+  // Contains the persistent resource for the graph initialization and execution
+  // if the graph needs it. The resource should be kept alive until the GPU has
+  // completed the execution.
+  struct PersistentResource {
+    PersistentResource(uint64_t persistent_buffer_byte_length,
+                       ComPtr<ID3D12Resource> persistent_buffer);
+    ~PersistentResource();
+    PersistentResource(const PersistentResource&) = delete;
+    PersistentResource& operator=(const PersistentResource&) = delete;
+
+    PersistentResource(PersistentResource&&) = delete;
+    PersistentResource& operator=(PersistentResource&&) = delete;
+
+    ComPtr<ID3D12Resource> persistent_buffer;
+    DML_BUFFER_BINDING persistent_buffer_binding;
+    DML_BINDING_DESC persistent_buffer_binding_desc;
+  };
+
   // Contains the GPU resources for a graph execution, including the descriptor
   // heap, upload buffer, input buffer, output buffer, read-back buffer and
   // temporary buffer if the graph needs. These resources should be kept alive
@@ -126,8 +144,26 @@
       IDMLCompiledOperator* compiled_operator,
       const ComputeResourceInfo& compute_resource_info);
 
+  // This method mainly records the graph execution onto the command list, binds
+  // all required resources and closes the command list.
+  //
+  // This method is called firstly after the graph initialization has been
+  // completed to prepare for the first graph execution. For following graph
+  // executions, the method only needs to be called if we need to record
+  // commands and bind resources again. Thus, it avoids re-calling the
+  // `IDMLCommandRecorder::RecordDispatch` and
+  // `ID3D12GraphicsCommandList::Close` methods which may be time-consuming for
+  // some devices during the first execution and following executions of a graph
+  // if not needed.
+  static HRESULT RecordGraphExecution(
+      IDMLCompiledOperator* compiled_operator,
+      CommandRecorder* command_recorder,
+      const ComputeResources* compute_resources,
+      const PersistentResource* persistent_resource,
+      const GraphBufferBindingInfo& graph_buffer_binding_info);
+
   GraphImpl(std::unique_ptr<CommandRecorder> command_recorder,
-            ComPtr<ID3D12Resource> persistent_buffer,
+            std::unique_ptr<PersistentResource> persistent_resource,
             ComPtr<IDMLCompiledOperator> compiled_operator,
             ComputeResourceInfo compute_resource_info,
             GraphBufferBindingInfo graph_buffer_binding_info,
@@ -171,7 +207,7 @@
   // required by the graph.
   static void OnInitializationComplete(
       std::unique_ptr<CommandRecorder> command_recorder,
-      ComPtr<ID3D12Resource> persistent_buffer,
+      std::unique_ptr<PersistentResource> persistent_resource,
       ComPtr<IDMLCompiledOperator> compiled_operator,
       ComputeResourceInfo compute_resource_info,
       GraphBufferBindingInfo graph_buffer_binding_info,
@@ -187,6 +223,7 @@
   void OnComputationComplete(
       mojom::WebNNGraph::ComputeCallback callback,
       std::unique_ptr<ComputeResources> compute_resources,
+      std::unique_ptr<CommandRecorder> command_recorder,
       HRESULT hr);
 
   // If GraphImpl::ComputeImpl fails, report an error and release the command
@@ -212,15 +249,22 @@
       base::flat_map<std::string, mojo_base::BigBuffer> named_inputs,
       mojom::WebNNGraph::ComputeCallback callback) override;
 
-  // The persistent buffer will be initialized after the initialization work on
-  // GPU is completed and will be used for the following graph executions. It
-  // could be nullptr which means it isn't required by the graph and won't need
-  // to be bound for graph executions.
-  ComPtr<ID3D12Resource> persistent_buffer_;
-  absl::optional<DML_BUFFER_BINDING> persistent_buffer_binding_;
-  absl::optional<DML_BINDING_DESC> persistent_buffer_binding_desc_;
+  // The persistent resource is allocated after the compilation work is
+  // completed for the graph initialization and will be used for the following
+  // graph executions. It could be nullptr which means it isn't required by the
+  // graph and won't need to be bound for graph executions.
+  std::unique_ptr<PersistentResource> persistent_resource_;
   scoped_refptr<CommandQueue> command_queue_;
   ComPtr<IDMLDevice> dml_device_;
+
+  // The command_recorder is created for the graph initialization and recycled
+  // after graph execution has completed. It avoids the resource allocation
+  // overhead for the first execution and following executions when it is
+  // available. A graph execution takes its ownership during the execution and
+  // returns the ownership once the GPU has completed the execution. If it is
+  // unavailable, e.g., being taken by previous uncompleted execution, a graph
+  // execution will create a new one and release it after the execution is
+  // done.
   std::unique_ptr<CommandRecorder> command_recorder_;
   // IDMLCompiledOperator represents a compiled and initialized DML graph to be
   // executed on GPU.
diff --git a/services/webnn/dml/graph_impl_test.cc b/services/webnn/dml/graph_impl_test.cc
index ed0b668..a222cac4 100644
--- a/services/webnn/dml/graph_impl_test.cc
+++ b/services/webnn/dml/graph_impl_test.cc
@@ -401,6 +401,14 @@
   float max_value;
 };
 
+struct Activation {
+  mojom::Activation::Tag kind;
+  absl::optional<ClampAttributes> clamp_attributes;
+  absl::optional<float> elu_alpha;
+  absl::optional<float> leaky_relu_alpha;
+  absl::optional<float> softplus_steepness;
+};
+
 template <typename T>
 struct BatchNormalizationTester {
   OperandInfo<T> input;
@@ -413,10 +421,7 @@
     absl::optional<uint64_t> bias_operand_id;
     uint32_t axis = 1;
     float epsilon = 1e-5;
-    absl::optional<mojom::Activation::Tag> activation;
-    absl::optional<ClampAttributes> clamp_attributes;
-    absl::optional<float> elu_alpha;
-    absl::optional<float> leaky_relu_alpha;
+    absl::optional<Activation> activation;
   };
   BatchNormalizationAttributes attributes;
   OperandInfo<float> output;
@@ -518,7 +523,8 @@
         .bias = OperandInfo<float>{.type = mojom::Operand::DataType::kFloat32,
                                    .dimensions = {2},
                                    .values = {0, 1}},
-        .attributes = {.activation = mojom::Activation::Tag::kRelu},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kRelu}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 1, 3},
                    .values = {0, 0, 0.9999950000374997, 0, 1,
@@ -526,6 +532,34 @@
         .Test();
   }
   {
+    // Test batchNormalization with 4-D input with activation = softplus.
+    BatchNormalizationTester<float>{
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 2, 1, 3},
+                  .values = {-1, 0, 1, 2, 3, 4}},
+        .mean = {.type = mojom::Operand::DataType::kFloat32,
+                 .dimensions = {2},
+                 .values = {0, 3}},
+        .variance = {.type = mojom::Operand::DataType::kFloat32,
+                     .dimensions = {2},
+                     .values = {1.0, 1.5}},
+        .scale = OperandInfo<float>{.type = mojom::Operand::DataType::kFloat32,
+                                    .dimensions = {2},
+                                    .values = {1.0, 1.5}},
+        .bias = OperandInfo<float>{.type = mojom::Operand::DataType::kFloat32,
+                                   .dimensions = {2},
+                                   .values = {0, 1}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kSoftplus,
+                                      .softplus_steepness = 1.2}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 2, 1, 3},
+                   .values = {0.2194032134850967, 0.5776226504666211,
+                              1.2193982135225965, 0.47280567014419334,
+                              1.219402056115026, 2.2805572041114077}}}
+        .Test();
+  }
+  {
     // Test batchNormalization with 4-D input with axis = 3.
     BatchNormalizationTester<float>{
         .input = {.type = mojom::Operand::DataType::kFloat32,
@@ -621,10 +655,7 @@
     mojom::InputOperandLayout input_layout =
         mojom::InputOperandLayout::kChannelsFirst;
     absl::optional<OperandInfo<T>> bias;
-    absl::optional<mojom::Activation::Tag> activation;
-    absl::optional<ClampAttributes> clamp_attributes;
-    absl::optional<float> elu_alpha;
-    absl::optional<float> leaky_relu_alpha;
+    absl::optional<Activation> activation;
   };
   Conv2dAttributes attributes;
   OperandInfo<float> output;
@@ -798,8 +829,9 @@
                                .type = mojom::Operand::DataType::kFloat32,
                                .dimensions = {1},
                                .values = {-5}},
-                       .activation = mojom::Activation::Tag::kElu,
-                       .elu_alpha = 0.8},
+                       .activation =
+                           Activation{.kind = mojom::Activation::Tag::kElu,
+                                      .elu_alpha = 0.8}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 1, 3, 3},
                    .values = {-0.7946096424007316, -0.7853474888890126,
@@ -823,8 +855,10 @@
                                .type = mojom::Operand::DataType::kFloat32,
                                .dimensions = {1},
                                .values = {-60}},
-                       .activation = mojom::Activation::Tag::kLeakyRelu,
-                       .leaky_relu_alpha = 0.02},
+                       .activation =
+                           Activation{
+                               .kind = mojom::Activation::Tag::kLeakyRelu,
+                               .leaky_relu_alpha = 0.02}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 1, 2, 2},
                    .values = {-0.3, -0.12, 21, 30}}}
@@ -849,7 +883,8 @@
                                .type = mojom::Operand::DataType::kFloat32,
                                .dimensions = {1},
                                .values = {-100}},
-                       .activation = mojom::Activation::Tag::kRelu},
+                       .activation =
+                           Activation{.kind = mojom::Activation::Tag::kRelu}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 5, 5, 1},
                    .values = {0,  0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 8,
@@ -876,7 +911,8 @@
                                .type = mojom::Operand::DataType::kFloat16,
                                .dimensions = {1},
                                .values = Float16FromFloat32({-100})},
-                       .activation = mojom::Activation::Tag::kRelu},
+                       .activation =
+                           Activation{.kind = mojom::Activation::Tag::kRelu}},
         .output = {.type = mojom::Operand::DataType::kFloat16,
                    .dimensions = {1, 5, 5, 1},
                    .values = {0,  0, 0, 0,  0,  0,  0,  0, 0,  0,  0,  0, 8,
@@ -907,7 +943,9 @@
                               0.9849002194630809, 0.4281076188358701}},
         .attributes = {.input_layout =
                            mojom::InputOperandLayout::kChannelsFirst,
-                       .activation = mojom::Activation::Tag::kSigmoid},
+                       .activation =
+                           Activation{.kind =
+                                          mojom::Activation::Tag::kSigmoid}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {2, 3, 2, 2},
                    .values = {0.7077627182006836, 0.6772933602333069,
@@ -924,6 +962,33 @@
                               0.7747598886489868, 0.7273134589195251}}}
         .Test();
   }
+  // Test conv2d with NCHW layout, float 32 data type, bias and fusing with
+  // softplus activation.
+  {
+    Conv2dTester<float>{
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 3, 3},
+                  .values = {0, 1, 2, 3, 4, 5, 6, 7, 8}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 1, 1},
+                   .values = {1}},
+        .attributes = {.bias =
+                           OperandInfo<float>{
+                               .type = mojom::Operand::DataType::kFloat32,
+                               .dimensions = {1},
+                               .values = {-2}},
+                       .activation =
+                           Activation{.kind = mojom::Activation::Tag::kSoftplus,
+                                      .softplus_steepness = 1.0}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3},
+                   .values = {0.1269280110429726, 0.31326168751822286,
+                              0.6931471805599453, 1.3132616875182228,
+                              2.1269280110429727, 3.048587351573742,
+                              4.0181499279178094, 5.006715348489118,
+                              6.00247568513773}}}
+        .Test();
+  }
   // Test conv2d with NCHW layout, fusing with tanh activation.
   {
     Conv2dTester<float>{
@@ -937,7 +1002,8 @@
         .attributes = {.padding = {1, 1, 1, 1},
                        .input_layout =
                            mojom::InputOperandLayout::kChannelsFirst,
-                       .activation = mojom::Activation::Tag::kTanh},
+                       .activation =
+                           Activation{.kind = mojom::Activation::Tag::kTanh}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 1, 5, 5},
                    .values = {0.5370495669980353, 0.7818063576087741,
@@ -1126,7 +1192,8 @@
                                .type = mojom::Operand::DataType::kFloat16,
                                .dimensions = {1},
                                .values = Float16FromFloat32({-5})},
-                       .activation = mojom::Activation::Tag::kRelu},
+                       .activation =
+                           Activation{.kind = mojom::Activation::Tag::kRelu}},
         .output = {.type = mojom::Operand::DataType::kFloat16,
                    .dimensions = {1, 1, 3, 3},
                    .values = {0., 0., 0., 0., 0., 1., 0., 7., 4.}}}
@@ -2943,8 +3010,10 @@
   absl::optional<float> clamp_max_value;
   absl::optional<float> elu_alpha;
   absl::optional<float> leaky_relu_alpha;
+  absl::optional<float> softplus_steepness;
   OperandInfo<float> output;
-  void Test() {
+  void Test(BuildAndComputeExpectation expectation =
+                BuildAndComputeExpectation::kSuccess) {
     // Build the graph with mojo type.
     GraphInfoBuilder builder;
     uint64_t input_operand_id =
@@ -2977,6 +3046,11 @@
       case mojom::Operation::Tag::kSoftmax:
         builder.BuildSoftmax(input_operand_id, output_operand_id);
         break;
+      case mojom::Operation::Tag::kSoftplus:
+        CHECK(softplus_steepness);
+        builder.BuildSoftplus(input_operand_id, output_operand_id,
+                              softplus_steepness.value());
+        break;
       case mojom::Operation::Tag::kTanh:
         builder.BuildTanh(input_operand_id, output_operand_id);
         break;
@@ -2989,9 +3063,11 @@
     base::flat_map<std::string, mojo_base::BigBuffer> named_outputs;
 
     BuildAndCompute(builder.CloneGraphInfo(), std::move(named_inputs),
-                    named_outputs);
+                    named_outputs, expectation);
 
-    VerifyIsEqual(std::move(named_outputs["output"]), output);
+    if (expectation == BuildAndComputeExpectation::kSuccess) {
+      VerifyIsEqual(std::move(named_outputs["output"]), output);
+    }
   }
 };
 
@@ -3098,6 +3174,65 @@
   }
 }
 
+// Test building and computing a DML graph with single operator softplus.
+TEST_F(WebNNGraphDMLImplTest, BuildAndComputeSingleOperatorSoftplus) {
+  {
+    // Test softplus with steepness = 1.0.
+    UnaryOperatorTester<float>{
+        .tag = mojom::Operation::Tag::kSoftplus,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 2, 3},
+                  .values = {-2, -1, 0, 1, 2, 3}},
+        .softplus_steepness = 1.0,
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 2, 3},
+                   .values = {0.1269280110429726, 0.31326168751822286,
+                              0.6931471805599453, 1.3132616875182228,
+                              2.1269280110429727, 3.048587351573742}}}
+        .Test();
+  }
+  {
+    // Test softplus with steepness = 2.0.
+    UnaryOperatorTester<float>{
+        .tag = mojom::Operation::Tag::kSoftplus,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 2, 2, 1},
+                  .values = {-1, 0, 1, 2}},
+        .softplus_steepness = 2.0,
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 2, 2, 1},
+                   .values = {0.0634640055214863, 0.34657359027997264,
+                              1.0634640055214863, 2.0090749639589047}}}
+        .Test();
+  }
+  {
+    // Test softplus with steepness = 10.0.
+    UnaryOperatorTester<float>{
+        .tag = mojom::Operation::Tag::kSoftplus,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 3, 2, 1},
+                  .values = {-10, -5, 0, 5, 10, 15}},
+        .softplus_steepness = 10.0,
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 3, 2, 1},
+                   .values = {0, 0, 0.06931471805599453, 5, 10, 15}}}
+        .Test();
+  }
+  {
+    // Test graph creation failure when steepness < 1.0.
+    UnaryOperatorTester<float>{
+        .tag = mojom::Operation::Tag::kSoftplus,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 1, 1},
+                  .values = {0}},
+        .softplus_steepness = 0.5,
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 1, 1},
+                   .values = {1.38629436111989}}}
+        .Test(BuildAndComputeExpectation::kCreateGraphFailure);
+  }
+}
+
 // Test building and computing a DML graph with single operator tanh.
 TEST_F(WebNNGraphDMLImplTest, BuildAndComputeSingleOperatorTanh) {
   // Test tanh with a 0-D scalar input.
@@ -4062,6 +4197,156 @@
             std::vector<float>({12, 14, 12, 14}));
 }
 
+// Test building a DML graph with one input and one constant to compute for
+// multiple times.
+TEST_F(WebNNGraphDMLImplTest, BuildOneGraphToComputeMultipleTimes) {
+  // DML_GEMM_OPERATOR_DESC support for 2 dimensions was introduced in
+  // DML_FEATURE_LEVEL_4_0.
+  SKIP_TEST_IF(!adapter_->IsDMLFeatureLevelSupported(DML_FEATURE_LEVEL_4_0));
+  // Build the mojom graph info.
+  std::vector<float> constant_data = {5, 6, 7, 8};
+  GraphInfoBuilder builder;
+  uint64_t input_a_operand_id =
+      builder.BuildInput("input_a", {2, 2}, mojom::Operand::DataType::kFloat32);
+  uint64_t input_b_operand_id =
+      builder.BuildConstant({2, 2}, mojom::Operand::DataType::kFloat32,
+                            base::as_bytes(base::make_span(constant_data)));
+  uint64_t output_operand_id =
+      builder.BuildOutput("output", {2, 2}, mojom::Operand::DataType::kFloat32);
+  builder.BuildGemm(input_a_operand_id, input_b_operand_id, output_operand_id,
+                    GemmAttributes());
+
+  base::flat_map<std::string, mojo_base::BigBuffer> named_outputs;
+  mojo::Remote<mojom::WebNNContextProvider> webnn_provider_remote;
+  mojo::Remote<mojom::WebNNContext> webnn_context_remote;
+  mojo::Remote<mojom::WebNNGraph> webnn_graph_remote;
+  WebNNContextProviderImpl::Create(
+      webnn_provider_remote.BindNewPipeAndPassReceiver());
+
+  // Create the dml::ContextImpl through context provider.
+  bool was_callback_called = false;
+  base::RunLoop run_loop_create_context;
+  auto options = mojom::CreateContextOptions::New();
+  webnn_provider_remote->CreateWebNNContext(
+      std::move(options),
+      base::BindLambdaForTesting(
+          [&](mojom::CreateContextResultPtr create_context_result) {
+            if (create_context_result->is_context_remote()) {
+              webnn_context_remote.Bind(
+                  std::move(create_context_result->get_context_remote()));
+            }
+            was_callback_called = true;
+            run_loop_create_context.Quit();
+          }));
+  run_loop_create_context.Run();
+  EXPECT_TRUE(was_callback_called);
+  EXPECT_TRUE(webnn_context_remote.is_bound());
+
+  // The dml::GraphImpl should be built successfully.
+  base::RunLoop run_loop_create_graph;
+  was_callback_called = false;
+  webnn_context_remote.set_disconnect_handler(
+      base::BindOnce([](base::RunLoop* run_loop) { run_loop->Quit(); },
+                     &run_loop_create_graph));
+  webnn_context_remote->CreateGraph(
+      builder.CloneGraphInfo(),
+      base::BindLambdaForTesting(
+          [&](mojom::CreateGraphResultPtr create_graph_result) {
+            webnn_graph_remote.Bind(
+                std::move(create_graph_result->get_graph_remote()));
+            was_callback_called = true;
+            run_loop_create_graph.Quit();
+          }));
+  run_loop_create_graph.Run();
+  EXPECT_TRUE(was_callback_called);
+  EXPECT_TRUE(webnn_graph_remote.is_bound());
+  {
+    // Compute for the first time.
+    base::flat_map<std::string, mojo_base::BigBuffer> named_inputs;
+    named_inputs.insert({"input_a", VectorToBigBuffer<float>({1, 1, 1, 1})});
+
+    // The dml::GraphImpl should compute successfully.
+    base::RunLoop run_loop_graph_compute;
+    was_callback_called = false;
+    webnn_graph_remote->Compute(
+        std::move(named_inputs),
+        base::BindLambdaForTesting(
+            [&](mojom::ComputeResult result,
+                absl::optional<base::flat_map<
+                    std::string, mojo_base::BigBuffer>> named_results) {
+              EXPECT_EQ(result, mojom::ComputeResult::kOk);
+              EXPECT_TRUE(named_results.has_value() &&
+                          !named_results.value().empty());
+              was_callback_called = true;
+              named_outputs = std::move(named_results.value());
+              run_loop_graph_compute.Quit();
+            }));
+    run_loop_graph_compute.Run();
+    EXPECT_TRUE(was_callback_called);
+
+    EXPECT_EQ(BigBufferToVector<float>(std::move(named_outputs["output"])),
+              std::vector<float>({12, 14, 12, 14}));
+  }
+  {
+    // Compute for the second time.
+    base::flat_map<std::string, mojo_base::BigBuffer> named_inputs;
+    named_inputs.insert({"input_a", VectorToBigBuffer<float>({1, 1, 1, 1})});
+
+    // The dml::GraphImpl should compute successfully.
+    base::RunLoop run_loop_graph_compute;
+    was_callback_called = false;
+    webnn_graph_remote->Compute(
+        std::move(named_inputs),
+        base::BindLambdaForTesting(
+            [&](mojom::ComputeResult result,
+                absl::optional<base::flat_map<
+                    std::string, mojo_base::BigBuffer>> named_results) {
+              EXPECT_EQ(result, mojom::ComputeResult::kOk);
+              EXPECT_TRUE(named_results.has_value() &&
+                          !named_results.value().empty());
+              was_callback_called = true;
+              named_outputs = std::move(named_results.value());
+              run_loop_graph_compute.Quit();
+            }));
+    run_loop_graph_compute.Run();
+    EXPECT_TRUE(was_callback_called);
+
+    EXPECT_EQ(BigBufferToVector<float>(std::move(named_outputs["output"])),
+              std::vector<float>({12, 14, 12, 14}));
+  }
+  {
+    // Compute for the third time.
+    base::flat_map<std::string, mojo_base::BigBuffer> named_inputs;
+    named_inputs.insert({"input_a", VectorToBigBuffer<float>({2, 2, 2, 2})});
+
+    // The dml::GraphImpl should compute successfully.
+    base::RunLoop run_loop_graph_compute;
+    was_callback_called = false;
+    webnn_graph_remote->Compute(
+        std::move(named_inputs),
+        base::BindLambdaForTesting(
+            [&](mojom::ComputeResult result,
+                absl::optional<base::flat_map<
+                    std::string, mojo_base::BigBuffer>> named_results) {
+              EXPECT_EQ(result, mojom::ComputeResult::kOk);
+              EXPECT_TRUE(named_results.has_value() &&
+                          !named_results.value().empty());
+              was_callback_called = true;
+              named_outputs = std::move(named_results.value());
+              run_loop_graph_compute.Quit();
+            }));
+    run_loop_graph_compute.Run();
+    EXPECT_TRUE(was_callback_called);
+
+    EXPECT_EQ(BigBufferToVector<float>(std::move(named_outputs["output"])),
+              std::vector<float>({24, 28, 24, 28}));
+  }
+  webnn_graph_remote.reset();
+  webnn_context_remote.reset();
+  webnn_provider_remote.reset();
+  base::RunLoop().RunUntilIdle();
+}
+
 template <typename T>
 struct InstanceNormalizationTester {
   OperandInfo<T> input;
diff --git a/services/webnn/dml/utils.cc b/services/webnn/dml/utils.cc
index 41360bd2..4352ab1 100644
--- a/services/webnn/dml/utils.cc
+++ b/services/webnn/dml/utils.cc
@@ -201,6 +201,26 @@
   command_recorder->ResourceBarrier(barriers);
 }
 
+void ReadbackBufferWithBarrier(CommandRecorder* command_recorder,
+                               ComPtr<ID3D12Resource> readback_buffer,
+                               ComPtr<ID3D12Resource> default_buffer,
+                               size_t buffer_size) {
+  // Copy the data from source buffer to destination buffer.
+  D3D12_RESOURCE_BARRIER barriers[1];
+  barriers[0] = CreateTransitionBarrier(default_buffer.Get(),
+                                        D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
+                                        D3D12_RESOURCE_STATE_COPY_SOURCE);
+  command_recorder->ResourceBarrier(barriers);
+  command_recorder->CopyBufferRegion(std::move(readback_buffer), 0,
+                                     default_buffer, 0, buffer_size);
+  // The bound resources should be in D3D12_RESOURCE_STATE_UNORDERED_ACCESS
+  // state before the execution of RecordDispatch on the GPU.
+  barriers[0] = CreateTransitionBarrier(default_buffer.Get(),
+                                        D3D12_RESOURCE_STATE_COPY_SOURCE,
+                                        D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+  command_recorder->ResourceBarrier(barriers);
+}
+
 mojom::ErrorPtr CreateError(mojom::Error::Code error_code,
                             std::string error_messages) {
   return mojom::Error::New(error_code,
diff --git a/services/webnn/dml/utils.h b/services/webnn/dml/utils.h
index f4ee618..89188a3 100644
--- a/services/webnn/dml/utils.h
+++ b/services/webnn/dml/utils.h
@@ -55,6 +55,14 @@
                             ComPtr<ID3D12Resource> src_buffer,
                             size_t buffer_size);
 
+// Helper function to readback data from GPU to CPU, the resource can be created
+// for a single buffer or a big buffer combined from multiple buffers.
+void COMPONENT_EXPORT(WEBNN_SERVICE)
+    ReadbackBufferWithBarrier(CommandRecorder* command_recorder,
+                              ComPtr<ID3D12Resource> readback_buffer,
+                              ComPtr<ID3D12Resource> default_buffer,
+                              size_t buffer_size);
+
 mojom::ErrorPtr CreateError(mojom::Error::Code error_code,
                             std::string error_messages);
 
diff --git a/services/webnn/public/mojom/webnn_graph.mojom b/services/webnn/public/mojom/webnn_graph.mojom
index 08aa92ef..b21984fc 100644
--- a/services/webnn/public/mojom/webnn_graph.mojom
+++ b/services/webnn/public/mojom/webnn_graph.mojom
@@ -628,6 +628,19 @@
   uint64 output_operand_id;
 };
 
+// Corresponds to `MLOperand softplus(MLOperand x)` that computes the softplus
+// function of the input tensor following the expression
+// ln(1 + exp(steepness * x)) / steepness.
+struct Softplus {
+  // The input operand (referenced by input_operand_id) must be distinct from
+  // the output operand (referenced by output_operand_id).
+  uint64 input_operand_id;
+  uint64 output_operand_id;
+
+  // The steepness value defaults to 1.0.
+  float steepness = 1.0;
+};
+
 // Represents a split operation that splits an input tensor into multiple
 // output tensors. The shape of the outputs and the specified axis determine
 // how the split will be performed. Since axis specifies which input dimension
@@ -729,6 +742,7 @@
   Relu relu;
   Sigmoid sigmoid;
   Softmax softmax;
+  Softplus softplus;
   Tanh tanh;
 };
 
@@ -760,6 +774,7 @@
   Sigmoid sigmoid;
   Slice slice;
   Softmax softmax;
+  Softplus softplus;
   Split split;
   Tanh tanh;
   Transpose transpose;
diff --git a/services/webnn/webnn_graph_impl.cc b/services/webnn/webnn_graph_impl.cc
index e95c86a..ac14131 100644
--- a/services/webnn/webnn_graph_impl.cc
+++ b/services/webnn/webnn_graph_impl.cc
@@ -143,6 +143,15 @@
   return true;
 }
 
+bool ValidateSoftplusAttributes(const mojom::SoftplusPtr& softplus) {
+  if (std::isnan(softplus->steepness)) {
+    // The value of steepness should not be NAN.
+    return false;
+  }
+
+  return true;
+}
+
 bool ValidateActivation(const mojom::ActivationPtr& activation) {
   switch (activation->which()) {
     case mojom::Activation::Tag::kClamp:
@@ -151,6 +160,8 @@
       return ValidateEluAttributes(activation->get_elu());
     case mojom::Activation::Tag::kLeakyRelu:
       return ValidateLeakyReluAttributes(activation->get_leaky_relu());
+    case mojom::Activation::Tag::kSoftplus:
+      return ValidateSoftplusAttributes(activation->get_softplus());
     case mojom::Activation::Tag::kRelu:
     case mojom::Activation::Tag::kSigmoid:
     case mojom::Activation::Tag::kSoftmax:
@@ -1063,6 +1074,19 @@
   return true;
 }
 
+bool ValidateSoftplus(const IdToOperandMap& id_to_operand_map,
+                      const mojom::SoftplusPtr& softplus) {
+  if (!ValidateUnaryOperation(id_to_operand_map, softplus,
+                              DataTypeConstraint::kFloat)) {
+    return false;
+  }
+  if (!ValidateSoftplusAttributes(softplus)) {
+    return false;
+  }
+
+  return true;
+}
+
 bool ValidateSplit(const IdToOperandMap& id_to_operand_map,
                    const mojom::SplitPtr& split) {
   auto* input = GetMojoOperand(id_to_operand_map, split->input_operand_id);
@@ -1261,6 +1285,8 @@
                                     DataTypeConstraint::kFloat);
     case mojom::Operation::Tag::kSoftmax:
       return ValidateSoftmax(id_to_operand_map, operation->get_softmax());
+    case mojom::Operation::Tag::kSoftplus:
+      return ValidateSoftplus(id_to_operand_map, operation->get_softplus());
     case mojom::Operation::Tag::kSplit:
       return ValidateSplit(id_to_operand_map, operation->get_split());
     case mojom::Operation::Tag::kTanh:
diff --git a/services/webnn/webnn_graph_impl_unittest.cc b/services/webnn/webnn_graph_impl_unittest.cc
index 94663a1..2f6db3f 100644
--- a/services/webnn/webnn_graph_impl_unittest.cc
+++ b/services/webnn/webnn_graph_impl_unittest.cc
@@ -414,6 +414,14 @@
   }
 }
 
+struct Activation {
+  mojom::Activation::Tag kind;
+  absl::optional<ClampTester::ClampAttributes> clamp_attributes;
+  absl::optional<float> elu_alpha;
+  absl::optional<float> leaky_relu_alpha;
+  absl::optional<float> softplus_steepness;
+};
+
 struct BatchNormalizationTester {
   OperandInfo input;
   OperandInfo mean;
@@ -425,10 +433,7 @@
     absl::optional<uint64_t> bias_operand_id;
     uint32_t axis = 1;
     float epsilon = 1e-5;
-    absl::optional<mojom::Activation::Tag> activation;
-    absl::optional<ClampTester::ClampAttributes> clamp_attributes;
-    absl::optional<float> elu_alpha;
-    absl::optional<float> leaky_relu_alpha;
+    absl::optional<Activation> activation;
   };
   BatchNormalizationAttributes attributes;
   OperandInfo output;
@@ -514,10 +519,12 @@
         .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
         .variance = {.type = mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}},
-        .attributes = {.activation = mojom::Activation::Tag::kClamp,
-                       .clamp_attributes =
-                           ClampTester::ClampAttributes{.min_value = 1.0,
-                                                        .max_value = 6.0}},
+        .attributes = {.activation =
+                           Activation{
+                               .kind = mojom::Activation::Tag::kClamp,
+                               .clamp_attributes =
+                                   ClampTester::ClampAttributes{
+                                       .min_value = 1.0, .max_value = 6.0}}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 3}},
         .expected = true}
@@ -531,8 +538,9 @@
         .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
         .variance = {.type = mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}},
-        .attributes = {.activation = mojom::Activation::Tag::kElu,
-                       .elu_alpha = 1.0},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kElu,
+                                      .elu_alpha = 1.0}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 3}},
         .expected = true}
@@ -546,8 +554,10 @@
         .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
         .variance = {.type = mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}},
-        .attributes = {.activation = mojom::Activation::Tag::kLeakyRelu,
-                       .leaky_relu_alpha = 0.01},
+        .attributes = {.activation =
+                           Activation{
+                               .kind = mojom::Activation::Tag::kLeakyRelu,
+                               .leaky_relu_alpha = 0.01}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 3}},
         .expected = true}
@@ -561,7 +571,8 @@
         .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
         .variance = {.type = mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}},
-        .attributes = {.activation = mojom::Activation::Tag::kRelu},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kRelu}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 3}},
         .expected = true}
@@ -575,7 +586,9 @@
         .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
         .variance = {.type = mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}},
-        .attributes = {.activation = mojom::Activation::Tag::kSigmoid},
+        .attributes = {.activation =
+                           Activation{.kind =
+                                          mojom::Activation::Tag::kSigmoid}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 3}},
         .expected = true}
@@ -589,7 +602,25 @@
         .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
         .variance = {.type = mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}},
-        .attributes = {.activation = mojom::Activation::Tag::kSoftmax},
+        .attributes = {.activation =
+                           Activation{.kind =
+                                          mojom::Activation::Tag::kSoftmax}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 2, 3, 3}},
+        .expected = true}
+        .Test();
+  }
+  {
+    // Test BatchNormalization with softplus activation.
+    BatchNormalizationTester{
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 2, 3, 3}},
+        .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
+        .variance = {.type = mojom::Operand::DataType::kFloat32,
+                     .dimensions = {2}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kSoftplus,
+                                      .softplus_steepness = 1.0}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 3}},
         .expected = true}
@@ -603,7 +634,8 @@
         .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
         .variance = {.type = mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}},
-        .attributes = {.activation = mojom::Activation::Tag::kTanh},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kTanh}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 3}},
         .expected = true}
@@ -617,8 +649,9 @@
         .mean = {.type = mojom::Operand::DataType::kFloat32, .dimensions = {2}},
         .variance = {.type = mojom::Operand::DataType::kFloat32,
                      .dimensions = {2}},
-        .attributes = {.activation = mojom::Activation::Tag::kElu,
-                       .elu_alpha = -1.0},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kElu,
+                                      .elu_alpha = -1.0}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 3}},
         .expected = false}
@@ -1008,10 +1041,7 @@
     mojom::InputOperandLayout input_layout =
         mojom::InputOperandLayout::kChannelsFirst;
     absl::optional<OperandInfo> bias;
-    absl::optional<mojom::Activation::Tag> activation;
-    absl::optional<ClampTester::ClampAttributes> clamp_attributes;
-    absl::optional<float> elu_alpha;
-    absl::optional<float> leaky_relu_alpha;
+    absl::optional<Activation> activation;
   };
   Conv2dAttributes attributes;
   OperandInfo output;
@@ -1108,31 +1138,36 @@
   }
   {
     // Test conv2d with clamp activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kDirect,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 5, 5}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kClamp,
-                                .clamp_attributes =
-                                    ClampTester::ClampAttributes{
-                                        .min_value = 1.0, .max_value = 6.0}},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kDirect,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{
+                               .kind = mojom::Activation::Tag::kClamp,
+                               .clamp_attributes =
+                                   ClampTester::ClampAttributes{
+                                       .min_value = 1.0, .max_value = 6.0}}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = true}
         .Test();
   }
   {
     // Test conv2d with elu activation.
-    Conv2dTester{.input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 5, 5}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kElu,
-                                .elu_alpha = 1.0},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .expected = true}
+    Conv2dTester{
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kElu,
+                                      .elu_alpha = 1.0}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = true}
         .Test();
   }
   {
@@ -1142,8 +1177,10 @@
                   .dimensions = {1, 1, 5, 5}},
         .filter = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
-        .attributes = {.activation = mojom::Activation::Tag::kLeakyRelu,
-                       .leaky_relu_alpha = 0.01},
+        .attributes = {.activation =
+                           Activation{
+                               .kind = mojom::Activation::Tag::kLeakyRelu,
+                               .leaky_relu_alpha = 0.01}},
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 1, 3, 3}},
         .expected = true}
@@ -1151,67 +1188,95 @@
   }
   {
     // Test conv2d with relu activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kDirect,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 5, 5}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kRelu},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kDirect,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kRelu}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = true}
         .Test();
   }
   {
     // Test conv2d with sigmoid activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kDirect,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 5, 5}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kSigmoid},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kDirect,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind =
+                                          mojom::Activation::Tag::kSigmoid}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = true}
         .Test();
   }
   {
     // Test conv2d with softmax activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kDirect,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 5, 5}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kSoftmax},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kDirect,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind =
+                                          mojom::Activation::Tag::kSoftmax}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = true}
+        .Test();
+  }
+  {
+    // Test conv2d with softplus activation.
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kDirect,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kSoftplus,
+                                      .softplus_steepness = 1.5}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = true}
         .Test();
   }
   {
     // Test conv2d with tanh activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kDirect,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 5, 5}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kTanh},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kDirect,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kTanh}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = true}
         .Test();
   }
   {
     // Test the invalid graph when elu activation has alpha < 0.
-    Conv2dTester{.input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 5, 5}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kElu,
-                                .elu_alpha = -1.0},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .expected = false}
+    Conv2dTester{
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kElu,
+                                      .elu_alpha = -1.0}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = false}
         .Test();
   }
   {
@@ -1301,18 +1366,21 @@
   }
   {
     // Test the invalid graph when the max value is less than the min value.
-    Conv2dTester{.type = mojom::Conv2d_Type::kDirect,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 5, 5}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kClamp,
-                                .clamp_attributes =
-                                    ClampTester::ClampAttributes{
-                                        .min_value = 6.0, .max_value = 1.0}},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .expected = false}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kDirect,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 5, 5}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{
+                               .kind = mojom::Activation::Tag::kClamp,
+                               .clamp_attributes =
+                                   ClampTester::ClampAttributes{
+                                       .min_value = 6.0, .max_value = 1.0}}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .expected = false}
         .Test();
   }
   {
@@ -1451,70 +1519,99 @@
   }
   {
     // Test convTranspose2d with clamp activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kTransposed,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 3, 3}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kClamp,
-                                .clamp_attributes =
-                                    ClampTester::ClampAttributes{
-                                        .min_value = 1.0, .max_value = 6.0}},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 5, 5}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kTransposed,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 3, 3}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{
+                               .kind = mojom::Activation::Tag::kClamp,
+                               .clamp_attributes =
+                                   ClampTester::ClampAttributes{
+                                       .min_value = 1.0, .max_value = 6.0}}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 5, 5}},
+        .expected = true}
         .Test();
   }
   {
     // Test convTranspose2d with relu activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kTransposed,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 3, 3}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kRelu},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 5, 5}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kTransposed,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 3, 3}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kRelu}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 5, 5}},
+        .expected = true}
         .Test();
   }
   {
     // Test convTranspose2d with sigmoid activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kTransposed,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 3, 3}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kSigmoid},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 5, 5}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kTransposed,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 3, 3}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind =
+                                          mojom::Activation::Tag::kSigmoid}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 5, 5}},
+        .expected = true}
         .Test();
   }
   {
     // Test convTranspose2d with softmax activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kTransposed,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 3, 3}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kSoftmax},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 5, 5}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kTransposed,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 3, 3}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind =
+                                          mojom::Activation::Tag::kSoftmax}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 5, 5}},
+        .expected = true}
+        .Test();
+  }
+  {
+    // Test convTranspose2d with softplus activation.
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kTransposed,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 3, 3}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kSoftplus,
+                                      .softplus_steepness = 1.5}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 5, 5}},
+        .expected = true}
         .Test();
   }
   {
     // Test convTranspose2d with tanh activation.
-    Conv2dTester{.type = mojom::Conv2d_Type::kTransposed,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 3, 3}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kTanh},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 5, 5}},
-                 .expected = true}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kTransposed,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 3, 3}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{.kind = mojom::Activation::Tag::kTanh}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 5, 5}},
+        .expected = true}
         .Test();
   }
   {
@@ -1630,18 +1727,21 @@
   }
   {
     // Test the invalid graph when the max value is less than the min value.
-    Conv2dTester{.type = mojom::Conv2d_Type::kTransposed,
-                 .input = {.type = mojom::Operand::DataType::kFloat32,
-                           .dimensions = {1, 1, 3, 3}},
-                 .filter = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 3, 3}},
-                 .attributes = {.activation = mojom::Activation::Tag::kClamp,
-                                .clamp_attributes =
-                                    ClampTester::ClampAttributes{
-                                        .min_value = 6.0, .max_value = 1.0}},
-                 .output = {.type = mojom::Operand::DataType::kFloat32,
-                            .dimensions = {1, 1, 5, 5}},
-                 .expected = false}
+    Conv2dTester{
+        .type = mojom::Conv2d_Type::kTransposed,
+        .input = {.type = mojom::Operand::DataType::kFloat32,
+                  .dimensions = {1, 1, 3, 3}},
+        .filter = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 3, 3}},
+        .attributes = {.activation =
+                           Activation{
+                               .kind = mojom::Activation::Tag::kClamp,
+                               .clamp_attributes =
+                                   ClampTester::ClampAttributes{
+                                       .min_value = 6.0, .max_value = 1.0}}},
+        .output = {.type = mojom::Operand::DataType::kFloat32,
+                   .dimensions = {1, 1, 5, 5}},
+        .expected = false}
         .Test();
   }
   {
@@ -4419,6 +4519,84 @@
   }
 }
 
+struct SoftplusTester {
+  OperandInfo input;
+  OperandInfo output;
+  float steepness = 1.0;
+  bool expected;
+
+  void Test() {
+    // Build the graph with mojo type.
+    GraphInfoBuilder builder;
+    uint64_t input_operand_id =
+        builder.BuildInput("input", input.dimensions, input.type);
+    uint64_t output_operand_id =
+        builder.BuildOutput("output", output.dimensions, output.type);
+    builder.BuildSoftplus(input_operand_id, output_operand_id, steepness);
+    EXPECT_EQ(WebNNGraphImpl::ValidateGraph(builder.GetGraphInfo()), expected);
+  }
+};
+
+TEST_F(WebNNGraphImplTest, SoftplusTest) {
+  {
+    // Test softplus operator with `steepness` = 1.5.
+    SoftplusTester{.input = {.type = mojom::Operand::DataType::kFloat32,
+                             .dimensions = {2, 2}},
+                   .output = {.type = mojom::Operand::DataType::kFloat32,
+                              .dimensions = {2, 2}},
+                   .steepness = 1.5,
+                   .expected = true}
+        .Test();
+  }
+  {
+    // Test the invalid graph for invalid data type.
+    SoftplusTester{.input = {.type = mojom::Operand::DataType::kInt32,
+                             .dimensions = {4, 2}},
+                   .output = {.type = mojom::Operand::DataType::kInt32,
+                              .dimensions = {4, 2}},
+                   .expected = false}
+        .Test();
+  }
+  {
+    // Test the invalid graph for `steepness` is NAN.
+    SoftplusTester{.input = {.type = mojom::Operand::DataType::kFloat16,
+                             .dimensions = {4, 2}},
+                   .output = {.type = mojom::Operand::DataType::kFloat16,
+                              .dimensions = {4, 2}},
+                   .steepness = NAN,
+                   .expected = false}
+        .Test();
+  }
+  {
+    // Test the invalid graph for the output shapes are not expected.
+    SoftplusTester{.input = {.type = mojom::Operand::DataType::kFloat32,
+                             .dimensions = {4, 2}},
+                   .output = {.type = mojom::Operand::DataType::kFloat32,
+                              .dimensions = {2}},
+                   .expected = false}
+        .Test();
+  }
+  {
+    // Test the invalid graph for output types don't match.
+    SoftplusTester{.input = {.type = mojom::Operand::DataType::kFloat32,
+                             .dimensions = {2, 5}},
+                   .output = {.type = mojom::Operand::DataType::kFloat16,
+                              .dimensions = {2, 5}},
+                   .expected = false}
+        .Test();
+  }
+  {
+    // Test the invalid graph for input operand == output operand.
+    GraphInfoBuilder builder;
+    uint64_t input_operand_id =
+        builder.BuildInput("input", {4, 6}, mojom::Operand::DataType::kFloat32);
+
+    builder.BuildSoftplus(input_operand_id, input_operand_id,
+                          /*steepness*/ 1.0);
+    EXPECT_EQ(WebNNGraphImpl::ValidateGraph(builder.GetGraphInfo()), false);
+  }
+}
+
 struct SplitTester {
   OperandInfo input;
   std::vector<OperandInfo> outputs;
diff --git a/services/webnn/webnn_test_utils.cc b/services/webnn/webnn_test_utils.cc
index 8b31faf..4e4f39f 100644
--- a/services/webnn/webnn_test_utils.cc
+++ b/services/webnn/webnn_test_utils.cc
@@ -288,6 +288,17 @@
       mojom::Operation::NewSoftmax(std::move(softmax)));
 }
 
+void GraphInfoBuilder::BuildSoftplus(uint64_t input_operand_id,
+                                     uint64_t output_operand_id,
+                                     float steepness) {
+  mojom::SoftplusPtr softplus = mojom::Softplus::New();
+  softplus->input_operand_id = input_operand_id;
+  softplus->output_operand_id = output_operand_id;
+  softplus->steepness = steepness;
+  graph_info_->operations.push_back(
+      mojom::Operation::NewSoftplus(std::move(softplus)));
+}
+
 void GraphInfoBuilder::BuildTanh(uint64_t input_operand_id,
                                  uint64_t output_operand_id) {
   mojom::TanhPtr tanh = mojom::Tanh::New();
diff --git a/services/webnn/webnn_test_utils.h b/services/webnn/webnn_test_utils.h
index bbba056..c835fac 100644
--- a/services/webnn/webnn_test_utils.h
+++ b/services/webnn/webnn_test_utils.h
@@ -39,19 +39,20 @@
                        const std::vector<uint32_t>& dimensions,
                        mojom::Operand::DataType type);
 
-  // A `ActivationAttributes` type should have the following members:
-  // struct ActivationAttributes {
-  //  absl::optional<mojom::Activation::Tag> activation;
+  // An `Activation` type should have the following members:
+  // struct Activation {
+  //  mojom::Activation::Tag kind;
   //  absl::optional<ClampTester::ClampAttributes> clamp_attributes;
   //  absl::optional<float> elu_alpha;
   //  absl::optional<float> leaky_relu_alpha;
+  //  absl::optional<float> softplus_steepness;
   // };
   template <typename ActivationAttributes>
   mojom::ActivationPtr CreateActivation(
-      const ActivationAttributes& attributes) {
-    switch (attributes.activation.value()) {
+      const ActivationAttributes& activation) {
+    switch (activation.kind) {
       case mojom::Activation::Tag::kClamp: {
-        const auto clamp_attributes = attributes.clamp_attributes;
+        const auto clamp_attributes = activation.clamp_attributes;
         CHECK(clamp_attributes.has_value());
         auto clamp = mojom::Clamp::New();
         clamp->min_value = clamp_attributes->min_value;
@@ -60,14 +61,14 @@
       }
       case mojom::Activation::Tag::kElu: {
         auto elu = mojom::Elu::New();
-        CHECK(attributes.elu_alpha.has_value());
-        elu->alpha = attributes.elu_alpha.value();
+        CHECK(activation.elu_alpha.has_value());
+        elu->alpha = activation.elu_alpha.value();
         return mojom::Activation::NewElu(std::move(elu));
       }
       case mojom::Activation::Tag::kLeakyRelu: {
         auto leaky_relu = mojom::LeakyRelu::New();
-        CHECK(attributes.leaky_relu_alpha.has_value());
-        leaky_relu->alpha = attributes.leaky_relu_alpha.value();
+        CHECK(activation.leaky_relu_alpha.has_value());
+        leaky_relu->alpha = activation.leaky_relu_alpha.value();
         return mojom::Activation::NewLeakyRelu(std::move(leaky_relu));
       }
       case mojom::Activation::Tag::kRelu:
@@ -76,6 +77,12 @@
         return mojom::Activation::NewSigmoid(mojom::Sigmoid::New());
       case mojom::Activation::Tag::kSoftmax:
         return mojom::Activation::NewSoftmax(mojom::Softmax::New());
+      case mojom::Activation::Tag::kSoftplus: {
+        auto softplus = mojom::Softplus::New();
+        CHECK(activation.softplus_steepness.has_value());
+        softplus->steepness = activation.softplus_steepness.value();
+        return mojom::Activation::NewSoftplus(std::move(softplus));
+      }
       case mojom::Activation::Tag::kTanh:
         return mojom::Activation::NewTanh(mojom::Tanh::New());
       default:
@@ -96,10 +103,7 @@
   //  absl::optional<uint64_t> bias_operand_id;
   //  uint32_t axis = 1;
   //  float epsilon = 1e-5;
-  //  absl::optional<mojom::Activation::Tag> activation;
-  //  absl::optional<ClampTester::ClampAttributes> clamp_attributes;
-  //  absl::optional<float> elu_alpha;
-  //  absl::optional<float> leaky_relu_alpha;
+  //  absl::optional<Activation> activation;
   // };
   template <typename BatchNormalizationAttributes>
   void BuildBatchNormalization(uint64_t input_operand_id,
@@ -120,7 +124,8 @@
     batch_normalization->epsilon = attributes.epsilon;
 
     if (attributes.activation.has_value()) {
-      batch_normalization->activation = std::move(CreateActivation(attributes));
+      batch_normalization->activation =
+          CreateActivation(attributes.activation.value());
     }
 
     graph_info_->operations.push_back(mojom::Operation::NewBatchNormalization(
@@ -144,10 +149,7 @@
   //   uint32_t groups;
   //   mojom::InputOperandLayout input_layout;
   //   absl::optional<uint64_t> bias_operand_id,
-  //   absl::optional<mojom::Activation::Tag> activation;
-  //   absl::optional<ClampAttributes> clamp_attributes;
-  //   absl::optional<float> elu_alpha;
-  //   absl::optional<float> leaky_relu_alpha;
+  //   absl::optional<Activation> activation;
   // };
   template <typename Conv2dAttributes>
   void BuildConv2d(mojom::Conv2d_Type type,
@@ -180,7 +182,7 @@
     conv2d->bias_operand_id = bias_operand_id;
 
     if (attributes.activation.has_value()) {
-      conv2d->activation = std::move(CreateActivation(attributes));
+      conv2d->activation = CreateActivation(attributes.activation.value());
     }
 
     graph_info_->operations.push_back(
@@ -383,6 +385,10 @@
 
   void BuildSoftmax(uint64_t input_operand_id, uint64_t output_operand_id);
 
+  void BuildSoftplus(uint64_t input_operand_id,
+                     uint64_t output_operand_id,
+                     float steepness);
+
   void BuildSplit(uint64_t input_operand_id,
                   const std::vector<uint64_t>& output_operand_ids,
                   uint32_t axis);
diff --git a/services/webnn/webnn_utils.cc b/services/webnn/webnn_utils.cc
index 880ec4ba..c7ca9d7 100644
--- a/services/webnn/webnn_utils.cc
+++ b/services/webnn/webnn_utils.cc
@@ -58,6 +58,8 @@
       return "slice";
     case mojom::Operation::Tag::kSoftmax:
       return "softmax";
+    case mojom::Operation::Tag::kSoftplus:
+      return "softplus";
     case mojom::Operation::Tag::kSplit:
       return "split";
     case mojom::Operation::Tag::kTanh:
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index e5a0b80..c8ca1af1 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -6195,9 +6195,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6207,8 +6207,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
@@ -6345,9 +6345,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6357,8 +6357,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index e96daca..13afd28 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -20387,9 +20387,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -20399,8 +20399,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
@@ -20537,9 +20537,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -20549,8 +20549,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index da0cd44..51b98e8 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -42369,9 +42369,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -42380,8 +42380,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
@@ -42519,9 +42519,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -42530,8 +42530,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
@@ -43843,9 +43843,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43854,8 +43854,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
@@ -43993,9 +43993,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -44004,8 +44004,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
@@ -44703,9 +44703,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -44714,8 +44714,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 95f4e70e6..7349c4f 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -16313,12 +16313,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -16328,8 +16328,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
@@ -16483,12 +16483,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 122.0.6185.0",
+        "description": "Run with ash-chrome version 122.0.6186.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -16498,8 +16498,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6185.0",
-              "revision": "version:122.0.6185.0"
+              "location": "lacros_version_skew_tests_v122.0.6186.0",
+              "revision": "version:122.0.6186.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index f8d9022..6edcd9a 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -337,16 +337,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'identifier': 'Lacros version skew testing ash canary',
-    'description': 'Run with ash-chrome version 122.0.6185.0',
+    'description': 'Run with ash-chrome version 122.0.6186.0',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6185.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6186.0/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v122.0.6185.0',
-          'revision': 'version:122.0.6185.0',
+          'location': 'lacros_version_skew_tests_v122.0.6186.0',
+          'revision': 'version:122.0.6186.0',
         },
       ],
     },
diff --git a/third_party/androidx/0_privacysandbox_AndroidManifest.xml b/third_party/androidx/0_privacysandbox_AndroidManifest.xml
deleted file mode 100644
index da6c78ff..0000000
--- a/third_party/androidx/0_privacysandbox_AndroidManifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    package="org.chromium.privacysandbox.overrides">
-
-    <!-- Library needed for androidx.privacysandbox.ads:ads-adservices to work on Android R & S,
-      which we do not currently support. Removing out of caution to prevent the library from
-      slowing down renderer process start-up.
-      https://crbug.com/1448095
-    -->
-    <application>
-      <uses-library android:name="android.ext.adservices" tools:node="remove" />
-    </application>
-</manifest>
diff --git a/third_party/androidx/customizations.gni b/third_party/androidx/customizations.gni
index 5b383f1..db10d3a 100644
--- a/third_party/androidx/customizations.gni
+++ b/third_party/androidx/customizations.gni
@@ -63,12 +63,6 @@
       # Replace broad library -keep rules with a more limited set in
       # chrome/android/java/proguard.flags instead.
       ignore_proguard_configs = true
-    } else if (target_name ==
-               "androidx_privacysandbox_ads_ads_adservices_java") {
-      if (!is_high_end_android) {
-        # https://crbug.com/1448095
-        mergeable_android_manifests = [ "0_privacysandbox_AndroidManifest.xml" ]
-      }
     } else if (target_name == "androidx_startup_startup_runtime_java") {
       # Keeps emoji2 code. See http://crbug.com/1205141
       ignore_proguard_configs = true
diff --git a/third_party/angle b/third_party/angle
index 8f96655..a1789be 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 8f966559277014210094158770d801896d718cab
+Subproject commit a1789bef235225f8f5603de9e568923c1f852d8b
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 2d21b9b..d191b72 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -1631,6 +1631,10 @@
              "RemoveAutorizationOnCrossOriginRedirect",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kInteractiveDetectorIgnoreFcp,
+             "InteractiveDetectorIgnoreFcp",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kRenderBlockingFonts,
              "RenderBlockingFonts",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn
index 6b6a693..8b812ec2f 100644
--- a/third_party/blink/public/common/BUILD.gn
+++ b/third_party/blink/public/common/BUILD.gn
@@ -263,6 +263,7 @@
     "page/drag_operation.h",
     "page/launching_process_state.h",
     "page/page_zoom.h",
+    "page/v8_compile_hints_histograms.h",
     "page_state/page_state.h",
     "page_state/page_state_serialization.h",
     "peerconnection/webrtc_ip_handling_policy.h",
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index e7771bad..a54a207 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -1509,6 +1509,9 @@
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
     kTreatHTTPExpiresHeaderValueZeroAsExpiredInBlink);
 
+// Don't require FCP for the page to turn interactive. Useful for testing.
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kInteractiveDetectorIgnoreFcp);
+
 }  // namespace features
 }  // namespace blink
 
diff --git a/third_party/blink/public/common/page/v8_compile_hints_histograms.h b/third_party/blink/public/common/page/v8_compile_hints_histograms.h
new file mode 100644
index 0000000..1b553cd
--- /dev/null
+++ b/third_party/blink/public/common/page/v8_compile_hints_histograms.h
@@ -0,0 +1,32 @@
+// 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_PUBLIC_COMMON_PAGE_V8_COMPILE_HINTS_HISTOGRAMS_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_V8_COMPILE_HINTS_HISTOGRAMS_H_
+
+namespace blink::v8_compile_hints {
+
+inline constexpr const char* kStatusHistogram =
+    "WebCore.Scripts.V8CompileHintsStatus";
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class Status {
+  kConsumeLocalCompileHintsClassicNonStreaming = 0,
+  kConsumeLocalCompileHintsModuleNonStreaming = 1,
+  kConsumeCrowdsourcedCompileHintsClassicNonStreaming = 2,
+  kConsumeCrowdsourcedCompileHintsModuleNonStreaming = 3,
+  kProduceCompileHintsClassicNonStreaming = 4,
+  kProduceCompileHintsModuleNonStreaming = 5,
+  kConsumeCodeCacheClassicNonStreaming = 6,
+  kConsumeCodeCacheModuleNonStreaming = 7,
+  kConsumeLocalCompileHintsStreaming = 8,
+  kConsumeCrowdsourcedCompileHintsStreaming = 9,
+  kProduceCompileHintsStreaming = 10,
+  kMaxValue = kProduceCompileHintsStreaming
+};
+
+}  // namespace blink::v8_compile_hints
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_V8_COMPILE_HINTS_HISTOGRAMS_H_
diff --git a/third_party/blink/public/mojom/loader/resource_load_info_notifier.mojom b/third_party/blink/public/mojom/loader/resource_load_info_notifier.mojom
index c133684..82129e5 100644
--- a/third_party/blink/public/mojom/loader/resource_load_info_notifier.mojom
+++ b/third_party/blink/public/mojom/loader/resource_load_info_notifier.mojom
@@ -27,7 +27,8 @@
   NotifyResourceResponseReceived(int64 request_id,
                                  url.mojom.SchemeHostPort final_response_url,
                                  network.mojom.URLResponseHead head,
-                                 network.mojom.RequestDestination request_destination);
+                                 network.mojom.RequestDestination request_destination,
+                                 bool is_ad_resource);
 
   // Called to notify the transfer size is updated.
   NotifyResourceTransferSizeUpdated(int64 request_id, int32 transfer_size_diff);
diff --git a/third_party/blink/public/platform/resource_load_info_notifier_wrapper.h b/third_party/blink/public/platform/resource_load_info_notifier_wrapper.h
index 09a5c77..f122200b 100644
--- a/third_party/blink/public/platform/resource_load_info_notifier_wrapper.h
+++ b/third_party/blink/public/platform/resource_load_info_notifier_wrapper.h
@@ -51,7 +51,8 @@
       const std::string& http_method,
       const GURL& referrer,
       network::mojom::RequestDestination request_destination,
-      net::RequestPriority request_priority);
+      net::RequestPriority request_priority,
+      bool is_ad_resource);
   void NotifyResourceRedirectReceived(
       const net::RedirectInfo& redirect_info,
       network::mojom::URLResponseHeadPtr redirect_response);
@@ -74,6 +75,8 @@
   // This struct holds the loading stats passed to
   // |weak_wrapper_resource_load_info_notifier_|.
   mojom::ResourceLoadInfoPtr resource_load_info_;
+
+  bool is_ad_resource_ = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/public/platform/url_loader_throttle_provider.h b/third_party/blink/public/platform/url_loader_throttle_provider.h
index 7730a44..21b8f12e 100644
--- a/third_party/blink/public/platform/url_loader_throttle_provider.h
+++ b/third_party/blink/public/platform/url_loader_throttle_provider.h
@@ -38,12 +38,6 @@
   // service workers call it on the worker thread. `local_frame_token` will be
   // set to the corresponding frame for frame and dedicated worker requests,
   // otherwise it will be not be set.
-  //
-  // TODO(crbug.com/1379780): The 'local_frame_token' argument is required
-  // because a frame's URLLoaderThrottleProvider is designed to be created only
-  // once per process and shared between multiple frames. But when we have
-  // URLLoaderThrottleProvider for each frames in the background threads, we
-  // don't need the 'local_frame_token' argument.
   virtual WebVector<std::unique_ptr<URLLoaderThrottle>> CreateThrottles(
       base::optional_ref<const LocalFrameToken> local_frame_token,
       const WebURLRequest& request) = 0;
@@ -52,14 +46,6 @@
   virtual void SetOnline(bool is_online) = 0;
 };
 
-class BLINK_PLATFORM_EXPORT WebURLLoaderThrottleProviderForFrame {
- public:
-  virtual ~WebURLLoaderThrottleProviderForFrame() = default;
-
-  virtual WebVector<std::unique_ptr<URLLoaderThrottle>> CreateThrottles(
-      const WebURLRequest& request) = 0;
-};
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_URL_LOADER_THROTTLE_PROVIDER_H_
diff --git a/third_party/blink/public/platform/weak_wrapper_resource_load_info_notifier.h b/third_party/blink/public/platform/weak_wrapper_resource_load_info_notifier.h
index 9778402..b13ee52 100644
--- a/third_party/blink/public/platform/weak_wrapper_resource_load_info_notifier.h
+++ b/third_party/blink/public/platform/weak_wrapper_resource_load_info_notifier.h
@@ -37,7 +37,8 @@
       int64_t request_id,
       const url::SchemeHostPort& final_response_url,
       network::mojom::URLResponseHeadPtr response_head,
-      network::mojom::RequestDestination request_destination) override;
+      network::mojom::RequestDestination request_destination,
+      bool is_ad_resource) override;
   void NotifyResourceTransferSizeUpdated(int64_t request_id,
                                          int32_t transfer_size_diff) override;
   void NotifyResourceLoadCompleted(
diff --git a/third_party/blink/public/platform/web_document_subresource_filter.h b/third_party/blink/public/platform/web_document_subresource_filter.h
index a92e635..8de28b9 100644
--- a/third_party/blink/public/platform/web_document_subresource_filter.h
+++ b/third_party/blink/public/platform/web_document_subresource_filter.h
@@ -36,10 +36,6 @@
   // Returns true if disallowed resource loads should be logged to the devtools
   // console.
   virtual bool ShouldLogToConsole() = 0;
-
-  // Report that the resource request corresponding to |request_id|  was tagged
-  // as an ad.
-  virtual void ReportAdRequestId(int request_id) {}
 };
 
 }  // namespace blink
diff --git a/third_party/blink/public/platform/web_navigation_body_loader.h b/third_party/blink/public/platform/web_navigation_body_loader.h
index f239968..4fb2fd6 100644
--- a/third_party/blink/public/platform/web_navigation_body_loader.h
+++ b/third_party/blink/public/platform/web_navigation_body_loader.h
@@ -80,7 +80,8 @@
       std::unique_ptr<ResourceLoadInfoNotifierWrapper>
           resource_load_info_notifier_wrapper,
       bool is_main_frame,
-      WebNavigationParams* navigation_params);
+      WebNavigationParams* navigation_params,
+      bool is_ad_frame);
 
   // It should be safe to destroy WebNavigationBodyLoader at any moment,
   // including from inside any client notification.
diff --git a/third_party/blink/public/web/web_document_loader.h b/third_party/blink/public/web/web_document_loader.h
index 0960ab9..f9d3219 100644
--- a/third_party/blink/public/web/web_document_loader.h
+++ b/third_party/blink/public/web/web_document_loader.h
@@ -134,10 +134,11 @@
   // committed in this WebDocumentLoader had transient activation.
   virtual bool LastNavigationHadTransientUserActivation() const = 0;
 
-  // Sets the CodeCacheHost for this loader.
+  // Sets the CodeCacheHosts for this loader.
   virtual void SetCodeCacheHost(
+      CrossVariantMojoRemote<mojom::CodeCacheHostInterfaceBase> code_cache_host,
       CrossVariantMojoRemote<mojom::CodeCacheHostInterfaceBase>
-          code_cache_host) = 0;
+          code_cache_host_for_background) = 0;
 
   virtual WebString OriginCalculationDebugInfo() const = 0;
 
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index 798e257..98bfe15 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -714,8 +714,7 @@
     return nullptr;
   }
 
-  virtual std::unique_ptr<WebURLLoaderThrottleProviderForFrame>
-  CreateWebURLLoaderThrottleProviderForFrame() {
+  virtual URLLoaderThrottleProvider* GetURLLoaderThrottleProvider() {
     return nullptr;
   }
 
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
index 81e46f35..97547f62 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
@@ -15,6 +15,7 @@
 #include "base/threading/thread_restrictions.h"
 #include "mojo/public/cpp/system/wait.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/common/page/v8_compile_hints_histograms.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-shared.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_code_cache.h"
@@ -767,6 +768,9 @@
   if (compile_hints_producer && compile_hints_producer->MightGenerateData()) {
     DCHECK(base::FeatureList::IsEnabled(features::kProduceCompileHints2));
     compile_options = v8::ScriptCompiler::kProduceCompileHints;
+    base::UmaHistogramEnumeration(
+        v8_compile_hints::kStatusHistogram,
+        v8_compile_hints::Status::kProduceCompileHintsStreaming);
   } else if (local_compile_hints_enabled &&
              V8CodeCache::HasCompileHints(
                  script_resource_->CacheHandler(),
@@ -792,6 +796,9 @@
       compile_hint_callback =
           v8_compile_hints::V8LocalCompileHintsConsumer::GetCompileHint;
       compile_options = v8::ScriptCompiler::kConsumeCompileHints;
+      base::UmaHistogramEnumeration(
+          v8_compile_hints::kStatusHistogram,
+          v8_compile_hints::Status::kConsumeLocalCompileHintsStreaming);
     }
   } else if (compile_hints_consumer && compile_hints_consumer->HasData()) {
     // This doesn't need to be gated behind a runtime flag, because there won't
@@ -805,11 +812,17 @@
         &v8_compile_hints::V8CrowdsourcedCompileHintsConsumer::
             CompileHintCallback;
     compile_options = v8::ScriptCompiler::kConsumeCompileHints;
+    base::UmaHistogramEnumeration(
+        v8_compile_hints::kStatusHistogram,
+        v8_compile_hints::Status::kConsumeCrowdsourcedCompileHintsStreaming);
   } else if (local_compile_hints_enabled) {
     // Produce local compile hints. TODO(chromium:1495723): If we later find out
     // there were local compile hints (but the cache arrived late), we'll need
     // to use them.
     compile_options = v8::ScriptCompiler::kProduceCompileHints;
+    base::UmaHistogramEnumeration(
+        v8_compile_hints::kStatusHistogram,
+        v8_compile_hints::Status::kProduceCompileHintsStreaming);
   }
 
   std::unique_ptr<v8::ScriptCompiler::ScriptStreamingTask>
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
index a5434cc..1ae7a9f9 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -26,8 +26,10 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
 
 #include "base/feature_list.h"
+#include "base/metrics/histogram_functions.h"
 #include "build/build_config.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/common/page/v8_compile_hints_histograms.h"
 #include "third_party/blink/public/mojom/v8_cache_options.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/buildflags.h"
 #include "third_party/blink/renderer/bindings/core/v8/binding_security.h"
@@ -164,6 +166,10 @@
       // not both at the same time.
       // TODO(chromium:1495723): Enable consuming both at the same time.
       if (local_compile_hints) {
+        base::UmaHistogramEnumeration(
+            v8_compile_hints::kStatusHistogram,
+            v8_compile_hints::Status::
+                kConsumeLocalCompileHintsClassicNonStreaming);
         CachedMetadataHandler* cache_handler = classic_script.CacheHandler();
         CHECK(cache_handler);
         scoped_refptr<CachedMetadata> cached_metadata =
@@ -187,6 +193,10 @@
         return v8::ScriptCompiler::Compile(script_state->GetContext(), &source,
                                            compile_options, no_cache_reason);
       }
+      base::UmaHistogramEnumeration(
+          v8_compile_hints::kStatusHistogram,
+          v8_compile_hints::Status::
+              kConsumeCrowdsourcedCompileHintsClassicNonStreaming);
       CHECK(consume_crowdsourced_compile_hints);
       // No local compile hints; compile with crowdsourced compile hints.
       // Based on how `can_use_compile_hints` in CompileScript is computed, we
@@ -213,15 +223,22 @@
       return v8::ScriptCompiler::Compile(script_state->GetContext(), &source,
                                          compile_options, no_cache_reason);
     }
+    case v8::ScriptCompiler::kProduceCompileHints:
+      base::UmaHistogramEnumeration(
+          v8_compile_hints::kStatusHistogram,
+          v8_compile_hints::Status::kProduceCompileHintsClassicNonStreaming);
+      [[fallthrough]];
     case v8::ScriptCompiler::kNoCompileOptions:
-    case v8::ScriptCompiler::kEagerCompile:
-    case v8::ScriptCompiler::kProduceCompileHints: {
+    case v8::ScriptCompiler::kEagerCompile: {
       v8::ScriptCompiler::Source source(code, origin);
       return v8::ScriptCompiler::Compile(script_state->GetContext(), &source,
                                          compile_options, no_cache_reason);
     }
 
     case v8::ScriptCompiler::kConsumeCodeCache: {
+      base::UmaHistogramEnumeration(
+          v8_compile_hints::kStatusHistogram,
+          v8_compile_hints::Status::kConsumeCodeCacheClassicNonStreaming);
       // Compile a script, and consume a V8 cache that was generated previously.
       CachedMetadataHandler* cache_handler = classic_script.CacheHandler();
       ScriptCacheConsumer* cache_consumer = classic_script.CacheConsumer();
@@ -370,6 +387,9 @@
       case v8::ScriptCompiler::kNoCompileOptions:
       case v8::ScriptCompiler::kEagerCompile:
       case v8::ScriptCompiler::kProduceCompileHints: {
+        base::UmaHistogramEnumeration(
+            v8_compile_hints::kStatusHistogram,
+            v8_compile_hints::Status::kProduceCompileHintsModuleNonStreaming);
         v8::ScriptCompiler::Source source(code, origin);
         script = v8::ScriptCompiler::CompileModule(
             isolate, &source, compile_options, no_cache_reason);
@@ -377,6 +397,9 @@
       }
 
       case v8::ScriptCompiler::kConsumeCodeCache: {
+        base::UmaHistogramEnumeration(
+            v8_compile_hints::kStatusHistogram,
+            v8_compile_hints::Status::kConsumeCodeCacheModuleNonStreaming);
         // Compile a script, and consume a V8 cache that was generated
         // previously.
         CachedMetadataHandler* cache_handler = params.CacheHandler();
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 5cecc1d8..011c04d 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1486,6 +1486,7 @@
   sources +=
       rebase_path(blink_core_tests_content_capture, "", "content_capture")
   sources += rebase_path(blink_core_tests_display_lock, "", "display_lock")
+  sources += rebase_path(blink_core_tests_dom, "", "dom")
   sources += rebase_path(blink_core_tests_events, "", "events")
   sources +=
       rebase_path(blink_core_tests_execution_context, "", "execution_context")
diff --git a/third_party/blink/renderer/core/css/style_recalc_change.cc b/third_party/blink/renderer/core/css/style_recalc_change.cc
index 15f010c7..e656fff 100644
--- a/third_party/blink/renderer/core/css/style_recalc_change.cc
+++ b/third_party/blink/renderer/core/css/style_recalc_change.cc
@@ -70,6 +70,9 @@
   if (pseudo_element.NeedsStyleRecalc()) {
     return true;
   }
+  if (pseudo_element.ChildNeedsStyleRecalc()) {
+    return true;
+  }
   if (pseudo_element.NeedsLayoutSubtreeUpdate()) {
     return true;
   }
diff --git a/third_party/blink/renderer/core/dom/attr_test.cc b/third_party/blink/renderer/core/dom/attr_test.cc
index 285b284..26c3516 100644
--- a/third_party/blink/renderer/core/dom/attr_test.cc
+++ b/third_party/blink/renderer/core/dom/attr_test.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 
@@ -20,6 +21,7 @@
   const AtomicString& Value() const { return value_; }
 
  private:
+  test::TaskEnvironment task_environment_;
   ScopedNullExecutionContext execution_context_;
   Persistent<Document> document_;
   AtomicString value_;
diff --git a/third_party/blink/renderer/core/dom/element_rare_data_vector_test.cc b/third_party/blink/renderer/core/dom/element_rare_data_vector_test.cc
index 687ce8b9..382c5dd 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data_vector_test.cc
+++ b/third_party/blink/renderer/core/dom/element_rare_data_vector_test.cc
@@ -3,9 +3,11 @@
 // found in the LICENSE file.
 
 #include "third_party/blink/renderer/core/dom/element_rare_data_vector.h"
+
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 #include "third_party/googletest/src/googletest/include/gtest/gtest.h"
 
 namespace blink {
@@ -38,6 +40,7 @@
         static_cast<ElementRareDataVector::FieldId>(field_id));
   }
 
+  test::TaskEnvironment task_environment_;
   Persistent<ElementRareDataVector> rare_data_;
 };
 
diff --git a/third_party/blink/renderer/core/dom/events/listener_leak_test.cc b/third_party/blink/renderer/core/dom/events/listener_leak_test.cc
index e2e1378..24960a9b 100644
--- a/third_party/blink/renderer/core/dom/events/listener_leak_test.cc
+++ b/third_party/blink/renderer/core/dom/events/listener_leak_test.cc
@@ -35,6 +35,7 @@
 #include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/platform/heap/thread_state.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
 #include "third_party/blink/renderer/platform/testing/url_loader_mock_factory.h"
 #include "third_party/blink/renderer/platform/testing/url_test_helpers.h"
@@ -111,6 +112,7 @@
   }
 
  protected:
+  test::TaskEnvironment task_environment_;
   frame_test_helpers::WebViewHelper web_view_helper;
 };
 
diff --git a/third_party/blink/renderer/core/dom/idle_deadline_test.cc b/third_party/blink/renderer/core/dom/idle_deadline_test.cc
index f820cd2..c0c472b 100644
--- a/third_party/blink/renderer/core/dom/idle_deadline_test.cc
+++ b/third_party/blink/renderer/core/dom/idle_deadline_test.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/blink/renderer/platform/testing/scoped_scheduler_overrider.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 namespace {
@@ -59,6 +60,7 @@
   }
 
  protected:
+  test::TaskEnvironment task_environment_;
   scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner_;
 };
 
diff --git a/third_party/blink/renderer/core/dom/mutation_observer_test.cc b/third_party/blink/renderer/core/dom/mutation_observer_test.cc
index e6fd903..ab9d7379d 100644
--- a/third_party/blink/renderer/core/dom/mutation_observer_test.cc
+++ b/third_party/blink/renderer/core/dom/mutation_observer_test.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/thread_state.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 
@@ -39,6 +40,7 @@
 }  // namespace
 
 TEST(MutationObserverTest, DisconnectCrash) {
+  test::TaskEnvironment task_environment;
   ScopedNullExecutionContext execution_context;
   Persistent<Document> document =
       HTMLDocument::CreateForTest(execution_context.GetExecutionContext());
diff --git a/third_party/blink/renderer/core/dom/names_map_test.cc b/third_party/blink/renderer/core/dom/names_map_test.cc
index fe923707..c9a79be 100644
--- a/third_party/blink/renderer/core/dom/names_map_test.cc
+++ b/third_party/blink/renderer/core/dom/names_map_test.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/dom/names_map.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
 
 namespace blink {
@@ -26,6 +27,7 @@
 }
 
 TEST(NamesMapTest, Set) {
+  test::TaskEnvironment task_environment;
   // This is vector of pairs where first is an expected output and second is a
   // vector of inputs, all of which should produce that output.
   Vector<std::pair<ExpectedMap, Vector<String>>> test_cases({
@@ -127,6 +129,7 @@
 }
 
 TEST(NamesMapTest, SetNull) {
+  test::TaskEnvironment task_environment;
   NamesMap map;
   map.Set(AtomicString("foo bar"));
   map.Set(g_null_atom);
diff --git a/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc b/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc
index 6e56526..7d834cb 100644
--- a/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc
+++ b/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc
@@ -18,6 +18,7 @@
 #include "third_party/blink/renderer/core/page/page_animator.h"
 #include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
@@ -31,6 +32,7 @@
   ScriptedAnimationController& Controller() { return *controller_; }
 
  private:
+  test::TaskEnvironment task_environment_;
   std::unique_ptr<DummyPageHolder> dummy_page_holder_;
   Persistent<ScriptedAnimationController> controller_;
 };
diff --git a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
index 5dba333..ac0dc48 100644
--- a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
+++ b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
@@ -19,6 +19,7 @@
 #include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_task_queue.h"
 #include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h"
 #include "third_party/blink/renderer/platform/testing/scoped_scheduler_overrider.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 namespace {
@@ -188,6 +189,7 @@
 }  // namespace
 
 TEST(ScriptedIdleTaskControllerTest, RunCallback) {
+  test::TaskEnvironment task_environment;
   MockScriptedIdleTaskControllerScheduler scheduler(ShouldYield(false));
   ScopedSchedulerOverrider scheduler_overrider(&scheduler,
                                                scheduler.TaskRunner());
@@ -210,6 +212,7 @@
 }
 
 TEST(ScriptedIdleTaskControllerTest, DontRunCallbackWhenAskedToYield) {
+  test::TaskEnvironment task_environment;
   MockScriptedIdleTaskControllerScheduler scheduler(ShouldYield(true));
   ScopedSchedulerOverrider scheduler_overrider(&scheduler,
                                                scheduler.TaskRunner());
@@ -232,6 +235,7 @@
 }
 
 TEST(ScriptedIdleTaskControllerTest, RunCallbacksAsyncWhenUnpaused) {
+  test::TaskEnvironment task_environment;
   MockScriptedIdleTaskControllerScheduler scheduler(ShouldYield(true));
   ScopedSchedulerOverrider scheduler_overrider(&scheduler,
                                                scheduler.TaskRunner());
diff --git a/third_party/blink/renderer/core/dom/slot_assignment_test.cc b/third_party/blink/renderer/core/dom/slot_assignment_test.cc
index 3ee0224..2ca4324b 100644
--- a/third_party/blink/renderer/core/dom/slot_assignment_test.cc
+++ b/third_party/blink/renderer/core/dom/slot_assignment_test.cc
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
+#include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
 #include "third_party/blink/renderer/core/dom/node.h"
 #include "third_party/blink/renderer/core/dom/node_traversal.h"
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
@@ -17,6 +16,7 @@
 #include "third_party/blink/renderer/core/html/html_slot_element.h"
 #include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
@@ -57,6 +57,7 @@
  private:
   void SetUp() override;
 
+  test::TaskEnvironment task_environment_;
   Persistent<Document> document_;
   std::unique_ptr<DummyPageHolder> dummy_page_holder_;
 };
diff --git a/third_party/blink/renderer/core/dom/space_split_string_test.cc b/third_party/blink/renderer/core/dom/space_split_string_test.cc
index 376ef3fe..15c345a 100644
--- a/third_party/blink/renderer/core/dom/space_split_string_test.cc
+++ b/third_party/blink/renderer/core/dom/space_split_string_test.cc
@@ -5,10 +5,12 @@
 #include "third_party/blink/renderer/core/dom/space_split_string.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 
 TEST(SpaceSplitStringTest, Set) {
+  test::TaskEnvironment task_environment;
   SpaceSplitString tokens;
 
   tokens.Set(AtomicString("foo"));
@@ -34,6 +36,7 @@
 }
 
 TEST(SpaceSplitStringTest, SerializeToString) {
+  test::TaskEnvironment task_environment;
   SpaceSplitString tokens;
 
   EXPECT_EQ("", tokens.SerializeToString());
diff --git a/third_party/blink/renderer/core/dom/static_range_test.cc b/third_party/blink/renderer/core/dom/static_range_test.cc
index 896ebae..45cafb41 100644
--- a/third_party/blink/renderer/core/dom/static_range_test.cc
+++ b/third_party/blink/renderer/core/dom/static_range_test.cc
@@ -18,6 +18,7 @@
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 
 namespace blink {
@@ -29,6 +30,7 @@
   HTMLDocument& GetDocument() const;
 
  private:
+  test::TaskEnvironment task_environment_;
   ScopedNullExecutionContext execution_context_;
   Persistent<HTMLDocument> document_;
 };
diff --git a/third_party/blink/renderer/core/dom/tree_scope_adopter_test.cc b/third_party/blink/renderer/core/dom/tree_scope_adopter_test.cc
index 101bebd5..3b27c83 100644
--- a/third_party/blink/renderer/core/dom/tree_scope_adopter_test.cc
+++ b/third_party/blink/renderer/core/dom/tree_scope_adopter_test.cc
@@ -13,6 +13,7 @@
 #include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 
@@ -27,6 +28,7 @@
 // TODO(hayato): It's hard to see what's happening in these tests.
 // It would be better to refactor these tests.
 TEST(TreeScopeAdopterTest, SimpleMove) {
+  test::TaskEnvironment task_environment;
   ScopedNullExecutionContext execution_context;
   auto* doc1 = Document::CreateForTest(execution_context.GetExecutionContext());
   auto* doc2 = Document::CreateForTest(execution_context.GetExecutionContext());
@@ -56,6 +58,7 @@
 }
 
 TEST(TreeScopeAdopterTest, MoveNestedShadowRoots) {
+  test::TaskEnvironment task_environment;
   DummyPageHolder source_page_holder;
   auto* source_doc = &source_page_holder.GetDocument();
   NativeEventListener* listener = MakeGarbageCollected<DoNothingListener>();
diff --git a/third_party/blink/renderer/core/dom/tree_scope_test.cc b/third_party/blink/renderer/core/dom/tree_scope_test.cc
index 2d873018..7436acd6 100644
--- a/third_party/blink/renderer/core/dom/tree_scope_test.cc
+++ b/third_party/blink/renderer/core/dom/tree_scope_test.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 
@@ -30,6 +31,7 @@
   }
 
  private:
+  test::TaskEnvironment task_environment_;
   ScopedNullExecutionContext execution_context_;
   Persistent<Document> document_;
   Persistent<Element> body_;
diff --git a/third_party/blink/renderer/core/dom/weak_identifier_map_test.cc b/third_party/blink/renderer/core/dom/weak_identifier_map_test.cc
index 07e1066..6f2cb687 100644
--- a/third_party/blink/renderer/core/dom/weak_identifier_map_test.cc
+++ b/third_party/blink/renderer/core/dom/weak_identifier_map_test.cc
@@ -7,6 +7,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/thread_state.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 
@@ -26,6 +27,7 @@
     ThreadState::Current()->CollectAllGarbageForTesting(
         ThreadState::StackState::kNoHeapPointers);
   }
+  test::TaskEnvironment task_environment_;
 };
 
 DECLARE_WEAK_IDENTIFIER_MAP(WeakIdentifierMapTest::TestClass);
diff --git a/third_party/blink/renderer/core/html/build.gni b/third_party/blink/renderer/core/html/build.gni
index 94e8ef0..ac3d843 100644
--- a/third_party/blink/renderer/core/html/build.gni
+++ b/third_party/blink/renderer/core/html/build.gni
@@ -655,9 +655,9 @@
   "custom/custom_element_test_helpers.cc",
   "custom/custom_element_test_helpers.h",
   "custom/custom_element_upgrade_sorter_test.cc",
+  "fenced_frame/fence_test.cc",
   "fenced_frame/fenced_frame_config_test.cc",
   "fenced_frame/html_fenced_frame_element_test.cc",
-  "fenced_frame/fence_test.cc",
   "forms/email_input_type_test.cc",
   "forms/external_date_time_chooser_test.cc",
   "forms/external_popup_menu_test.cc",
diff --git a/third_party/blink/renderer/core/html/html_image_element.cc b/third_party/blink/renderer/core/html/html_image_element.cc
index abd2828..ca279eeb 100644
--- a/third_party/blink/renderer/core/html/html_image_element.cc
+++ b/third_party/blink/renderer/core/html/html_image_element.cc
@@ -533,16 +533,10 @@
 void HTMLImageElement::AttachLayoutTree(AttachContext& context) {
   HTMLElement::AttachLayoutTree(context);
   if (auto* layout_image = DynamicTo<LayoutImage>(GetLayoutObject())) {
-    LayoutImageResource* layout_image_resource = layout_image->ImageResource();
-    if (is_fallback_image_)
-      layout_image_resource->UseBrokenImage();
-
-    if (layout_image_resource->HasImage())
-      return;
-
-    if (!GetImageLoader().GetContent() && !layout_image_resource->CachedImage())
-      return;
-    layout_image_resource->SetImageResource(GetImageLoader().GetContent());
+    if (is_fallback_image_) {
+      layout_image->ImageResource()->UseBrokenImage();
+    }
+    GetImageLoader().OnAttachLayoutTree();
   }
 }
 
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.cc b/third_party/blink/renderer/core/html/html_plugin_element.cc
index 2e4bfba6..565f4c3 100644
--- a/third_party/blink/renderer/core/html/html_plugin_element.cc
+++ b/third_party/blink/renderer/core/html/html_plugin_element.cc
@@ -251,10 +251,8 @@
     GetDocument().IncrementLoadEventDelayCount();
     GetDocument().LoadPluginsSoon();
   }
-  if (image_loader_ && layout_object->IsLayoutImage()) {
-    LayoutImageResource* image_resource =
-        To<LayoutImage>(layout_object)->ImageResource();
-    image_resource->SetImageResource(image_loader_->GetContent());
+  if (image_loader_ && IsA<LayoutImage>(*layout_object)) {
+    image_loader_->OnAttachLayoutTree();
   }
   if (layout_object->AffectsWhitespaceSiblings())
     context.previous_in_flow = layout_object;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc b/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
index 5eb30ba4..eb8e394 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
@@ -370,6 +370,7 @@
 
   auto* timeupdate_handler = MakeGarbageCollected<MockEventListener>();
   Video()->addEventListener(event_type_names::kTimeupdate, timeupdate_handler);
+  testing::Mock::VerifyAndClearExpectations(timeupdate_handler);
 
   // Simulate conditions where playback is possible.
   SimulateNetworkState(HTMLMediaElement::kNetworkIdle);
diff --git a/third_party/blink/renderer/core/html/media/html_video_element.cc b/third_party/blink/renderer/core/html/media/html_video_element.cc
index 0a5f3580..fde8fc5 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_video_element.cc
@@ -72,17 +72,6 @@
 
 namespace blink {
 
-namespace {
-
-// This enum is used to record histograms. Do not reorder.
-enum VideoPersistenceControlsType {
-  kNative = 0,
-  kCustom = 1,
-  kMaxValue = 1,
-};
-
-}  // anonymous namespace
-
 HTMLVideoElement::HTMLVideoElement(Document& document)
     : HTMLMediaElement(html_names::kVideoTag, document),
       remoting_interstitial_(nullptr),
@@ -161,9 +150,7 @@
     UpdatePosterImage();
   }
   if (image_loader_ && GetLayoutObject()) {
-    LayoutImageResource* layout_image_resource =
-        To<LayoutImage>(*GetLayoutObject()).ImageResource();
-    layout_image_resource->SetImageResource(image_loader_->GetContent());
+    image_loader_->OnAttachLayoutTree();
   }
 }
 
@@ -276,14 +263,6 @@
   is_auto_picture_in_picture_ = persistent;
 
   if (persistent) {
-    // Record the type of video. If it is already fullscreen, it is a video with
-    // native controls, otherwise it is assumed to be with custom controls.
-    // This is only recorded when entering this mode.
-    base::UmaHistogramEnumeration("Media.VideoPersistence.ControlsType",
-                                  IsFullscreen()
-                                      ? VideoPersistenceControlsType::kNative
-                                      : VideoPersistenceControlsType::kCustom);
-
     Element* fullscreen_element =
         Fullscreen::FullscreenElementFrom(GetDocument());
     // Only set the video in persistent mode if it is not using native controls
diff --git a/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.cc
index 74aa5426..d26e1f9 100644
--- a/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.cc
@@ -1146,17 +1146,19 @@
                        : SizingConstraint::kMaxContent);
   };
 
+  auto MinMaxSizesFunc = [&](MinMaxSizesType type) -> MinMaxSizesResult {
+    if (grid_item->IsSubgrid()) {
+      return ComputeMinMaxSizesForSubgrid(
+          sizing_subtree.SubgridSizingSubtree(*grid_item), *grid_item, space);
+    }
+    return node.ComputeMinMaxSizes(item_style.GetWritingMode(), type, space);
+  };
+
   auto MinOrMaxContentSize = [&](bool is_min_content) -> LayoutUnit {
     const auto result =
         grid_item->IsSubgrid()
-            ? ComputeMinAndMaxContentContributionForSelf(
-                  node, space,
-                  [&](MinMaxSizesType) -> MinMaxSizesResult {
-                    const auto& subgrid_sizing_subtree =
-                        sizing_subtree.SubgridSizingSubtree(*grid_item);
-                    return ComputeMinMaxSizesForSubgrid(subgrid_sizing_subtree,
-                                                        *grid_item, space);
-                  })
+            ? ComputeMinAndMaxContentContributionForSelf(node, space,
+                                                         MinMaxSizesFunc)
             : ComputeMinAndMaxContentContributionForSelf(node, space);
 
     // The min/max contribution may depend on the block-size of the grid-area:
@@ -1300,19 +1302,12 @@
             // and apply the transferred min/max sizes when appropriate. We do
             // this sometimes elsewhere so should unify and simplify this code.
             if (is_parallel_with_track_direction) {
-              auto MinMaxSizesFunc =
-                  [&](MinMaxSizesType type) -> MinMaxSizesResult {
-                return node.ComputeMinMaxSizes(item_style.GetWritingMode(),
-                                               type, space);
-              };
-
-              contribution = ResolveMinInlineLength(
-                  space, item_style, border_padding, MinMaxSizesFunc,
-                  item_style.LogicalMinWidth());
-            } else {
               contribution =
-                  ResolveMinBlockLength(space, item_style, border_padding,
-                                        item_style.LogicalMinHeight());
+                  ResolveMinInlineLength(space, item_style, border_padding,
+                                         MinMaxSizesFunc, min_length);
+            } else {
+              contribution = ResolveMinBlockLength(space, item_style,
+                                                   border_padding, min_length);
             }
             break;
           }
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index e1497f6..757f221 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -138,6 +138,7 @@
 #include "third_party/blink/renderer/platform/fonts/font_performance.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/loader/cors/cors.h"
+#include "third_party/blink/renderer/platform/loader/fetch/background_code_cache_host.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
 #include "third_party/blink/renderer/platform/loader/fetch/loader_freeze_mode.h"
@@ -319,6 +320,8 @@
   WebVector<WebHistoryItem> navigation_api_forward_entries;
   Member<HistoryItem> navigation_api_previous_entry;
   std::unique_ptr<CodeCacheHost> code_cache_host;
+  mojo::PendingRemote<mojom::blink::CodeCacheHost>
+      pending_code_cache_host_for_background;
   HashMap<KURL, EarlyHintsPreloadEntry> early_hints_preloaded_resources;
   absl::optional<Vector<KURL>> ad_auction_components;
   std::unique_ptr<ExtraData> extra_data;
@@ -3425,6 +3428,15 @@
   return code_cache_host_.get();
 }
 
+scoped_refptr<BackgroundCodeCacheHost>
+DocumentLoader::CreateBackgroundCodeCacheHost() {
+  if (!pending_code_cache_host_for_background_) {
+    return nullptr;
+  }
+  return base::MakeRefCounted<BackgroundCodeCacheHost>(
+      std::move(pending_code_cache_host_for_background_));
+}
+
 mojo::PendingRemote<mojom::blink::CodeCacheHost>
 DocumentLoader::CreateWorkerCodeCacheHost() {
   if (GetDisableCodeCacheForTesting())
@@ -3437,7 +3449,9 @@
 
 void DocumentLoader::SetCodeCacheHost(
     CrossVariantMojoRemote<mojom::blink::CodeCacheHostInterfaceBase>
-        code_cache_host) {
+        code_cache_host,
+    CrossVariantMojoRemote<mojom::blink::CodeCacheHostInterfaceBase>
+        code_cache_host_for_background) {
   code_cache_host_.reset();
   // When NavigationThreadingOptimizations feature is disabled, code_cache_host
   // can be a nullptr. When this feature is turned off the CodeCacheHost
@@ -3446,6 +3460,10 @@
     code_cache_host_ = std::make_unique<CodeCacheHost>(
         mojo::Remote<mojom::blink::CodeCacheHost>(std::move(code_cache_host)));
   }
+
+  pending_code_cache_host_for_background_ =
+      mojo::PendingRemote<mojom::blink::CodeCacheHost>(
+          std::move(code_cache_host_for_background));
 }
 
 void DocumentLoader::SetSubresourceFilter(
diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h
index 1f85fd2..e185780 100644
--- a/third_party/blink/renderer/core/loader/document_loader.h
+++ b/third_party/blink/renderer/core/loader/document_loader.h
@@ -99,6 +99,7 @@
 
 namespace blink {
 
+class BackgroundCodeCacheHost;
 class ContentSecurityPolicy;
 class CodeCacheHost;
 class Document;
@@ -205,7 +206,9 @@
   }
   void SetCodeCacheHost(
       CrossVariantMojoRemote<mojom::blink::CodeCacheHostInterfaceBase>
-          code_cache_host) override;
+          code_cache_host,
+      CrossVariantMojoRemote<mojom::blink::CodeCacheHostInterfaceBase>
+          code_cache_host_for_background) override;
   WebString OriginCalculationDebugInfo() const override {
     return origin_calculation_debug_info_;
   }
@@ -404,6 +407,7 @@
       const mojom::blink::PrerenderPageActivationParams& params);
 
   CodeCacheHost* GetCodeCacheHost();
+  scoped_refptr<BackgroundCodeCacheHost> CreateBackgroundCodeCacheHost();
   static void DisableCodeCacheForTesting();
 
   mojo::PendingRemote<mojom::blink::CodeCacheHost> CreateWorkerCodeCacheHost();
@@ -808,6 +812,8 @@
   // This is the interface that handles generated code cache
   // requests to fetch code cache when loading resources.
   std::unique_ptr<CodeCacheHost> code_cache_host_;
+  mojo::PendingRemote<mojom::blink::CodeCacheHost>
+      pending_code_cache_host_for_background_;
 
   HashMap<KURL, EarlyHintsPreloadEntry> early_hints_preloaded_resources_;
 
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc
index 1648b5c..6b8fd81 100644
--- a/third_party/blink/renderer/core/loader/image_loader.cc
+++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -853,6 +853,21 @@
   return nullptr;
 }
 
+void ImageLoader::OnAttachLayoutTree() {
+  LayoutImageResource* image_resource = GetLayoutImageResource();
+  if (!image_resource) {
+    return;
+  }
+  // If the LayoutImageResource already has an image, it either means that it
+  // hasn't been freshly created or that it is generated content ("content:
+  // url(...)") - in which case we don't need to do anything or shouldn't do
+  // anything respectively.
+  if (image_resource->HasImage()) {
+    return;
+  }
+  image_resource->SetImageResource(image_content_);
+}
+
 void ImageLoader::UpdateLayoutObject() {
   LayoutImageResource* image_resource = GetLayoutImageResource();
 
diff --git a/third_party/blink/renderer/core/loader/image_loader.h b/third_party/blink/renderer/core/loader/image_loader.h
index 56cd77c..6e7fd3dc 100644
--- a/third_party/blink/renderer/core/loader/image_loader.h
+++ b/third_party/blink/renderer/core/loader/image_loader.h
@@ -82,6 +82,7 @@
                          bool force_blocking = false);
 
   void ElementDidMoveToNewDocument();
+  void OnAttachLayoutTree();
 
   Element* GetElement() const { return element_.Get(); }
   bool ImageComplete() const { return image_complete_; }
diff --git a/third_party/blink/renderer/core/loader/interactive_detector.cc b/third_party/blink/renderer/core/loader/interactive_detector.cc
index 623d3e03..63fff4d 100644
--- a/third_party/blink/renderer/core/loader/interactive_detector.cc
+++ b/third_party/blink/renderer/core/loader/interactive_detector.cc
@@ -8,6 +8,7 @@
 #include "base/profiler/sample_metadata.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/default_tick_clock.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -526,26 +527,34 @@
   if (!interactive_time_.is_null())
     return;
 
+  const bool ignore_fcp =
+      base::FeatureList::IsEnabled(features::kInteractiveDetectorIgnoreFcp);
   // FCP and DCL have not been detected yet.
-  if (page_event_times_.first_contentful_paint.is_null() ||
-      page_event_times_.dom_content_loaded_end.is_null())
+  if ((page_event_times_.first_contentful_paint.is_null() && !ignore_fcp) ||
+      page_event_times_.dom_content_loaded_end.is_null()) {
     return;
+  }
 
   const base::TimeTicks current_time = clock_->NowTicks();
-  if (current_time - page_event_times_.first_contentful_paint <
-      kTimeToInteractiveWindow) {
+  if (!ignore_fcp && (current_time - page_event_times_.first_contentful_paint <
+                      kTimeToInteractiveWindow)) {
     // Too close to FCP to determine Time to Interactive.
     return;
   }
 
   AddCurrentlyActiveNetworkQuietInterval(current_time);
-  const base::TimeTicks interactive_candidate = FindInteractiveCandidate(
+  base::TimeTicks interactive_candidate = FindInteractiveCandidate(
       page_event_times_.first_contentful_paint, current_time);
   RemoveCurrentlyActiveNetworkQuietInterval();
 
   // No Interactive Candidate found.
-  if (interactive_candidate.is_null())
-    return;
+  if (interactive_candidate.is_null()) {
+    if (ignore_fcp) {
+      interactive_candidate = page_event_times_.dom_content_loaded_end;
+    } else {
+      return;
+    }
+  }
 
   interactive_time_ = std::max(
       {interactive_candidate, page_event_times_.dom_content_loaded_end});
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
index 839f294..4fc1e72d 100644
--- a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
+++ b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
@@ -64,17 +64,6 @@
   window.GetFrame()->GetLocalFrameHostRemote().GetKeepAliveHandleFactory(
       keep_alive_handle_factory_.BindNewPipeAndPassReceiver(
           window.GetTaskRunner(TaskType::kNetworking)));
-
-  // LocalFrameClient member may not be valid in some tests.
-  if (window_->GetFrame()->Client() &&
-      window_->GetFrame()->Client()->GetWebFrame() &&
-      window_->GetFrame()->Client()->GetWebFrame()->Client()) {
-    throttle_provider_ = window_->GetFrame()
-                             ->Client()
-                             ->GetWebFrame()
-                             ->Client()
-                             ->CreateWebURLLoaderThrottleProviderForFrame();
-  }
 }
 
 void LoaderFactoryForFrame::Trace(Visitor* visitor) const {
@@ -92,15 +81,8 @@
     scoped_refptr<base::SingleThreadTaskRunner> unfreezable_task_runner,
     BackForwardCacheLoaderHelper* back_forward_cache_loader_helper) {
   WrappedResourceRequest webreq(request);
-  Vector<std::unique_ptr<URLLoaderThrottle>> throttles;
-  if (throttle_provider_) {
-    WebVector<std::unique_ptr<URLLoaderThrottle>> web_throttles =
-        throttle_provider_->CreateThrottles(webreq);
-    throttles.reserve(base::checked_cast<wtf_size_t>(web_throttles.size()));
-    for (auto& throttle : web_throttles) {
-      throttles.push_back(std::move(throttle));
-    }
-  }
+  Vector<std::unique_ptr<URLLoaderThrottle>> throttles =
+      CreateThrottles(webreq);
 
   mojo::PendingRemote<network::mojom::blink::URLLoaderFactory>
       url_loader_factory;
@@ -241,17 +223,39 @@
 scoped_refptr<BackgroundCodeCacheHost>
 LoaderFactoryForFrame::GetBackgroundCodeCacheHost() {
   if (!background_code_cache_host_) {
-    // TODO(crbug.com/1379780): Consider passing a pending_remote in the
-    // navigation IPC instead.
-    mojo::PendingRemote<mojom::blink::CodeCacheHost> pending_remote;
-    document_loader_->GetFrame()
-        ->Client()
-        ->GetBrowserInterfaceBroker()
-        .GetInterface(pending_remote.InitWithNewPipeAndPassReceiver());
-    background_code_cache_host_ = base::MakeRefCounted<BackgroundCodeCacheHost>(
-        std::move(pending_remote));
+    background_code_cache_host_ =
+        document_loader_->CreateBackgroundCodeCacheHost();
   }
   return background_code_cache_host_;
 }
 
+Vector<std::unique_ptr<URLLoaderThrottle>>
+LoaderFactoryForFrame::CreateThrottles(const WebURLRequest& web_url_request) {
+  // LocalFrameClient member may not be valid in some tests.
+  if (!window_->GetFrame()->Client() ||
+      !window_->GetFrame()->Client()->GetWebFrame() ||
+      !window_->GetFrame()->Client()->GetWebFrame()->Client()) {
+    return {};
+  }
+  URLLoaderThrottleProvider* throttle_provider =
+      window_->GetFrame()
+          ->Client()
+          ->GetWebFrame()
+          ->Client()
+          ->GetURLLoaderThrottleProvider();
+  if (!throttle_provider) {
+    return {};
+  }
+  WebVector<std::unique_ptr<URLLoaderThrottle>> web_throttles =
+      throttle_provider->CreateThrottles(
+          window_->GetFrame()->GetLocalFrameToken(), web_url_request);
+  Vector<std::unique_ptr<URLLoaderThrottle>> throttles;
+
+  throttles.reserve(base::checked_cast<wtf_size_t>(web_throttles.size()));
+  for (auto& throttle : web_throttles) {
+    throttles.push_back(std::move(throttle));
+  }
+  return throttles;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_frame.h b/third_party/blink/renderer/core/loader/loader_factory_for_frame.h
index 8575450..86630eb2 100644
--- a/third_party/blink/renderer/core/loader/loader_factory_for_frame.h
+++ b/third_party/blink/renderer/core/loader/loader_factory_for_frame.h
@@ -50,12 +50,13 @@
       mojom::blink::LocalFrameHost& local_frame_host,
       mojo::PendingReceiver<mojom::blink::KeepAliveHandle> pending_receiver);
   scoped_refptr<BackgroundCodeCacheHost> GetBackgroundCodeCacheHost();
+  Vector<std::unique_ptr<URLLoaderThrottle>> CreateThrottles(
+      const WebURLRequest&);
 
   const Member<DocumentLoader> document_loader_;
   const Member<LocalDOMWindow> window_;
   const Member<PrefetchedSignedExchangeManager>
       prefetched_signed_exchange_manager_;
-  std::unique_ptr<WebURLLoaderThrottleProviderForFrame> throttle_provider_;
   HeapMojoRemote<mojom::blink::KeepAliveHandleFactory>
       keep_alive_handle_factory_;
   scoped_refptr<BackgroundCodeCacheHost> background_code_cache_host_;
diff --git a/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc b/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc
index 4217bfb..14fc5f8 100644
--- a/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc
+++ b/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc
@@ -30,7 +30,6 @@
 #include "third_party/blink/renderer/core/loader/mixed_content_checker.h"
 #include "third_party/blink/renderer/core/loader/preload_helper.h"
 #include "third_party/blink/renderer/core/loader/progress_tracker.h"
-#include "third_party/blink/renderer/core/loader/subresource_filter.h"
 #include "third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h"
@@ -187,10 +186,6 @@
   LocalFrame* frame = document_->GetFrame();
   DCHECK(frame);
   LocalFrameClient* frame_client = frame->Client();
-  SubresourceFilter* subresource_filter =
-      document_loader_->GetSubresourceFilter();
-  if (subresource_filter && resource->GetResourceRequest().IsAdResource())
-    subresource_filter->ReportAdRequestId(response.RequestId());
 
   DCHECK(frame_client);
   if (response_source == ResponseSource::kFromMemoryCache) {
diff --git a/third_party/blink/renderer/core/loader/subresource_filter.cc b/third_party/blink/renderer/core/loader/subresource_filter.cc
index f82d69bc1..9126c3d0 100644
--- a/third_party/blink/renderer/core/loader/subresource_filter.cc
+++ b/third_party/blink/renderer/core/loader/subresource_filter.cc
@@ -43,15 +43,6 @@
     : execution_context_(execution_context),
       subresource_filter_(std::move(subresource_filter)) {
   DCHECK(subresource_filter_);
-  // Report the main resource as an ad if the subresource filter is
-  // associated with an ad subframe.
-  if (auto* window = DynamicTo<LocalDOMWindow>(execution_context_.Get())) {
-    auto* frame = window->GetFrame();
-    if (frame->IsAdFrame()) {
-      ReportAdRequestId(
-          frame->Loader().GetDocumentLoader()->GetResponse().RequestId());
-    }
-  }
 }
 
 SubresourceFilter::~SubresourceFilter() = default;
@@ -120,10 +111,6 @@
   return load_policy != WebDocumentSubresourceFilter::kAllow;
 }
 
-void SubresourceFilter::ReportAdRequestId(int request_id) {
-  subresource_filter_->ReportAdRequestId(request_id);
-}
-
 void SubresourceFilter::ReportLoad(
     const KURL& resource_url,
     WebDocumentSubresourceFilter::LoadPolicy load_policy) {
diff --git a/third_party/blink/renderer/core/loader/subresource_filter.h b/third_party/blink/renderer/core/loader/subresource_filter.h
index d1d338c..00d7450 100644
--- a/third_party/blink/renderer/core/loader/subresource_filter.h
+++ b/third_party/blink/renderer/core/loader/subresource_filter.h
@@ -40,8 +40,6 @@
 
   // Returns if |resource_url| is an ad resource.
   bool IsAdResource(const KURL& resource_url, mojom::blink::RequestContextType);
-  // Reports the resource request id as an ad to the |subresource_filter_|.
-  void ReportAdRequestId(int request_id);
 
   virtual void Trace(Visitor*) const;
 
diff --git a/third_party/blink/renderer/core/svg/svg_image_element.cc b/third_party/blink/renderer/core/svg/svg_image_element.cc
index b6ae95f..e88337180 100644
--- a/third_party/blink/renderer/core/svg/svg_image_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_image_element.cc
@@ -210,12 +210,8 @@
 
 void SVGImageElement::AttachLayoutTree(AttachContext& context) {
   SVGGraphicsElement::AttachLayoutTree(context);
-
-  if (auto* image_obj = To<LayoutSVGImage>(GetLayoutObject())) {
-    LayoutImageResource* layout_image_resource = image_obj->ImageResource();
-    if (layout_image_resource->HasImage())
-      return;
-    layout_image_resource->SetImageResource(GetImageLoader().GetContent());
+  if (GetLayoutObject()) {
+    GetImageLoader().OnAttachLayoutTree();
   }
 }
 
diff --git a/third_party/blink/renderer/platform/exported/resource_load_info_notifier_wrapper.cc b/third_party/blink/renderer/platform/exported/resource_load_info_notifier_wrapper.cc
index ac94b2c..75ebe1b 100644
--- a/third_party/blink/renderer/platform/exported/resource_load_info_notifier_wrapper.cc
+++ b/third_party/blink/renderer/platform/exported/resource_load_info_notifier_wrapper.cc
@@ -64,7 +64,8 @@
     const std::string& http_method,
     const GURL& referrer,
     network::mojom::RequestDestination request_destination,
-    net::RequestPriority request_priority) {
+    net::RequestPriority request_priority,
+    bool is_ad_resource) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   DCHECK(!resource_load_info_);
@@ -77,6 +78,7 @@
   resource_load_info_->referrer = referrer;
   resource_load_info_->network_info = mojom::CommonNetworkInfo::New();
   resource_load_info_->request_priority = request_priority;
+  is_ad_resource_ = is_ad_resource;
 }
 
 void ResourceLoadInfoNotifierWrapper::NotifyResourceRedirectReceived(
@@ -133,7 +135,8 @@
       weak_wrapper_resource_load_info_notifier_->NotifyResourceResponseReceived(
           resource_load_info_->request_id,
           url::SchemeHostPort(resource_load_info_->final_url),
-          std::move(response_head), resource_load_info_->request_destination);
+          std::move(response_head), resource_load_info_->request_destination,
+          is_ad_resource_);
     }
     return;
   }
@@ -150,7 +153,8 @@
           weak_wrapper_resource_load_info_notifier_,
           resource_load_info_->request_id,
           url::SchemeHostPort(resource_load_info_->final_url),
-          std::move(response_head), resource_load_info_->request_destination));
+          std::move(response_head), resource_load_info_->request_destination,
+          is_ad_resource_));
 }
 
 void ResourceLoadInfoNotifierWrapper::NotifyResourceTransferSizeUpdated(
diff --git a/third_party/blink/renderer/platform/exported/weak_wrapper_resource_load_info_notifier.cc b/third_party/blink/renderer/platform/exported/weak_wrapper_resource_load_info_notifier.cc
index 0d69fd30..82636f6 100644
--- a/third_party/blink/renderer/platform/exported/weak_wrapper_resource_load_info_notifier.cc
+++ b/third_party/blink/renderer/platform/exported/weak_wrapper_resource_load_info_notifier.cc
@@ -37,11 +37,12 @@
     int64_t request_id,
     const url::SchemeHostPort& final_response_url,
     network::mojom::URLResponseHeadPtr response_head,
-    network::mojom::RequestDestination request_destination) {
+    network::mojom::RequestDestination request_destination,
+    bool is_ad_resource) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   resource_load_info_notifier_->NotifyResourceResponseReceived(
       request_id, final_response_url, std::move(response_head),
-      request_destination);
+      request_destination, is_ad_resource);
 }
 
 void WeakWrapperResourceLoadInfoNotifier::NotifyResourceTransferSizeUpdated(
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
index 92975cb..a864d48 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -41,6 +41,7 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/unguessable_token.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "net/base/load_flags.h"
 #include "services/metrics/public/cpp/metrics_utils.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/network/public/cpp/cross_origin_embedder_policy.h"
@@ -161,22 +162,6 @@
   builder.Record(recorder);
 }
 
-bool CanHandleDataURLRequestLocally(const ResourceRequestHead& request) {
-  if (!request.Url().ProtocolIsData()) {
-    return false;
-  }
-
-  // The fast paths for data URL, Start() and HandleDataURL(), don't support
-  // the DownloadToBlob option.
-  if (request.DownloadToBlob()) {
-    return false;
-  }
-
-  // Main resources are handled in the browser, so we can handle data url
-  // subresources locally.
-  return true;
-}
-
 bool RequestContextObserveResponse(mojom::blink::RequestContextType type) {
   switch (type) {
     case mojom::blink::RequestContextType::PING:
@@ -217,6 +202,50 @@
   }
 }
 
+bool ShouldActivateCacheAwareLoading(const ResourceFetcher* fetcher,
+                                     const Resource* resource) {
+  if (resource->Options().cache_aware_loading_enabled !=
+      kIsCacheAwareLoadingEnabled) {
+    return false;
+  }
+
+  // Synchronous requests are not supported.
+  if (resource->Options().synchronous_policy == kRequestSynchronously) {
+    return false;
+  }
+
+  // Don't activate on Resource revalidation.
+  if (resource->IsCacheValidator()) {
+    return false;
+  }
+
+  // Don't activate if cache policy is explicitly set.
+  if (resource->GetResourceRequest().GetCacheMode() !=
+      mojom::blink::FetchCacheMode::kDefault) {
+    return false;
+  }
+
+  // Don't activate if the page is controlled by service worker.
+  if (fetcher->IsControlledByServiceWorker() !=
+      mojom::blink::ControllerServiceWorkerMode::kNoController) {
+    return false;
+  }
+  return true;
+}
+
+std::unique_ptr<network::ResourceRequest> CreateNetworkRequest(
+    const ResourceRequestHead& request_head,
+    ResourceRequestBody& request_body) {
+  auto network_resource_request = std::make_unique<network::ResourceRequest>();
+  scoped_refptr<EncodedFormData> form_body = request_body.FormBody();
+  PopulateResourceRequest(request_head, std::move(request_body),
+                          network_resource_request.get());
+  if (form_body) {
+    request_body = ResourceRequestBody(std::move(form_body));
+  }
+  return network_resource_request;
+}
+
 }  // namespace
 
 ResourceLoader::ResourceLoader(ResourceFetcher* fetcher,
@@ -231,7 +260,8 @@
       resource_(resource),
       request_body_(std::move(request_body)),
       inflight_keepalive_bytes_(inflight_keepalive_bytes),
-      is_cache_aware_loading_activated_(false),
+      is_cache_aware_loading_activated_(
+          ShouldActivateCacheAwareLoading(fetcher, resource)),
       progress_receiver_(this, context),
       cancel_timer_(fetcher_->GetTaskRunner(),
                     this,
@@ -283,9 +313,23 @@
 
 void ResourceLoader::Start() {
   const ResourceRequestHead& request = resource_->GetResourceRequest();
-  ActivateCacheAwareLoadingIfNeeded(request);
-  loader_ = fetcher_->CreateURLLoader(request, resource_->Options());
-  task_runner_for_body_loader_ = loader_->GetTaskRunnerForBodyLoader();
+
+  if (!resource_->Url().ProtocolIsData()) {
+    network_resource_request_ = CreateNetworkRequest(request, request_body_);
+    if (is_cache_aware_loading_activated_) {
+      // Override cache policy for cache-aware loading. If this request fails, a
+      // reload with original request will be triggered in DidFail().
+      network_resource_request_->load_flags |= net::LOAD_ONLY_FROM_CACHE;
+    }
+    loader_ = fetcher_->CreateURLLoader(request, resource_->Options());
+    task_runner_for_body_loader_ = loader_->GetTaskRunnerForBodyLoader();
+  } else {
+    // ResourceLoader doesn't support DownloadToBlob option for data URL. This
+    // logic is implemented inside XMLHttpRequest.
+    CHECK(!resource_->GetResourceRequest().DownloadToBlob());
+    task_runner_for_body_loader_ = fetcher_->GetTaskRunner();
+  }
+
   DCHECK_EQ(ResourceLoadScheduler::kInvalidClientId, scheduler_client_id_);
   auto throttle_option = ResourceLoadScheduler::ThrottleOption::kThrottleable;
 
@@ -342,7 +386,7 @@
 void ResourceLoader::Run() {
   // TODO(crbug.com/1169032): Manage cookies' capability control here for the
   // Prerender2.
-  StartWith(resource_->GetResourceRequest());
+  StartFetch();
 }
 
 void ResourceLoader::DidReceiveData(base::span<const char> data) {
@@ -375,10 +419,8 @@
   Cancel();
 }
 
-void ResourceLoader::StartWith(const ResourceRequestHead& request) {
+void ResourceLoader::StartFetch() {
   DCHECK_NE(ResourceLoadScheduler::kInvalidClientId, scheduler_client_id_);
-  DCHECK(loader_);
-
   if (resource_->Options().synchronous_policy == kRequestSynchronously &&
       fetcher_->GetProperties().FreezeMode() != LoaderFreezeMode::kNone) {
     // TODO(yuzus): Evict bfcache if necessary.
@@ -386,24 +428,12 @@
     return;
   }
 
-  is_downloading_to_blob_ = request.DownloadToBlob();
-
   SetDefersLoading(fetcher_->GetProperties().FreezeMode());
 
-  if (is_cache_aware_loading_activated_) {
-    // Override cache policy for cache-aware loading. If this request fails, a
-    // reload with original request will be triggered in DidFail().
-    ResourceRequestHead cache_aware_request(request);
-    cache_aware_request.SetCacheMode(
-        mojom::FetchCacheMode::kUnspecifiedOnlyIfCachedStrict);
-    RequestAsynchronously(cache_aware_request);
-    return;
-  }
-
   if (resource_->Options().synchronous_policy == kRequestSynchronously) {
-    RequestSynchronously(request);
+    RequestSynchronously();
   } else {
-    RequestAsynchronously(request);
+    RequestAsynchronously();
   }
 }
 
@@ -417,15 +447,18 @@
   feature_handle_for_scheduler_.reset();
 }
 
-void ResourceLoader::Restart(const ResourceRequestHead& request) {
+void ResourceLoader::Restart() {
+  const ResourceRequestHead& request = resource_->GetResourceRequest();
   CHECK_EQ(resource_->Options().synchronous_policy, kRequestAsynchronously);
+  CHECK(!network_resource_request_);
+  CHECK(!resource_->Url().ProtocolIsData());
+  network_resource_request_ = CreateNetworkRequest(request, request_body_);
   loader_ = fetcher_->CreateURLLoader(request, resource_->Options());
   task_runner_for_body_loader_ = loader_->GetTaskRunnerForBodyLoader();
-  StartWith(request);
+  StartFetch();
 }
 
 void ResourceLoader::SetDefersLoading(LoaderFreezeMode mode) {
-  DCHECK(loader_);
   freeze_mode_ = mode;
 
   if (response_body_loader_) {
@@ -452,7 +485,9 @@
     }
   }
 
-  loader_->Freeze(mode);
+  if (loader_) {
+    loader_->Freeze(mode);
+  }
   if (mode != LoaderFreezeMode::kNone) {
     resource_->VirtualTimePauser().UnpauseVirtualTime();
   } else {
@@ -463,11 +498,12 @@
 void ResourceLoader::DidChangePriority(ResourceLoadPriority load_priority,
                                        int intra_priority_value) {
   if (scheduler_->IsRunning(scheduler_client_id_)) {
-    DCHECK(loader_);
     DCHECK_NE(ResourceLoadScheduler::kInvalidClientId, scheduler_client_id_);
-    loader_->DidChangePriority(
-        static_cast<WebURLRequest::Priority>(load_priority),
-        intra_priority_value);
+    if (loader_) {
+      loader_->DidChangePriority(
+          static_cast<WebURLRequest::Priority>(load_priority),
+          intra_priority_value);
+    }
   } else {
     scheduler_->SetPriority(scheduler_client_id_, load_priority,
                             intra_priority_value);
@@ -481,7 +517,7 @@
 }
 
 void ResourceLoader::CancelTimerFired(TimerBase*) {
-  if (loader_ && !resource_->HasClientsOrObservers()) {
+  if (IsLoading() && !resource_->HasClientsOrObservers()) {
     Cancel();
   }
 }
@@ -492,7 +528,7 @@
 }
 
 bool ResourceLoader::IsLoading() const {
-  return !!loader_;
+  return !finished_;
 }
 
 void ResourceLoader::CancelForRedirectAccessCheckError(
@@ -500,7 +536,7 @@
     ResourceRequestBlockedReason blocked_reason) {
   resource_->WillNotFollowRedirect();
 
-  if (loader_) {
+  if (IsLoading()) {
     HandleError(
         ResourceError::CancelledDueToAccessCheckError(new_url, blocked_reason));
   }
@@ -726,7 +762,7 @@
     return;
   }
 
-  if (is_downloading_to_blob_) {
+  if (resource_->GetResourceRequest().DownloadToBlob()) {
     DCHECK(!blob_response_started_);
     blob_response_started_ = true;
 
@@ -1010,7 +1046,8 @@
 
   if ((response_body_loader_ && !has_seen_end_of_body_ &&
        !response_body_loader_->IsAborted()) ||
-      (is_downloading_to_blob_ && !blob_finished_ && blob_response_started_)) {
+      (resource_->GetResourceRequest().DownloadToBlob() && !blob_finished_ &&
+       blob_response_started_)) {
     // If the body is still being loaded, we defer the completion until all the
     // body is received.
     deferred_finish_loading_info_ =
@@ -1029,6 +1066,7 @@
   response_body_loader_ = nullptr;
   has_seen_end_of_body_ = false;
   deferred_finish_loading_info_ = absl::nullopt;
+  finished_ = true;
 
   TRACE_EVENT_NESTABLE_ASYNC_END1(
       TRACE_DISABLED_BY_DEFAULT("network"), "ResourceLoad",
@@ -1088,7 +1126,7 @@
       !fetcher_->GetProperties().ShouldBlockLoadingSubResource()) {
     resource_->WillReloadAfterDiskCacheMiss();
     is_cache_aware_loading_activated_ = false;
-    Restart(resource_->GetResourceRequest());
+    Restart();
     return;
   }
   if (error.CorsErrorStatus() &&
@@ -1110,6 +1148,7 @@
   response_body_loader_ = nullptr;
   has_seen_end_of_body_ = false;
   deferred_finish_loading_info_ = absl::nullopt;
+  finished_ = true;
 
   TRACE_EVENT_NESTABLE_ASYNC_END1(
       TRACE_DISABLED_BY_DEFAULT("network"), "ResourceLoad",
@@ -1128,25 +1167,22 @@
                               inflight_keepalive_bytes_);
 }
 
-void ResourceLoader::RequestSynchronously(const ResourceRequestHead& request) {
-  DCHECK(loader_);
-  DCHECK_EQ(request.Priority(), ResourceLoadPriority::kHighest);
+void ResourceLoader::RequestSynchronously() {
+  DCHECK(IsLoading());
+  DCHECK_EQ(resource_->GetResourceRequest().Priority(),
+            ResourceLoadPriority::kHighest);
 
-  auto network_resource_request = std::make_unique<network::ResourceRequest>();
-  scoped_refptr<EncodedFormData> form_body = request_body_.FormBody();
-  PopulateResourceRequest(request, std::move(request_body_),
-                          network_resource_request.get());
-  if (form_body) {
-    request_body_ = ResourceRequestBody(std::move(form_body));
-  }
   WebURLResponse response_out;
   absl::optional<WebURLError> error_out;
   scoped_refptr<SharedBuffer> data_out;
   int64_t encoded_data_length = URLLoaderClient::kUnknownEncodedDataLength;
   uint64_t encoded_body_length = 0;
   scoped_refptr<BlobDataHandle> downloaded_blob;
+  const ResourceRequestHead& request = resource_->GetResourceRequest();
 
-  if (CanHandleDataURLRequestLocally(request)) {
+  if (resource_->Url().ProtocolIsData()) {
+    CHECK(!network_resource_request_);
+    CHECK(!loader_);
     // We don't have to verify mime type again since it's allowed to handle
     // the data url with invalid mime type in some cases.
     // CanHandleDataURLRequestLocally() has already checked if the data url can
@@ -1160,11 +1196,13 @@
       data_out = std::move(data);
     }
   } else {
+    CHECK(network_resource_request_);
+    CHECK(loader_);
     // Don't do mime sniffing for fetch (crbug.com/2016)
     bool no_mime_sniffing = request.GetRequestContext() ==
                             blink::mojom::blink::RequestContextType::FETCH;
     loader_->LoadSynchronously(
-        std::move(network_resource_request), Context().GetTopFrameOrigin(),
+        std::move(network_resource_request_), Context().GetTopFrameOrigin(),
         request.DownloadToBlob(), no_mime_sniffing, request.TimeoutInterval(),
         this, response_out, error_out, data_out, encoded_data_length,
         encoded_body_length, downloaded_blob,
@@ -1209,33 +1247,29 @@
                    encoded_body_length, decoded_body_length);
 }
 
-void ResourceLoader::RequestAsynchronously(const ResourceRequestHead& request) {
-  DCHECK(loader_);
-  if (CanHandleDataURLRequestLocally(request)) {
+void ResourceLoader::RequestAsynchronously() {
+  if (resource_->Url().ProtocolIsData()) {
+    CHECK(!network_resource_request_);
+    CHECK(!loader_);
     // Handle DataURL in another task instead of using |loader_|.
     GetLoadingTaskRunner()->PostTask(
         FROM_HERE, WTF::BindOnce(&ResourceLoader::HandleDataUrl,
                                  WrapWeakPersistent(this)));
     return;
   }
+  CHECK(loader_);
+  CHECK(network_resource_request_);
 
-  auto network_resource_request = std::make_unique<network::ResourceRequest>();
   // Don't do mime sniffing for fetch (crbug.com/2016)
-  bool no_mime_sniffing = request.GetRequestContext() ==
+  bool no_mime_sniffing = resource_->GetResourceRequest().GetRequestContext() ==
                           blink::mojom::blink::RequestContextType::FETCH;
-  scoped_refptr<EncodedFormData> form_body = request_body_.FormBody();
-  PopulateResourceRequest(request, std::move(request_body_),
-                          network_resource_request.get());
-  if (form_body) {
-    request_body_ = ResourceRequestBody(std::move(form_body));
-  }
 
   // Don't pass a CodeCacheHost when DownloadToBlob is true. The detailed
   // decision logic for whether or not to fetch code cache from the isolated
   // code cache is implemented in ResourceRequestSender::CodeCacheFetcher. We
   // only check the DownloadToBlob flag here, which ResourceRequestSender cannot
   // know.
-  loader_->LoadAsynchronously(std::move(network_resource_request),
+  loader_->LoadAsynchronously(std::move(network_resource_request_),
                               Context().GetTopFrameOrigin(), no_mime_sniffing,
                               Context().CreateResourceLoadInfoNotifierWrapper(),
                               !resource_->GetResourceRequest().DownloadToBlob()
@@ -1258,39 +1292,6 @@
   }
 }
 
-void ResourceLoader::ActivateCacheAwareLoadingIfNeeded(
-    const ResourceRequestHead& request) {
-  DCHECK(!is_cache_aware_loading_activated_);
-
-  if (resource_->Options().cache_aware_loading_enabled !=
-      kIsCacheAwareLoadingEnabled) {
-    return;
-  }
-
-  // Synchronous requests are not supported.
-  if (resource_->Options().synchronous_policy == kRequestSynchronously) {
-    return;
-  }
-
-  // Don't activate on Resource revalidation.
-  if (resource_->IsCacheValidator()) {
-    return;
-  }
-
-  // Don't activate if cache policy is explicitly set.
-  if (request.GetCacheMode() != mojom::FetchCacheMode::kDefault) {
-    return;
-  }
-
-  // Don't activate if the page is controlled by service worker.
-  if (fetcher_->IsControlledByServiceWorker() !=
-      blink::mojom::ControllerServiceWorkerMode::kNoController) {
-    return;
-  }
-
-  is_cache_aware_loading_activated_ = true;
-}
-
 bool ResourceLoader::ShouldBeKeptAliveWhenDetached() const {
   if (base::FeatureList::IsEnabled(
           blink::features::kKeepAliveInBrowserMigration) &&
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
index b09af5b..a9cd89e 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
@@ -109,10 +109,6 @@
 
   void DidChangePriority(ResourceLoadPriority, int intra_priority_value);
 
-  // Called before start() to activate cache-aware loading if enabled in
-  // |m_resource->options()| and applicable.
-  void ActivateCacheAwareLoadingIfNeeded(const ResourceRequestHead&);
-
   bool IsCacheAwareLoadingActivated() const {
     return is_cache_aware_loading_activated_;
   }
@@ -189,15 +185,14 @@
   void DidCancelLoadingBody() override;
 
   bool ShouldFetchCodeCache();
-  void StartWith(const ResourceRequestHead&);
+  void StartFetch();
 
   void Release(ResourceLoadScheduler::ReleaseOption,
                const ResourceLoadScheduler::TrafficReportHints&);
 
-  // This method is currently only used for service worker fallback request and
-  // cache-aware loading, other users should be careful not to break
-  // ResourceLoader state.
-  void Restart(const ResourceRequestHead&);
+  // This method is currently only used for cache-aware loading, other users
+  // should be careful not to break ResourceLoader state.
+  void Restart();
 
   FetchContext& Context() const;
 
@@ -207,8 +202,8 @@
 
   void CancelForRedirectAccessCheckError(const KURL&,
                                          ResourceRequestBlockedReason);
-  void RequestSynchronously(const ResourceRequestHead&);
-  void RequestAsynchronously(const ResourceRequestHead&);
+  void RequestSynchronously();
+  void RequestAsynchronously();
   void Dispose();
 
   void DidReceiveResponseInternal(
@@ -245,7 +240,13 @@
   void CountPrivateNetworkAccessPreflightResult(
       network::mojom::PrivateNetworkAccessPreflightResult result);
 
+  // The request object which will be passed to URLLoader. This is not used when
+  // the request URL is a data URL.
+  std::unique_ptr<network::ResourceRequest> network_resource_request_;
+
+  // Used only for non-data URL request.
   std::unique_ptr<URLLoader> loader_;
+
   ResourceLoadScheduler::ClientId scheduler_client_id_;
   Member<ResourceFetcher> fetcher_;
   Member<ResourceLoadScheduler> scheduler_;
@@ -261,7 +262,6 @@
   uint32_t inflight_keepalive_bytes_;
   bool is_cache_aware_loading_activated_;
 
-  bool is_downloading_to_blob_ = false;
   blink::HeapMojoAssociatedReceiver<mojom::blink::ProgressClient,
                                     blink::ResourceLoader>
       progress_receiver_;
@@ -292,6 +292,7 @@
 
   int64_t received_body_length_from_service_worker_ = 0;
   CnameAliasInfoForTesting cname_alias_info_for_testing_;
+  bool finished_ = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader.cc
index 3181ff69a..10c455a7 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader.cc
@@ -343,7 +343,7 @@
         cors_exempt_header_list, base::MakeRefCounted<RequestClient>(this),
         background_resource_fetch_context->GetLoaderFactory(),
         std::move(throttles), std::move(resource_load_info_notifier_wrapper),
-        should_use_code_cache_host
+        should_use_code_cache_host && background_code_cache_host_
             ? &background_code_cache_host_->GetCodeCacheHost(
                   background_task_runner_)
             : nullptr,
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
index 17f5498..1eec790 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
@@ -592,7 +592,8 @@
     std::unique_ptr<ResourceLoadInfoNotifierWrapper>
         resource_load_info_notifier_wrapper,
     bool is_main_frame,
-    WebNavigationParams* navigation_params) {
+    WebNavigationParams* navigation_params,
+    bool is_ad_frame) {
   // Use the original navigation url to start with. We'll replay the
   // redirects afterwards and will eventually arrive to the final url.
   const KURL original_url = !commit_params->original_url.is_empty()
@@ -604,7 +605,7 @@
       !commit_params->original_method.empty() ? commit_params->original_method
                                               : common_params->method,
       common_params->referrer->url, common_params->request_destination,
-      is_main_frame ? net::HIGHEST : net::LOWEST);
+      is_main_frame ? net::HIGHEST : net::LOWEST, is_ad_frame);
   size_t redirect_count = commit_params->redirect_response.size();
 
   if (redirect_count != commit_params->redirects.size()) {
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader_unittest.cc
index 97c0e925..d8596066 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader_unittest.cc
@@ -83,7 +83,7 @@
         std::move(endpoints), scheduler::GetSingleThreadTaskRunnerForTesting(),
         std::make_unique<ResourceLoadInfoNotifierWrapper>(
             /*resource_load_info_notifier=*/nullptr),
-        /*is_main_frame=*/true, &navigation_params);
+        /*is_main_frame=*/true, &navigation_params, /*is_ad_frame=*/false);
     loader_ = std::move(navigation_params.body_loader);
   }
 
@@ -458,7 +458,7 @@
       scheduler::GetSingleThreadTaskRunnerForTesting(),
       std::make_unique<ResourceLoadInfoNotifierWrapper>(
           /*resource_load_info_notifier=*/nullptr),
-      /*is_main_frame=*/true, &navigation_params);
+      /*is_main_frame=*/true, &navigation_params, /*is_ad_frame=*/false);
   EXPECT_TRUE(
       navigation_params.response.ToResourceResponse().GetSSLInfo().has_value());
 }
@@ -507,7 +507,7 @@
       scheduler::GetSingleThreadTaskRunnerForTesting(),
       std::make_unique<ResourceLoadInfoNotifierWrapper>(
           /*resource_load_info_notifier=*/nullptr),
-      /*is_main_frame=*/true, &navigation_params);
+      /*is_main_frame=*/true, &navigation_params, /*is_ad_frame=*/false);
   ASSERT_EQ(navigation_params.redirects.size(), 2u);
   ASSERT_EQ(navigation_params.redirects[0].new_referrer,
             WebString(Referrer::NoReferrer()));
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.cc
index 4be9c0c374..978fcfb 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.cc
@@ -521,9 +521,10 @@
       std::move(resource_load_info_notifier_wrapper));
 
   request_info_->resource_load_info_notifier_wrapper
-      ->NotifyResourceLoadInitiated(
-          request_id, request->url, request->method, request->referrer,
-          request_info_->request_destination, request->priority);
+      ->NotifyResourceLoadInitiated(request_id, request->url, request->method,
+                                    request->referrer,
+                                    request_info_->request_destination,
+                                    request->priority, request->is_ad_tagged);
 
   auto url_loader_client = std::make_unique<MojoURLLoaderClient>(
       this, loading_task_runner, url_loader_factory->BypassRedirectChecks(),
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.cc
index e0528d3b..4f879a1 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.cc
@@ -58,11 +58,13 @@
   // TODO(crbug.com/929370): Support CSP check to post violation reports for
   // worker top-level scripts, if off-the-main-thread fetch is enabled.
 
+  // Currently we don't support ad resource check for the worker scripts.
   resource_load_info_notifier_wrapper_->NotifyResourceLoadInitiated(
       request_id_, GURL(initial_request_url_),
       initial_request_.HttpMethod().Latin1(),
       WebStringToGURL(WebString(initial_request_.ReferrerString())),
-      initial_request_.GetRequestDestination(), net::HIGHEST);
+      initial_request_.GetRequestDestination(), net::HIGHEST,
+      /*is_ad_resource=*/false);
 
   if (!worker_main_script_load_params->redirect_responses.empty()) {
     HandleRedirections(worker_main_script_load_params->redirect_infos,
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader_unittest.cc
index af415d6..e11f695a 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader_unittest.cc
@@ -125,7 +125,8 @@
         int64_t request_id,
         const url::SchemeHostPort& final_url,
         network::mojom::URLResponseHeadPtr head,
-        network::mojom::RequestDestination request_destination) override {}
+        network::mojom::RequestDestination request_destination,
+        bool is_ad_resource) override {}
     void NotifyResourceTransferSizeUpdated(
         int64_t request_id,
         int32_t transfer_size_diff) override {}
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 4c6fe83..ced2b215 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1700,6 +1700,7 @@
       name: "FetchLaterAPI",
       status: "experimental",
       origin_trial_feature_name: "FetchLaterAPI",
+      origin_trial_allows_third_party: true,
       base_feature: "FetchLaterAPI",
       // base_feature is meant as kill-switch. This runtime-enabled feature
       // should follow the Origin Trial unless explicitly overriden by Finch or
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
index b3a4cd4..12e7cc38 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
@@ -76,8 +76,9 @@
   // The GpuMemoryBuffer backing the camera frame.
   std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer;
   // The SharedImage created from |gpu_memory_buffer|.
-  gpu::Mailbox mailboxes[media::VideoFrame::kMaxPlanes];
-  // The release sync token for |mailboxes|.
+  scoped_refptr<gpu::ClientSharedImage>
+      shared_images[media::VideoFrame::kMaxPlanes];
+  // The release sync token for |shared_images|.
   gpu::SyncToken release_sync_token;
 };
 
@@ -176,13 +177,13 @@
 
   static void DestroyTextureOnMediaThread(
       media::GpuVideoAcceleratorFactories* gpu_factories,
-      gpu::Mailbox mailbox,
+      scoped_refptr<gpu::ClientSharedImage> shared_image,
       gpu::SyncToken release_sync_token) {
-    if (!mailbox.IsZero()) {
+    if (shared_image) {
       auto* sii = gpu_factories->SharedImageInterface();
       if (!sii)
         return;
-      sii->DestroySharedImage(release_sync_token, mailbox);
+      sii->DestroySharedImage(release_sync_token, std::move(shared_image));
     }
   }
 
@@ -225,12 +226,14 @@
     if (!gmb_resources_)
       return;
     for (size_t plane = 0; plane < media::VideoFrame::kMaxPlanes; ++plane) {
-      if (!gmb_resources_->mailboxes[plane].IsSharedImage())
+      if (!gmb_resources_->shared_images[plane]) {
         continue;
+      }
       media_task_runner_->PostTask(
           FROM_HERE,
           base::BindOnce(&BufferContext::DestroyTextureOnMediaThread,
-                         gpu_factories_, gmb_resources_->mailboxes[plane],
+                         gpu_factories_,
+                         std::move(gmb_resources_->shared_images[plane]),
                          gmb_resources_->release_sync_token));
     }
   }
@@ -600,7 +603,7 @@
 
   for (size_t plane = 0; plane < planes.size(); ++plane) {
     if (should_recreate_shared_image ||
-        buffer_context_->gmb_resources()->mailboxes[plane].IsZero()) {
+        !buffer_context_->gmb_resources()->shared_images[plane]) {
       auto multiplanar_si_format = viz::MultiPlaneFormat::kNV12;
 #if BUILDFLAG(IS_OZONE)
       if (!use_per_plane_sampling) {
@@ -625,12 +628,12 @@
             kPremul_SkAlphaType, usage, "VideoCaptureFrameBuffer");
       }
       CHECK(client_shared_image);
-      buffer_context_->gmb_resources()->mailboxes[plane] =
-          client_shared_image->mailbox();
+      buffer_context_->gmb_resources()->shared_images[plane] =
+          std::move(client_shared_image);
     } else {
       sii->UpdateSharedImage(
           buffer_context_->gmb_resources()->release_sync_token,
-          buffer_context_->gmb_resources()->mailboxes[plane]);
+          buffer_context_->gmb_resources()->shared_images[plane]->mailbox());
     }
   }
 
@@ -650,11 +653,10 @@
 
   gpu::MailboxHolder mailbox_holder_array[media::VideoFrame::kMaxPlanes];
   for (size_t plane = 0; plane < planes.size(); ++plane) {
-    DCHECK(!buffer_context_->gmb_resources()->mailboxes[plane].IsZero());
-    DCHECK(buffer_context_->gmb_resources()->mailboxes[plane].IsSharedImage());
-    mailbox_holder_array[plane] =
-        gpu::MailboxHolder(buffer_context_->gmb_resources()->mailboxes[plane],
-                           sync_token, texture_target);
+    DCHECK(buffer_context_->gmb_resources()->shared_images[plane]);
+    mailbox_holder_array[plane] = gpu::MailboxHolder(
+        buffer_context_->gmb_resources()->shared_images[plane]->mailbox(),
+        sync_token, texture_target);
   }
 
   const auto gmb_size = gpu_memory_buffer_->GetSize();
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 5a746d56..d650ae6 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -1376,6 +1376,10 @@
 
 crbug.com/1465046 [ Mac ] virtual/threaded/external/wpt/css/css-scroll-snap/input/keyboard.html [ Slow ]
 
+# Slow Private Network Access tests
+crbug.com/626703 [ Mac12 ] external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.html [ Slow ]
+crbug.com/1484710 virtual/fenced-frame-mparch/external/wpt/fetch/private-network-access/fenced-frame-subresource-fetch.tentative.https.window.html?include=from-public [ Slow ]
+
 # Gardener 2023-10-26
 crbug.com/1496281 external/wpt/html/semantics/embedded-content/bfcache/embedded-js.html [ Slow ]
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index d0685e8..b77617f3 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -574,15 +574,13 @@
 crbug.com/882975 [ Win10.20h2 ] virtual/threaded/fast/events/pinch/gesture-pinch-zoom-prevent-in-handler.html [ Failure Pass ]
 crbug.com/882975 [ Win10.20h2 ] virtual/threaded/fast/events/pinch/scroll-visual-viewport-send-boundary-events.html [ Failure Pass ]
 
+# Temporarily disabled to unblock https://crrev.com/c/5126051
+crbug.com/798498 http/tests/devtools/copy-network-request.js [ Failure Pass ]
+
 crbug.com/898394 virtual/android/url-bar/bottom-and-top-fixed-sticks-to-top.html [ Failure Timeout ]
 
 crbug.com/1046784 http/tests/devtools/elements/styles-3/styles-disable-then-delete.js [ Crash Failure Pass Timeout ]
 
-# Temporarily disabled to unblock https://crrev.com/c/4417276
-crbug.com/1427397 http/tests/devtools/elements/styles-4/style-update-during-selector-edit.js [ Failure Pass ]
-# Temporarily disabled to unblock https://crrev.com/c/5033671
-crbug.com/1473339 http/tests/devtools/elements/styles-4/styles-source-lines.js [ Failure Pass ]
-
 # Subpixel rounding differences that are incorrect.
 crbug.com/997202 compositing/overflow/scaled-overflow.html [ Failure ]
 # Flaky subpixel AA difference (not necessarily incorrect, but flaky)
@@ -1523,17 +1521,7 @@
 # https://crbug.com/1488371.
 # See https://docs.google.com/document/d/1FH0iG8G8mEebjMpVA_zvSfHBWUhWqC92jRFctaGcxrc/edit#heading=h.pacsgp238vkn
 
-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-unload-handler.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/history/the-history-interface/traverse_the_history_unload_1.html [ Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html [ Failure Skip Timeout ]
-crbug.com/1488371 virtual/deprecate-unload/external/wpt/navigation-api/navigate-event/replaceState-in-unload-then-remove-iframe.html [ 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 ]
 
 # ========== End of Unload deprecation pending
 
@@ -1546,8 +1534,11 @@
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/fetch/metadata/unload.https.sub.html [ Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/browsers/the-window-object/open-close/close_unload.html [ Timeout ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/browsers/browsing-the-web/unloading-documents/unload/009.html [ Timeout ]
+crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/browsers/history/the-history-interface/traverse_the_history_unload_1.html [ Timeout ]
+crbug.com/1488371 virtual/deprecate-unload/external/wpt/navigation-api/navigate-event/replaceState-in-unload-then-remove-iframe.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/external/wpt/screen-details/getScreenDetails.tentative.https.window.html [ Timeout ]
 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 ]
 crbug.com/1488371 virtual/deprecate-unload/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-origin.sub.window.html [ Timeout ]
@@ -2705,13 +2696,11 @@
 crbug.com/626703 [ Mac12 ] external/wpt/css/css-grid/animation/grid-template-rows-interpolation.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/css/css-masking/animations/clip-path-interpolation-002.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/editing/other/join-pre-and-other-block.html?method=backspace&block=div [ Timeout ]
-crbug.com/626703 [ Mac12 ] external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/html/browsers/origin/cross-origin-objects/window-location-and-location-href-cross-realm-set.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/performance-timeline/back-forward-cache-restoration.tentative.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/api/response/response-clone.any.sharedworker.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/regression-1399759.https.sub.html?pipe=header(Origin-Agent-Cluster,%253F0) [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/pna-navigations-warning/external/wpt/fetch/private-network-access/shared-worker-fetch.tentative.https.window.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/pna-workers-disabled/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/worker-blob-fetch.tentative.window.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch-no-vary-search/external/wpt/speculation-rules/prefetch/no-vary-search/prefetch-single-with-hint.https.html?3-3 [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch-no-vary-search/external/wpt/speculation-rules/prefetch/no-vary-search/prefetch-single.https.html?16-16 [ Timeout ]
@@ -4274,10 +4263,6 @@
 # SwANGLE issues
 crbug.com/1204234 css3/blending/background-blend-mode-single-accelerated-element.html [ Failure ]
 
-# Temporarily disabled to land changes in DevTools, multiple dependent CLs
-# [1] https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2049183
-# [2] https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2119670
-
 # "in-multicol-child.html" is laid out in legacy layout due by "multicol" but
 # reference is laid out by LayoutNG.
 
@@ -4393,9 +4378,6 @@
 crbug.com/1066732 fast/events/platform-wheelevent-paging-x-in-scrolling-div.html [ Failure Pass ]
 crbug.com/1066732 fast/events/platform-wheelevent-paging-y-in-scrolling-div.html [ Failure Pass ]
 
-# Temporarily disabled for landing changes to DevTools frontend
-crbug.com/1066579 http/tests/devtools/har-importer.js [ Failure Pass ]
-
 # COOP top navigation:
 crbug.com/1153648 external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html [ Failure ]
 
@@ -6322,7 +6304,6 @@
 [ Debug Mac13 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/disallowed-navigations-dangling-markup-urn.https.html [ Failure ]
 [ Debug Mac13 ] virtual/threaded-prefer-compositing/fast/scrolling/overflow-hidden-viewport-scrolling.html [ Skip Timeout ]
 [ Debug Mac13 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/can-load-api.https.html [ Skip Timeout ]
-[ Debug Mac13 ] virtual/pna-workers-disabled/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.html [ Skip Timeout ]
 [ Debug Mac13 ] external/wpt/webtransport/streams-close.https.any.serviceworker.html [ Failure ]
 [ Debug Mac13 ] virtual/threaded/transitions/retargeted-matching-rotation-transforms.html [ Skip Timeout ]
 [ Debug Mac13 ] virtual/dark-mode-default/dark-mode/images/pattern.html [ Skip Timeout ]
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 1d076779..3f55c986 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
@@ -109692,7 +109692,7 @@
        ]
       ],
       "container-for-cue.html": [
-       "f53d161db0dda46b608c40e5ef1ccf714828a364",
+       "a460f79af061de93f269ad56455f878408437b85",
        [
         null,
         [
@@ -141362,6 +141362,58 @@
         {}
        ]
       ],
+      "standalone-axis-size-003.html": [
+       "5c06ee62e10be27753f728adaddc4d2b3a74ecec",
+       [
+        null,
+        [
+         [
+          "/css/reference/ref-filled-green-100px-square.xht",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "standalone-axis-size-004.html": [
+       "d69412d62529018b301cc2baec58fb4e21f01e00",
+       [
+        null,
+        [
+         [
+          "/css/reference/ref-filled-green-100px-square.xht",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "standalone-axis-size-005.html": [
+       "586d26bf2fe3ecb6a003b97bb8827a230023f56d",
+       [
+        null,
+        [
+         [
+          "/css/reference/ref-filled-green-100px-square.xht",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "standalone-axis-size-006.html": [
+       "056f0a402803c84b2827aa41aefee021c46a5559",
+       [
+        null,
+        [
+         [
+          "/css/reference/ref-filled-green-100px-square.xht",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "subgrid-baseline-001.html": [
        "95469c0018e0a97786aff086c0cabaf081ced7b4",
        [
@@ -302820,6 +302872,10 @@
       "6f2248994883acc6631b00909129aa64930c4e22",
       []
      ],
+     "DIR_METADATA": [
+      "12a5b0640db68c21567548a4542814ae563e3230",
+      []
+     ],
      "META.yml": [
       "73541d894be1e6e42a5d029dce7844c30c391282",
       []
@@ -303362,6 +303418,10 @@
      }
     },
     "css-anchor-position": {
+     "DIR_METADATA": [
+      "97e2659bf8cff713dc731eec03ac942794cc5fd2",
+      []
+     ],
      "anchor-center-002-ref.html": [
       "40ccc2b044b3da3be44582522d99e5a138b6f354",
       []
@@ -303444,6 +303504,10 @@
       "bd20c188f0abf22896e42e180271c8c2ccade85f",
       []
      ],
+     "DIR_METADATA": [
+      "849d9c0f45574344e9c71d57c57cdb030cd7205d",
+      []
+     ],
      "Document-getAnimations.tentative-expected.txt": [
       "824836b66475e108f1621b57a11c74e8669d49d8",
       []
@@ -305688,6 +305752,10 @@
      }
     },
     "css-box": {
+     "DIR_METADATA": [
+      "97e2659bf8cff713dc731eec03ac942794cc5fd2",
+      []
+     ],
      "META.yml": [
       "dde409360faf79a301c3ae3ea34a995d154d7bb4",
       []
@@ -307562,7 +307630,7 @@
        []
       ],
       "container-for-cue-ref.html": [
-       "48b262236394da747f188c9422cc9364b1cb4271",
+       "40b0a07ae0183163576247a4adcf534345b068c1",
        []
       ],
       "container-units-gradient-ref.html": [
@@ -309774,6 +309842,10 @@
      }
     },
     "css-easing": {
+     "DIR_METADATA": [
+      "849d9c0f45574344e9c71d57c57cdb030cd7205d",
+      []
+     ],
      "META.yml": [
       "2c412b40f0f1b6059099682bc5c787310e8d2991",
       []
@@ -309794,6 +309866,10 @@
      ]
     },
     "css-fill-stroke": {
+     "DIR_METADATA": [
+      "aeb9395befd7af9295ff79f2a97d85da49320d75",
+      []
+     ],
      "META.yml": [
       "237aea970a3a4103d415a9f3078a59da229e5a79",
       []
@@ -322448,6 +322524,10 @@
      }
     },
     "css-inline": {
+     "DIR_METADATA": [
+      "d7542b2d18dbe34bd58c0ae8721b27f4bc134f76",
+      []
+     ],
      "META.yml": [
       "42e669d316d4f470cf4d339fce632a6a69c583ca",
       []
@@ -325404,6 +325484,10 @@
      }
     },
     "css-overflow": {
+     "DIR_METADATA": [
+      "97e2659bf8cff713dc731eec03ac942794cc5fd2",
+      []
+     ],
      "META.yml": [
       "b9ba7acd150e5022de5c5208cd7f5f7d4dde93c3",
       []
@@ -325910,6 +325994,10 @@
      ]
     },
     "css-overscroll-behavior": {
+     "DIR_METADATA": [
+      "913fe32f2a162e65713812b39ce842da97ab2189",
+      []
+     ],
      "META.yml": [
       "8b83e50d1e465786f6466548b58d4df031a855f2",
       []
@@ -327902,6 +327990,10 @@
      ]
     },
     "css-rhythm": {
+     "DIR_METADATA": [
+      "97e2659bf8cff713dc731eec03ac942794cc5fd2",
+      []
+     ],
      "parsing": {
       "block-step-insert-computed-expected.txt": [
        "5dde60dac7f56797ecf8d2c6b1ac24d7bbf611df",
@@ -327922,6 +328014,10 @@
      }
     },
     "css-ruby": {
+     "DIR_METADATA": [
+      "abc2fd0b20698d7c05bc9be576fd9fb853a14501",
+      []
+     ],
      "META.yml": [
       "b0098caea13c61def740fa706be68efb74b3bd9b",
       []
@@ -328356,6 +328452,10 @@
      }
     },
     "css-scroll-snap": {
+     "DIR_METADATA": [
+      "913fe32f2a162e65713812b39ce842da97ab2189",
+      []
+     ],
      "META.yml": [
       "df776353a31f1cef3abe9bc9d195da9be5da2510",
       []
@@ -328430,6 +328530,10 @@
      }
     },
     "css-scroll-snap-2": {
+     "DIR_METADATA": [
+      "913fe32f2a162e65713812b39ce842da97ab2189",
+      []
+     ],
      "resources": {
       "common.js": [
        "1a2edab90bba958141c6e5a1b28fa3bd53408ddb",
@@ -328478,6 +328582,10 @@
      }
     },
     "css-scrollbars": {
+     "DIR_METADATA": [
+      "97e2659bf8cff713dc731eec03ac942794cc5fd2",
+      []
+     ],
      "META.yml": [
       "f7c0439e202113c9611405ae967b33c2b12cfcee",
       []
@@ -336860,6 +336968,10 @@
      ]
     },
     "css-transitions": {
+     "DIR_METADATA": [
+      "849d9c0f45574344e9c71d57c57cdb030cd7205d",
+      []
+     ],
      "KeyframeEffect-getKeyframes.tentative-expected.txt": [
       "e836d3c29d75b7a0aede054b696def9c31a79f11",
       []
@@ -353174,7 +353286,7 @@
        []
       ],
       "support.sub.js": [
-       "920ded6cff7feae1aa9337405a7cc3402b787c57",
+       "69d8f50f18fe71e780eb1e61b92b4c136b717191",
        []
       ],
       "worker-blob-fetcher.html": [
@@ -353426,11 +353538,11 @@
      ],
      "resources": {
       "bidding-logic.sub.py": [
-       "c0d6114ab2c6102ba545e92a969a1eecce696d85",
+       "707e37f36bb1423dfb168a88320e3be620249109",
        []
       ],
       "decision-logic.sub.py": [
-       "4e1862af82da346ee67941f3df92dd92dcf3ef21",
+       "78d459e3f9dac36241d8cf92c33fd031c7046af0",
        []
       ],
       "direct-from-seller-signals.py": [
@@ -353480,6 +353592,10 @@
       "trusted-scoring-signals.py": [
        "fc6ec79096c4708b347e0cfc277fa248bf8ba9c3",
        []
+      ],
+      "worklet-helpers.js": [
+       "dd3b9a7dd518a0dd2d6b1d9b63315f427562f35a",
+       []
       ]
      }
     }
@@ -373280,6 +373396,10 @@
      []
     ],
     "resources": {
+     "pass-with-referrer.html": [
+      "be978c16dc866fd536c188983e1095c9f2396950",
+      []
+     ],
      "pass.html": [
       "5c7ca343e9b2bbe4774ed127d905c8c77b09e47f",
       []
@@ -392348,7 +392468,7 @@
    },
    "web-animations": {
     "DIR_METADATA": [
-     "334756514841e2c9bbac8d15cd6f05401d65bd46",
+     "849d9c0f45574344e9c71d57c57cdb030cd7205d",
      []
     ],
     "META.yml": [
@@ -431279,7 +431399,7 @@
       ]
      ],
      "report-preload-and-consume.https.html": [
-      "3e04f55f03c58eef1ee07417182b8d03ff91769f",
+      "2fc180234731eb850e53d947adc5789feb7e2c8a",
       [
        null,
        {}
@@ -455966,6 +456086,13 @@
        {}
       ]
      ],
+     "focused-element-in-excluded-subtree.html": [
+      "85b3107802d134ed4a23f2bbfd05f6f3f84977b3",
+      [
+       null,
+       {}
+      ]
+     ],
      "focused-element-outside-scroller.html": [
       "73a5944856b19ff55219e446299513d0d65d589e",
       [
@@ -498680,7 +498807,7 @@
      ]
     ],
     "automatic-beacon-click-handler.https.html": [
-     "c24a9d76af6a237e06b78693f863036bb7cc1b7f",
+     "0fe3fbb93356da7e70f5f63f4565829a99c11e1f",
      [
       null,
       {
@@ -511732,7 +511859,7 @@
     },
     "private-network-access": {
      "anchor.tentative.https.window.js": [
-      "8ad99b1ee9c9ece0720553ddb1e1409d117de025",
+      "4e860ad381df9b97fe3486e6b9d8d98eaabf808a",
       [
        "fetch/private-network-access/anchor.tentative.https.window.html?include=from-local",
        {
@@ -511754,6 +511881,10 @@
           "resources/support.sub.js"
          ],
          [
+          "timeout",
+          "long"
+         ],
+         [
           "variant",
           "?include=from-local"
          ],
@@ -511769,7 +511900,8 @@
           "variant",
           "?include=from-treat-as-public"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ],
       [
@@ -511793,6 +511925,10 @@
           "resources/support.sub.js"
          ],
          [
+          "timeout",
+          "long"
+         ],
+         [
           "variant",
           "?include=from-local"
          ],
@@ -511808,7 +511944,8 @@
           "variant",
           "?include=from-treat-as-public"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ],
       [
@@ -511832,6 +511969,10 @@
           "resources/support.sub.js"
          ],
          [
+          "timeout",
+          "long"
+         ],
+         [
           "variant",
           "?include=from-local"
          ],
@@ -511847,7 +511988,8 @@
           "variant",
           "?include=from-treat-as-public"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ],
       [
@@ -511871,6 +512013,10 @@
           "resources/support.sub.js"
          ],
          [
+          "timeout",
+          "long"
+         ],
+         [
           "variant",
           "?include=from-local"
          ],
@@ -511886,12 +512032,13 @@
           "variant",
           "?include=from-treat-as-public"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "anchor.tentative.window.js": [
-      "60ccbde74d6d3c92f375e4562978c0702f50e06a",
+      "cb538658081437ba5867d2df426c444aacaa6c2c",
       [
        "fetch/private-network-access/anchor.tentative.window.html",
        {
@@ -511907,8 +512054,13 @@
          [
           "script",
           "resources/support.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
@@ -512935,7 +513087,7 @@
       ]
      ],
      "window-open.tentative.https.window.js": [
-      "c91ec2355119ad4a5cc2de360ffccc9c76796549",
+      "6793d1f3b4d9218975c7b08e165a729c00960df9",
       [
        "fetch/private-network-access/window-open.tentative.https.window.html?include=from-local",
        {
@@ -512957,6 +513109,10 @@
           "resources/support.sub.js"
          ],
          [
+          "timeout",
+          "long"
+         ],
+         [
           "variant",
           "?include=from-local"
          ],
@@ -512972,7 +513128,8 @@
           "variant",
           "?include=from-treat-as-public"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ],
       [
@@ -512996,6 +513153,10 @@
           "resources/support.sub.js"
          ],
          [
+          "timeout",
+          "long"
+         ],
+         [
           "variant",
           "?include=from-local"
          ],
@@ -513011,7 +513172,8 @@
           "variant",
           "?include=from-treat-as-public"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ],
       [
@@ -513035,6 +513197,10 @@
           "resources/support.sub.js"
          ],
          [
+          "timeout",
+          "long"
+         ],
+         [
           "variant",
           "?include=from-local"
          ],
@@ -513050,7 +513216,8 @@
           "variant",
           "?include=from-treat-as-public"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ],
       [
@@ -513074,6 +513241,10 @@
           "resources/support.sub.js"
          ],
          [
+          "timeout",
+          "long"
+         ],
+         [
           "variant",
           "?include=from-local"
          ],
@@ -513089,12 +513260,13 @@
           "variant",
           "?include=from-treat-as-public"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "window-open.tentative.window.js": [
-      "18a0260cb10f1af3c58a04d565bee9a1d4f1d9d0",
+      "5e2313d60a22bc7c3d2e3acb4dfbdebff711d539",
       [
        "fetch/private-network-access/window-open.tentative.window.html",
        {
@@ -513110,8 +513282,13 @@
          [
           "script",
           "resources/support.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
@@ -516062,6 +516239,185 @@
        {}
       ]
      ],
+     "interest-group-passed-to-generate-bid.https.window.js": [
+      "cf46855a3d1d879a2a1d64c7252ef7aaf8d7786f",
+      [
+       "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?1-5",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ],
+      [
+       "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?11-15",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ],
+      [
+       "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?16-last",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ],
+      [
+       "fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?6-10",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-5"
+         ],
+         [
+          "variant",
+          "?6-10"
+         ],
+         [
+          "variant",
+          "?11-15"
+         ],
+         [
+          "variant",
+          "?16-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ]
+     ],
      "join-leave-ad-interest-group-in-fenced-frame.https.window.js": [
       "e6836ab2f45a873a3d5bd3de9f74c92424782bec",
       [
@@ -556715,15 +557071,197 @@
         {}
        ]
       ],
-      "document-render-blocking-partial.tentative.html": [
-       "89ab05ed845da69b3d82153a77652349a68a3d81",
+      "element-render-blocking-001.tentative.html": [
+       "9624b41a194946794fc17c71f66fb4cc2ec6abe1",
        [
         null,
         {}
        ]
       ],
-      "document-render-blocking.tentative.html": [
-       "909029b73db0594adb1a940a47b8047b1fc298a4",
+      "element-render-blocking-002.tentative.html": [
+       "ab0fd511156bc9edb89fe9350d87a000616f2438",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-003.tentative.html": [
+       "eb3a347a6ebbb7b05a5e3bb7905c9098bf755c51",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-004.tentative.html": [
+       "2c50f2d362a54c8252f92222a71025301222aa9f",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-005.tentative.html": [
+       "04cdab467deff3f8880855592cd5724d064b3371",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-006.tentative.html": [
+       "1c9da255a622503c2f2bb74fc98876938bce19e1",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-007.tentative.html": [
+       "df8f9ae3d1258194088f4b8cbadbf2eee9b85500",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-008.tentative.html": [
+       "c2458a0bab31244de67c707d32b2669a5aaa746a",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-009.tentative.html": [
+       "d765ac8a5d3c9b742fa9b24d3401d6c1ff098a08",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-010.tentative.html": [
+       "7ef6a1baf35b460791ac54b8891dc3e019aaee85",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-011.tentative.html": [
+       "31df9b068c01b5a149941f24d619898f6b926301",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-012.tentative.html": [
+       "8f2594d25903a60911f89d7eb6a39968ca2e9d82",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-013.tentative.html": [
+       "9d65bd96b73189f4fafbbcd59261261e0f154fb9",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-014.tentative.html": [
+       "d042b96b64370c1ad08cd235729a2c0e6abb597e",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-015.tentative.html": [
+       "f7ac0b1015d79635d83fced00cbcb8c7c5e6400b",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-016.tentative.html": [
+       "d32a0468e79b4109607d920ec72279ae0af0e0d6",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-017.tentative.html": [
+       "d3a6046cbb37f90b3bf5721f1799f8df313d06c7",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-018.tentative.html": [
+       "0d7402201accb05ce81636be43057128cfaf976b",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-019.tentative.html": [
+       "fea9e3a2b21821722eb956beac19acfb44721034",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-020.tentative.html": [
+       "7fc0fe19bbae57d15b5a8bbc27cfb6400661114b",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-021.tentative.html": [
+       "29430349f04689578cc7e5f90ba86ef77626bde5",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-022.tentative.html": [
+       "6548c9ec4df21169af9c97dfa30acf49acb1c95a",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-023.tentative.html": [
+       "c3661bcaa6a9c3b2e6fc64dc937c73688041a43d",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-024.tentative.html": [
+       "c98022cfeabef10171061432168274eb81324834",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-025.tentative.html": [
+       "29868b92cbc76a7f9b6da3e645e02c0701f5e31b",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-026.tentative.html": [
+       "dc23211b8b00d2011592dd529bd554670456acc5",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-027.tentative.html": [
+       "5b8a5eb24d5e973a25ca8fbf594f85f006ba7a06",
+       [
+        null,
+        {}
+       ]
+      ],
+      "element-render-blocking-028.tentative.html": [
+       "57ba3d602602d59f55bdaa34d18eeb06254e826a",
        [
         null,
         {}
@@ -580007,6 +580545,13 @@
        {}
       ]
      ],
+     "referrer.https.sub.html": [
+      "3cd83ba561c2b5166cacddf493e52c1ee08318e1",
+      [
+       null,
+       {}
+      ]
+     ],
      "upgrade.https.sub.html": [
       "71a1fe1dde618163c259d13eb14797c22785c247",
       [
@@ -581961,6 +582506,27 @@
       {}
      ]
     ],
+    "fixed-position-child-scroll.html": [
+     "93602090463df74b71cbfdce33a622775540fede",
+     [
+      null,
+      {}
+     ]
+    ],
+    "fixed-position-iframe-scroll.html": [
+     "7d90331fd0b8ab3fdc8ffefb9c2a1ab3030f1384",
+     [
+      null,
+      {}
+     ]
+    ],
+    "fixed-position-scroll.html": [
+     "3dc02a8b0d3c561c6c17d29a593c4ef31e3fcd30",
+     [
+      null,
+      {}
+     ]
+    ],
     "idlharness.window.js": [
      "2059e1ce638b5f2cac4e4f013c567a56894599a0",
      [
@@ -596794,13 +597360,6 @@
        {}
       ]
      ],
-     "performance-entry-source-deleted-frame.html": [
-      "8197060670797c928e070b9bd23a14603f37a275",
-      [
-       null,
-       {}
-      ]
-     ],
      "performance-entry-source.html": [
       "d10d3c5ed512b79cc9ea516de0d1d59d7959cedf",
       [
@@ -617199,11 +617758,12 @@
      ]
     ],
     "force-load-at-top.html": [
-     "1399de3d624927131c21ef9bf548825de4b059a4",
+     "fe3913dfac453ea899239de6d89a13dd75be2ab6",
      [
       null,
       {
-       "testdriver": true
+       "testdriver": true,
+       "timeout": "long"
       }
      ]
     ],
@@ -617262,11 +617822,12 @@
      ]
     ],
     "redirects.html": [
-     "5ad910affe55f6dd5ff63cdd3e019cf969fc6653",
+     "71bc1be02e65be68eced1ef7e3e492d1bff6cffd",
      [
       null,
       {
-       "testdriver": true
+       "testdriver": true,
+       "timeout": "long"
       }
      ]
     ],
@@ -652447,6 +653008,16 @@
       }
      ]
     ],
+    "createcredential-hints.https.html": [
+     "a662bcef46f156c212fcd81feb7d69b613f551c3",
+     [
+      null,
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ]
+    ],
     "createcredential-large-blob-not-supported.https.html": [
      "167a65b92262759e652009e51c5f8ad6f2e4ac1e",
      [
@@ -652596,6 +653167,16 @@
       }
      ]
     ],
+    "getcredential-hints.https.html": [
+     "45f6e6b48e2167fabb826f55f084c1b4a5a3501c",
+     [
+      null,
+      {
+       "testdriver": true,
+       "timeout": "long"
+      }
+     ]
+    ],
     "getcredential-large-blob-not-supported.https.html": [
      "97cea30f27f491bf0fd1aec6fe6e4734d48e591a",
      [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-007.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-007.html
index 9bccd2d..b532dd63 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-007.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-007.html
@@ -32,7 +32,9 @@
   div::first-letter
     {
       background-color: red;
-      background-image: url("support/1x1-green.png"), url("../support/60x60-red.png");
+      background-image:
+        url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' style='background: green'></svg>"),
+        url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' style='background: red'></svg>");
       font-family: Ahem;
       font-size: 100px;
     }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-for-cue-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-for-cue-ref.html
index 48b2622..40b0a07 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-for-cue-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-for-cue-ref.html
@@ -16,8 +16,8 @@
 <body>
   <video autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
     <track default src="support/test.vtt">
-    <source src="/media/white.webm" type="video/webm">
     <source src="/media/white.mp4" type="video/mp4">
+    <source src="/media/white.webm" type="video/webm">
   </video>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-for-cue.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-for-cue.html
index f53d161d..a460f79 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-for-cue.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-for-cue.html
@@ -19,8 +19,8 @@
 </head>
 <body>
   <video autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
-    <source src="/media/white.webm" type="video/webm">
     <source src="/media/white.mp4" type="video/mp4">
+    <source src="/media/white.webm" type="video/webm">
     <track default src="support/test.vtt">
   </video>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/subgrid/standalone-axis-size-007.html b/third_party/blink/web_tests/external/wpt/css/css-grid/subgrid/standalone-axis-size-007.html
new file mode 100644
index 0000000..4642006
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/subgrid/standalone-axis-size-007.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Test: Subgrid contribution size on standalone axis</title>
+<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-box-alignment">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.grid {
+  background: red;
+  display: inline-grid;
+}
+.subgrid {
+  display: grid;
+  grid-row: span 2;
+  background: green;
+  min-width: min-content;
+  grid-auto-flow: column;
+  grid-template-rows: subgrid;
+}
+.w100 {
+  height: 50px;
+  width: 100px;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="grid">
+  <div class="subgrid">
+    <div class="w100"></div>
+    <div class="w100"></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-lists/crashtests/chrome-bug-1377573.html b/third_party/blink/web_tests/external/wpt/css/css-lists/crashtests/chrome-bug-1377573.html
new file mode 100644
index 0000000..3419a23e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-lists/crashtests/chrome-bug-1377573.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>Chrome crash with nested ::after::marker with failing list-style-image</title>
+<link rel="help" href="https://crbug.com/1377573">
+<style>
+  :is(body, html)::after {
+    display: list-item;
+    content: " ";
+  }
+  :root { list-style-image:url('.'); }
+</style>
+<body>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/focused-element-in-excluded-subtree.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/focused-element-in-excluded-subtree.html
new file mode 100644
index 0000000..85b3107
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/focused-element-in-excluded-subtree.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+
+body { height: 4000px; }
+div { height: 100px; }
+
+.scroller {
+  overflow: scroll;
+  position: fixed;
+  width: 300px;
+  height: 300px;
+  background-color: green;
+}
+
+#posSticky {
+  top: 300px;
+  position: relative;
+  height: 50px;
+  width: 50px;
+  background-color: blue;
+}
+
+#content {
+  background-color: #D3D3D3;
+  height: 50px;
+  width: 50px;
+  position: relative;
+  top: 500px;
+}
+
+</style>
+<div id="scroller" class="scroller">
+    <div id="content"></div>
+
+  <div id="posSticky">
+    <div id="block1" tabindex="-1">abc</div>
+  </div>
+</div>
+
+<script>
+
+// Tests that a focused element doesn't become the
+// priority candidate of the main frame if it is
+// in an excluded subtree
+
+promise_test(async function() {
+  var scroller = document.querySelector("#scroller");
+  var focusElement = document.querySelector("#block1");
+  focusElement.focus();
+  scroller.scrollBy(0,150);
+  document.scrollingElement.scrollBy(0,100);
+
+  await new Promise(resolve => {
+     document.addEventListener("scroll", () => step_timeout(resolve, 0));
+   });
+
+  assert_equals(document.scrollingElement.scrollTop, 100);
+}, "Ensure there is no scroll anchoring adjustment in the main frame.");
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js
index 54485dc..dbae519 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.js
@@ -1,5 +1,6 @@
 // META: script=/common/utils.js
 // META: script=resources/support.sub.js
+// META: timeout=long
 //
 // Spec: https://wicg.github.io/private-network-access
 //
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.js b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.js
index 6369b166..8d1028c 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.js
@@ -1,5 +1,6 @@
 // META: script=/common/utils.js
 // META: script=resources/support.sub.js
+// META: timeout=long
 //
 // Spec: https://wicg.github.io/private-network-access/#integration-fetch
 // Spec: https://wicg.github.io/background-fetch/
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/style-update-during-selector-edit.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/style-update-during-selector-edit.js
index 8f1bb06..7d3f5a6 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/style-update-during-selector-edit.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/style-update-during-selector-edit.js
@@ -47,8 +47,9 @@
     TestRunner.addSniffer(Elements.StylesSidebarPane.StylesSidebarPane.prototype, 'doUpdate', rebuildUpdate);
     TestRunner.domModel.addEventListener(SDK.DOMModel.Events.AttrModified, attributeChanged, this);
     // Click "Add new rule".
-    Elements.ElementsPanel.ElementsPanel.instance().stylesWidget.contentElement.querySelector('.styles-pane-toolbar')
-        .shadowRoot.querySelector('.largeicon-add')
+    Elements.ElementsPanel.ElementsPanel.instance()
+        .stylesWidget.contentElement.querySelector('.styles-pane-toolbar')
+        .shadowRoot.querySelector('.plus')
         .click();
     TestRunner.evaluateInPage('addStyleClass()', step2);
   }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-source-lines-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-source-lines-expected.txt
index 2bd42f1f..c8c8136 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-source-lines-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-4/styles-source-lines-expected.txt
@@ -16,7 +16,6 @@
 #main, .at_line_26 { (styles-sour…per.html:29 -> styles-source-lines-helper.html:29:2)
     font-family: /*  Comment in 
                       value  */courier;
-/-- overloaded --/     color blue: ;
 
 [expanded] 
 #main, .at_line_11::before { (styles-sour…per.html:15 -> styles-source-lines-helper.html:15:2)
diff --git a/third_party/blink/web_tests/http/tests/devtools/har-importer-expected.txt b/third_party/blink/web_tests/http/tests/devtools/har-importer-expected.txt
index 6b35dc1..888b5af 100644
--- a/third_party/blink/web_tests/http/tests/devtools/har-importer-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/har-importer-expected.txt
@@ -11,6 +11,7 @@
     "requestMethod": "GET",
     "requestHeaders": [
       {
+        "custom": {},
         "name": "Host",
         "value": "localhost:8000"
       }
@@ -18,6 +19,7 @@
     "mimeType": "text/html",
     "responseHeaders": [
       {
+        "custom": {},
         "name": "Content-Type",
         "value": "text/html;charset=ISO-8859-1"
       }
@@ -35,15 +37,7 @@
       "encoded": false
     },
     "remoteAddress": "[::1]:80",
-    "resourceType": {
-      "_name": "document",
-      "_title": "Document",
-      "_category": {
-        "title": "Documents",
-        "shortTitle": "Doc"
-      },
-      "_isTextType": true
-    },
+    "resourceType": {},
     "priority": "VeryHigh",
     "finished": true,
     "timing": {
@@ -58,10 +52,13 @@
       "sslEnd": -1,
       "workerStart": -1,
       "workerReady": -1,
+      "workerFetchStart": -1,
+      "workerRespondWithSettled": -1,
       "sendStart": 2.4644479999188333,
       "sendEnd": 2.534447999918833,
       "pushStart": 0,
       "pushEnd": 0,
+      "receiveHeadersStart": 2.534447999918833,
       "receiveHeadersEnd": 5.624447982991114
     },
     "endTime": 1542746587.7661417,
@@ -94,15 +91,7 @@
       "encoded": false
     },
     "remoteAddress": "[::1]:80",
-    "resourceType": {
-      "_name": "image",
-      "_title": "Image",
-      "_category": {
-        "title": "Images",
-        "shortTitle": "Img"
-      },
-      "_isTextType": false
-    },
+    "resourceType": {},
     "priority": "Low",
     "finished": true,
     "timing": {
@@ -117,10 +106,13 @@
       "sslEnd": -1,
       "workerStart": -1,
       "workerReady": -1,
+      "workerFetchStart": -1,
+      "workerRespondWithSettled": -1,
       "sendStart": 2.2485360001232477,
       "sendEnd": 2.3095360001232477,
       "pushStart": 0,
       "pushEnd": 0,
+      "receiveHeadersStart": 2.3095360001232477,
       "receiveHeadersEnd": 2.828536113491282
     },
     "endTime": 1542746587.8738945,
@@ -149,15 +141,7 @@
       "encoded": false
     },
     "remoteAddress": "[::1]:80",
-    "resourceType": {
-      "_name": "script",
-      "_title": "Script",
-      "_category": {
-        "title": "Scripts",
-        "shortTitle": "JS"
-      },
-      "_isTextType": true
-    },
+    "resourceType": {},
     "priority": "Low",
     "finished": true,
     "timing": {
@@ -172,10 +156,13 @@
       "sslEnd": -1,
       "workerStart": -1,
       "workerReady": -1,
+      "workerFetchStart": -1,
+      "workerRespondWithSettled": -1,
       "sendStart": 2.2485360001232477,
       "sendEnd": 2.3095360001232477,
       "pushStart": 0,
       "pushEnd": 0,
+      "receiveHeadersStart": 2.3095360001232477,
       "receiveHeadersEnd": 2.828536113491282
     },
     "endTime": 1542746587.8738945,
@@ -185,7 +172,11 @@
     "url": "http://localhost:8000/endpoint",
     "documentURL": "http://localhost:8000/",
     "initiator": {
-      "type": "script"
+      "type": "script",
+      "stack": {
+        "custom": {},
+        "callFrames": []
+      }
     },
     "requestFormData": null,
     "connectionId": "2945",
@@ -206,15 +197,7 @@
       "encoded": false
     },
     "remoteAddress": "[::1]:80",
-    "resourceType": {
-      "_name": "fetch",
-      "_title": "Fetch",
-      "_category": {
-        "title": "XHR and Fetch",
-        "shortTitle": "XHR"
-      },
-      "_isTextType": true
-    },
+    "resourceType": {},
     "priority": "Low",
     "finished": true,
     "timing": {
@@ -229,10 +212,13 @@
       "sslEnd": -1,
       "workerStart": -1,
       "workerReady": -1,
+      "workerFetchStart": -1,
+      "workerRespondWithSettled": -1,
       "sendStart": 2.2485360001232477,
       "sendEnd": 2.3095360001232477,
       "pushStart": 0,
       "pushEnd": 0,
+      "receiveHeadersStart": 2.3095360001232477,
       "receiveHeadersEnd": 2.828536113491282
     },
     "endTime": 1542746587.8738945,
@@ -242,75 +228,104 @@
     "url": "ws://localhost:8880/echo",
     "documentURL": "ws://localhost:8880/echo",
     "initiator": {
-      "type": "script"
+      "type": "script",
+      "stack": {
+        "custom": {},
+        "callFrames": [
+          {
+            "custom": {},
+            "functionName": "",
+            "scriptId": "73",
+            "url": "",
+            "lineNumber": 0,
+            "columnNumber": 5
+          }
+        ]
+      }
     },
     "requestFormData": null,
     "connectionId": "",
     "requestMethod": "GET",
     "requestHeaders": [
       {
+        "custom": {},
         "name": "Pragma",
         "value": "no-cache"
       },
       {
+        "custom": {},
         "name": "Origin",
         "value": "http://localhost:8000"
       },
       {
+        "custom": {},
         "name": "Accept-Encoding",
         "value": "gzip, deflate, br"
       },
       {
+        "custom": {},
         "name": "Host",
         "value": "localhost:8880"
       },
       {
+        "custom": {},
         "name": "Accept-Language",
         "value": "en-US,en;q=0.9"
       },
       {
+        "custom": {},
         "name": "Sec-WebSocket-Key",
         "value": "EBTeYTo1PMrIJhQV3KCyLA=="
       },
       {
+        "custom": {},
         "name": "User-Agent",
         "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3762.0 Safari/537.36"
       },
       {
+        "custom": {},
         "name": "Upgrade",
         "value": "websocket"
       },
       {
+        "custom": {},
         "name": "Sec-WebSocket-Extensions",
         "value": "permessage-deflate; client_max_window_bits"
       },
       {
+        "custom": {},
         "name": "Cache-Control",
         "value": "no-cache"
       },
       {
+        "custom": {},
         "name": "Connection",
         "value": "Upgrade"
       },
       {
+        "custom": {},
         "name": "Sec-WebSocket-Version",
         "value": "13"
       }
     ],
     "responseHeaders": [
       {
+        "custom": {},
         "name": "Sec-WebSocket-Accept",
         "value": "U81HpQbqlT7cIvlTLbf4dTv7m5w="
       },
       {
+        "custom": {},
         "name": "Connection",
         "value": "Upgrade"
       },
       {
+        "custom": {},
         "name": "Sec-WebSocket-Extensions",
         "value": "permessage-deflate"
       },
       {
+        "custom": {},
         "name": "Upgrade",
         "value": "websocket"
       }
@@ -328,15 +343,7 @@
       "encoded": false
     },
     "remoteAddress": ":80",
-    "resourceType": {
-      "_name": "websocket",
-      "_title": "WebSocket",
-      "_category": {
-        "title": "WebSockets",
-        "shortTitle": "WS"
-      },
-      "_isTextType": false
-    },
+    "resourceType": {},
     "priority": null,
     "finished": true,
     "timing": {
@@ -351,10 +358,13 @@
       "sslEnd": -1,
       "workerStart": -1,
       "workerReady": -1,
+      "workerFetchStart": -1,
+      "workerRespondWithSettled": -1,
       "sendStart": 0,
       "sendEnd": 0,
       "pushStart": 0,
       "pushEnd": 0,
+      "receiveHeadersStart": 0,
       "receiveHeadersEnd": 33045.93599960208
     },
     "endTime": 1555608261.2199361,
diff --git a/third_party/blink/web_tests/http/tests/devtools/har-importer.js b/third_party/blink/web_tests/http/tests/devtools/har-importer.js
index 9d8b238..400d152 100644
--- a/third_party/blink/web_tests/http/tests/devtools/har-importer.js
+++ b/third_party/blink/web_tests/http/tests/devtools/har-importer.js
@@ -2,47 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {TestRunner} from 'test_runner';
 import {ApplicationTestRunner} from 'application_test_runner';
+import * as HAR from 'devtools/models/har/har.js';
 import {NetworkTestRunner} from 'network_test_runner';
-
-(async function() {
-  TestRunner.addResult(
-      'Verifies that imported HAR files create matching NetworkRequests');
-  const harRoot = new HARImporter.HARRoot(harJson);
-  const requests = HARImporter.Importer.requestsFromHARLog(harRoot.log);
-  const formattedRequests = await Promise.all(requests.map(async request => {
-    return {
-      url: request.url(),
-      documentURL: request.documentURL,
-      initiator: request.initiator(),
-      requestFormData: await (request.requestFormData()),
-      connectionId: request.connectionId,
-      requestMethod: request.requestMethod,
-      requestHeaders: request.requestHeaders(),
-      mimeType: request.mimeType,
-      responseHeaders: request.responseHeaders,
-      statusCode: request.statusCode,
-      statusText: request.statusText,
-      protocol: request.protocol,
-      resourceSize: request.resourceSize,
-      transferSize: request.transferSize,
-      cached: request.cached(),
-      cachedInMemory: request.cachedInMemory(),
-      contentData: await (request.contentData()),
-      remoteAddress: request.remoteAddress(),
-      resourceType: request.resourceType(),
-      priority: request.priority(),
-      finished: request.finished,
-      timing: request.timing,
-      endTime: request.endTime,
-      frames: request.frames()
-    };
-  }));
-  TestRunner.addResult(
-      'requests: ' + JSON.stringify(formattedRequests, null, 2));
-  TestRunner.completeTest();
-})();
+import {TestRunner} from 'test_runner';
 
 const harJson = {
   'log': {
@@ -269,54 +232,24 @@
           'url': 'ws://localhost:8880/echo',
           'httpVersion': 'HTTP/1.1',
           'headers': [
-            {
-              'name': 'Pragma',
-              'value': 'no-cache'
-            },
-            {
-              'name': 'Origin',
-              'value': 'http://localhost:8000'
-            },
-            {
-              'name': 'Accept-Encoding',
-              'value': 'gzip, deflate, br'
-            },
-            {
-              'name': 'Host',
-              'value': 'localhost:8880'
-            },
-            {
-              'name': 'Accept-Language',
-              'value': 'en-US,en;q=0.9'
-            },
-            {
-              'name': 'Sec-WebSocket-Key',
-              'value': 'EBTeYTo1PMrIJhQV3KCyLA=='
-            },
+            {'name': 'Pragma', 'value': 'no-cache'},
+            {'name': 'Origin', 'value': 'http://localhost:8000'},
+            {'name': 'Accept-Encoding', 'value': 'gzip, deflate, br'},
+            {'name': 'Host', 'value': 'localhost:8880'},
+            {'name': 'Accept-Language', 'value': 'en-US,en;q=0.9'},
+            {'name': 'Sec-WebSocket-Key', 'value': 'EBTeYTo1PMrIJhQV3KCyLA=='},
             {
               'name': 'User-Agent',
-              'value': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3762.0 Safari/537.36'
+              'value':
+                  'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3762.0 Safari/537.36'
             },
-            {
-              'name': 'Upgrade',
-              'value': 'websocket'
-            },
-            {
+            {'name': 'Upgrade', 'value': 'websocket'}, {
               'name': 'Sec-WebSocket-Extensions',
               'value': 'permessage-deflate; client_max_window_bits'
             },
-            {
-              'name': 'Cache-Control',
-              'value': 'no-cache'
-            },
-            {
-              'name': 'Connection',
-              'value': 'Upgrade'
-            },
-            {
-              'name': 'Sec-WebSocket-Version',
-              'value': '13'
-            }
+            {'name': 'Cache-Control', 'value': 'no-cache'},
+            {'name': 'Connection', 'value': 'Upgrade'},
+            {'name': 'Sec-WebSocket-Version', 'value': '13'}
           ],
           'queryString': [],
           'cookies': [],
@@ -332,25 +265,12 @@
               'name': 'Sec-WebSocket-Accept',
               'value': 'U81HpQbqlT7cIvlTLbf4dTv7m5w='
             },
-            {
-              'name': 'Connection',
-              'value': 'Upgrade'
-            },
-            {
-              'name': 'Sec-WebSocket-Extensions',
-              'value': 'permessage-deflate'
-            },
-            {
-              'name': 'Upgrade',
-              'value': 'websocket'
-            }
+            {'name': 'Connection', 'value': 'Upgrade'},
+            {'name': 'Sec-WebSocket-Extensions', 'value': 'permessage-deflate'},
+            {'name': 'Upgrade', 'value': 'websocket'}
           ],
           'cookies': [],
-          'content': {
-            'size': 0,
-            'mimeType': 'x-unknown',
-            'compression': 175
-          },
+          'content': {'size': 0, 'mimeType': 'x-unknown', 'compression': 175},
           'redirectURL': '',
           'headersSize': 175,
           'bodySize': -175,
@@ -371,15 +291,13 @@
         '_initiator': {
           'type': 'script',
           'stack': {
-            'callFrames': [
-              {
-                'functionName': '',
-                'scriptId': '73',
-                'url': '',
-                'lineNumber': 0,
-                'columnNumber': 5
-              }
-            ]
+            'callFrames': [{
+              'functionName': '',
+              'scriptId': '73',
+              'url': '',
+              'lineNumber': 0,
+              'columnNumber': 5
+            }]
           }
         },
         '_priority': null,
@@ -426,3 +344,41 @@
     ]
   }
 };
+
+(async function() {
+  TestRunner.addResult(
+      'Verifies that imported HAR files create matching NetworkRequests');
+  const harRoot = new HAR.HARFormat.HARRoot(harJson);
+  const requests = HAR.Importer.Importer.requestsFromHARLog(harRoot.log);
+  const formattedRequests = await Promise.all(requests.map(async request => {
+    return {
+      url: request.url(),
+      documentURL: request.documentURL,
+      initiator: request.initiator(),
+      requestFormData: await (request.requestFormData()),
+      connectionId: request.connectionId,
+      requestMethod: request.requestMethod,
+      requestHeaders: request.requestHeaders(),
+      mimeType: request.mimeType,
+      responseHeaders: request.responseHeaders,
+      statusCode: request.statusCode,
+      statusText: request.statusText,
+      protocol: request.protocol,
+      resourceSize: request.resourceSize,
+      transferSize: request.transferSize,
+      cached: request.cached(),
+      cachedInMemory: request.cachedInMemory(),
+      contentData: await (request.contentData()),
+      remoteAddress: request.remoteAddress(),
+      resourceType: request.resourceType(),
+      priority: request.priority(),
+      finished: request.finished,
+      timing: request.timing,
+      endTime: request.endTime,
+      frames: request.frames()
+    };
+  }));
+  TestRunner.addResult(
+      'requests: ' + JSON.stringify(formattedRequests, null, 2));
+  TestRunner.completeTest();
+})();
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/receive-router-rules-on-update-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/receive-router-rules-on-update-expected.txt
index 6ac1ded..cf773ad1 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/receive-router-rules-on-update-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/service-worker/tentative/static-router/receive-router-rules-on-update-expected.txt
@@ -1,3 +1,3 @@
 Tests receiving static router rules from the service worker.
-[{"condition":{"request":{"method":"POST"}},"source":["network"]},{"condition":{"urlPattern":{"hash":"*","hostname":"127.0.0.1","password":"*","pathname":"/**/*.txt","port":"8000","protocol":"http","search":"*","username":"*"}},"source":["fetch-event"]}]
+[{"condition":{"request":{"method":"POST"}},"id":1,"source":["network"]},{"condition":{"urlPattern":{"hash":"*","hostname":"127.0.0.1","password":"*","pathname":"/**/*.txt","port":"8000","protocol":"http","search":"*","username":"*"}},"id":2,"source":["fetch-event"]}]
 
diff --git a/third_party/blink/web_tests/http/tests/navigation/image-load-in-unload-handler.html b/third_party/blink/web_tests/http/tests/navigation/image-load-in-unload-handler.html
index 7077790..d872a82 100644
--- a/third_party/blink/web_tests/http/tests/navigation/image-load-in-unload-handler.html
+++ b/third_party/blink/web_tests/http/tests/navigation/image-load-in-unload-handler.html
@@ -1,41 +1,48 @@
-<html><head>
-<title>Image load in unload handler</title>
-<script>
+<!DOCTYPE html>
+<html>
 
-var testCalled = false;
+<head>
+  <title>Image load in unload handler</title>
+  <script>
+    // We need to ensure that other instances of this test running in parallel
+    // (e.g. in a virtual suite) do not interfere.
+    const key = `${Date.now()}-${Math.random()}`;
 
-function test() {
-    if (!testCalled) {
-        if (window.testRunner) {
-            testRunner.dumpAsText();
-            testRunner.waitUntilDone();
-        }
-        testCalled = true;
-        return;
+    if (window.testRunner) {
+      testRunner.dumpAsText();
+      testRunner.waitUntilDone();
     }
-    // We can't go to check-ping.php directly, since that doesn't start sending
-    // a response until the ping data is detected, but unload handlers (where
-    // we send the ping) are only run once we've begun receiving data from the
-    // page being navigated to. Instead, we go through a dummy redirect page,
-    // to make sure that the onunload handler has run before we get to 
-    // check-ping.php.
-    location.assign("resources/ping-redirect.html?test=unload-image");
-}
 
-function ping() {
-    var img = new Image(1, 1);
-    img.src = "resources/save-Ping.php?test=unload-image";
-}
+    async function test() {
 
-</script>
+      const response = await fetch(`resources/delete-ping.php?test=unload-image-${key}`);
+      if (response.ok) {
+        // We can't go to check-ping.php directly, since that doesn't start sending
+        // a response until the ping data is detected, but unload handlers (where
+        // we send the ping) are only run once we've begun receiving data from the
+        // page being navigated to. Instead, we go through a dummy redirect page,
+        // to make sure that the onunload handler has run before we get to
+        // check-ping.php.
+        location.assign(`resources/ping-redirect.html?test=unload-image-${key}`);
+      }
+    }
+
+    function ping() {
+      var img = new Image(1, 1);
+      img.src = `resources/save-Ping.php?test=unload-image-${key}`
+    }
+
+  </script>
 </head>
+
 <body onload="test();" onunload="ping();">
-<img src="resources/delete-ping.php?test=unload-image" onload="test();" onerror="test();"></img>
-Test case for https://bugs.webkit.org/show_bug.cgi?id=30457. Previously, if an image<br>
-load was trigger from an unload handler, we would kill it almost immediately due to the<br>
-navigation stopping all loaders. These loads now happen entirely in the background and detached<br>
-from the DOM, so they're invisible to the normal resource load callback infrastructure. We generate a<br>
-timestamp, then in the unload handler, we load an 'image' (actually a php script) that takes the<br>
-timestamp as a parameter and saves it to a file.  The destination page is a php script that checks for<br>
-the existence of that file and passes the test if the file contains the expected timestamp.<br>
-</body></html>
+  Test case for https://bugs.webkit.org/show_bug.cgi?id=30457. Previously, if an image<br>
+  load was trigger from an unload handler, we would kill it almost immediately due to the<br>
+  navigation stopping all loaders. These loads now happen entirely in the background and detached<br>
+  from the DOM, so they're invisible to the normal resource load callback infrastructure. We generate a<br>
+  timestamp, then in the unload handler, we load an 'image' (actually a php script) that takes the<br>
+  timestamp as a parameter and saves it to a file. The destination page is a php script that checks for<br>
+  the existence of that file and passes the test if the file contains the expected timestamp.<br>
+</body>
+
+</html>
diff --git a/third_party/blink/web_tests/http/tests/navigation/resources/save-Ping.php b/third_party/blink/web_tests/http/tests/navigation/resources/save-Ping.php
index 08be629..1c334a4 100644
--- a/third_party/blink/web_tests/http/tests/navigation/resources/save-Ping.php
+++ b/third_party/blink/web_tests/http/tests/navigation/resources/save-Ping.php
@@ -1,4 +1,5 @@
 <?php
+ignore_user_abort(true);
 require_once '../../resources/portabilityLayer.php';
 
 $pingFile = fopen(sys_get_temp_dir() . "/ping.txt.tmp", 'w');
diff --git a/third_party/blink/web_tests/http/tests/resources/prevent-bfcache.js b/third_party/blink/web_tests/http/tests/resources/prevent-bfcache.js
index 7210780..5b1301e 100644
--- a/third_party/blink/web_tests/http/tests/resources/prevent-bfcache.js
+++ b/third_party/blink/web_tests/http/tests/resources/prevent-bfcache.js
@@ -3,11 +3,11 @@
 // found in the LICENSE file.
 
 
-// When the returned promised resolve, BFCache will not be used for the current
-// page.
-function preventBFCache() {
-  return new Promise(resolve => {
-    let webSocket = new WebSocket('ws://127.0.0.1:8880/echo');
-    webSocket.onopen = () => { resolve(42); };
-  });
+// When the returned promised resolves, BFCache will not be used for the current
+// page. The function should be async even if it doesn't seem necessary, so that
+// if we need to change how it blocks in the future to something async, we will
+// not need to update all callers.
+let bc;
+async function preventBFCache() {
+  bc = new BroadcastChannel("blocker");
 }
diff --git a/third_party/cros-components/src b/third_party/cros-components/src
index efb6769..075d293 160000
--- a/third_party/cros-components/src
+++ b/third_party/cros-components/src
@@ -1 +1 @@
-Subproject commit efb676910c7e96c78bb050ee100e47f4addf23d1
+Subproject commit 075d293d1a98cce55cdb88185239126eb64f6d55
diff --git a/third_party/dawn b/third_party/dawn
index 615eeaa..498189e 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 615eeaaaba9ba8b21de204f31d37e8ff075c78f5
+Subproject commit 498189e2dd635668efd4b5e261f3222cd82141a2
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index 9a50858..2d62a1f 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit 9a50858ef92b662c0f264a32b6a94c189da5e945
+Subproject commit 2d62a1f2a592e504f9420b3ecd917f0a880295bd
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 6f24b5c..0d9654f 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 6f24b5c111c5631de0e094a81be6926d55509167
+Subproject commit 0d9654f13ba7bbeabb1136d09401309975720cf8
diff --git a/third_party/libc++/src b/third_party/libc++/src
index dbea847..99f5e4d 160000
--- a/third_party/libc++/src
+++ b/third_party/libc++/src
@@ -1 +1 @@
-Subproject commit dbea8476722304fba54a843659313f2ecf2252c3
+Subproject commit 99f5e4d09e3014e1b178dfd7ebf451e652461ad6
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index c8bb25f..88311ff0 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby
-Version: 5fee66b487b8845d20efccfe5602bf11329cb7d4
+Version: 85091845a8471a776df9461d476f733304b13c8e
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/nearby/src b/third_party/nearby/src
index 5fee66b..8509184 160000
--- a/third_party/nearby/src
+++ b/third_party/nearby/src
@@ -1 +1 @@
-Subproject commit 5fee66b487b8845d20efccfe5602bf11329cb7d4
+Subproject commit 85091845a8471a776df9461d476f733304b13c8e
diff --git a/third_party/perfetto b/third_party/perfetto
index d6dd1af..84bb6bc 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit d6dd1afcbdccd18eff2a5992ad7eedaef4a6b4c6
+Subproject commit 84bb6bced2420d2e7bd880cbf30b348448fa95d4
diff --git a/third_party/skia b/third_party/skia
index 79f23e8..1537198 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 79f23e8d8b5d3c602bc2a1081ddb39d3f8085c9e
+Subproject commit 1537198c54612e958cd5262f590adcbb9224bd82
diff --git a/third_party/webgpu-cts/src b/third_party/webgpu-cts/src
index cd9505d..dac947f 160000
--- a/third_party/webgpu-cts/src
+++ b/third_party/webgpu-cts/src
@@ -1 +1 @@
-Subproject commit cd9505da1d631c46cc38b7218c54a4598a4fd802
+Subproject commit dac947fdd70cf6ec088e1c621f58eaf99430175f
diff --git a/third_party/webrtc b/third_party/webrtc
index 3ba809d..c30fb63 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 3ba809d6a6bc20931adde485bb04586a6556db11
+Subproject commit c30fb63f95862e401fb72562ddb6301da3dcbd9d
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 63a58f5..0160196 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -40433,7 +40433,6 @@
   <suffix name="DesktopTabGroupsNewGroup" label="For desktop Tab Groups."/>
   <suffix name="DiscoverFeedHeaderMenu"
       label="For DiscoverFeedHeaderMenu feature."/>
-  <suffix name="DownloadEsbPromo" label="For Download Esb Iph feature promo."/>
   <suffix name="DownloadHome" label="For DownloadHome feature."/>
   <suffix name="DownloadIndicator" label="For DownloadIndicator feature."/>
   <suffix name="DownloadInfoBarDownloadContinuing"
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 123ce3cb..0beabf4 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -16518,6 +16518,7 @@
   <int value="1858" label="DOCUMENTSCAN_CANCELSCAN"/>
   <int value="1859" label="DOCUMENTSCAN_READSCANDATA"/>
   <int value="1860" label="DOCUMENTSCAN_SETOPTIONS"/>
+  <int value="1861" label="DOCUMENTSCAN_GETOPTIONGROUPS"/>
 </enum>
 
 <enum name="ExtensionInProgressRequestState">
@@ -33729,6 +33730,7 @@
       label="InterestFeedV2ClickAndViewActionsConditionalUpload:disabled"/>
   <int value="288755982"
       label="AutofillEnableLocalCardMigrationForNonSyncUser:enabled"/>
+  <int value="289408715" label="MacImeLiveConversionFix:enabled"/>
   <int value="289465857" label="ClipboardHistorySimpleRender:disabled"/>
   <int value="290559997" label="LinkCapturingUiUpdate:disabled"/>
   <int value="291389947" label="PercentBasedScrolling:disabled"/>
@@ -37658,6 +37660,7 @@
   <int value="2130479056" label="CCTResizableSideSheet:disabled"/>
   <int value="2132018256" label="ThumbnailPlaceholder:disabled"/>
   <int value="2132335798" label="EcheSWA:disabled"/>
+  <int value="2132373345" label="MacImeLiveConversionFix:disabled"/>
   <int value="2132595171" label="OmniboxSearchEngineLogo:enabled"/>
   <int value="2133594095" label="CryptAuthV2DeviceActivityStatus:disabled"/>
   <int value="2133647636" label="ClipboardFilenames:disabled"/>
@@ -51118,6 +51121,23 @@
   <int value="2" label="Good model"/>
 </enum>
 
+<enum name="V8CompileHintsStatus">
+  <int value="0"
+      label="Consume local compile hints, classic script, no streaming"/>
+  <int value="1" label="Consume local compile hints, module, no streaming"/>
+  <int value="2"
+      label="Consume crowdsourced compile hints, classic script, no streaming"/>
+  <int value="3"
+      label="Consume crowdsourced compile hints, module, no streaming"/>
+  <int value="4" label="Produce compile hints, classic script, no streaming"/>
+  <int value="5" label="Produce compile hints, module, no streaming"/>
+  <int value="6" label="Consume code cache, classic script, no streaming"/>
+  <int value="7" label="Consume code cache, module, no streaming"/>
+  <int value="8" label="Consume local compile hints, streaming"/>
+  <int value="9" label="Consume crowdsourced compile hints streaming"/>
+  <int value="10" label="Produce compile hints, streaming"/>
+</enum>
+
 <enum name="VariationsSeedExpiry">
   <int value="0" label="Not Expired"/>
   <int value="1" label="Fetch Time Missing"/>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 395b460..8c82a224 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -2677,6 +2677,18 @@
   <token key="ChromeOSAppType" variants="ChromeOSAppType"/>
 </histogram>
 
+<histogram name="Arc.WM.WindowRotateDelayTime.{ChromeOSAppType}" units="ms"
+    expires_after="2024-11-30">
+  <owner>lingyufeng@google.com</owner>
+  <owner>arc-framework@google.com</owner>
+  <summary>
+    Records the time elapsed from display rotates in tablet mode until the
+    window bounds is changed. The data is only collected for the top maximized
+    window shown in tablet mode.
+  </summary>
+  <token key="ChromeOSAppType" variants="ChromeOSAppType"/>
+</histogram>
+
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index 86604cb..358fa3f 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -138,7 +138,6 @@
       summary="PWA launch due to link capturing being enabled"/>
   <variant name="IPH_DesktopTabGroupsNewGroup"
       summary="creating a new tab group"/>
-  <variant name="IPH_DownloadEsbPromo" summary="download ESB promo"/>
   <variant name="IPH_DownloadHome" summary="download home"/>
   <variant name="IPH_DownloadInfobarDownloadContinuing"
       summary="download infobar informing that downloads are still in
diff --git a/tools/metrics/histograms/metadata/media/enums.xml b/tools/metrics/histograms/metadata/media/enums.xml
index 20292def..c3b1a67 100644
--- a/tools/metrics/histograms/metadata/media/enums.xml
+++ b/tools/metrics/histograms/metadata/media/enums.xml
@@ -2280,11 +2280,6 @@
   <int value="6" label="GpuMemoryBuffer"/>
 </enum>
 
-<enum name="VideoPersistenceControlsType">
-  <int value="0" label="Native controls"/>
-  <int value="1" label="Custom controls"/>
-</enum>
-
 <enum name="VideoPixelFormatUnion">
   <int value="0" label="UNKNOWN"/>
   <int value="1" label="I420"/>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index e92fa620..0cc9af9 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -6102,16 +6102,6 @@
   </token>
 </histogram>
 
-<histogram name="Media.VideoPersistence.ControlsType"
-    enum="VideoPersistenceControlsType" expires_after="2021-09-19">
-  <owner>peconn@chromium.org</owner>
-  <owner>media-dev-uma@chromium.org</owner>
-  <summary>
-    Record the type of controls a persisted video is using. This is recorded
-    every time a video enters persistence mode
-  </summary>
-</histogram>
-
 <histogram name="Media.VideoRenderer.CadenceChanges" units="changes"
     expires_after="never">
 <!-- expires-never: Media pipeline health metric. -->
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index 310f5f86..6c165cd 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -4121,16 +4121,6 @@
   <token key="Technology" variants="PhysicalTechnology"/>
 </histogram>
 
-<histogram name="Network.VisibilityAwareResourceScheduler.Deprioritized"
-    units="Boolean" expires_after="2024-01-22">
-  <owner>bashi@chromium.org</owner>
-  <owner>blink-network-stack@google.com</owner>
-  <summary>
-    Whether a resource request is deprioritized because the resource is coming
-    from a background tab. Recorded when a resource request is scheduled.
-  </summary>
-</histogram>
-
 <histogram name="Network.Wifi.Channel" enum="NetworkChannelType"
     expires_after="M85">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index b9eaa34..79dddc9f 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -2558,7 +2558,7 @@
 </histogram>
 
 <histogram name="PageLoad.Internal.Prerender2.Event"
-    enum="PageLoadPrerenderEvent" expires_after="2024-01-21">
+    enum="PageLoadPrerenderEvent" expires_after="2024-07-21">
   <owner>kenoss@chromium.org</owner>
   <owner>src/content/browser/preloading/prerender/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_core/histograms.xml b/tools/metrics/histograms/metadata/web_core/histograms.xml
index c46fa78..a6369183 100644
--- a/tools/metrics/histograms/metadata/web_core/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_core/histograms.xml
@@ -802,6 +802,18 @@
   <summary>Whether a parsing blocking script was streamed or not.</summary>
 </histogram>
 
+<histogram name="WebCore.Scripts.V8CompileHintsStatus"
+    enum="V8CompileHintsStatus" expires_after="2024-03-12">
+  <owner>marja@chromium.org</owner>
+  <owner>v8-loading@google.com</owner>
+  <owner>chrome-intelligence-core@google.com</owner>
+  <summary>
+    Whether we produced / consumed compile hints (either local or crowdsourced)
+    for a script. Recorded when a script is compiled (either via streaming or
+    otherwise).
+  </summary>
+</histogram>
+
 <histogram name="WebCore.Scripts.V8CrowdsourcedCompileHints.ModelQuality"
     enum="V8CompileHintsModelQuality" expires_after="2024-09-11">
   <owner>marja@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index d4bb76c..0b79647 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/3e53e144bee271ec558363df2e561a77d7e0b789/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "88c5f875c7ce8c8ba796d9768aec9c0bdedb985e",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/1817225b10713aae101b4eb5fe9ad89712402736/trace_processor_shell.exe"
+            "hash": "636b74f4ed560fd9acd66c608d8886bfb34f3b57",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/d6dd1afcbdccd18eff2a5992ad7eedaef4a6b4c6/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "8aa911491cd365131216862ae495e18424ebe1b2",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/3e53e144bee271ec558363df2e561a77d7e0b789/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "a63b8e4770a5bda0e4701c59461dda1454bcfa3b",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/d6dd1afcbdccd18eff2a5992ad7eedaef4a6b4c6/trace_processor_shell"
+            "hash": "dfb3b624133d935fa1ac17ba3e765b526162d72e",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/84bb6bced2420d2e7bd880cbf30b348448fa95d4/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/whats_new/upload_whats_new_features.py b/tools/whats_new/upload_whats_new_features.py
index d8cc421..3e6385ce 100755
--- a/tools/whats_new/upload_whats_new_features.py
+++ b/tools/whats_new/upload_whats_new_features.py
@@ -142,6 +142,9 @@
         _AddFeature(index, feature_row, milestone_folder_absolute_path)
         features_name.append(feature_row['Feature name'])
 
+    # Update FET event
+    whats_new_util.UpdateWhatsNewFETEvent(milestone.lower())
+
     # Prepare and upload changes
     _FormatChanges()
     _AddChangesToBranch()
diff --git a/tools/whats_new/whats_new_util.py b/tools/whats_new/whats_new_util.py
index eaf613b..e9a8c94a 100644
--- a/tools/whats_new/whats_new_util.py
+++ b/tools/whats_new/whats_new_util.py
@@ -306,6 +306,29 @@
         os.remove(os.path.join(screenshot_dir, title + '.png'))
 
 
+def UpdateWhatsNewFETEvent(milestone: str) -> None:
+    """Updates ios_promo_feature_configuration.cc and event_constants.cc
+       with the new what's new fet event name.
+
+  Args:
+      milestone: What's New milestone.
+  """
+    whats_new_fet_event_regex = r'"viewed_whats_new_(.*?)"'
+    new_event_str = '"viewed_whats_new_' + milestone + '"'
+    event_constants_file = os.path.join(
+        BASE_DIR, '../components/feature_engagement/public/event_constants.cc')
+    with open(event_constants_file, 'r+', encoding='utf-8',
+              newline='') as file:
+        file_content = file.read()
+        match_whats_new_fet_event = re.search(whats_new_fet_event_regex,
+                                              file_content, re.DOTALL)
+        assert match_whats_new_fet_event
+        new_file_content = file_content.replace(
+            match_whats_new_fet_event.group(0), new_event_str)
+        file.seek(0)
+        file.write(new_file_content)
+
+
 def RemoveStringsForMilestone(milestone: str) -> None:
     """Removes the strings for a specific milestone.
 
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
index da2fcfa..7e4d4069 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -351,7 +351,7 @@
 <translation id="3798449238516105146">वर्शन</translation>
 <translation id="3801082500826908679">फ़ारोईस</translation>
 <translation id="3809272675881623365">खरगोश</translation>
-<translation id="3810973564298564668">प्रबंधित करें</translation>
+<translation id="3810973564298564668">मैनेज करें</translation>
 <translation id="3811408895933919563">अंग्रेज़ी (पाकिस्तान)</translation>
 <translation id="3811494700605067549">1 फ़ाइल चुनी गई</translation>
 <translation id="3817579325494460411">नहीं दिया गया</translation>
@@ -850,7 +850,7 @@
 <translation id="7551643184018910560">अलमारी से पिन करें</translation>
 <translation id="7553492409867692754">Linux ऐप्लिकेशन को <ph name="FOLDER_NAME" /> फ़ोल्डर की फ़ाइलें ऐक्सेस करने की अनुमति दें</translation>
 <translation id="7555339735447658365">आप फ़िलहाल ऑफ़लाइन हैं. डिवाइस को इंटरनेट से कनेक्ट करने पर, फ़ाइल सिंक करने की सुविधा फिर से शुरू हो जाएगी</translation>
-<translation id="7589661784326793847">बस एक सेकंड प्रतीक्षा करें</translation>
+<translation id="7589661784326793847">बस एक सेकंड इंतज़ार करें</translation>
 <translation id="7592775719802218421"><ph name="FILE_NAME" /> को ऑफ़लाइन इस्तेमाल करने के लिए डाउनलोड किया जा रहा है</translation>
 <translation id="7600126690270271294">सर्बियन</translation>
 <translation id="7603724359189955920">ग्रिड</translation>
diff --git a/ui/file_manager/BUILD.gn b/ui/file_manager/BUILD.gn
index 095c9400..2f5257f6 100644
--- a/ui/file_manager/BUILD.gn
+++ b/ui/file_manager/BUILD.gn
@@ -143,6 +143,9 @@
   "chrome://resources/mwc/*|" + rebase_path(
           "//third_party/material_web_components/components-chromium/node_modules/*",
           target_gen_dir),
+  "chrome://resources/cr_components/color_change_listener/*|" + rebase_path(
+          "$root_gen_dir/ui/webui/resources/tsc/cr_components/color_change_listener/*",
+          target_gen_dir),
 ]
 
 ts_library("build_ts") {
@@ -267,6 +270,7 @@
     "//third_party/material_web_components:bundle_lit_ts",
     "//third_party/material_web_components:library",
     "//third_party/polymer/v3_0:library",
+    "//ui/webui/resources/cr_components/color_change_listener:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
   ]
diff --git a/ui/file_manager/file_manager/background/js/test_util.ts b/ui/file_manager/file_manager/background/js/test_util.ts
index 8cc1bd9..1f074a48 100644
--- a/ui/file_manager/file_manager/background/js/test_util.ts
+++ b/ui/file_manager/file_manager/background/js/test_util.ts
@@ -126,7 +126,7 @@
  * @return The URL of the last URL visited.
  */
 test.util.sync.getLastVisitedURL = (contentWindow: Window): string => {
-  return contentWindow.fileManager.getLastVisitedURL();
+  return contentWindow.fileManager.getLastVisitedUrl();
 };
 
 /**
diff --git a/ui/file_manager/file_manager/common/js/dom_utils.ts b/ui/file_manager/file_manager/common/js/dom_utils.ts
index 2f14bd82..c24e043 100644
--- a/ui/file_manager/file_manager/common/js/dom_utils.ts
+++ b/ui/file_manager/file_manager/common/js/dom_utils.ts
@@ -9,7 +9,7 @@
 import type {DirectoryItem, DirectoryTree} from '../../foreground/js/ui/directory_tree.js';
 import type {XfTree} from '../../widgets/xf_tree.js';
 import type {XfTreeItem} from '../../widgets/xf_tree_item.js';
-import {isTree, isTreeItem} from '../../widgets/xf_tree_util.js';
+import {isTreeItem, isXfTree} from '../../widgets/xf_tree_util.js';
 
 import {crInjectTypeAndInit, type DecoratableElement} from './cr_ui.js';
 
@@ -225,7 +225,7 @@
  * TODO(b/285977941): Remove the old tree support.
  */
 export function isDirectoryTree(element: any): element is DirectoryTree|XfTree {
-  return element.typeName === 'directory_tree' || isTree(element);
+  return element.typeName === 'directory_tree' || isXfTree(element);
 }
 export function isDirectoryTreeItem(element: any): element is DirectoryItem|
     XfTreeItem {
@@ -235,7 +235,7 @@
   if (tree.typeName === 'directory_tree') {
     return tree.selectedItem;
   }
-  if (isTree(tree)) {
+  if (isXfTree(tree)) {
     return tree.focusedItem;
   }
   return null;
diff --git a/ui/file_manager/file_manager/common/js/entry_utils.ts b/ui/file_manager/file_manager/common/js/entry_utils.ts
index 348ae99..8a86ac1 100644
--- a/ui/file_manager/file_manager/common/js/entry_utils.ts
+++ b/ui/file_manager/file_manager/common/js/entry_utils.ts
@@ -7,7 +7,7 @@
 import {CurrentDirectory, EntryType, FileData} from '../../externs/ts/state.js';
 import type {VolumeInfo} from '../../externs/volume_info.js';
 import type {VolumeManager} from '../../externs/volume_manager.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ODFS_EXTENSION_ID} from '../../foreground/js/constants.js';
 import type {DirectoryItem} from '../../foreground/js/ui/directory_tree.js';
 import type {TreeItem} from '../../foreground/js/ui/tree.js';
 import {driveRootEntryListKey, myFilesEntryListKey} from '../../state/ducks/volumes.js';
@@ -872,7 +872,7 @@
 }
 
 export const isOneDriveId = (providerId: string|null|undefined) =>
-    providerId === constants.ODFS_EXTENSION_ID;
+    providerId === ODFS_EXTENSION_ID;
 
 export function isOneDrive(volumeInfo: VolumeInfo) {
   return isOneDriveId(volumeInfo?.providerId);
diff --git a/ui/file_manager/file_manager/common/js/entry_utils_unittest.ts b/ui/file_manager/file_manager/common/js/entry_utils_unittest.ts
index f6875d11..bb0028a 100644
--- a/ui/file_manager/file_manager/common/js/entry_utils_unittest.ts
+++ b/ui/file_manager/file_manager/common/js/entry_utils_unittest.ts
@@ -103,9 +103,7 @@
   const downloadsVolumeInfo = volumeManager.volumeInfoList.item(1);
   const mockFs = downloadsVolumeInfo.fileSystem as MockFileSystem;
   mockFs.populate(['/folder1/']);
-  // @ts-ignore: error TS2339: Property 'entries' does not exist on type
-  // 'FileSystem'.
-  const folder1 = downloadsVolumeInfo.fileSystem.entries['/folder1'];
+  const folder1 = mockFs.entries['/folder1']!;
 
   const volumeEntry = new VolumeEntry(downloadsVolumeInfo);
   volumeEntry.addEntry(fakeEntry);
diff --git a/ui/file_manager/file_manager/common/js/icon_util.ts b/ui/file_manager/file_manager/common/js/icon_util.ts
index ac2c17e..6602e03 100644
--- a/ui/file_manager/file_manager/common/js/icon_util.ts
+++ b/ui/file_manager/file_manager/common/js/icon_util.ts
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {constants} from '../../foreground/js/constants.js';
+import {ICON_TYPES} from '../../foreground/js/constants.js';
+
 
 /**
  * @fileoverview This file contains utils for working with icons.
@@ -17,11 +18,11 @@
   }
   switch (vmType) {
     case chrome.fileManagerPrivate.VmType.BRUSCHETTA:
-      return constants.ICON_TYPES.BRUSCHETTA;
+      return ICON_TYPES.BRUSCHETTA;
     case chrome.fileManagerPrivate.VmType.ARCVM:
-      return constants.ICON_TYPES.ANDROID_FILES;
+      return ICON_TYPES.ANDROID_FILES;
     case chrome.fileManagerPrivate.VmType.TERMINA:
-      return constants.ICON_TYPES.CROSTINI;
+      return ICON_TYPES.CROSTINI;
     default:
       console.error('Unable to determine icon for vmType: ' + vmType);
       return '';
diff --git a/ui/file_manager/file_manager/containers/directory_tree_container.ts b/ui/file_manager/file_manager/containers/directory_tree_container.ts
index 537d006..f4496c3 100644
--- a/ui/file_manager/file_manager/containers/directory_tree_container.ts
+++ b/ui/file_manager/file_manager/containers/directory_tree_container.ts
@@ -14,7 +14,7 @@
 import {RootTypesForUMA, VolumeType} from '../common/js/volume_manager_types.js';
 import {AndroidApp, CurrentDirectory, FileData, FileKey, NavigationKey, NavigationRoot, NavigationType, PropStatus, SearchLocation, State} from '../externs/ts/state.js';
 import type {VolumeManager} from '../externs/volume_manager.js';
-import {constants} from '../foreground/js/constants.js';
+import {ICON_TYPES} from '../foreground/js/constants.js';
 import {DirectoryModel} from '../foreground/js/directory_model.js';
 import {Command} from '../foreground/js/ui/command.js';
 import {contextMenuHandler} from '../foreground/js/ui/context_menu_handler.js';
@@ -489,7 +489,7 @@
       element: XfTreeItem, fileData: FileData,
       navigationRoot?: NavigationRoot) {
     if (navigationRoot?.type === NavigationType.SHORTCUT) {
-      element.icon = constants.ICON_TYPES.SHORTCUT;
+      element.icon = ICON_TYPES.SHORTCUT;
       return;
     }
     // Navigation icon might be chrome.fileManagerPrivate.IconSet type.
@@ -502,13 +502,13 @@
     if (shouldSupportDriveSpecificIcons(fileData) && fileData.metadata) {
       const {shared, isMachineRoot, isExternalMedia} = fileData.metadata;
       if (shared) {
-        element.icon = constants.ICON_TYPES.SHARED_FOLDER;
+        element.icon = ICON_TYPES.SHARED_FOLDER;
       }
       if (isMachineRoot) {
-        element.icon = constants.ICON_TYPES.COMPUTER;
+        element.icon = ICON_TYPES.COMPUTER;
       }
       if (isExternalMedia) {
-        element.icon = constants.ICON_TYPES.USB;
+        element.icon = ICON_TYPES.USB;
       }
     }
   }
diff --git a/ui/file_manager/file_manager/definitions/context_menu_handler_events.d.ts b/ui/file_manager/file_manager/definitions/context_menu_handler_events.d.ts
deleted file mode 100644
index 096da03..0000000
--- a/ui/file_manager/file_manager/definitions/context_menu_handler_events.d.ts
+++ /dev/null
@@ -1,14 +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.
-
-import type {Menu} from '../foreground/js/ui/menu.js';
-
-interface ContextMenuEventDetail {
-  element: HTMLElement;
-  menu: Menu;
-}
-
-export type HideEvent = CustomEvent<ContextMenuEventDetail>;
-
-export type ShowEvent = CustomEvent<ContextMenuEventDetail>;
diff --git a/ui/file_manager/file_manager/definitions/file_manager.d.ts b/ui/file_manager/file_manager/definitions/file_manager.d.ts
index 8c220854..912ab26 100644
--- a/ui/file_manager/file_manager/definitions/file_manager.d.ts
+++ b/ui/file_manager/file_manager/definitions/file_manager.d.ts
@@ -22,7 +22,7 @@
   directoryModel: DirectoryModel;
   directoryTreeNamingController: DirectoryTreeNamingController;
   ui: FileManagerUI;
-  getLastVisitedURL(): string;
+  getLastVisitedUrl(): string;
   getTranslatedString(id: string): string;
   onUnloadForTest(): void;
 }
@@ -30,6 +30,7 @@
 interface AppState {
   currentDirectoryURL?: string;
   selectionURL?: string;
+  viewOptions?: any;
 }
 
 /**
@@ -50,10 +51,6 @@
 
     appState?: AppState;
 
-    webkitResolveLocalFileSystemURL(
-        url: string, successCallback: FileSystemEntryCallback,
-        errorCallback: ErrorCallback): void;
-
     // Only used for grid.ts
     cvox?: {
       Api?: {
@@ -70,6 +67,10 @@
     // For unit test.
     chrome: typeof chrome;
   }
+
+  function webkitResolveLocalFileSystemURL(
+      url: string, successCallback: FileSystemEntryCallback,
+      errorCallback: ErrorCallback): void;
 }
 
 export {};
diff --git a/ui/file_manager/file_manager/externs/command_handler_deps.js b/ui/file_manager/file_manager/externs/command_handler_deps.js
index 2c84162..e3aa7c8 100644
--- a/ui/file_manager/file_manager/externs/command_handler_deps.js
+++ b/ui/file_manager/file_manager/externs/command_handler_deps.js
@@ -46,7 +46,7 @@
     /** @type {FileFilter} */
     this.fileFilter;
 
-    /** @type {FileTransferController} */
+    /** @type {?FileTransferController} */
     this.fileTransferController;
 
     /** @type {FileSelectionHandler} */
@@ -88,7 +88,7 @@
 
   // @ts-ignore: error TS2355: A function whose declared type is neither 'void'
   // nor 'any' must return a value.
-  /** @return {DirectoryEntry|FilesAppEntry} */
+  /** @return {DirectoryEntry|FilesAppEntry|null|undefined} */
   getCurrentDirectoryEntry() {}
 
   // @ts-ignore: error TS2355: A function whose declared type is neither 'void'
diff --git a/ui/file_manager/file_manager/foreground/js/actions_controller.ts b/ui/file_manager/file_manager/foreground/js/actions_controller.ts
index 2336903..321525f 100644
--- a/ui/file_manager/file_manager/foreground/js/actions_controller.ts
+++ b/ui/file_manager/file_manager/foreground/js/actions_controller.ts
@@ -5,7 +5,6 @@
 import {getFocusedTreeItem} from '../../common/js/dom_utils.js';
 import {getTreeItemEntry} from '../../common/js/entry_utils.js';
 import {isNewDirectoryTreeEnabled} from '../../common/js/flags.js';
-import type {ShowEvent} from '../../definitions/context_menu_handler_events.js';
 import type {FilesAppEntry} from '../../externs/files_app_entry_interfaces.js';
 import type {VolumeManager} from '../../externs/volume_manager.js';
 import {XfTree} from '../../widgets/xf_tree.js';
@@ -15,7 +14,7 @@
 import {FolderShortcutsDataModel} from './folder_shortcuts_data_model.js';
 import {MetadataSetEvent} from './metadata/metadata_cache_set.js';
 import {MetadataModel} from './metadata/metadata_model.js';
-import {contextMenuHandler} from './ui/context_menu_handler.js';
+import {contextMenuHandler, type ShowEvent} from './ui/context_menu_handler.js';
 import {DirectoryTree} from './ui/directory_tree.js';
 import {FileManagerUI} from './ui/file_manager_ui.js';
 
@@ -53,7 +52,7 @@
     // Attach listeners to events based on user action to show the menu, which
     // updates the DOM.
     contextMenuHandler.addEventListener(
-        'show', this.onContextMenuShow_.bind(this) as EventListener);
+        'show', this.onContextMenuShow_.bind(this));
     this.ui_.selectionMenuButton.addEventListener(
         'menushow', this.onMenuShow_.bind(this));
     this.ui_.gearButton.addEventListener(
diff --git a/ui/file_manager/file_manager/foreground/js/actions_model.ts b/ui/file_manager/file_manager/foreground/js/actions_model.ts
index a6b6828..3a08fd9 100644
--- a/ui/file_manager/file_manager/foreground/js/actions_model.ts
+++ b/ui/file_manager/file_manager/foreground/js/actions_model.ts
@@ -14,7 +14,7 @@
 import type {FilesAppEntry} from '../../externs/files_app_entry_interfaces.js';
 import type {VolumeManager} from '../../externs/volume_manager.js';
 
-import {constants} from './constants.js';
+import {FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED, FSP_ACTION_HIDDEN_ONEDRIVE_URL, FSP_ACTION_HIDDEN_ONEDRIVE_USER_EMAIL} from './constants.js';
 import type {FolderShortcutsDataModel} from './folder_shortcuts_data_model.js';
 import type {MetadataModel} from './metadata/metadata_model.js';
 import type {ActionModelUi} from './ui/action_model_ui.js';
@@ -499,17 +499,15 @@
                         // user, for example actions that just expose OneDrive
                         // URLs.
                         // TODO(b/237216270): Restrict to the ODFS extension ID.
-                        if (action.id ===
-                            constants.FSP_ACTION_HIDDEN_ONEDRIVE_URL) {
+                        if (action.id === FSP_ACTION_HIDDEN_ONEDRIVE_URL) {
                           return;
                         }
                         if (action.id ===
-                            constants.FSP_ACTION_HIDDEN_ONEDRIVE_USER_EMAIL) {
+                            FSP_ACTION_HIDDEN_ONEDRIVE_USER_EMAIL) {
                           return;
                         }
                         if (action.id ===
-                            constants
-                                .FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED) {
+                            FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED) {
                           return;
                         }
                         actions[action.id] = new CustomAction(
diff --git a/ui/file_manager/file_manager/foreground/js/app_state_controller.js b/ui/file_manager/file_manager/foreground/js/app_state_controller.js
deleted file mode 100644
index 08bfe90..0000000
--- a/ui/file_manager/file_manager/foreground/js/app_state_controller.js
+++ /dev/null
@@ -1,274 +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.
-
-import {assert} from 'chrome://resources/ash/common/assert.js';
-
-import {saveAppState, updateAppState} from '../../common/js/app_util.js';
-import {isRecentRoot} from '../../common/js/entry_utils.js';
-import {storage} from '../../common/js/storage.js';
-import {DialogType} from '../../externs/ts/state.js';
-
-import {DirectoryModel} from './directory_model.js';
-import {GROUP_BY_FIELD_DIRECTORY, GROUP_BY_FIELD_MODIFICATION_TIME} from './file_list_model.js';
-import {FileManagerUI} from './ui/file_manager_ui.js';
-import {ListType} from './ui/list_container.js';
-
-export class AppStateController {
-  /**
-   * @param {DialogType} dialogType
-   */
-  constructor(dialogType) {
-    /** @private @const @type {string} */
-    this.viewOptionStorageKey_ = 'file-manager-' + dialogType;
-
-    /** @private @type {?DirectoryModel} */
-    this.directoryModel_ = null;
-
-    /** @private @type {?FileManagerUI} */
-    this.ui_ = null;
-
-    /** @private @type {*} */
-    this.viewOptions_ = null;
-
-    /**
-     * Preferred sort field of file list. This will be ignored in the Recent
-     * folder, since it always uses descendant order of date-mofidied.
-     * @private @type {string}
-     */
-    this.fileListSortField_ = AppStateController.DEFAULT_SORT_FIELD;
-
-    /**
-     * Preferred sort direction of file list. This will be ignored in the Recent
-     * folder, since it always uses descendant order of date-mofidied.
-     * @private @type {string}
-     */
-    this.fileListSortDirection_ = AppStateController.DEFAULT_SORT_DIRECTION;
-  }
-
-  /**
-   * @return {Promise<void>}
-   */
-  async loadInitialViewOptions() {
-    // Load initial view option.
-    try {
-      const values = await storage.local.getAsync(this.viewOptionStorageKey_);
-
-      this.viewOptions_ = {};
-
-      const value = /** @type {string} */ (values[this.viewOptionStorageKey_]);
-      if (!value) {
-        return;
-      }
-
-      // Load the global default options.
-      try {
-        this.viewOptions_ = JSON.parse(value);
-      } catch (ignore) {
-      }
-
-      // Override with window-specific options.
-      // @ts-ignore: error TS2339: Property 'appState' does not exist on type
-      // 'Window & typeof globalThis'.
-      if (window.appState && window.appState.viewOptions) {
-        // @ts-ignore: error TS2339: Property 'appState' does not exist on type
-        // 'Window & typeof globalThis'.
-        for (const key in window.appState.viewOptions) {
-          // @ts-ignore: error TS2339: Property 'appState' does not exist on
-          // type 'Window & typeof globalThis'.
-          if (window.appState.viewOptions.hasOwnProperty(key)) {
-            // @ts-ignore: error TS2339: Property 'appState' does not exist on
-            // type 'Window & typeof globalThis'.
-            this.viewOptions_[key] = window.appState.viewOptions[key];
-          }
-        }
-      }
-    } catch (error) {
-      this.viewOptions_ = {};
-      console.warn(error);
-    }
-  }
-
-  /**
-   * @param {!FileManagerUI} ui
-   * @param {!DirectoryModel} directoryModel
-   */
-  initialize(ui, directoryModel) {
-    assert(this.viewOptions_);
-
-    this.ui_ = ui;
-    this.directoryModel_ = directoryModel;
-    const {table} = ui.listContainer;
-
-    // Register event listeners.
-    // @ts-ignore: error TS2339: Property 'addEventListener' does not exist on
-    // type 'FileTable'.
-    table.addEventListener(
-        'column-resize-end', this.saveViewOptions.bind(this));
-    directoryModel.getFileList().addEventListener(
-        'sorted', this.onFileListSorted_.bind(this));
-    directoryModel.getFileFilter().addEventListener(
-        'changed', this.onFileFilterChanged_.bind(this));
-    directoryModel.addEventListener(
-        'directory-changed', this.onDirectoryChanged_.bind(this));
-
-    // Restore preferences.
-    ui.setCurrentListType(this.viewOptions_.listType || ListType.DETAIL);
-    if (this.viewOptions_.sortField) {
-      this.fileListSortField_ = this.viewOptions_.sortField;
-    }
-    if (this.viewOptions_.sortDirection) {
-      this.fileListSortDirection_ = this.viewOptions_.sortDirection;
-    }
-    this.directoryModel_.getFileList().sort(
-        this.fileListSortField_, this.fileListSortDirection_);
-    if (this.viewOptions_.isAllAndroidFoldersVisible) {
-      this.directoryModel_.getFileFilter().setAllAndroidFoldersVisible(true);
-    }
-    if (this.viewOptions_.columnConfig) {
-      // @ts-ignore: error TS2339: Property 'restoreColumnConfig' does not exist
-      // on type 'TableColumnModel'.
-      table.columnModel.restoreColumnConfig(this.viewOptions_.columnConfig);
-      // The stored config might not match the current table width, do a
-      // normalization here after restoration.
-      // @ts-ignore: error TS2339: Property 'clientWidth' does not exist on type
-      // 'FileTable'.
-      table.columnModel.normalizeWidths(table.clientWidth);
-    }
-  }
-
-  /**
-   * Saves current view option.
-   */
-  async saveViewOptions() {
-    const prefs = {
-      sortField: this.fileListSortField_,
-      sortDirection: this.fileListSortDirection_,
-      columnConfig: {},
-      listType: this.ui_?.listContainer.currentListType,
-      isAllAndroidFoldersVisible:
-          this.directoryModel_?.getFileFilter().isAllAndroidFoldersVisible(),
-    };
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    const cm = this.ui_.listContainer.table.columnModel;
-    // @ts-ignore: error TS2339: Property 'exportColumnConfig' does not exist on
-    // type 'TableColumnModel'.
-    prefs.columnConfig = cm.exportColumnConfig();
-    // Save the global default.
-    const items = {};
-    // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-    // expression of type 'string' can't be used to index type '{}'.
-    items[this.viewOptionStorageKey_] = JSON.stringify(prefs);
-    storage.local.setAsync(items);
-
-    // Save the window-specific preference.
-    // @ts-ignore: error TS2339: Property 'appState' does not exist on type
-    // 'Window & typeof globalThis'.
-    if (window.appState) {
-      // @ts-ignore: error TS2339: Property 'appState' does not exist on type
-      // 'Window & typeof globalThis'.
-      window.appState.viewOptions = prefs;
-      saveAppState();
-    }
-  }
-
-  /**
-   * @private
-   */
-  async onFileListSorted_() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    const currentDirectory = this.directoryModel_.getCurrentDirEntry();
-    if (!currentDirectory) {
-      return;
-    }
-
-    // Update preferred sort field and direction only when the current directory
-    // is not Recent folder.
-    if (!isRecentRoot(currentDirectory)) {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      const currentSortStatus = this.directoryModel_.getFileList().sortStatus;
-      // @ts-ignore: error TS2339: Property 'field' does not exist on type
-      // 'Object'.
-      this.fileListSortField_ = currentSortStatus.field;
-      // @ts-ignore: error TS2339: Property 'direction' does not exist on type
-      // 'Object'.
-      this.fileListSortDirection_ = currentSortStatus.direction;
-    }
-    this.saveViewOptions();
-  }
-
-  /**
-   * @private
-   */
-  async onFileFilterChanged_() {
-    const isAllAndroidFoldersVisible =
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.directoryModel_.getFileFilter().isAllAndroidFoldersVisible();
-    if (this.viewOptions_.isAllAndroidFoldersVisible !==
-        isAllAndroidFoldersVisible) {
-      this.viewOptions_.isAllAndroidFoldersVisible = isAllAndroidFoldersVisible;
-      this.saveViewOptions();
-    }
-  }
-
-  /**
-   * @param {Event} event
-   * @private
-   */
-  onDirectoryChanged_(event) {
-    const
-        customEvent = /**
-                         @type {import('./directory_model.js').DirectoryChangeEvent}
-                           */
-        (event);
-    if (!customEvent.detail.newDirEntry) {
-      return;
-    }
-
-    // Sort the file list by:
-    // 1) 'date-mofidied' and 'desc' order on Recent folder.
-    // 2) preferred field and direction on other folders.
-    const isOnRecent = isRecentRoot(customEvent.detail.newDirEntry);
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    const fileListModel = this.directoryModel_.getFileList();
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.isOnRecent = isOnRecent;
-    const isOnRecentBefore = customEvent.detail.previousDirEntry &&
-        isRecentRoot(customEvent.detail.previousDirEntry);
-    if (isOnRecent != isOnRecentBefore) {
-      if (isOnRecent) {
-        fileListModel.groupByField = GROUP_BY_FIELD_MODIFICATION_TIME;
-        fileListModel.sort(
-            AppStateController.DEFAULT_SORT_FIELD,
-            AppStateController.DEFAULT_SORT_DIRECTION);
-      } else {
-        const isGridView =
-            this.ui_?.listContainer.currentListType === ListType.THUMBNAIL;
-        fileListModel.groupByField =
-            isGridView ? GROUP_BY_FIELD_DIRECTORY : null;
-        fileListModel.sort(
-            this.fileListSortField_, this.fileListSortDirection_);
-      }
-    }
-
-    updateAppState(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.directoryModel_.getCurrentDirEntry() ?
-            // @ts-ignore: error TS2531: Object is possibly 'null'.
-            this.directoryModel_.getCurrentDirEntry().toURL() :
-            '',
-        /*selectionURL=*/ '');
-  }
-}
-
-/**
- * Default sort field of the file list.
- * @const @type {string}
- */
-AppStateController.DEFAULT_SORT_FIELD = 'modificationTime';
-
-/**
- * Default sort direction of the file list.
- * @const @type {string}
- */
-AppStateController.DEFAULT_SORT_DIRECTION = 'desc';
diff --git a/ui/file_manager/file_manager/foreground/js/app_state_controller.ts b/ui/file_manager/file_manager/foreground/js/app_state_controller.ts
new file mode 100644
index 0000000..ee22928
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/app_state_controller.ts
@@ -0,0 +1,211 @@
+// 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.
+
+import {assert} from 'chrome://resources/js/assert.js';
+
+import {saveAppState, updateAppState} from '../../common/js/app_util.js';
+import {isRecentRoot} from '../../common/js/entry_utils.js';
+import {storage} from '../../common/js/storage.js';
+import {DialogType} from '../../externs/ts/state.js';
+
+import type {DirectoryChangeEvent, DirectoryModel} from './directory_model.js';
+import {GROUP_BY_FIELD_DIRECTORY, GROUP_BY_FIELD_MODIFICATION_TIME} from './file_list_model.js';
+import type {FileManagerUI} from './ui/file_manager_ui.js';
+import type {FileTableColumnModel} from './ui/file_table.js';
+import {ListType} from './ui/list_container.js';
+
+export class AppStateController {
+  private readonly viewOptionStorageKey_: string;
+  private directoryModel_: DirectoryModel|null = null;
+  private ui_: FileManagerUI|null = null;
+  private viewOptions_: any = null;
+
+  /**
+   * Preferred sort field of file list. This will be ignored in the Recent
+   * folder, since it always uses descendant order of date-mofidied.
+   */
+  private fileListSortField_: string|null = DEFAULT_SORT_FIELD;
+
+  /**
+   * Preferred sort direction of file list. This will be ignored in the Recent
+   * folder, since it always uses descendant order of date-mofidied.
+   */
+  private fileListSortDirection_: string|null = DEFAULT_SORT_DIRECTION;
+
+  constructor(dialogType: DialogType) {
+    this.viewOptionStorageKey_ = 'file-manager-' + dialogType;
+  }
+
+  async loadInitialViewOptions(): Promise<void> {
+    // Load initial view option.
+    try {
+      const values = await storage.local.getAsync(this.viewOptionStorageKey_);
+
+      this.viewOptions_ = {};
+
+      const value = values[this.viewOptionStorageKey_];
+      if (!value) {
+        return;
+      }
+
+      // Load the global default options.
+      try {
+        this.viewOptions_ = JSON.parse(value);
+      } catch (ignore) {
+      }
+
+      // Override with window-specific options.
+      if (window?.appState?.viewOptions) {
+        for (const [key, value] of Object.entries(
+                 window.appState.viewOptions)) {
+          this.viewOptions_[key] = value;
+        }
+      }
+    } catch (error) {
+      this.viewOptions_ = {};
+      console.warn(error);
+    }
+  }
+
+  initialize(ui: FileManagerUI, directoryModel: DirectoryModel) {
+    assert(this.viewOptions_);
+
+    this.ui_ = ui;
+    this.directoryModel_ = directoryModel;
+    const {table} = ui.listContainer;
+
+    // Register event listeners.
+    table.addEventListener(
+        'column-resize-end', this.saveViewOptions.bind(this));
+    directoryModel.getFileList().addEventListener(
+        'sorted', this.onFileListSorted_.bind(this));
+    directoryModel.getFileFilter().addEventListener(
+        'changed', this.onFileFilterChanged_.bind(this));
+    directoryModel.addEventListener(
+        'directory-changed', this.onDirectoryChanged_.bind(this));
+
+    // Restore preferences.
+    ui.setCurrentListType(this.viewOptions_.listType || ListType.DETAIL);
+    if (this.viewOptions_.sortField) {
+      this.fileListSortField_ = this.viewOptions_.sortField;
+    }
+    if (this.viewOptions_.sortDirection) {
+      this.fileListSortDirection_ = this.viewOptions_.sortDirection;
+    }
+    this.directoryModel_.getFileList().sort(
+        this.fileListSortField_!, this.fileListSortDirection_!);
+    if (this.viewOptions_.isAllAndroidFoldersVisible) {
+      this.directoryModel_.getFileFilter().setAllAndroidFoldersVisible(true);
+    }
+    if (this.viewOptions_.columnConfig) {
+      (table.columnModel as FileTableColumnModel)
+          .restoreColumnConfig(this.viewOptions_.columnConfig);
+      // The stored config might not match the current table width, do a
+      // normalization here after restoration.
+      table.columnModel.normalizeWidths(table.clientWidth);
+    }
+  }
+
+  /**
+   * Saves current view option.
+   */
+  async saveViewOptions() {
+    const prefs = {
+      sortField: this.fileListSortField_,
+      sortDirection: this.fileListSortDirection_,
+      columnConfig: {},
+      listType: this.ui_?.listContainer.currentListType,
+      isAllAndroidFoldersVisible:
+          this.directoryModel_?.getFileFilter().isAllAndroidFoldersVisible(),
+    };
+    assert(this.ui_);
+    const cm = this.ui_.listContainer.table.columnModel as FileTableColumnModel;
+    prefs.columnConfig = cm.exportColumnConfig();
+    // Save the global default.
+    const items: Record<string, string> = {};
+    items[this.viewOptionStorageKey_] = JSON.stringify(prefs);
+    storage.local.setAsync(items);
+
+    // Save the window-specific preference.
+    if (window.appState) {
+      window.appState.viewOptions = prefs;
+      saveAppState();
+    }
+  }
+
+  private async onFileListSorted_() {
+    assert(this.directoryModel_);
+    const currentDirectory = this.directoryModel_.getCurrentDirEntry();
+    if (!currentDirectory) {
+      return;
+    }
+
+    // Update preferred sort field and direction only when the current directory
+    // is not Recent folder.
+    if (!isRecentRoot(currentDirectory)) {
+      const currentSortStatus = this.directoryModel_.getFileList().sortStatus;
+      this.fileListSortField_ = currentSortStatus.field;
+      this.fileListSortDirection_ = currentSortStatus.direction;
+    }
+    this.saveViewOptions();
+  }
+
+  private async onFileFilterChanged_() {
+    assert(this.directoryModel_);
+    const isAllAndroidFoldersVisible =
+        this.directoryModel_.getFileFilter().isAllAndroidFoldersVisible();
+    if (this.viewOptions_.isAllAndroidFoldersVisible !==
+        isAllAndroidFoldersVisible) {
+      this.viewOptions_.isAllAndroidFoldersVisible = isAllAndroidFoldersVisible;
+      this.saveViewOptions();
+    }
+  }
+
+  private onDirectoryChanged_(event: DirectoryChangeEvent) {
+    if (!event.detail.newDirEntry) {
+      return;
+    }
+
+    assert(this.directoryModel_);
+    assert(this.ui_);
+
+    // Sort the file list by:
+    // 1) 'date-mofidied' and 'desc' order on Recent folder.
+    // 2) preferred field and direction on other folders.
+    const isOnRecent = isRecentRoot(event.detail.newDirEntry);
+    const fileListModel = this.directoryModel_.getFileList();
+    this.ui_.listContainer.isOnRecent = isOnRecent;
+    const isOnRecentBefore = event.detail.previousDirEntry &&
+        isRecentRoot(event.detail.previousDirEntry);
+    if (isOnRecent !== isOnRecentBefore) {
+      if (isOnRecent) {
+        fileListModel.groupByField = GROUP_BY_FIELD_MODIFICATION_TIME;
+        fileListModel.sort(DEFAULT_SORT_FIELD, DEFAULT_SORT_DIRECTION);
+      } else {
+        const isGridView =
+            this.ui_?.listContainer.currentListType === ListType.THUMBNAIL;
+        fileListModel.groupByField =
+            isGridView ? GROUP_BY_FIELD_DIRECTORY : null;
+        fileListModel.sort(
+            this.fileListSortField_!, this.fileListSortDirection_!);
+      }
+    }
+
+    updateAppState(
+        this.directoryModel_.getCurrentDirEntry() ?
+            this.directoryModel_.getCurrentDirEntry()!.toURL() :
+            '',
+        /*selectionURL=*/ '');
+  }
+}
+
+/**
+ * Default sort field of the file list.
+ */
+const DEFAULT_SORT_FIELD = 'modificationTime';
+
+/**
+ * Default sort direction of the file list.
+ */
+const DEFAULT_SORT_DIRECTION = 'desc';
diff --git a/ui/file_manager/file_manager/foreground/js/banner_controller.ts b/ui/file_manager/file_manager/foreground/js/banner_controller.ts
index bdd7d6b..bafb523a 100644
--- a/ui/file_manager/file_manager/foreground/js/banner_controller.ts
+++ b/ui/file_manager/file_manager/foreground/js/banner_controller.ts
@@ -19,7 +19,7 @@
 import type {VolumeManager} from '../../externs/volume_manager.js';
 import {getStore} from '../../state/store.js';
 
-import {constants} from './constants.js';
+import {DEFAULT_CROSTINI_VM, PLUGIN_VM} from './constants.js';
 import {DirectoryModel} from './directory_model.js';
 import {TAG_NAME as DlpRestrictedBannerName} from './ui/banners/dlp_restricted_banner.js';
 import {TAG_NAME as DriveBulkPinningBannerTagName} from './ui/banners/drive_bulk_pinning_banner.js';
@@ -341,22 +341,19 @@
       this.registerCustomBannerFilter(SharedWithCrostiniPluginVmBanner, {
         shouldShow: () =>
             isPathSharedWithVm(
-                this.crostini_, this.currentEntry_,
-                constants.DEFAULT_CROSTINI_VM) &&
-            isPathSharedWithVm(
-                this.crostini_, this.currentEntry_, constants.PLUGIN_VM),
-        context: () =>
-            ({type: constants.DEFAULT_CROSTINI_VM + constants.PLUGIN_VM}),
+                this.crostini_, this.currentEntry_, DEFAULT_CROSTINI_VM) &&
+            isPathSharedWithVm(this.crostini_, this.currentEntry_, PLUGIN_VM),
+        context: () => ({type: DEFAULT_CROSTINI_VM + PLUGIN_VM}),
       });
       this.registerCustomBannerFilter(SharedWithCrostiniPluginVmBanner, {
         shouldShow: () => isPathSharedWithVm(
-            this.crostini_, this.currentEntry_, constants.DEFAULT_CROSTINI_VM),
-        context: () => ({type: constants.DEFAULT_CROSTINI_VM}),
+            this.crostini_, this.currentEntry_, DEFAULT_CROSTINI_VM),
+        context: () => ({type: DEFAULT_CROSTINI_VM}),
       });
       this.registerCustomBannerFilter(SharedWithCrostiniPluginVmBanner, {
-        shouldShow: () => isPathSharedWithVm(
-            this.crostini_, this.currentEntry_, constants.PLUGIN_VM),
-        context: () => ({type: constants.PLUGIN_VM}),
+        shouldShow: () =>
+            isPathSharedWithVm(this.crostini_, this.currentEntry_, PLUGIN_VM),
+        context: () => ({type: PLUGIN_VM}),
       });
 
       this.registerCustomBannerFilter(DriveBulkPinningBannerTagName, {
diff --git a/ui/file_manager/file_manager/foreground/js/command_handler.ts b/ui/file_manager/file_manager/foreground/js/command_handler.ts
index 157d362..6981051d 100644
--- a/ui/file_manager/file_manager/foreground/js/command_handler.ts
+++ b/ui/file_manager/file_manager/foreground/js/command_handler.ts
@@ -6,14 +6,13 @@
 
 import {crInjectTypeAndInit} from '../../common/js/cr_ui.js';
 import {recordEnum} from '../../common/js/metrics.js';
-import type {HideEvent, ShowEvent} from '../../definitions/context_menu_handler_events.js';
 import type {CommandHandlerDeps} from '../../externs/command_handler_deps.js';
 
-import {constants} from './constants.js';
+import {DEFAULT_BRUSCHETTA_VM, DEFAULT_CROSTINI_VM, PLUGIN_VM} from './constants.js';
 import {BrowserBackCommand, ConfigureCommand, CutCopyCommand, DefaultTaskCommand, DeleteCommand, DlpRestrictionDetailsCommand, DriveBuyMoreSpaceCommand, DriveGoToDriveCommand, DriveSyncSettingsCommand, EmptyTrashCommand, EraseDeviceCommand, ExtractAllCommand, FilesSettingsCommand, FocusActionBarCommand, FormatCommand, GetInfoCommand, GoToFileLocationCommand, GuestOsManagingSharingCommand, GuestOsManagingSharingGearCommand, GuestOsShareCommand, InspectConsoleCommand, InspectElementCommand, InspectNormalCommand, InvokeSharesheetCommand, ManageInDriveCommand, ManageMirrorsyncCommand, NewFolderCommand, NewWindowCommand, OpenGearMenuCommand, OpenWithCommand, PasteCommand, PasteIntoCurrentFolderCommand, PasteIntoFolderCommand, PinFolderCommand, RefreshCommand, RenameCommand, RestoreFromTrashCommand, SearchCommand, SelectAllCommand, SendFeedbackCommand, SetWallpaperCommand, ShareCommand, ShowProvidersSubmenuCommand, SortByDateCommand, SortByNameCommand, SortBySizeCommand, SortByTypeCommand, ToggleHiddenAndroidFoldersCommand, ToggleHiddenFilesCommand, ToggleHoldingSpaceCommand, TogglePinnedCommand, UnmountCommand, UnpinFolderCommand, VolumeHelpCommand, VolumeStorageCommand, VolumeSwitchCommand, ZipSelectionCommand, ZoomInCommand, ZoomOutCommand, ZoomResetCommand} from './file_manager_commands.js';
 import {shouldIgnoreEvents} from './file_manager_commands_util.js';
 import {CanExecuteEvent, Command, CommandEvent} from './ui/command.js';
-import {contextMenuHandler} from './ui/context_menu_handler.js';
+import {contextMenuHandler, type HideEvent, type ShowEvent} from './ui/context_menu_handler.js';
 
 /**
  * Name of a command (for UMA).
@@ -128,34 +127,32 @@
   'volume-switch-8': new VolumeSwitchCommand(8),
   'volume-switch-9': new VolumeSwitchCommand(9),
   'share-with-linux': new GuestOsShareCommand(
-      constants.DEFAULT_CROSTINI_VM, 'CROSTINI', crostiniSettings,
+      DEFAULT_CROSTINI_VM, 'CROSTINI', crostiniSettings,
       MenuCommandsForUma.MANAGE_LINUX_SHARING_TOAST,
       MenuCommandsForUma.SHARE_WITH_LINUX),
   'share-with-plugin-vm': new GuestOsShareCommand(
-      constants.PLUGIN_VM, 'PLUGIN_VM', pluginVmSettings,
+      PLUGIN_VM, 'PLUGIN_VM', pluginVmSettings,
       MenuCommandsForUma.MANAGE_PLUGIN_VM_SHARING_TOAST,
       MenuCommandsForUma.SHARE_WITH_PLUGIN_VM),
   'share-with-bruschetta': new GuestOsShareCommand(
-      constants.DEFAULT_BRUSCHETTA_VM, 'BRUSCHETTA', bruschettaSettings,
+      DEFAULT_BRUSCHETTA_VM, 'BRUSCHETTA', bruschettaSettings,
       MenuCommandsForUma.MANAGE_BRUSCHETTA_SHARING_TOAST,
       MenuCommandsForUma.SHARE_WITH_BRUSCHETTA),
   'manage-linux-sharing-gear': new GuestOsManagingSharingGearCommand(
-      constants.DEFAULT_CROSTINI_VM, crostiniSettings,
+      DEFAULT_CROSTINI_VM, crostiniSettings,
       MenuCommandsForUma.MANAGE_LINUX_SHARING),
   'manage-plugin-vm-sharing-gear': new GuestOsManagingSharingGearCommand(
-      constants.PLUGIN_VM, pluginVmSettings,
-      MenuCommandsForUma.MANAGE_PLUGIN_VM_SHARING),
+      PLUGIN_VM, pluginVmSettings, MenuCommandsForUma.MANAGE_PLUGIN_VM_SHARING),
   'manage-bruschetta-sharing-gear': new GuestOsManagingSharingGearCommand(
-      constants.DEFAULT_BRUSCHETTA_VM, bruschettaSettings,
+      DEFAULT_BRUSCHETTA_VM, bruschettaSettings,
       MenuCommandsForUma.MANAGE_BRUSCHETTA_SHARING),
   'manage-linux-sharing': new GuestOsManagingSharingCommand(
-      constants.DEFAULT_CROSTINI_VM, crostiniSettings,
+      DEFAULT_CROSTINI_VM, crostiniSettings,
       MenuCommandsForUma.MANAGE_LINUX_SHARING),
   'manage-plugin-vm-sharing': new GuestOsManagingSharingCommand(
-      constants.PLUGIN_VM, pluginVmSettings,
-      MenuCommandsForUma.MANAGE_PLUGIN_VM_SHARING),
+      PLUGIN_VM, pluginVmSettings, MenuCommandsForUma.MANAGE_PLUGIN_VM_SHARING),
   'manage-bruschetta-sharing': new GuestOsManagingSharingCommand(
-      constants.DEFAULT_BRUSCHETTA_VM, bruschettaSettings,
+      DEFAULT_BRUSCHETTA_VM, bruschettaSettings,
       MenuCommandsForUma.MANAGE_BRUSCHETTA_SHARING),
 };
 
@@ -195,9 +192,9 @@
         'canExecute', this.onCanExecute_.bind(this) as EventListener);
 
     contextMenuHandler.addEventListener(
-        'show', this.onContextMenuShow_.bind(this) as EventListener);
+        'show', this.onContextMenuShow_.bind(this));
     contextMenuHandler.addEventListener(
-        'hide', this.onContextMenuHide_.bind(this) as EventListener);
+        'hide', this.onContextMenuHide_.bind(this));
   }
 
   private onContextMenuShow_(event: ShowEvent) {
diff --git a/ui/file_manager/file_manager/foreground/js/constants.js b/ui/file_manager/file_manager/foreground/js/constants.ts
similarity index 72%
rename from ui/file_manager/file_manager/foreground/js/constants.js
rename to ui/file_manager/file_manager/foreground/js/constants.ts
index 516c0d1..ae1c6c2 100644
--- a/ui/file_manager/file_manager/foreground/js/constants.js
+++ b/ui/file_manager/file_manager/foreground/js/constants.ts
@@ -2,44 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-/**
- * Namespace for common constants used in Files app.
- * @namespace
- */
-export const constants = {};
-
-/**
- * @const @type {!Array<string>}
- */
-constants.ACTIONS_MODEL_METADATA_PREFETCH_PROPERTY_NAMES = [
+export const ACTIONS_MODEL_METADATA_PREFETCH_PROPERTY_NAMES = [
   'canPin',
   'hosted',
   'pinned',
 ];
 
 /**
- * The list of executable file extensions.
- *
- * @const
- * @type {Array<string>}
- */
-// @ts-ignore: error TS4104: The type 'readonly string[]' is 'readonly' and
-// cannot be assigned to the mutable type 'string[]'.
-constants.EXECUTABLE_EXTENSIONS = Object.freeze([
-  '.exe',
-  '.lnk',
-  '.deb',
-  '.dmg',
-  '.jar',
-  '.msi',
-]);
-
-/**
  * These metadata is expected to be cached to accelerate computeAdditional.
  * See: crbug.com/458915.
- * @const @type {!Array<string>}
  */
-constants.FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES = [
+export const FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES = [
   'availableOffline',
   'contentMimeType',
   'hosted',
@@ -52,9 +25,8 @@
  * TODO(sashab): Store capabilities as a set of flags to save memory. See
  * https://crbug.com/849997
  *
- * @const @type {!Array<string>}
  */
-constants.LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES = [
+export const LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES = [
   'availableOffline',
   'contentMimeType',
   'customIconUrl',
@@ -78,10 +50,8 @@
 /**
  * Metadata properties used to inform the user about DLP (Data Leak Prevention)
  * Files restrictions. These metadata is expected to be cached.
- *
- * @const @type {!Array<string>}
  */
-constants.DLP_METADATA_PREFETCH_PROPERTY_NAMES = [
+export const DLP_METADATA_PREFETCH_PROPERTY_NAMES = [
   'isDlpRestricted',
   'sourceUrl',
   'isRestrictedForDestination',
@@ -89,54 +59,48 @@
 
 /**
  * Name of the default crostini VM: crostini::kCrostiniDefaultVmName
- * @const
  */
-constants.DEFAULT_CROSTINI_VM = 'termina';
+export const DEFAULT_CROSTINI_VM = 'termina';
 
 /**
  * Name of the Plugin VM: plugin_vm::kPluginVmName.
- * @const
  */
-constants.PLUGIN_VM = 'PvmDefault';
+export const PLUGIN_VM = 'PvmDefault';
 
 /**
  * Name of the default bruschetta VM: bruschetta::kBruschettaVmName
- * @const
  */
-constants.DEFAULT_BRUSCHETTA_VM = 'bru';
+export const DEFAULT_BRUSCHETTA_VM = 'bru';
 
 /**
  * DOMError type for crostini connection failure.
- * @const @type {string}
  */
-constants.CROSTINI_CONNECT_ERR = 'CrostiniConnectErr';
+export const CROSTINI_CONNECT_ERR = 'CrostiniConnectErr';
 
 /**
  * ID of the fake fileSystemProvider custom action containing OneDrive document
  * URLs.
- * @const @type {string}
  */
-constants.FSP_ACTION_HIDDEN_ONEDRIVE_URL = 'HIDDEN_ONEDRIVE_URL';
+export const FSP_ACTION_HIDDEN_ONEDRIVE_URL = 'HIDDEN_ONEDRIVE_URL';
 
 /**
  * ID of the fake fileSystemProvider custom action containing OneDrive document
  * User Emails.
- * @const @type {string}
  */
-constants.FSP_ACTION_HIDDEN_ONEDRIVE_USER_EMAIL = 'HIDDEN_ONEDRIVE_USER_EMAIL';
+export const FSP_ACTION_HIDDEN_ONEDRIVE_USER_EMAIL =
+    'HIDDEN_ONEDRIVE_USER_EMAIL';
 
 /**
  * ID of the fake fileSystemProvider custom action containing OneDrive document
  * Reauthentication Required state.
- * @const @type {string}
  */
-constants.FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED =
+export const FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED =
     'HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED';
 
 /**
  * All icon types.
  */
-constants.ICON_TYPES = {
+export const ICON_TYPES = {
   ANDROID_FILES: 'android_files',
   ARCHIVE: 'archive',
   AUDIO: 'audio',
@@ -213,7 +177,5 @@
 
 /**
  * Extension ID for OneDrive FSP, also used as ProviderId.
- * @const
- * @type {string}
  */
-constants.ODFS_EXTENSION_ID = 'gnnndjlaomemikopnjhhnoombakkkkdg';
+export const ODFS_EXTENSION_ID = 'gnnndjlaomemikopnjhhnoombakkkkdg';
diff --git a/ui/file_manager/file_manager/foreground/js/crostini_controller.ts b/ui/file_manager/file_manager/foreground/js/crostini_controller.ts
index b4fd20bf..cb5f568 100644
--- a/ui/file_manager/file_manager/foreground/js/crostini_controller.ts
+++ b/ui/file_manager/file_manager/foreground/js/crostini_controller.ts
@@ -14,7 +14,7 @@
 import {FilesToast} from '../elements/files_toast.js';
 
 import {MenuCommandsForUma, recordMenuItemSelected} from './command_handler.js';
-import {constants} from './constants.js';
+import {DEFAULT_BRUSCHETTA_VM, DEFAULT_CROSTINI_VM, PLUGIN_VM} from './constants.js';
 import {NavigationModelFakeItem, NavigationModelItemType} from './navigation_list_model.js';
 import {DirectoryTree} from './ui/directory_tree.js';
 
@@ -38,7 +38,7 @@
   async redraw() {
     // Setup Linux files fake root.
     let crostiniNavigationModelItem;
-    if (this.crostini_.isEnabled(constants.DEFAULT_CROSTINI_VM)) {
+    if (this.crostini_.isEnabled(DEFAULT_CROSTINI_VM)) {
       const crostiniEntry =
           new FakeEntryImpl(str('LINUX_FILES_ROOT_LABEL'), RootType.CROSTINI);
       crostiniNavigationModelItem = new NavigationModelFakeItem(
@@ -102,9 +102,9 @@
 
     const [crostiniShareCount, pluginVmShareCount, bruschettaVmShareCount] =
         await Promise.all([
-          getSharedPaths(constants.DEFAULT_CROSTINI_VM),
-          getSharedPaths(constants.PLUGIN_VM),
-          getSharedPaths(constants.DEFAULT_BRUSCHETTA_VM),
+          getSharedPaths(DEFAULT_CROSTINI_VM),
+          getSharedPaths(PLUGIN_VM),
+          getSharedPaths(DEFAULT_BRUSCHETTA_VM),
         ]);
 
     // Toasts are queued and shown one-at-a-time if multiple apply.
diff --git a/ui/file_manager/file_manager/foreground/js/directory_contents.ts b/ui/file_manager/file_manager/foreground/js/directory_contents.ts
index 150fbc21..6b1ecab1 100644
--- a/ui/file_manager/file_manager/foreground/js/directory_contents.ts
+++ b/ui/file_manager/file_manager/foreground/js/directory_contents.ts
@@ -22,7 +22,7 @@
 import {getDefaultSearchOptions} from '../../state/ducks/search.js';
 import {getStore} from '../../state/store.js';
 
-import {constants} from './constants.js';
+import {ACTIONS_MODEL_METADATA_PREFETCH_PROPERTY_NAMES, CROSTINI_CONNECT_ERR, DLP_METADATA_PREFETCH_PROPERTY_NAMES, FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES, LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES} from './constants.js';
 import {FileListModel} from './file_list_model.js';
 import {MetadataItem} from './metadata/metadata_item.js';
 import {MetadataModel} from './metadata/metadata_model.js';
@@ -764,7 +764,7 @@
         console.warn(`Cannot mount Crostini volume: ${
             chrome.runtime.lastError.message}`);
         errorCallback(createDOMError(
-            constants.CROSTINI_CONNECT_ERR, chrome.runtime.lastError.message));
+            CROSTINI_CONNECT_ERR, chrome.runtime.lastError.message));
         return;
       }
       successCallback();
@@ -800,7 +800,7 @@
     } catch (error) {
       errorCallback(createDOMError(
           // TODO(crbug/1293229): Strings
-          constants.CROSTINI_CONNECT_ERR, JSON.stringify(error)));
+          CROSTINI_CONNECT_ERR, JSON.stringify(error)));
     }
   }
 }
@@ -1006,10 +1006,10 @@
       readonly volumeManager: VolumeManager) {
     this.fileList = new FileListModel(metadataModel);
     this.prefetchPropertyNames = Array.from(new Set([
-      ...constants.LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES,
-      ...constants.ACTIONS_MODEL_METADATA_PREFETCH_PROPERTY_NAMES,
-      ...constants.FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES,
-      ...constants.DLP_METADATA_PREFETCH_PROPERTY_NAMES,
+      ...LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES,
+      ...ACTIONS_MODEL_METADATA_PREFETCH_PROPERTY_NAMES,
+      ...FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES,
+      ...DLP_METADATA_PREFETCH_PROPERTY_NAMES,
     ]));
   }
 }
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.ts b/ui/file_manager/file_manager/foreground/js/directory_model.ts
index de7b297..d4404fd 100644
--- a/ui/file_manager/file_manager/foreground/js/directory_model.ts
+++ b/ui/file_manager/file_manager/foreground/js/directory_model.ts
@@ -27,7 +27,7 @@
 import {clearSearch, getDefaultSearchOptions, updateSearch} from '../../state/ducks/search.js';
 import {getFileData, getStore, getVolume} from '../../state/store.js';
 
-import {constants} from './constants.js';
+import {CROSTINI_CONNECT_ERR, DLP_METADATA_PREFETCH_PROPERTY_NAMES, LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES} from './constants.js';
 import {ContentScanner, CrostiniMounter, DirectoryContents, DirectoryContentScanner, DriveMetadataSearchContentScanner, EmptyContentScanner, FileFilter, FileListContext, GuestOsMounter, MediaViewContentScanner, RecentContentScanner, SearchV2ContentScanner, TrashContentScanner} from './directory_contents.js';
 import {FileListModel} from './file_list_model.js';
 import {FileWatcher, type WatcherDirectoryChangedEvent} from './file_watcher.js';
@@ -101,8 +101,8 @@
 }
 
 export type DirectoryChangeEvent = CustomEvent<{
-  previousDirEntry: DirectoryEntry | FilesAppDirEntry | FakeEntry,
-  newDirEntry: DirectoryEntry | FilesAppDirEntry | FakeEntry,
+  previousDirEntry: DirectoryEntry | FilesAppDirEntry,
+  newDirEntry: DirectoryEntry | FilesAppDirEntry,
   volumeChanged: boolean,
 }>;
 
@@ -840,8 +840,8 @@
       if (!isFakeEntry(currentEntry)) {
         this.metadataModel_.get(
             [currentEntry],
-            constants.LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES.concat(
-                constants.DLP_METADATA_PREFETCH_PROPERTY_NAMES));
+            LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES.concat(
+                DLP_METADATA_PREFETCH_PROPERTY_NAMES));
       }
     }
 
@@ -989,30 +989,30 @@
       maybeRunPendingRescan();
     };
 
-    const onFailure =
-        ((event: CustomEvent<{error: DOMError}>) => {
-          onFinished();
+    const onFailure = ((event: CustomEvent<{error: DOMError}>) => {
+                        onFinished();
 
-          this.runningScan_ = null;
-          this.scanFailures_++;
-          failureCallback(event.detail.error);
+                        this.runningScan_ = null;
+                        this.scanFailures_++;
+                        failureCallback(event.detail.error);
 
-          if (maybeRunPendingRescan()) {
-            return;
-          }
+                        if (maybeRunPendingRescan()) {
+                          return;
+                        }
 
-          // Do not rescan for Guest OS (including Crostini) errors.
-          // TODO(crbug/1293229): Guest OS currently reuses the Crostini error
-          // string, but once it gets its own strings this needs to include
-          // both.
-          if (event.detail.error.name === constants.CROSTINI_CONNECT_ERR) {
-            return;
-          }
+                        // Do not rescan for Guest OS (including Crostini)
+                        // errors.
+                        // TODO(crbug/1293229): Guest OS currently reuses the
+                        // Crostini error string, but once it gets its own
+                        // strings this needs to include both.
+                        if (event.detail.error.name === CROSTINI_CONNECT_ERR) {
+                          return;
+                        }
 
-          if (this.scanFailures_ <= 1) {
-            this.rescanLater(refresh);
-          }
-        }) as EventListenerOrEventListenerObject;
+                        if (this.scanFailures_ <= 1) {
+                          this.rescanLater(refresh);
+                        }
+                      }) as EventListenerOrEventListenerObject;
 
     const onCancelled = () => {
       onFinished();
diff --git a/ui/file_manager/file_manager/foreground/js/empty_folder_controller.ts b/ui/file_manager/file_manager/foreground/js/empty_folder_controller.ts
index 53deb63..210f604 100644
--- a/ui/file_manager/file_manager/foreground/js/empty_folder_controller.ts
+++ b/ui/file_manager/file_manager/foreground/js/empty_folder_controller.ts
@@ -12,7 +12,7 @@
 import {updateIsInteractiveVolume} from '../../state/ducks/volumes.js';
 import {getStore} from '../../state/store.js';
 
-import {constants} from './constants.js';
+import {FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED} from './constants.js';
 import {DirectoryModel} from './directory_model.js';
 import {ProvidersModel} from './providers_model.js';
 
@@ -104,8 +104,7 @@
             // Find the reauthentication required action.
             for (const action of customActions) {
               if (action.id ===
-                      constants
-                          .FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED &&
+                      FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED &&
                   action.title === 'true') {
                 fulfill(true);
                 return;
diff --git a/ui/file_manager/file_manager/foreground/js/empty_folder_controller_unittest.ts b/ui/file_manager/file_manager/foreground/js/empty_folder_controller_unittest.ts
index c7def54a..1acdadb 100644
--- a/ui/file_manager/file_manager/foreground/js/empty_folder_controller_unittest.ts
+++ b/ui/file_manager/file_manager/foreground/js/empty_folder_controller_unittest.ts
@@ -14,7 +14,7 @@
 import {RootType, VolumeType} from '../../common/js/volume_manager_types.js';
 import {FakeEntry} from '../../externs/files_app_entry_interfaces.js';
 import {PropStatus} from '../../externs/ts/state.js';
-import {constants} from '../../foreground/js/constants.js';
+import {FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED, ODFS_EXTENSION_ID} from '../../foreground/js/constants.js';
 import {clearSearch, updateSearch} from '../../state/ducks/search.js';
 import {convertVolumeInfoAndMetadataToVolume} from '../../state/ducks/volumes.js';
 import {createFakeVolumeMetadata, setUpFileManagerOnWindow, setupStore} from '../../state/for_tests.js';
@@ -92,7 +92,7 @@
         // This is called for the test when Reauthentication Required state is
         // true.
         const actions = [{
-          id: constants.FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED,
+          id: FSP_ACTION_HIDDEN_ONEDRIVE_REAUTHENTICATION_REQUIRED,
           title: 'true',
         }];
         callback(actions);
@@ -193,7 +193,7 @@
   const initialState = getEmptyState();
   const {volumeManager} = window.fileManager;
   const odfsVolumeInfo = MockVolumeManager.createMockVolumeInfo(
-      VolumeType.PROVIDED, 'odfs', 'odfs', 'odfs', constants.ODFS_EXTENSION_ID);
+      VolumeType.PROVIDED, 'odfs', 'odfs', 'odfs', ODFS_EXTENSION_ID);
   volumeManager.volumeInfoList.add(odfsVolumeInfo);
   const volume = convertVolumeInfoAndMetadataToVolume(
       odfsVolumeInfo, createFakeVolumeMetadata(odfsVolumeInfo));
@@ -237,7 +237,7 @@
   const initialState = getEmptyState();
   const {volumeManager} = window.fileManager;
   const odfsVolumeInfo = MockVolumeManager.createMockVolumeInfo(
-      VolumeType.PROVIDED, 'odfs', 'odfs', 'odfs', constants.ODFS_EXTENSION_ID);
+      VolumeType.PROVIDED, 'odfs', 'odfs', 'odfs', ODFS_EXTENSION_ID);
   volumeManager.volumeInfoList.add(odfsVolumeInfo);
   const volume = convertVolumeInfoAndMetadataToVolume(
       odfsVolumeInfo, createFakeVolumeMetadata(odfsVolumeInfo));
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.js b/ui/file_manager/file_manager/foreground/js/file_manager.js
deleted file mode 100644
index d62b9b1..0000000
--- a/ui/file_manager/file_manager/foreground/js/file_manager.js
+++ /dev/null
@@ -1,2202 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'chrome://resources/cros_components/switch/switch.js';
-import '../../background/js/file_manager_base.js';
-import '../../background/js/test_util.js';
-import '../../definitions/file_manager_private.js';
-import '../../widgets/xf_jellybean.js';
-
-import {assert, assertInstanceof} from 'chrome://resources/ash/common/assert.js';
-import {NativeEventTarget as EventTarget} from 'chrome://resources/ash/common/event_target.js';
-import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-// @ts-ignore: error TS2792: Cannot find module
-// 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js'.
-// Did you mean to set the 'moduleResolution' option to 'nodenext', or to add
-// aliases to the 'paths' option?
-import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
-import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
-
-import {FileManagerBase} from '../../background/js/file_manager_base.js';
-import {getBulkPinProgress, getDialogCaller, getDlpBlockedComponents, getDriveConnectionState, getPreferences} from '../../common/js/api.js';
-import {ArrayDataModel} from '../../common/js/array_data_model.js';
-import {crInjectTypeAndInit} from '../../common/js/cr_ui.js';
-import {isFolderDialogType} from '../../common/js/dialog_type.js';
-import {getKeyModifiers, queryDecoratedElement, queryRequiredElement} from '../../common/js/dom_utils.js';
-import {EntryList, FakeEntryImpl} from '../../common/js/files_app_entry_types.js';
-import {FilesAppState} from '../../common/js/files_app_state.js';
-import {FilteredVolumeManager} from '../../common/js/filtered_volume_manager.js';
-import {isDlpEnabled, isGuestOsEnabled, isNewDirectoryTreeEnabled} from '../../common/js/flags.js';
-import {recordEnum, recordInterval, startInterval} from '../../common/js/metrics.js';
-import {ProgressItemState} from '../../common/js/progress_center_common.js';
-import {str} from '../../common/js/translations.js';
-import {TrashRootEntry} from '../../common/js/trash.js';
-import {getLastVisitedURL, isInGuestMode, runningInBrowser} from '../../common/js/util.js';
-import {AllowedPaths, ARCHIVE_OPENED_EVENT_TYPE, RootType, VolumeType} from '../../common/js/volume_manager_types.js';
-import {DirectoryTreeContainer} from '../../containers/directory_tree_container.js';
-import {NudgeType} from '../../containers/nudge_container.js';
-import {Crostini} from '../../externs/background/crostini.js';
-import {ProgressCenter} from '../../externs/background/progress_center.js';
-import {CommandHandlerDeps} from '../../externs/command_handler_deps.js';
-import {FakeEntry, FilesAppDirEntry} from '../../externs/files_app_entry_interfaces.js';
-import {DialogType, PropStatus, SearchLocation} from '../../externs/ts/state.js';
-import {Store} from '../../externs/ts/store.js';
-import {getMyFiles} from '../../state/ducks/all_entries.js';
-import {updateBulkPinProgress} from '../../state/ducks/bulk_pinning.js';
-import {updateDeviceConnectionState} from '../../state/ducks/device.js';
-import {updateDriveConnectionStatus} from '../../state/ducks/drive.js';
-import {setLaunchParameters} from '../../state/ducks/launch_params.js';
-import {updatePreferences} from '../../state/ducks/preferences.js';
-import {getDefaultSearchOptions, updateSearch} from '../../state/ducks/search.js';
-import {addUiEntry, removeUiEntry} from '../../state/ducks/ui_entries.js';
-import {driveRootEntryListKey, trashRootKey} from '../../state/ducks/volumes.js';
-import {getEmptyState, getEntry, getStore} from '../../state/store.js';
-
-import {ActionsController} from './actions_controller.js';
-import {AndroidAppListModel} from './android_app_list_model.js';
-import {AppStateController} from './app_state_controller.js';
-import {BannerController} from './banner_controller.js';
-import {CommandHandler} from './command_handler.js';
-import {findQueryMatchedDirectoryEntry} from './crossover_search_utils.js';
-import {CrostiniController} from './crostini_controller.js';
-import {DialogActionController} from './dialog_action_controller.js';
-import {FileFilter} from './directory_contents.js';
-import {DirectoryModel} from './directory_model.js';
-import {DirectoryTreeNamingController} from './directory_tree_naming_controller.js';
-import {importElements} from './elements_importer.js';
-import {EmptyFolderController} from './empty_folder_controller.js';
-import {forceDefaultHandler} from './file_manager_commands_util.js';
-import {FileSelection, FileSelectionHandler} from './file_selection.js';
-import {FileTasks} from './file_tasks.js';
-import {FileTransferController} from './file_transfer_controller.js';
-import {FileTypeFiltersController} from './file_type_filters_controller.js';
-import {FolderShortcutsDataModel} from './folder_shortcuts_data_model.js';
-import {GearMenuController} from './gear_menu_controller.js';
-import {GuestOsController} from './guest_os_controller.js';
-import {LastModifiedController} from './last_modified_controller.js';
-import {LaunchParam} from './launch_param.js';
-import {ListThumbnailLoader} from './list_thumbnail_loader.js';
-import {MainWindowComponent} from './main_window_component.js';
-import {MetadataModel} from './metadata/metadata_model.js';
-import {ThumbnailModel} from './metadata/thumbnail_model.js';
-import {MetadataBoxController} from './metadata_box_controller.js';
-import {MetadataUpdateController} from './metadata_update_controller.js';
-import {NamingController} from './naming_controller.js';
-import {NavigationListModel, NavigationModelFakeItem, NavigationModelItemType} from './navigation_list_model.js';
-import {NavigationUma} from './navigation_uma.js';
-import {ProvidersModel} from './providers_model.js';
-import {QuickViewController} from './quick_view_controller.js';
-import {QuickViewModel} from './quick_view_model.js';
-import {QuickViewUma} from './quick_view_uma.js';
-import {ScanController} from './scan_controller.js';
-import {SelectionMenuController} from './selection_menu_controller.js';
-import {SortMenuController} from './sort_menu_controller.js';
-import {SpinnerController} from './spinner_controller.js';
-import {TaskController} from './task_controller.js';
-import {ToolbarController} from './toolbar_controller.js';
-import {A11yAnnounce} from './ui/a11y_announce.js';
-import {CommandButton} from './ui/commandbutton.js';
-import {contextMenuHandler} from './ui/context_menu_handler.js';
-import {DirectoryTree} from './ui/directory_tree.js';
-import {FileGrid} from './ui/file_grid.js';
-import {FileListSelectionModel} from './ui/file_list_selection_model.js';
-import {FileManagerUI} from './ui/file_manager_ui.js';
-import {FileMetadataFormatter} from './ui/file_metadata_formatter.js';
-import {FileTable} from './ui/file_table.js';
-import {List} from './ui/list.js';
-import {Menu} from './ui/menu.js';
-
-/**
- * FileManager constructor.
- *
- * FileManager objects encapsulate the functionality of the file selector
- * dialogs, as well as the full screen file manager application.
- *
- * @implements {CommandHandlerDeps}
- */
-export class FileManager extends EventTarget {
-  constructor() {
-    super();
-
-    // ------------------------------------------------------------------------
-    // Services FileManager depends on.
-
-    /**
-     * Volume manager.
-     * @private @type {!FilteredVolumeManager}
-     */
-    this.volumeManager_;
-
-    /** @private @type {?Crostini} */
-    this.crostini_ = null;
-
-    /** @private @type {?CrostiniController} */
-    this.crostiniController_ = null;
-
-    /** @private @type {?GuestOsController} */
-    this.guestOsController_ = null;
-
-    /** @private @type {?MetadataModel} */
-    this.metadataModel_ = null;
-
-    /** @private @const @type {!FileMetadataFormatter} */
-    this.fileMetadataFormatter_ = new FileMetadataFormatter();
-
-    /** @private @type {?ThumbnailModel} */
-    this.thumbnailModel_ = null;
-
-    /**
-     * File filter.
-     * @private @type {?FileFilter}
-     */
-    this.fileFilter_ = null;
-
-    /**
-     * Model of current directory.
-     * @private @type {?DirectoryModel}
-     */
-    this.directoryModel_ = null;
-
-    /**
-     * Model of folder shortcuts.
-     * @private @type {?FolderShortcutsDataModel}
-     */
-    this.folderShortcutsModel_ = null;
-
-    /**
-     * Model of Android apps.
-     * @private @type {?AndroidAppListModel}
-     */
-    this.androidAppListModel_ = null;
-
-    /**
-     * Model for providers (providing extensions).
-     * @private @type {?ProvidersModel}
-     */
-    this.providersModel_ = null;
-
-    /**
-     * Model for quick view.
-     * @private @type {?QuickViewModel}
-     */
-    this.quickViewModel_ = null;
-
-    /**
-     * Controller for actions for current selection.
-     * @private @type {ActionsController}
-     */
-    // @ts-ignore: error TS2322: Type 'null' is not assignable to type
-    // 'ActionsController'.
-    this.actionsController_ = null;
-
-    /**
-     * Handler for command events.
-     * @private @type {CommandHandler}
-     */
-    // @ts-ignore: error TS2322: Type 'null' is not assignable to type
-    // 'CommandHandler'.
-    this.commandHandler_ = null;
-
-    /**
-     * Handler for the change of file selection.
-     * @private @type {?FileSelectionHandler}
-     */
-    this.selectionHandler_ = null;
-
-    /**
-     * UI management class of file manager.
-     * @private @type {?FileManagerUI}
-     */
-    this.ui_ = null;
-
-    // ------------------------------------------------------------------------
-    // Parameters determining the type of file manager.
-
-    /**
-     * Dialog type of this window.
-     * @public @type {DialogType}
-     */
-    this.dialogType = DialogType.FULL_PAGE;
-
-    /**
-     * Startup parameters for this application.
-     * @private @type {?LaunchParam}
-     */
-    this.launchParams_ = null;
-
-    // ------------------------------------------------------------------------
-    // Controllers.
-
-    /**
-     * File transfer controller.
-     * @private @type {?FileTransferController}
-     */
-    this.fileTransferController_ = null;
-
-    /**
-     * Naming controller.
-     * @private @type {?NamingController}
-     */
-    this.namingController_ = null;
-
-    /**
-     * Directory tree naming controller.
-     * @private @type {DirectoryTreeNamingController}
-     */
-    // @ts-ignore: error TS2322: Type 'null' is not assignable to type
-    // 'DirectoryTreeNamingController'.
-    this.directoryTreeNamingController_ = null;
-
-    /**
-     * Controller for directory scan.
-     * @private @type {?ScanController}
-     */
-    this.scanController_ = null;
-
-    /**
-     * Controller for spinner.
-     * @private @type {?SpinnerController}
-     */
-    this.spinnerController_ = null;
-
-    /**
-     * Sort menu controller.
-     * @private @type {?SortMenuController}
-     */
-    this.sortMenuController_ = null;
-
-    /**
-     * Gear menu controller.
-     * @private @type {?GearMenuController}
-     */
-    this.gearMenuController_ = null;
-
-    /**
-     * Controller for the context menu opened by the action bar button in the
-     * check-select mode.
-     * @private @type {?SelectionMenuController}
-     */
-    this.selectionMenuController_ = null;
-
-    /**
-     * Toolbar controller.
-     * @private @type {?ToolbarController}
-     */
-    this.toolbarController_ = null;
-
-    /**
-     * App state controller.
-     * @private @type {?AppStateController}
-     */
-    this.appStateController_ = null;
-
-    /**
-     * Dialog action controller.
-     * @private @type {?DialogActionController}
-     */
-    this.dialogActionController_ = null;
-
-    /**
-     * List update controller.
-     * @private @type {?MetadataUpdateController}
-     */
-    this.metadataUpdateController_ = null;
-
-    /**
-     * Last modified controller.
-     * @private @type {LastModifiedController}
-     */
-    // @ts-ignore: error TS2322: Type 'null' is not assignable to type
-    // 'LastModifiedController'.
-    this.lastModifiedController_ = null;
-
-    /**
-     * Component for main window and its misc UI parts.
-     * @private @type {?MainWindowComponent}
-     */
-    this.mainWindowComponent_ = null;
-
-    /** @private @type {?TaskController} */
-    this.taskController_ = null;
-
-    /** @private @type {?QuickViewUma} */
-    this.quickViewUma_ = null;
-
-    /** @private @type {?QuickViewController} */
-    this.quickViewController_ = null;
-
-    /** @private @type {?FileTypeFiltersController} */
-    this.fileTypeFiltersController_ = null;
-
-    /**
-     * Empty folder controller.
-     * @private @type {?EmptyFolderController}
-     */
-    this.emptyFolderController_ = null;
-
-    /**
-     * Records histograms of directory-changed event.
-     * @private @type {?NavigationUma}
-     */
-    this.navigationUma_ = null;
-
-    // ------------------------------------------------------------------------
-    // DOM elements.
-
-    /**
-     * @private @type {?FileManagerBase}
-     */
-    this.fileBrowserBackground_ = null;
-
-    /**
-     * The root DOM element of this app.
-     * @private @type {?HTMLBodyElement}
-     */
-    this.dialogDom_ = null;
-
-    /**
-     * The document object of this app.
-     * @private @type {?Document}
-     */
-    this.document_ = null;
-
-    // ------------------------------------------------------------------------
-    // Miscellaneous FileManager's states.
-
-    /**
-     * Promise object which is fulfilled when initialization for app state
-     * controller is done.
-     * @private @type {?Promise<void>}
-     */
-    this.initSettingsPromise_ = null;
-
-    /**
-     * Promise object which is fulfilled when initialization related to the
-     * background page is done.
-     * @private @type {?Promise<void>}
-     */
-    this.initBackgroundPagePromise_ = null;
-
-    /**
-     * Whether Drive is enabled. Retrieved from user preferences.
-     * @private @type {boolean}
-     */
-    this.driveEnabled_ = false;
-
-    /**
-     * Whether Drive bulk-pinning is available on this device. Retrieved from
-     * user preferences.
-     * @private @type {boolean}
-     */
-    this.bulkPinningAvailable_ = false;
-
-    /**
-     * Whether Drive bulk-pinning has been initialized in Files App.
-     * @private @type {boolean}
-     */
-    this.bulkPinningInitialized_ = false;
-
-    /**
-     * A fake Drive placeholder item.
-     * @private @type {?NavigationModelFakeItem}
-     */
-    this.fakeDriveItem_ = null;
-
-    /**
-     * Whether Trash is enabled or not, retrieved from user preferences.
-     * @type {boolean}
-     */
-    this.trashEnabled = false;
-
-    /**
-     * A fake Trash placeholder item.
-     * @private @type {?NavigationModelFakeItem}
-     */
-    this.fakeTrashItem_ = null;
-
-    /**
-     * A fake entry for Recents.
-     * @private @type {?FakeEntry}
-     */
-    this.recentEntry_ = null;
-
-    /**
-     * Whether or not we are running in guest mode.
-     * @private @type {boolean}
-     */
-    this.guestMode_ = false;
-
-    /** @private @type {!Store} */
-    this.store_ = getStore();
-
-    (function() {
-      ColorChangeUpdater.forDocument().start();
-    })();
-  }
-
-  /**
-   * @return {!ProgressCenter}
-   */
-  get progressCenter() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    return assert(this.fileBrowserBackground_.progressCenter);
-  }
-
-  /**
-   * @return {DirectoryModel}
-   */
-  get directoryModel() {
-    // @ts-ignore: error TS2322: Type 'DirectoryModel | null' is not assignable
-    // to type 'DirectoryModel'.
-    return this.directoryModel_;
-  }
-
-  /**
-   * @return {DirectoryTreeNamingController}
-   */
-  get directoryTreeNamingController() {
-    return this.directoryTreeNamingController_;
-  }
-
-  /**
-   * @return {FileFilter}
-   */
-  get fileFilter() {
-    // @ts-ignore: error TS2322: Type 'FileFilter | null' is not assignable to
-    // type 'FileFilter'.
-    return this.fileFilter_;
-  }
-
-  /**
-   * @return {FolderShortcutsDataModel}
-   */
-  get folderShortcutsModel() {
-    // @ts-ignore: error TS2322: Type 'FolderShortcutsDataModel | null' is not
-    // assignable to type 'FolderShortcutsDataModel'.
-    return this.folderShortcutsModel_;
-  }
-
-  /**
-   * @return {ActionsController}
-   */
-  get actionsController() {
-    return this.actionsController_;
-  }
-
-  /**
-   * @return {CommandHandler}
-   */
-  get commandHandler() {
-    return this.commandHandler_;
-  }
-
-  /**
-   * @return {ProvidersModel}
-   */
-  get providersModel() {
-    // @ts-ignore: error TS2322: Type 'ProvidersModel | null' is not assignable
-    // to type 'ProvidersModel'.
-    return this.providersModel_;
-  }
-
-  /**
-   * @return {MetadataModel}
-   */
-  get metadataModel() {
-    // @ts-ignore: error TS2322: Type 'MetadataModel | null' is not assignable
-    // to type 'MetadataModel'.
-    return this.metadataModel_;
-  }
-
-  /**
-   * @return {FileSelectionHandler}
-   */
-  get selectionHandler() {
-    // @ts-ignore: error TS2322: Type 'FileSelectionHandler | null' is not
-    // assignable to type 'FileSelectionHandler'.
-    return this.selectionHandler_;
-  }
-
-  /**
-   * @return {Document}
-   */
-  get document() {
-    // @ts-ignore: error TS2322: Type 'Document | null' is not assignable to
-    // type 'Document'.
-    return this.document_;
-  }
-
-  /**
-   * @return {FileTransferController}
-   */
-  get fileTransferController() {
-    // @ts-ignore: error TS2322: Type 'FileTransferController | null' is not
-    // assignable to type 'FileTransferController'.
-    return this.fileTransferController_;
-  }
-
-  /**
-   * @return {NamingController}
-   */
-  get namingController() {
-    // @ts-ignore: error TS2322: Type 'NamingController | null' is not
-    // assignable to type 'NamingController'.
-    return this.namingController_;
-  }
-
-  /**
-   * @return {TaskController}
-   */
-  get taskController() {
-    // @ts-ignore: error TS2322: Type 'TaskController | null' is not assignable
-    // to type 'TaskController'.
-    return this.taskController_;
-  }
-
-  /**
-   * @return {SpinnerController}
-   */
-  get spinnerController() {
-    // @ts-ignore: error TS2322: Type 'SpinnerController | null' is not
-    // assignable to type 'SpinnerController'.
-    return this.spinnerController_;
-  }
-
-  /**
-   * @return {!FilteredVolumeManager}
-   */
-  get volumeManager() {
-    return this.volumeManager_;
-  }
-
-  /**
-   * @return {Crostini}
-   */
-  get crostini() {
-    // @ts-ignore: error TS2322: Type 'Crostini | null' is not assignable to
-    // type 'Crostini'.
-    return this.crostini_;
-  }
-
-  /**
-   * @return {FileManagerUI}
-   */
-  get ui() {
-    // @ts-ignore: error TS2322: Type 'FileManagerUI | null' is not assignable
-    // to type 'FileManagerUI'.
-    return this.ui_;
-  }
-
-  /**
-   * @return {boolean} If the app is running in the guest mode.
-   */
-  get guestMode() {
-    return this.guestMode_;
-  }
-
-  /**
-   * Launch a new File Manager app.
-   * @param {!FilesAppState=} appState App state.
-   */
-  launchFileManager(appState) {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.fileBrowserBackground_.launchFileManager(appState);
-  }
-
-  /**
-   * Returns the last URL visited with visitURL() (e.g. for "Manage in Drive").
-   * Used by the integration tests.
-   * @return {string}
-   */
-  getLastVisitedURL() {
-    return getLastVisitedURL();
-  }
-
-  /**
-   * Returns a string translation from its translation ID.
-   * @param {string} id The id of the translated string.
-   * @return {string}
-   */
-  getTranslatedString(id) {
-    return str(id);
-  }
-
-  /**
-   * One time initialization for app state controller to load view option from
-   * local storage.
-   * @return {!Promise<void>}
-   * @private
-   */
-  async startInitSettings_() {
-    startInterval('Load.InitSettings');
-    this.appStateController_ = new AppStateController(this.dialogType);
-    await this.appStateController_.loadInitialViewOptions();
-    recordInterval('Load.InitSettings');
-  }
-
-  /**
-   * Updates guestMode_ field based on what the result of the isInGuestMode
-   * helper function. It errs on the side of not-in-guestmode, if the util
-   * function fails. The worse this causes are extra notifications.
-   */
-  async setGuestMode_() {
-    try {
-      const guest = await isInGuestMode();
-      if (guest !== null) {
-        this.guestMode_ = guest;
-      }
-    } catch (error) {
-      console.warn(error);
-      // Leave this.guestMode_ as its initial value.
-    }
-  }
-
-  /**
-   * One time initialization for the file system and related things.
-   * @return {!Promise<void>}
-   * @private
-   */
-  async initFileSystemUI_() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.startBatchUpdates();
-
-    const fileListPromise = this.initFileList_();
-    const currentDirectoryPromise = this.setupCurrentDirectory_();
-
-    const self = this;
-
-    // @ts-ignore: error TS7034: Variable 'listBeingUpdated' implicitly has type
-    // 'any' in some locations where its type cannot be determined.
-    let listBeingUpdated = null;
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.directoryModel_.addEventListener('begin-update-files', () => {
-      // @ts-ignore: error TS2339: Property 'startBatchUpdates' does not exist
-      // on type 'List'.
-      self.ui_.listContainer.currentList.startBatchUpdates();
-      // Remember the list which was used when updating files started, so
-      // endBatchUpdates() is called on the same list.
-      // @ts-ignore: error TS18047: 'self.ui_' is possibly 'null'.
-      listBeingUpdated = self.ui_.listContainer.currentList;
-    });
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.directoryModel_.addEventListener('end-update-files', () => {
-      // @ts-ignore: error TS18047: 'self.namingController_' is possibly 'null'.
-      self.namingController_.restoreItemBeingRenamed();
-      // @ts-ignore: error TS7005: Variable 'listBeingUpdated' implicitly has an
-      // 'any' type.
-      listBeingUpdated.endBatchUpdates();
-      listBeingUpdated = null;
-    });
-    this.volumeManager_.addEventListener(ARCHIVE_OPENED_EVENT_TYPE, event => {
-      // @ts-ignore: error TS2339: Property 'detail' does not exist on type
-      // 'Event'.
-      assert(event.detail.mountPoint);
-      // @ts-ignore: error TS2339: Property 'isFocused' does not exist on
-      // type 'Window & typeof globalThis'.
-      if (window.isFocused()) {
-        // @ts-ignore: error TS2339: Property 'detail' does not exist on
-        // type 'Event'.
-        this.directoryModel_.changeDirectoryEntry(event.detail.mountPoint);
-      }
-    });
-
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.directoryModel_.addEventListener('directory-changed', event => {
-      const
-          customEvent = /**
-                           @type {import('./directory_model.js').DirectoryChangeEvent}
-                             */
-          (event);
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.navigationUma_.onDirectoryChanged(customEvent.detail.newDirEntry);
-    });
-
-    this.initCommands_();
-
-    assert(this.directoryModel_);
-    assert(this.spinnerController_);
-    assert(this.commandHandler_);
-    assert(this.selectionHandler_);
-    assert(this.launchParams_);
-    assert(this.volumeManager_);
-    assert(this.dialogDom_);
-
-    // @ts-ignore: error TS2322: Type 'MetadataModel | null' is not assignable
-    // to type 'Object'.
-    this.fileBrowserBackground_.driveSyncHandler.metadataModel =
-        assert(this.metadataModel_);
-    this.scanController_ = new ScanController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.directoryModel_, this.ui_.listContainer, this.spinnerController_,
-        this.selectionHandler_);
-    this.sortMenuController_ = new SortMenuController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.sortButton, assert(this.directoryModel_.getFileList()));
-    this.gearMenuController_ = new GearMenuController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.gearButton, this.ui_.gearMenu, this.ui_.providersMenu,
-        // @ts-ignore: error TS2345: Argument of type 'DirectoryModel | null' is
-        // not assignable to parameter of type 'DirectoryModel'.
-        this.directoryModel_, assert(this.providersModel_));
-    this.selectionMenuController_ = new SelectionMenuController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.selectionMenuButton,
-        // @ts-ignore: error TS2345: Argument of type '(arg0?: Object |
-        // undefined) => Element' is not assignable to parameter of type 'new
-        // (...args: any) => Menu'.
-        queryDecoratedElement('#file-context-menu', Menu));
-    this.toolbarController_ = new ToolbarController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.toolbar, this.ui_.dialogNavigationList, this.ui_.listContainer,
-        this.selectionHandler_, this.directoryModel_, this.volumeManager_,
-        /** @type {!A11yAnnounce} */ (this.ui_));
-    this.actionsController_ = new ActionsController(
-        // @ts-ignore: error TS2345: Argument of type 'MetadataModel | null' is
-        // not assignable to parameter of type 'MetadataModel'.
-        this.volumeManager_, assert(this.metadataModel_),
-        assert(this.folderShortcutsModel_), this.selectionHandler_,
-        assert(this.ui_));
-    this.lastModifiedController_ = new LastModifiedController(
-        // @ts-ignore: error TS2345: Argument of type 'DirectoryModel | null' is
-        // not assignable to parameter of type 'DirectoryModel'.
-        this.ui_.listContainer.table, this.directoryModel_);
-
-    this.quickViewModel_ = new QuickViewModel();
-    const fileListSelectionModel = /** @type {!FileListSelectionModel} */ (
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.directoryModel_.getFileListSelection());
-    this.quickViewUma_ =
-        new QuickViewUma(assert(this.volumeManager_), assert(this.dialogType));
-    const metadataBoxController = new MetadataBoxController(
-        // @ts-ignore: error TS2345: Argument of type 'MetadataModel | null' is
-        // not assignable to parameter of type 'MetadataModel'.
-        this.metadataModel_, this.quickViewModel_, this.fileMetadataFormatter_,
-        assert(this.volumeManager_));
-    this.quickViewController_ = new QuickViewController(
-        // @ts-ignore: error TS2345: Argument of type 'MetadataModel | null' is
-        // not assignable to parameter of type 'MetadataModel'.
-        this, assert(this.metadataModel_), assert(this.selectionHandler_),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        assert(this.ui_.listContainer), assert(this.ui_.selectionMenuButton),
-        assert(this.quickViewModel_), assert(this.taskController_),
-        fileListSelectionModel, assert(this.quickViewUma_),
-        metadataBoxController, this.dialogType, assert(this.volumeManager_),
-        this.dialogDom_);
-
-    assert(this.fileFilter_);
-    assert(this.namingController_);
-    assert(this.appStateController_);
-    assert(this.taskController_);
-    this.mainWindowComponent_ = new MainWindowComponent(
-        // @ts-ignore: error TS2345: Argument of type 'FileManagerUI | null' is
-        // not assignable to parameter of type 'FileManagerUI'.
-        this.dialogType, this.ui_, this.volumeManager_, this.directoryModel_,
-        this.selectionHandler_, this.namingController_,
-        this.appStateController_, this.taskController_);
-
-    this.initDataTransferOperations_();
-    fileListPromise.then(() => {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.taskController_.setFileTransferController(
-          // @ts-ignore: error TS2345: Argument of type 'FileTransferController
-          // | null' is not assignable to parameter of type
-          // 'FileTransferController'.
-          this.fileTransferController_);
-    });
-
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.selectionHandler_.onFileSelectionChanged();
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.endBatchUpdates();
-
-    const bannerController = new BannerController(
-        // @ts-ignore: error TS2345: Argument of type 'DirectoryModel | null' is
-        // not assignable to parameter of type 'DirectoryModel'.
-        this.directoryModel_, this.volumeManager_, assert(this.crostini_),
-        this.dialogType);
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.initBanners(bannerController);
-    bannerController.initialize();
-
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.attachFilesTooltip();
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.decorateFilesMenuItems();
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.selectionMenuButton.hidden = false;
-
-    await Promise.all([
-      fileListPromise,
-      currentDirectoryPromise,
-      this.setGuestMode_(),
-    ]);
-  }
-
-  /**
-   * Subscribes to bulk-pinning events to ensure the store is kept up to date.
-   * Also tries to retrieve a first bulk pinning progress to populate the store.
-   * @private
-   */
-  async initBulkPinning_() {
-    try {
-      const promise = getBulkPinProgress();
-
-      if (!this.bulkPinningInitialized_) {
-        // @ts-ignore: error TS7006: Parameter 'progress' implicitly has an
-        // 'any' type.
-        chrome.fileManagerPrivate.onBulkPinProgress.addListener((progress) => {
-          console.debug('Got bulk-pinning event:', progress);
-          this.store_.dispatch(updateBulkPinProgress(progress));
-        });
-
-        this.bulkPinningInitialized_ = true;
-      }
-
-      const progress = await promise;
-      if (progress) {
-        console.debug('Got initial bulk-pinning state:', progress);
-        this.store_.dispatch(updateBulkPinProgress(progress));
-      }
-    } catch (e) {
-      console.warn('Cannot get initial bulk-pinning state:', e);
-    }
-  }
-
-  /**
-   * @private
-   */
-  initDataTransferOperations_() {
-    // CopyManager are required for 'Delete' operation in
-    // Open and Save dialogs. But drag-n-drop and copy-paste are not needed.
-    if (this.dialogType !== DialogType.FULL_PAGE) {
-      return;
-    }
-
-    this.fileTransferController_ = new FileTransferController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        assert(this.document_), assert(this.ui_.listContainer),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        assert(this.ui_.directoryTree),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.showConfirmationDialog.bind(this.ui_), this.progressCenter,
-        assert(this.metadataModel_), assert(this.directoryModel_),
-        assert(this.volumeManager_),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        assert(this.selectionHandler_), this.ui_.toast);
-  }
-
-  /**
-   * One-time initialization of commands.
-   * @private
-   */
-  initCommands_() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    assert(this.ui_.textContextMenu);
-
-    this.commandHandler_ = new CommandHandler(this);
-
-    // TODO(hirono): Move the following block to the UI part.
-    // Hook up the cr-button commands.
-    // @ts-ignore: error TS2488: Type 'NodeListOf<Element>' must have a
-    // '[Symbol.iterator]()' method that returns an iterator.
-    for (const crButton of this.dialogDom_.querySelectorAll(
-             'cr-button[command]')) {
-      crInjectTypeAndInit(
-          /** @type {CrButtonElement} */ (crButton), CommandButton);
-    }
-
-    // @ts-ignore: error TS2488: Type 'NodeListOf<Element>' must have a
-    // '[Symbol.iterator]()' method that returns an iterator.
-    for (const input of this.getDomInputs_()) {
-      this.setContextMenuForInput_(input);
-    }
-
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.setContextMenuForInput_(this.ui_.listContainer.renameInput);
-    this.setContextMenuForInput_(
-        this.directoryTreeNamingController_.getInputElement());
-  }
-
-  /**
-   * Get input elements from root DOM element of this app.
-   * @private
-   */
-  getDomInputs_() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    return this.dialogDom_.querySelectorAll(
-        'input[type=text], input[type=search], textarea, cr-input');
-  }
-
-  /**
-   * Set context menu and handlers for an input element.
-   * @private
-   */
-  // @ts-ignore: error TS7006: Parameter 'input' implicitly has an 'any' type.
-  setContextMenuForInput_(input) {
-    let touchInduced = false;
-
-    // stop contextmenu propagation for touch-induced events.
-    // @ts-ignore: error TS7006: Parameter 'e' implicitly has an 'any' type.
-    input.addEventListener('touchstart', (e) => {
-      touchInduced = true;
-    });
-    // @ts-ignore: error TS7006: Parameter 'e' implicitly has an 'any' type.
-    input.addEventListener('contextmenu', (e) => {
-      if (touchInduced) {
-        e.stopImmediatePropagation();
-      }
-      touchInduced = false;
-    });
-    // @ts-ignore: error TS7006: Parameter 'e' implicitly has an 'any' type.
-    input.addEventListener('click', (e) => {
-      touchInduced = false;
-    });
-
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    contextMenuHandler.setContextMenu(input, this.ui_.textContextMenu);
-    this.registerInputCommands_(input);
-  }
-
-  /**
-   * Registers cut, copy, paste and delete commands on input element.
-   *
-   * @param {Node} node Text input element to register on.
-   * @private
-   */
-  registerInputCommands_(node) {
-    forceDefaultHandler(node, 'cut');
-    forceDefaultHandler(node, 'copy');
-    forceDefaultHandler(node, 'paste');
-    forceDefaultHandler(node, 'delete');
-    node.addEventListener('keydown', e => {
-      // @ts-ignore: error TS2339: Property 'keyCode' does not exist on type
-      // 'Event'.
-      const key = getKeyModifiers(e) + e.keyCode;
-      if (key === '190' /* '/' */ || key === '191' /* '.' */) {
-        // If this key event is propagated, this is handled search command,
-        // which calls 'preventDefault' method.
-        e.stopPropagation();
-      }
-    });
-  }
-
-  /**
-   * Entry point of the initialization.
-   * This method is called from main.js.
-   */
-  initializeCore() {
-    this.initGeneral_();
-    this.initSettingsPromise_ = this.startInitSettings_();
-    this.initBackgroundPagePromise_ =
-        this.startInitBackgroundPage_().then(() => this.initVolumeManager_());
-
-    window.addEventListener('pagehide', this.onUnload_.bind(this));
-  }
-
-  /**
-   * @return {!Promise<void>}
-   */
-  // @ts-ignore: error TS7006: Parameter 'dialogDom' implicitly has an 'any'
-  // type.
-  async initializeUI(dialogDom) {
-    console.warn(`Files app starting up: ${this.dialogType}`);
-    this.dialogDom_ = dialogDom;
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.document_ = this.dialogDom_.ownerDocument;
-
-    startInterval('Load.InitDocuments');
-    // importElements depend on loadTimeData which is initialized in the
-    // initBackgroundPagePromise_.
-    await this.initBackgroundPagePromise_;
-    await importElements();
-    recordInterval('Load.InitDocuments');
-
-    startInterval('Load.InitUI');
-    this.document_.documentElement.classList.add('files-ng');
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.dialogDom_.classList.add('files-ng');
-
-    chrome.fileManagerPrivate.isTabletModeEnabled(
-        this.onTabletModeChanged_.bind(this));
-    chrome.fileManagerPrivate.onTabletModeChanged.addListener(
-        this.onTabletModeChanged_.bind(this));
-
-    this.initEssentialUI_();
-    this.initAdditionalUI_();
-    await this.initSettingsPromise_;
-    const fileSystemUIPromise = this.initFileSystemUI_();
-    // Initialize the Store for the whole app.
-    const store = getStore();
-    store.init(getEmptyState());
-    this.initUIFocus_();
-    recordInterval('Load.InitUI');
-
-    chrome.fileManagerPrivate.onDeviceConnectionStatusChanged.addListener(
-        this.updateDeviceConnectionState_.bind(this));
-    chrome.fileManagerPrivate.getDeviceConnectionState(
-        this.updateDeviceConnectionState_.bind(this));
-
-    return fileSystemUIPromise;
-  }
-
-  /**
-   * Initializes general purpose basic things, which are used by other
-   * initializing methods.
-   * @private
-   */
-  initGeneral_() {
-    // Initialize the application state.
-    // TODO(mtomasz): Unify window.appState with location.search format.
-    // @ts-ignore: error TS2339: Property 'appState' does not exist on type
-    // 'Window & typeof globalThis'.
-    if (window.appState) {
-      const params = {};
-
-      // @ts-ignore: error TS2339: Property 'appState' does not exist on type
-      // 'Window & typeof globalThis'.
-      for (const name in window.appState) {
-        // @ts-ignore: error TS2339: Property 'appState' does not exist on type
-        // 'Window & typeof globalThis'.
-        params[name] = window.appState[name];
-      }
-
-      // @ts-ignore: error TS2345: Argument of type '{}' is not assignable to
-      // parameter of type 'FilesAppState'.
-      this.launchParams_ = new LaunchParam(params);
-    } else {
-      // Used by the select dialog and SWA.
-      let json = {};
-      if (location.search) {
-        const query = location.search.substr(1);
-        try {
-          json = /** @type {!FilesAppState} */ (
-              JSON.parse(decodeURIComponent(query)));
-        } catch (e) {
-          console.debug(`Error parsing location.search "${query}" due to ${e}`);
-        }
-      }
-      // @ts-ignore: error TS2345: Argument of type '{}' is not assignable to
-      // parameter of type 'FilesAppState'.
-      this.launchParams_ = new LaunchParam(json);
-    }
-    this.store_.dispatch(
-        setLaunchParameters({dialogType: this.launchParams_.type}));
-
-    // Initialize the member variables that depend this.launchParams_.
-    this.dialogType = this.launchParams_.type;
-  }
-
-  /**
-   * Initializes the background page.
-   * @return {!Promise<void>}
-   * @private
-   */
-  async startInitBackgroundPage_() {
-    startInterval('Load.InitBackgroundPage');
-
-    this.fileBrowserBackground_ = window.background;
-
-    await this.fileBrowserBackground_.ready();
-
-    // For the SWA, we load background and foreground in the same Window, avoid
-    // loading the `data` twice.
-    if (!loadTimeData.isInitialized()) {
-      loadTimeData.data = this.fileBrowserBackground_.stringData;
-    }
-    if (runningInBrowser()) {
-      this.fileBrowserBackground_.registerDialog(window);
-    }
-    this.crostini_ = this.fileBrowserBackground_.crostini;
-
-    recordInterval('Load.InitBackgroundPage');
-  }
-
-  /**
-   * Initializes the VolumeManager instance.
-   * @private
-   */
-  async initVolumeManager_() {
-    const allowedPaths = this.getAllowedPaths_();
-    const writableOnly =
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.launchParams_.type === DialogType.SELECT_SAVEAS_FILE;
-    const disabledVolumes =
-        /** @type {!Array<!VolumeType>} */ (await this.getDisabledVolumes_());
-
-    // FilteredVolumeManager hides virtual file system related event and data
-    // even depends on the value of |supportVirtualPath|. If it is
-    // VirtualPathSupport.NO_VIRTUAL_PATH, it hides Drive even if Drive is
-    // enabled on preference.
-    // In other words, even if Drive is disabled on preference but the Files app
-    // should show Drive when it is re-enabled, then the value should be set to
-    // true.
-    // Note that the Drive enabling preference change is listened by
-    // DriveIntegrationService, so here we don't need to take care about it.
-    this.volumeManager_ = new FilteredVolumeManager(
-        allowedPaths, writableOnly,
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.fileBrowserBackground_.getVolumeManager(),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.launchParams_.volumeFilter, disabledVolumes);
-
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    await this.fileBrowserBackground_.getVolumeManager();
-  }
-
-  /**
-   * One time initialization of the essential UI elements in the Files app.
-   * These elements will be shown to the user. Only visible elements should be
-   * initialized here. Any heavy operation should be avoided. The Files app's
-   * window is shown at the end of this routine.
-   * @private
-   */
-  initEssentialUI_() {
-    // Record stats of dialog types. New values must NOT be inserted into the
-    // array enumerating the types. It must be in sync with
-    // FileDialogType enum in tools/metrics/histograms/histogram.xml.
-    const metricName = 'SWA.Create';
-    recordEnum(metricName, this.dialogType, [
-      DialogType.SELECT_FOLDER,
-      DialogType.SELECT_UPLOAD_FOLDER,
-      DialogType.SELECT_SAVEAS_FILE,
-      DialogType.SELECT_OPEN_FILE,
-      DialogType.SELECT_OPEN_MULTI_FILE,
-      DialogType.FULL_PAGE,
-    ]);
-
-    // Create the metadata cache.
-    assert(this.volumeManager_);
-    this.metadataModel_ = MetadataModel.create(this.volumeManager_);
-    this.thumbnailModel_ = new ThumbnailModel(this.metadataModel_);
-    this.providersModel_ = new ProvidersModel(this.volumeManager_);
-    this.fileFilter_ = new FileFilter(this.volumeManager_);
-
-    // Set the files-ng class for dialog header styling.
-    const dialogHeader = queryRequiredElement('.dialog-header');
-    dialogHeader.classList.add('files-ng');
-
-    // Create the root view of FileManager.
-    assert(this.dialogDom_);
-    assert(this.launchParams_);
-    this.ui_ = new FileManagerUI(
-        // @ts-ignore: error TS2345: Argument of type 'HTMLBodyElement | null'
-        // is not assignable to parameter of type 'HTMLElement'.
-        assert(this.providersModel_), this.dialogDom_, this.launchParams_);
-  }
-
-  /**
-   * One-time initialization of various DOM nodes. Loads the additional DOM
-   * elements visible to the user. Initialize here elements, which are expensive
-   * or hidden in the beginning.
-   * @private
-   */
-  initAdditionalUI_() {
-    assert(this.metadataModel_);
-    assert(this.volumeManager_);
-    assert(this.dialogDom_);
-    assert(this.ui_);
-
-    // Cache nodes we'll be manipulating.
-    const dom = this.dialogDom_;
-    assert(dom);
-
-    // @ts-ignore: error TS2345: Argument of type 'HTMLBodyElement | null' is
-    // not assignable to parameter of type 'Document | Element | HTMLElement |
-    // DocumentFragment | undefined'.
-    const table = queryRequiredElement('.detail-table', dom);
-    FileTable.decorate(
-        // @ts-ignore: error TS2345: Argument of type 'MetadataModel | null' is
-        // not assignable to parameter of type 'MetadataModel'.
-        table, this.metadataModel_, this.volumeManager_,
-        /** @type {!A11yAnnounce} */ (this.ui_),
-        this.dialogType == DialogType.FULL_PAGE);
-    // @ts-ignore: error TS2345: Argument of type 'HTMLBodyElement | null' is
-    // not assignable to parameter of type 'Document | Element | HTMLElement |
-    // DocumentFragment | undefined'.
-    const grid = queryRequiredElement('.thumbnail-grid', dom);
-    FileGrid.decorate(
-        // @ts-ignore: error TS2345: Argument of type 'MetadataModel | null' is
-        // not assignable to parameter of type 'MetadataModel'.
-        grid, this.metadataModel_, this.volumeManager_,
-        /** @type {!A11yAnnounce} */ (this.ui_));
-
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.initAdditionalUI(
-        assertInstanceof(table, FileTable), assertInstanceof(grid, FileGrid),
-        this.volumeManager_);
-
-    // Handle UI events.
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.progressCenter.addPanel(this.ui_.progressCenterPanel);
-
-    // Arrange the file list.
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.table.normalizeColumns();
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.table.redraw();
-  }
-
-  /**
-   * One-time initialization of focus. This should run at the last of UI
-   *  initialization.
-   * @private
-   */
-  initUIFocus_() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.initUIFocus();
-  }
-
-  /**
-   * Constructs table and grid (heavy operation).
-   * @return {!Promise<void>}
-   * @private
-   */
-  async initFileList_() {
-    const singleSelection = this.dialogType == DialogType.SELECT_OPEN_FILE ||
-        this.dialogType == DialogType.SELECT_FOLDER ||
-        this.dialogType == DialogType.SELECT_UPLOAD_FOLDER ||
-        this.dialogType == DialogType.SELECT_SAVEAS_FILE;
-
-    assert(this.volumeManager_);
-    assert(this.metadataModel_);
-    this.directoryModel_ = new DirectoryModel(
-        // @ts-ignore: error TS2345: Argument of type 'FileFilter | null' is not
-        // assignable to parameter of type 'FileFilter'.
-        singleSelection, this.fileFilter_, this.metadataModel_,
-        this.volumeManager_);
-
-    this.folderShortcutsModel_ =
-        new FolderShortcutsDataModel(this.volumeManager_);
-
-    this.androidAppListModel_ = new AndroidAppListModel(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.launchParams_.showAndroidPickerApps,
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.launchParams_.includeAllFiles, this.launchParams_.typeList);
-
-    this.recentEntry_ = new FakeEntryImpl(
-        str('RECENT_ROOT_LABEL'), RootType.RECENT, this.getSourceRestriction_(),
-        chrome.fileManagerPrivate.FileCategory.ALL);
-    // @ts-ignore: error TS2741: Property 'getUiChildren' is missing in type
-    // 'FakeEntry' but required in type 'FakeEntryImpl'.
-    this.store_.dispatch(addUiEntry({entry: this.recentEntry_}));
-    assert(this.launchParams_);
-    this.selectionHandler_ = new FileSelectionHandler(
-        assert(this.directoryModel_),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        assert(this.ui_.listContainer), assert(this.metadataModel_),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        assert(this.volumeManager_), this.launchParams_.allowedPaths);
-
-    // TODO(mtomasz, yoshiki): Create navigation list earlier, and here just
-    // attach the directory model.
-    const directoryTreePromise = this.initDirectoryTree_();
-
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.listThumbnailLoader = new ListThumbnailLoader(
-        // @ts-ignore: error TS2345: Argument of type 'ThumbnailModel | null' is
-        // not assignable to parameter of type 'ThumbnailModel'.
-        this.directoryModel_, assert(this.thumbnailModel_),
-        this.volumeManager_);
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.dataModel = this.directoryModel_.getFileList();
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.emptyDataModel =
-        this.directoryModel_.getEmptyFileList();
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.ui_.listContainer.selectionModel =
-        this.directoryModel_.getFileListSelection();
-
-    // @ts-ignore: error TS2345: Argument of type 'FileManagerUI | null' is not
-    // assignable to parameter of type 'FileManagerUI'.
-    this.appStateController_.initialize(this.ui_, this.directoryModel_);
-
-    // Create metadata update controller.
-    this.metadataUpdateController_ = new MetadataUpdateController(
-        // @ts-ignore: error TS2345: Argument of type 'MetadataModel | null' is
-        // not assignable to parameter of type 'MetadataModel'.
-        this.ui_.listContainer, this.directoryModel_, this.metadataModel_,
-        this.fileMetadataFormatter_);
-
-    // Create naming controller.
-    this.namingController_ = new NamingController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.listContainer, assert(this.ui_.alertDialog),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        assert(this.ui_.confirmDialog), this.directoryModel_,
-        /** @type {!FileFilter} */ (this.fileFilter_), this.selectionHandler_);
-
-    // Create task controller.
-    this.taskController_ = new TaskController(
-        // @ts-ignore: error TS2345: Argument of type 'FileManagerUI | null' is
-        // not assignable to parameter of type 'FileManagerUI'.
-        this.volumeManager_, this.ui_, this.metadataModel_,
-        this.directoryModel_, this.selectionHandler_,
-        this.metadataUpdateController_, assert(this.crostini_),
-        this.progressCenter);
-
-    // Create directory tree naming controller.
-    this.directoryTreeNamingController_ = new DirectoryTreeNamingController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.directoryModel_, assert(this.ui_.directoryTree),
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.directoryTreeContainer, this.ui_.alertDialog);
-
-
-    // Create spinner controller.
-    this.spinnerController_ =
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        new SpinnerController(this.ui_.listContainer.spinner);
-    this.spinnerController_.blink();
-
-    // Create dialog action controller.
-    this.dialogActionController_ = new DialogActionController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.dialogType, this.ui_.dialogFooter, this.directoryModel_,
-        // @ts-ignore: error TS2345: Argument of type 'FileFilter | null' is not
-        // assignable to parameter of type 'FileFilter'.
-        this.volumeManager_, this.fileFilter_, this.namingController_,
-        this.selectionHandler_, this.launchParams_);
-
-    // Create file-type filter controller.
-    this.fileTypeFiltersController_ = new FileTypeFiltersController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.fileTypeFilterContainer, this.directoryModel_,
-        this.recentEntry_, /** @type {!A11yAnnounce} */ (this.ui_));
-    this.emptyFolderController_ = new EmptyFolderController(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.ui_.emptyFolder, this.directoryModel_,
-        // @ts-ignore: error TS2345: Argument of type 'ProvidersModel | null' is
-        // not assignable to parameter of type 'ProvidersModel'.
-        assert(this.providersModel_), this.recentEntry_);
-
-
-    return directoryTreePromise;
-  }
-
-  /**
-   * Based on the dialog type and dialog caller, sets the list of volumes
-   * that should be disabled according to Data Leak Prevention rules.
-   * @return {Promise<!Array<!VolumeType>>}
-   */
-  async getDisabledVolumes_() {
-    if (this.dialogType !== DialogType.SELECT_SAVEAS_FILE || !isDlpEnabled()) {
-      return [];
-    }
-    const caller = await getDialogCaller();
-    if (!caller.url) {
-      return [];
-    }
-    const dlpBlockedComponents = await getDlpBlockedComponents(caller.url);
-    const disabledVolumes = [];
-    for (const c of dlpBlockedComponents) {
-      disabledVolumes.push(
-          /** @type {!VolumeType }*/ (c));
-    }
-    return disabledVolumes;
-  }
-
-  /**
-   * @return {!Promise<void>}
-   * @private
-   */
-  async initDirectoryTree_() {
-    this.navigationUma_ = new NavigationUma(assert(this.volumeManager_));
-
-    const directoryTree = /** @type {DirectoryTree} */
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        (this.dialogDom_.querySelector('#directory-tree'));
-
-    if (isNewDirectoryTreeEnabled()) {
-      const treeContainer = directoryTree.parentElement;
-      directoryTree.remove();
-      const directoryTreeContainer = new DirectoryTreeContainer(
-          // @ts-ignore: error TS2345: Argument of type 'HTMLElement | null' is
-          // not assignable to parameter of type 'HTMLElement'.
-          treeContainer, this.directoryModel_, this.volumeManager_);
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.initDirectoryTree(directoryTreeContainer);
-    } else {
-      const fakeEntriesVisible =
-          this.dialogType !== DialogType.SELECT_SAVEAS_FILE;
-
-      DirectoryTree.decorate(
-          // @ts-ignore: error TS2345: Argument of type 'DirectoryModel | null'
-          // is not assignable to parameter of type 'DirectoryModel'.
-          directoryTree, assert(this.directoryModel_),
-          assert(this.volumeManager_), assert(this.metadataModel_),
-          fakeEntriesVisible);
-
-      directoryTree.dataModel = new NavigationListModel(
-          // @ts-ignore: error TS2345: Argument of type
-          // 'FolderShortcutsDataModel | null' is not assignable to parameter of
-          // type 'FolderShortcutsDataModel'.
-          assert(this.volumeManager_), assert(this.folderShortcutsModel_),
-          // @ts-ignore: error TS2531: Object is possibly 'null'.
-          fakeEntriesVisible && !isFolderDialogType(this.launchParams_.type) ?
-              new NavigationModelFakeItem(
-                  str('RECENT_ROOT_LABEL'), NavigationModelItemType.RECENT,
-                  // @ts-ignore: error TS2345: Argument of type 'FakeEntry |
-                  // null' is not assignable to parameter of type
-                  // 'FilesAppEntry'.
-                  assert(this.recentEntry_)) :
-              null,
-          assert(this.directoryModel_), assert(this.androidAppListModel_),
-          this.dialogType);
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.initDirectoryTree(directoryTree);
-    }
-
-    // If 'media-store-files-only' volume filter is enabled, then Android ARC
-    // SelectFile opened files app to pick files from volumes that are indexed
-    // by the Android MediaStore. Never add Drive, Crostini, GuestOS, to the
-    // directory tree in that case: their volume content is not indexed by the
-    // Android MediaStore, and being indexed there is needed for this Android
-    // ARC SelectFile MediaStore filter mode to work: crbug.com/1333385
-    if (this.volumeManager_.getMediaStoreFilesOnlyFilterEnabled()) {
-      return;
-    }
-
-    // Drive add/removes itself from directory tree in onPreferencesChanged_.
-    // Setup a prefs change listener then call onPreferencesChanged_() to add
-    // Drive to the directory tree if Drive is enabled by prefs.
-    chrome.fileManagerPrivate.onPreferencesChanged.addListener(() => {
-      this.onPreferencesChanged_();
-    });
-    this.onPreferencesChanged_();
-
-    chrome.fileManagerPrivate.onDriveConnectionStatusChanged.addListener(() => {
-      this.onDriveConnectionStatusChanged_();
-    });
-    this.onDriveConnectionStatusChanged_();
-
-    // The fmp.onCrostiniChanged receives enabled/disabled events via a pref
-    // watcher and share/unshare events.  The enabled/disabled prefs are
-    // handled in fmp.onCrostiniChanged rather than fmp.onPreferencesChanged
-    // to keep crostini logic colocated, and to have an API that best supports
-    // multiple VMs.
-    chrome.fileManagerPrivate.onCrostiniChanged.addListener(
-        this.onCrostiniChanged_.bind(this));
-    this.crostiniController_ = new CrostiniController(
-        // @ts-ignore: error TS2345: Argument of type 'Crostini | null' is not
-        // assignable to parameter of type 'Crostini'.
-        assert(this.crostini_),
-        // TODO(b/285977941): `DirectoryTree` is only used when FileExperimental
-        // flag is off, remove it after the tree replacement.
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        assert(/** @type {DirectoryTree} */ (this.ui_.directoryTree)),
-        this.volumeManager_.isDisabled(VolumeType.CROSTINI));
-    await this.crostiniController_.redraw();
-    // Never show toast in an open-file dialog.
-    const maybeShowToast = this.dialogType === DialogType.FULL_PAGE;
-    await this.crostiniController_.loadSharedPaths(
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        maybeShowToast, this.ui_.toast);
-
-    if (isGuestOsEnabled()) {
-      this.guestOsController_ = new GuestOsController(
-          // TODO(b/285977941): `DirectoryTree` is only used when
-          // FileExperimental flag is off, remove it after the tree replacement.
-          // @ts-ignore: error TS2531: Object is possibly 'null'.
-          assert(/** @type {DirectoryTree} */ (this.ui_.directoryTree)),
-          this.volumeManager_);
-      await this.guestOsController_.refresh();
-    }
-  }
-
-  /**
-   * Listens for the enable and disable events in order to add or remove the
-   * directory tree 'Linux files' root item.
-   *
-   * @param {chrome.fileManagerPrivate.CrostiniEvent} event
-   * @return {!Promise<void>}
-   * @private
-   */
-  async onCrostiniChanged_(event) {
-    // The background |this.crostini_| object also listens to all crostini
-    // events including enable/disable, and share/unshare.
-    // But to ensure we don't have any race conditions between bg and fg, we
-    // set enabled status on it before calling |setupCrostini_| which reads
-    // enabled status from it to determine whether 'Linux files' is shown.
-    switch (event.eventType) {
-      case chrome.fileManagerPrivate.CrostiniEventType.ENABLE:
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.crostini_.setEnabled(event.vmName, event.containerName, true);
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        return this.crostiniController_.redraw();
-
-      case chrome.fileManagerPrivate.CrostiniEventType.DISABLE:
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.crostini_.setEnabled(event.vmName, event.containerName, false);
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        return this.crostiniController_.redraw();
-
-      // Event is sent when a user drops an unshared file on Plugin VM.
-      // We show the move dialog so the user can move the file or share the
-      // directory.
-      case chrome.fileManagerPrivate.CrostiniEventType
-          .DROP_FAILED_PLUGIN_VM_DIRECTORY_NOT_SHARED:
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        if (this.ui_.dragInProcess) {
-          const moveMessage =
-              str('UNABLE_TO_DROP_IN_PLUGIN_VM_DIRECTORY_NOT_SHARED_MESSAGE');
-          const copyMessage =
-              str('UNABLE_TO_DROP_IN_PLUGIN_VM_EXTERNAL_DRIVE_MESSAGE');
-          FileTasks.showPluginVmNotSharedDialog(
-              this.selectionHandler.selection.entries, this.volumeManager_,
-              // @ts-ignore: error TS2345: Argument of type 'MetadataModel |
-              // null' is not assignable to parameter of type 'MetadataModel'.
-              assert(this.metadataModel_), assert(this.ui_), moveMessage,
-              copyMessage, this.fileTransferController_,
-              assert(this.directoryModel_));
-        }
-        break;
-    }
-  }
-
-  /**
-   * Sets up the current directory during initialization.
-   * @return {!Promise<void>}
-   * @private
-   */
-  async setupCurrentDirectory_() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    const tracker = this.directoryModel_.createDirectoryChangeTracker();
-    tracker.start();
-
-    // Wait until the volume manager is initialized.
-    await new Promise(
-        // @ts-ignore: error TS2345: Argument of type '(value: any) => void' is
-        // not assignable to parameter of type '() => any'.
-        resolve => this.volumeManager_.ensureInitialized(resolve));
-
-    // @ts-ignore: error TS7034: Variable 'nextCurrentDirEntry' implicitly has
-    // type 'any' in some locations where its type cannot be determined.
-    let nextCurrentDirEntry;
-    // @ts-ignore: error TS7034: Variable 'selectionEntry' implicitly has type
-    // 'any' in some locations where its type cannot be determined.
-    let selectionEntry;
-
-    // Resolve the selectionURL to selectionEntry or to currentDirectoryEntry in
-    // case of being a display root or a default directory to open files.
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    if (this.launchParams_.selectionURL) {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      if (this.launchParams_.selectionURL == this.recentEntry_.toURL()) {
-        nextCurrentDirEntry = this.recentEntry_;
-      } else {
-        try {
-          const inEntry = await new Promise((resolve, reject) => {
-            window.webkitResolveLocalFileSystemURL(
-                // @ts-ignore: error TS2531: Object is possibly 'null'.
-                this.launchParams_.selectionURL, resolve, reject);
-          });
-          const locationInfo = this.volumeManager_.getLocationInfo(inEntry);
-          // If location information is not available, then the volume is no
-          // longer (or never) available.
-          if (locationInfo) {
-            // If the selection is root, use it as a current directory instead.
-            // This is because selecting a root is the same as opening it.
-            if (locationInfo.isRootEntry) {
-              nextCurrentDirEntry = inEntry;
-            }
-
-            // If the |selectionURL| is a directory make it the current
-            // directory.
-            if (inEntry.isDirectory) {
-              nextCurrentDirEntry = inEntry;
-            }
-
-            // By default, the selection should be selected entry and the parent
-            // directory of it should be the current directory.
-            if (!nextCurrentDirEntry) {
-              selectionEntry = inEntry;
-            }
-          }
-        } catch (error) {
-          // If `selectionURL` doesn't exist we just don't select it, thus we
-          // don't need to log the failure.
-          // @ts-ignore: error TS18046: 'error' is of type 'unknown'.
-          if (error.name !== 'NotFoundError') {
-            // @ts-ignore: error TS18046: 'error' is of type 'unknown'.
-            console.warn(error.stack || error);
-          }
-        }
-      }
-    }
-
-    // If searchQuery param is set, find the first directory that matches the
-    // query, and select it if exists.
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    const searchQuery = this.launchParams_.searchQuery;
-    if (searchQuery) {
-      startInterval('Load.ProcessInitialSearchQuery');
-      if (!isNewDirectoryTreeEnabled()) {
-        this.store_.dispatch(updateSearch({
-          query: searchQuery,
-          status: PropStatus.STARTED,
-          options: getDefaultSearchOptions(),
-        }));
-      }
-      // Show a spinner, as the crossover search function call could be slow.
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      const hideSpinnerCallback = this.spinnerController_.show();
-      const queryMatchedDirEntry = await findQueryMatchedDirectoryEntry(
-          // @ts-ignore: error TS2345: Argument of type 'DirectoryModel |
-          // null' is not assignable to parameter of type 'DirectoryModel'.
-          this.volumeManager_, this.directoryModel_, searchQuery);
-      if (queryMatchedDirEntry) {
-        nextCurrentDirEntry = queryMatchedDirEntry;
-      }
-      hideSpinnerCallback();
-      recordInterval('Load.ProcessInitialSearchQuery');
-    }
-
-    // Resolve the currentDirectoryURL to currentDirectoryEntry (if not done by
-    // the previous step).
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    if (!nextCurrentDirEntry && this.launchParams_.currentDirectoryURL) {
-      try {
-        const inEntry = await new Promise((resolve, reject) => {
-          window.webkitResolveLocalFileSystemURL(
-              // @ts-ignore: error TS2531: Object is possibly 'null'.
-              this.launchParams_.currentDirectoryURL, resolve, reject);
-        });
-        const locationInfo = this.volumeManager_.getLocationInfo(inEntry);
-        if (locationInfo) {
-          nextCurrentDirEntry = inEntry;
-        }
-      } catch (error) {
-        // @ts-ignore: error TS18046: 'error' is of type 'unknown'.
-        console.warn(error.stack || error);
-      }
-    }
-
-    // If the directory to be changed to is not available, then first fallback
-    // to the parent of the selection entry.
-    if (!nextCurrentDirEntry && selectionEntry) {
-      nextCurrentDirEntry = await new Promise(resolve => {
-        // @ts-ignore: error TS7005: Variable 'selectionEntry' implicitly has an
-        // 'any' type.
-        selectionEntry.getParent(resolve);
-      });
-    }
-
-    // Check if the next current directory is not a virtual directory which is
-    // not available in UI. This may happen to shared on Drive.
-    if (nextCurrentDirEntry) {
-      const locationInfo =
-          this.volumeManager_.getLocationInfo(nextCurrentDirEntry);
-      // If we can't check, assume that the directory is illegal.
-      if (!locationInfo) {
-        nextCurrentDirEntry = null;
-      } else {
-        // Having root directory of DRIVE_SHARED_WITH_ME here should be only for
-        // shared with me files. Fallback to Drive root in such case.
-        if (locationInfo.isRootEntry &&
-            locationInfo.rootType === RootType.DRIVE_SHARED_WITH_ME) {
-          const volumeInfo =
-              this.volumeManager_.getVolumeInfo(nextCurrentDirEntry);
-          if (!volumeInfo) {
-            nextCurrentDirEntry = null;
-          } else {
-            try {
-              nextCurrentDirEntry = await volumeInfo.resolveDisplayRoot();
-            } catch (error) {
-              // @ts-ignore: error TS18046: 'error' is of type 'unknown'.
-              console.warn(error.stack || error);
-              nextCurrentDirEntry = null;
-            }
-          }
-        }
-      }
-    }
-
-    // If the resolved directory to be changed is blocked by DLP, we should
-    // fallback to the default display root.
-    if (nextCurrentDirEntry && isDlpEnabled()) {
-      const volumeInfo = this.volumeManager_.getVolumeInfo(nextCurrentDirEntry);
-      if (volumeInfo && this.volumeManager_.isDisabled(volumeInfo.volumeType)) {
-        console.warn('Target directory is DLP blocked, redirecting to MyFiles');
-        nextCurrentDirEntry = null;
-      }
-    }
-
-    // If the directory to be changed to is still not resolved, then fallback to
-    // the default display root.
-    if (!nextCurrentDirEntry) {
-      nextCurrentDirEntry = await new Promise(resolve => {
-        this.volumeManager_.getDefaultDisplayRoot(resolve);
-      });
-    }
-
-    // If selection failed to be resolved (eg. didn't exist, in case of saving a
-    // file, or in case of a fallback of the current directory, then try to
-    // resolve again using the target name.
-    if (!selectionEntry && nextCurrentDirEntry &&
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        this.launchParams_.targetName) {
-      // Try to resolve as a file first. If it fails, then as a directory.
-      try {
-        selectionEntry = await new Promise((resolve, reject) => {
-          // @ts-ignore: error TS7005: Variable 'nextCurrentDirEntry' implicitly
-          // has an 'any' type.
-          nextCurrentDirEntry.getFile(
-              // @ts-ignore: error TS2531: Object is possibly 'null'.
-              this.launchParams_.targetName, {}, resolve, reject);
-        });
-      } catch (error1) {
-        // Failed to resolve as a file. Try to resolve as a directory.
-        try {
-          selectionEntry = await new Promise((resolve, reject) => {
-            // @ts-ignore: error TS7005: Variable 'nextCurrentDirEntry'
-            // implicitly has an 'any' type.
-            nextCurrentDirEntry.getDirectory(
-                // @ts-ignore: error TS2531: Object is possibly 'null'.
-                this.launchParams_.targetName, {}, resolve, reject);
-          });
-        } catch (error2) {
-          // If `targetName` doesn't exist we just don't select it, thus we
-          // don't need to log the failure.
-          // @ts-ignore: error TS18046: 'error1' is of type 'unknown'.
-          if (error1.name !== 'NotFoundError') {
-            // @ts-ignore: error TS18046: 'error1' is of type 'unknown'.
-            console.warn(error1.stack || error1);
-            console.log(error1);
-          }
-          // @ts-ignore: error TS18046: 'error2' is of type 'unknown'.
-          if (error2.name !== 'NotFoundError') {
-            // @ts-ignore: error TS18046: 'error2' is of type 'unknown'.
-            console.warn(error2.stack || error2);
-          }
-        }
-      }
-    }
-
-    // If there is no target select MyFiles by default.
-    if (!nextCurrentDirEntry) {
-      if (isNewDirectoryTreeEnabled()) {
-        const myFiles = getMyFiles(this.store_.getState());
-        // When MyFiles volume is mounted, we rely on the current directory
-        // change to make it as selected (controlled by DirectoryModel),
-        // that's why we can't set MyFiles entry list as the current directory
-        // here.
-        // TODO(b/308504417): MyFiles entry list should be selected before
-        // MyFiles volume mounts.
-        if (myFiles.myFilesVolume) {
-          nextCurrentDirEntry = myFiles.myFilesEntry;
-        }
-        // @ts-ignore: error TS2339: Property 'dataModel' does not exist on type
-        // 'XfTree | DirectoryTree'.
-      } else if (this.ui_.directoryTree.dataModel.myFilesModel_) {
-        nextCurrentDirEntry =
-            // @ts-ignore: error TS2339: Property 'dataModel' does not exist on
-            // type 'XfTree | DirectoryTree'.
-            this.ui_.directoryTree.dataModel.myFilesModel_.entry;
-      }
-    }
-
-    // Check directory change.
-    tracker.stop();
-    if (!tracker.hasChanged) {
-      // Finish setup current directory.
-      await this.finishSetupCurrentDirectory_(
-          // @ts-ignore: error TS2531: Object is possibly 'null'.
-          nextCurrentDirEntry, selectionEntry, this.launchParams_.targetName);
-    }
-  }
-
-  /**
-   * @param {?DirectoryEntry} directoryEntry Directory to be opened.
-   * @param {Entry=} opt_selectionEntry Entry to be selected.
-   * @param {string=} opt_suggestedName Suggested name for a non-existing
-   *     selection.
-   * @return {!Promise<void> }
-   * @private
-   */
-  async finishSetupCurrentDirectory_(
-      directoryEntry, opt_selectionEntry, opt_suggestedName) {
-    // Open the directory, and select the selection (if passed).
-    const promise = (async () => {
-      console.warn('Files app has started');
-      if (directoryEntry) {
-        await new Promise(resolve => {
-          // @ts-ignore: error TS2531: Object is possibly 'null'.
-          this.directoryModel_.changeDirectoryEntry(
-              // @ts-ignore: error TS2345: Argument of type '(value: any) =>
-              // void' is not assignable to parameter of type '() => any'.
-              assert(directoryEntry), resolve);
-        });
-        if (opt_selectionEntry) {
-          // @ts-ignore: error TS2531: Object is possibly 'null'.
-          this.directoryModel_.selectEntry(opt_selectionEntry);
-        }
-        if (this.launchParams_?.searchQuery) {
-          const searchState = this.store_.getState().search;
-          this.store_.dispatch(updateSearch({
-            query: this.launchParams_.searchQuery,
-            status: undefined,
-            // Make sure the current directory can be highlighted in the
-            // directory tree.
-            options: {
-              ...getDefaultSearchOptions(),
-              ...searchState?.options,
-              location: SearchLocation.THIS_FOLDER,
-            },
-          }));
-        }
-      } else {
-        console.warn('No entry for finishSetupCurrentDirectory_');
-      }
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.addLoadedAttribute();
-    })();
-
-    if (this.dialogType === DialogType.SELECT_SAVEAS_FILE) {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.dialogFooter.filenameInput.value = opt_suggestedName || '';
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.dialogFooter.selectTargetNameInFilenameInput();
-    }
-
-    return promise;
-  }
-
-  /**
-   * Return DirectoryEntry of the current directory or null.
-   * @return {DirectoryEntry|FakeEntry|FilesAppDirEntry} DirectoryEntry of the
-   *     current directory.
-   *     Returns null if the directory model is not ready or the current
-   *     directory is not set.
-   */
-  getCurrentDirectoryEntry() {
-    // @ts-ignore: error TS2322: Type 'FileSystemDirectoryEntry |
-    // FilesAppDirEntry | FakeEntry | null' is not assignable to type
-    // 'FileSystemDirectoryEntry | FilesAppDirEntry | FakeEntry'.
-    return this.directoryModel_ && this.directoryModel_.getCurrentDirEntry();
-  }
-
-  /** Expose the unload method for integration tests. */
-  onUnloadForTest() {
-    this.onUnload_();
-  }
-
-  /**
-   * Unload handler for the page.
-   * @private
-   */
-  onUnload_() {
-    if (this.directoryModel_) {
-      this.directoryModel_.dispose();
-    }
-
-    if (this.volumeManager_) {
-      this.volumeManager_.dispose();
-    }
-
-    if (this.fileTransferController_) {
-      for (const taskId of assert(
-               this.fileTransferController_.pendingTaskIds)) {
-        const item = this.progressCenter.getItemById(taskId);
-        // @ts-ignore: error TS18047: 'item' is possibly 'null'.
-        item.message = '';
-        // @ts-ignore: error TS18047: 'item' is possibly 'null'.
-        item.state = ProgressItemState.CANCELED;
-        // @ts-ignore: error TS2345: Argument of type 'ProgressCenterItem |
-        // null' is not assignable to parameter of type 'ProgressCenterItem'.
-        this.progressCenter.updateItem(item);
-      }
-    }
-
-    if (this.ui_ && this.ui_.progressCenterPanel) {
-      this.progressCenter.removePanel(this.ui_.progressCenterPanel);
-    }
-  }
-
-  /**
-   * Returns allowed path for the dialog by considering:
-   * 1) The launch parameter which specifies generic category of valid files
-   * paths.
-   * 2) Files app's unique capabilities and restrictions.
-   * @returns {AllowedPaths}
-   */
-  getAllowedPaths_() {
-    let allowedPaths =
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        /** @type {AllowedPaths} */ (this.launchParams_.allowedPaths);
-    // The native implementation of the Files app creates snapshot files for
-    // non-native files. But it does not work for folders (e.g., dialog for
-    // loading unpacked extensions).
-    if (allowedPaths === AllowedPaths.NATIVE_PATH &&
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        !isFolderDialogType(this.launchParams_.type)) {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      if (this.launchParams_.type == DialogType.SELECT_SAVEAS_FILE) {
-        allowedPaths = AllowedPaths.NATIVE_PATH;
-      } else {
-        allowedPaths = AllowedPaths.ANY_PATH;
-      }
-    }
-
-    return allowedPaths;
-  }
-
-  /**
-   * Returns SourceRestriction which is used to communicate restrictions about
-   * sources to chrome.fileManagerPrivate.getRecentFiles API.
-   * @returns {chrome.fileManagerPrivate.SourceRestriction}
-   */
-  getSourceRestriction_() {
-    const allowedPaths = this.getAllowedPaths_();
-    if (allowedPaths == AllowedPaths.NATIVE_PATH) {
-      return chrome.fileManagerPrivate.SourceRestriction.NATIVE_SOURCE;
-    }
-    return chrome.fileManagerPrivate.SourceRestriction.ANY_SOURCE;
-  }
-
-  /**
-   * @return {FileSelection} Selection object.
-   */
-  getSelection() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    return this.selectionHandler_.selection;
-  }
-
-  /**
-   * @return {ArrayDataModel} File list.
-   */
-  getFileList() {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    return this.directoryModel_.getFileList();
-  }
-
-  /**
-   * @return {!List} Current list object.
-   */
-  getCurrentList() {
-    return this.ui.listContainer.currentList;
-  }
-
-  /**
-   * Add or remove the fake Drive and Trash item from the directory tree when
-   * the prefs change. If Drive or Trash has been enabled by prefs, add the item
-   * otherwise remove it. This supports dynamic refresh when the pref changes.
-   */
-  async onPreferencesChanged_() {
-    let prefs = null;
-    try {
-      prefs = await getPreferences();
-    } catch (e) {
-      console.error('Cannot get preferences:', e);
-      return;
-    }
-
-    this.store_.dispatch(updatePreferences(prefs));
-
-    let redraw = false;
-    if (this.driveEnabled_ !== prefs.driveEnabled) {
-      this.driveEnabled_ = prefs.driveEnabled;
-      this.toggleDriveRootOnPreferencesUpdate_();
-      redraw = true;
-    }
-
-    if (this.bulkPinningAvailable_ !== prefs.driveFsBulkPinningAvailable) {
-      this.bulkPinningAvailable_ = prefs.driveFsBulkPinningAvailable;
-      console.debug(`Bulk-pinning is now ${
-          this.bulkPinningAvailable_ ? 'available' : 'unavailable'}`);
-      if (this.bulkPinningAvailable_) {
-        await this.initBulkPinning_();
-      }
-    }
-
-    if (this.trashEnabled !== prefs.trashEnabled) {
-      this.trashEnabled = prefs.trashEnabled;
-      this.toggleTrashRootOnPreferencesUpdate_();
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.toolbarController_.moveToTrashCommand.disabled = !this.trashEnabled;
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.toolbarController_.moveToTrashCommand.canExecuteChange(
-          // @ts-ignore: error TS2531: Object is possibly 'null'.
-          this.ui_.listContainer.currentList);
-      redraw = true;
-    }
-
-    await this.updateOfficePrefs_(prefs);
-
-    if (redraw && !isNewDirectoryTreeEnabled()) {
-      // @ts-ignore: error TS2339: Property 'redraw' does not exist on type
-      // 'XfTree | DirectoryTree'.
-      this.ui_.directoryTree.redraw(false);
-    }
-  }
-
-  async onDriveConnectionStatusChanged_() {
-    let connectionState = null;
-    try {
-      connectionState = await getDriveConnectionState();
-    } catch (e) {
-      console.error('Failed to retrieve drive connection state:', e);
-      return;
-    }
-    this.store_.dispatch(updateDriveConnectionStatus(connectionState));
-  }
-
-  /**
-   * @param {!chrome.fileManagerPrivate.Preferences} prefs
-   * @private
-   */
-  async updateOfficePrefs_(prefs) {
-    // These prefs starts with value 0. We only want to display when they're
-    // non-zero and show the most recent (larger value).
-    if (prefs.officeFileMovedOneDrive > prefs.officeFileMovedGoogleDrive) {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.nudgeContainer.showNudge(
-          NudgeType['ONE_DRIVE_MOVED_FILE_NUDGE']);
-    } else if (
-        prefs.officeFileMovedOneDrive < prefs.officeFileMovedGoogleDrive) {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.nudgeContainer.showNudge(NudgeType['DRIVE_MOVED_FILE_NUDGE']);
-    }
-    // Reset the seen state for office nudge. For normal users these 2 prefs
-    // will never reset to 0, however for manual tests it can be reset in
-    // chrome://files-internals.
-    if (prefs.officeFileMovedOneDrive === 0 &&
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        await this.ui_.nudgeContainer.checkSeen(
-            NudgeType['ONE_DRIVE_MOVED_FILE_NUDGE'])) {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.nudgeContainer.clearSeen(
-          NudgeType['ONE_DRIVE_MOVED_FILE_NUDGE']);
-      console.debug('Reset OneDrive move to cloud nudge');
-    }
-    if (prefs.officeFileMovedGoogleDrive === 0 &&
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        await this.ui_.nudgeContainer.checkSeen(
-            NudgeType['DRIVE_MOVED_FILE_NUDGE'])) {
-      // @ts-ignore: error TS2531: Object is possibly 'null'.
-      this.ui_.nudgeContainer.clearSeen(NudgeType['DRIVE_MOVED_FILE_NUDGE']);
-      console.debug('Reset Google Drive move to cloud nudge');
-    }
-  }
-
-  /**
-   * Invoked when the device connection status changes.
-   * @param {chrome.fileManagerPrivate.DeviceConnectionState} state
-   * @private
-   */
-  updateDeviceConnectionState_(state) {
-    this.store_.dispatch(updateDeviceConnectionState({connection: state}));
-  }
-
-  /**
-   * Toggles the trash root visibility when the `trashEnabled` preference is
-   * updated.
-   * @private
-   */
-  toggleTrashRootOnPreferencesUpdate_() {
-    if (this.trashEnabled) {
-      if (!this.fakeTrashItem_) {
-        this.fakeTrashItem_ = new NavigationModelFakeItem(
-            str('TRASH_ROOT_LABEL'), NavigationModelItemType.TRASH,
-            new TrashRootEntry());
-      }
-      // @ts-ignore: error TS2740: Type 'FilesAppEntry' is missing the following
-      // properties from type 'FakeEntryImpl': label, disabled,
-      // sourceRestriction, fileCategory, and 7 more.
-      this.store_.dispatch(addUiEntry({entry: this.fakeTrashItem_.entry}));
-      if (!isNewDirectoryTreeEnabled()) {
-        // @ts-ignore: error TS2339: Property 'dataModel' does not exist on type
-        // 'XfTree | DirectoryTree'.
-        this.ui_.directoryTree.dataModel.fakeTrashItem = this.fakeTrashItem_;
-      }
-      return;
-    }
-
-    this.store_.dispatch(removeUiEntry({key: trashRootKey}));
-    if (!isNewDirectoryTreeEnabled()) {
-      // @ts-ignore: error TS2339: Property 'dataModel' does not exist on type
-      // 'XfTree | DirectoryTree'.
-      this.ui_.directoryTree.dataModel.fakeTrashItem = null;
-    }
-    this.navigateAwayFromDisabledRoot_(this.fakeTrashItem_);
-  }
-
-  /**
-   * Toggles the drive root visibility when the `driveEnabled` preference is
-   * updated.
-   * @private
-   */
-  toggleDriveRootOnPreferencesUpdate_() {
-    if (this.driveEnabled_) {
-      let driveFakeRoot = /** @type {?EntryList} */
-          (getEntry(this.store_.getState(), driveRootEntryListKey));
-      if (!driveFakeRoot) {
-        driveFakeRoot = new EntryList(
-            str('DRIVE_DIRECTORY_LABEL'), RootType.DRIVE_FAKE_ROOT);
-        this.store_.dispatch(addUiEntry({entry: driveFakeRoot}));
-      }
-      if (!isNewDirectoryTreeEnabled()) {
-        // TODO(b/285977941): Remove the old FakeEntry based drive root.
-        const driveFakeRoot = new FakeEntryImpl(
-            str('DRIVE_DIRECTORY_LABEL'), RootType.DRIVE_FAKE_ROOT);
-        if (!this.fakeDriveItem_) {
-          this.fakeDriveItem_ = new NavigationModelFakeItem(
-              str('DRIVE_DIRECTORY_LABEL'), NavigationModelItemType.DRIVE,
-              driveFakeRoot);
-          this.fakeDriveItem_.disabled =
-              this.volumeManager_.isDisabled(VolumeType.DRIVE);
-        }
-        // @ts-ignore: error TS2339: Property 'dataModel' does not exist on
-        // type 'XfTree | DirectoryTree'.
-        this.ui_.directoryTree.dataModel.fakeDriveItem = this.fakeDriveItem_;
-      }
-      return;
-    }
-    this.store_.dispatch(removeUiEntry({key: driveRootEntryListKey}));
-    if (!isNewDirectoryTreeEnabled()) {
-      // @ts-ignore: error TS2339: Property 'dataModel' does not exist on type
-      // 'XfTree | DirectoryTree'.
-      this.ui_.directoryTree.dataModel.fakeDriveItem = null;
-    }
-    this.navigateAwayFromDisabledRoot_(this.fakeDriveItem_);
-  }
-
-  /**
-   * If the root item has been disabled but it is the current visible entry,
-   * navigate away from it to the default display root.
-   * @param {?NavigationModelFakeItem} rootItem The item to navigate away
-   *     from.
-   * @private
-   */
-  navigateAwayFromDisabledRoot_(rootItem) {
-    if (!rootItem) {
-      return;
-    }
-    // The fake root item is being hidden so navigate away if it's the
-    // current directory.
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    if (this.directoryModel_.getCurrentDirEntry() === rootItem.entry) {
-      // @ts-ignore: error TS7006: Parameter 'displayRoot' implicitly has an
-      // 'any' type.
-      this.volumeManager_.getDefaultDisplayRoot((displayRoot) => {
-        // @ts-ignore: error TS2531: Object is possibly 'null'.
-        if (this.directoryModel_.getCurrentDirEntry() === rootItem.entry &&
-            displayRoot) {
-          // @ts-ignore: error TS2531: Object is possibly 'null'.
-          this.directoryModel_.changeDirectoryEntry(displayRoot);
-        }
-      });
-    }
-  }
-
-  /**
-   * Updates the DOM to reflect the specified tablet mode `enabled` state.
-   * @param {boolean} enabled
-   * @private
-   */
-  onTabletModeChanged_(enabled) {
-    // @ts-ignore: error TS2531: Object is possibly 'null'.
-    this.dialogDom_.classList.toggle('tablet-mode-enabled', enabled);
-  }
-}
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.ts b/ui/file_manager/file_manager/foreground/js/file_manager.ts
new file mode 100644
index 0000000..9014294
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/file_manager.ts
@@ -0,0 +1,1786 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cros_components/switch/switch.js';
+import '../../background/js/file_manager_base.js';
+import '../../background/js/test_util.js';
+import '../../definitions/file_manager_private.js';
+import '../../widgets/xf_jellybean.js';
+
+import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import {assert, assertInstanceof} from 'chrome://resources/js/assert.js';
+
+import {FileManagerBase} from '../../background/js/file_manager_base.js';
+import {getBulkPinProgress, getDialogCaller, getDlpBlockedComponents, getDriveConnectionState, getPreferences} from '../../common/js/api.js';
+import {ArrayDataModel} from '../../common/js/array_data_model.js';
+import {crInjectTypeAndInit} from '../../common/js/cr_ui.js';
+import {isFolderDialogType} from '../../common/js/dialog_type.js';
+import {getKeyModifiers, queryDecoratedElement, queryRequiredElement} from '../../common/js/dom_utils.js';
+import {EntryList, FakeEntryImpl} from '../../common/js/files_app_entry_types.js';
+import {FilesAppState} from '../../common/js/files_app_state.js';
+import {FilteredVolumeManager} from '../../common/js/filtered_volume_manager.js';
+import {isDlpEnabled, isGuestOsEnabled, isNewDirectoryTreeEnabled} from '../../common/js/flags.js';
+import {recordEnum, recordInterval, startInterval} from '../../common/js/metrics.js';
+import {ProgressItemState} from '../../common/js/progress_center_common.js';
+import {str} from '../../common/js/translations.js';
+import {TrashRootEntry} from '../../common/js/trash.js';
+import {getLastVisitedURL, isInGuestMode, runningInBrowser} from '../../common/js/util.js';
+import {AllowedPaths, ARCHIVE_OPENED_EVENT_TYPE, RootType, VolumeType} from '../../common/js/volume_manager_types.js';
+import {DirectoryTreeContainer} from '../../containers/directory_tree_container.js';
+import {NudgeType} from '../../containers/nudge_container.js';
+import {Crostini} from '../../externs/background/crostini.js';
+import {ProgressCenter} from '../../externs/background/progress_center.js';
+import {FakeEntry, FilesAppDirEntry, FilesAppEntry} from '../../externs/files_app_entry_interfaces.js';
+import {DialogType, PropStatus, SearchLocation} from '../../externs/ts/state.js';
+import {getMyFiles} from '../../state/ducks/all_entries.js';
+import {updateBulkPinProgress} from '../../state/ducks/bulk_pinning.js';
+import {updateDeviceConnectionState} from '../../state/ducks/device.js';
+import {updateDriveConnectionStatus} from '../../state/ducks/drive.js';
+import {setLaunchParameters} from '../../state/ducks/launch_params.js';
+import {updatePreferences} from '../../state/ducks/preferences.js';
+import {getDefaultSearchOptions, updateSearch} from '../../state/ducks/search.js';
+import {addUiEntry, removeUiEntry} from '../../state/ducks/ui_entries.js';
+import {driveRootEntryListKey, trashRootKey} from '../../state/ducks/volumes.js';
+import {getEmptyState, getEntry, getStore} from '../../state/store.js';
+import {isXfTree} from '../../widgets/xf_tree_util.js';
+
+import {ActionsController} from './actions_controller.js';
+import {AndroidAppListModel} from './android_app_list_model.js';
+import {AppStateController} from './app_state_controller.js';
+import {BannerController} from './banner_controller.js';
+import {CommandHandler} from './command_handler.js';
+import {findQueryMatchedDirectoryEntry} from './crossover_search_utils.js';
+import {CrostiniController} from './crostini_controller.js';
+import {DialogActionController} from './dialog_action_controller.js';
+import {FileFilter} from './directory_contents.js';
+import {DirectoryModel} from './directory_model.js';
+import {DirectoryTreeNamingController} from './directory_tree_naming_controller.js';
+import {importElements} from './elements_importer.js';
+import {EmptyFolderController} from './empty_folder_controller.js';
+import {forceDefaultHandler} from './file_manager_commands_util.js';
+import {FileSelection, FileSelectionHandler} from './file_selection.js';
+import {FileTasks} from './file_tasks.js';
+import {FileTransferController} from './file_transfer_controller.js';
+import {FileTypeFiltersController} from './file_type_filters_controller.js';
+import {FolderShortcutsDataModel} from './folder_shortcuts_data_model.js';
+import {GearMenuController} from './gear_menu_controller.js';
+import {GuestOsController} from './guest_os_controller.js';
+import {LastModifiedController} from './last_modified_controller.js';
+import {LaunchParam} from './launch_param.js';
+import {ListThumbnailLoader} from './list_thumbnail_loader.js';
+import {MainWindowComponent} from './main_window_component.js';
+import {MetadataModel} from './metadata/metadata_model.js';
+import {ThumbnailModel} from './metadata/thumbnail_model.js';
+import {MetadataBoxController} from './metadata_box_controller.js';
+import {MetadataUpdateController} from './metadata_update_controller.js';
+import {NamingController} from './naming_controller.js';
+import {NavigationListModel, NavigationModelFakeItem, NavigationModelItemType} from './navigation_list_model.js';
+import {NavigationUma} from './navigation_uma.js';
+import {ProvidersModel} from './providers_model.js';
+import {QuickViewController} from './quick_view_controller.js';
+import {QuickViewModel} from './quick_view_model.js';
+import {QuickViewUma} from './quick_view_uma.js';
+import {ScanController} from './scan_controller.js';
+import {SelectionMenuController} from './selection_menu_controller.js';
+import {SortMenuController} from './sort_menu_controller.js';
+import {SpinnerController} from './spinner_controller.js';
+import {TaskController} from './task_controller.js';
+import {ToolbarController} from './toolbar_controller.js';
+import {CommandButton} from './ui/commandbutton.js';
+import {contextMenuHandler} from './ui/context_menu_handler.js';
+import {DirectoryTree} from './ui/directory_tree.js';
+import {FileGrid} from './ui/file_grid.js';
+import {FileManagerUI} from './ui/file_manager_ui.js';
+import {FileMetadataFormatter} from './ui/file_metadata_formatter.js';
+import {FileTable} from './ui/file_table.js';
+import {List} from './ui/list.js';
+import {Menu} from './ui/menu.js';
+
+/**
+ * FileManager constructor.
+ *
+ * FileManager objects encapsulate the functionality of the file selector
+ * dialogs, as well as the full screen file manager application.
+ *
+ */
+export class FileManager {
+  // ------------------------------------------------------------------------
+  // Services FileManager depends on.
+
+  /**
+   * Volume manager.
+   */
+  private volumeManager_: FilteredVolumeManager|null = null;
+  private crostini_: Crostini|null = null;
+  private crostiniController_: CrostiniController|null = null;
+  private guestOsController_: GuestOsController|null = null;
+  private metadataModel_: MetadataModel|null = null;
+  private fileMetadataFormatter_ = new FileMetadataFormatter();
+  private thumbnailModel_: ThumbnailModel|null = null;
+  /**
+   * File filter.
+   */
+  private fileFilter_: null|FileFilter = null;
+
+  /**
+   * Model of current directory.
+   */
+  private directoryModel_: null|DirectoryModel = null;
+
+  /**
+   * Model of folder shortcuts.
+   */
+  private folderShortcutsModel_: null|FolderShortcutsDataModel = null;
+
+  /**
+   * Model of Android apps.
+   */
+  private androidAppListModel_: null|AndroidAppListModel = null;
+
+  /**
+   * Model for providers (providing extensions).
+   */
+  private providersModel_: null|ProvidersModel = null;
+
+  /**
+   * Model for quick view.
+   */
+  private quickViewModel_: null|QuickViewModel = null;
+
+  /**
+   * Controller for actions for current selection.
+   */
+  private actionsController_: ActionsController|null = null;
+
+  /**
+   * Handler for command events.
+   */
+  private commandHandler_: CommandHandler|null = null;
+
+  /**
+   * Handler for the change of file selection.
+   */
+  private selectionHandler_: null|FileSelectionHandler = null;
+
+  /**
+   * UI management class of file manager.
+   */
+  private ui_: null|FileManagerUI = null;
+
+  // ------------------------------------------------------------------------
+  // Parameters determining the type of file manager.
+
+  /**
+   * Dialog type of this window.
+   */
+  dialogType: DialogType = DialogType.FULL_PAGE;
+
+  /**
+   * Startup parameters for this application.
+   */
+  private launchParams_: null|LaunchParam = null;
+
+  // ------------------------------------------------------------------------
+  // Controllers.
+
+  /**
+   * File transfer controller.
+   */
+  private fileTransferController_: null|FileTransferController = null;
+
+  /**
+   * Naming controller.
+   */
+  private namingController_: null|NamingController = null;
+
+  /**
+   * Directory tree naming controller.
+   */
+  private directoryTreeNamingController_: DirectoryTreeNamingController|null =
+      null;
+
+  /**
+   * Controller for directory scan.
+   */
+  protected scanController_: null|ScanController = null;
+
+  /**
+   * Controller for spinner.
+   */
+  private spinnerController_: null|SpinnerController = null;
+
+  /**
+   * Sort menu controller.
+   */
+  protected sortMenuController_: null|SortMenuController = null;
+
+  /**
+   * Gear menu controller.
+   */
+  protected gearMenuController_: null|GearMenuController = null;
+
+  /**
+   * Controller for the context menu opened by the action bar button in the
+   * check-select mode.
+   */
+  protected selectionMenuController_: null|SelectionMenuController = null;
+
+  /**
+   * Toolbar controller.
+   */
+  private toolbarController_: null|ToolbarController = null;
+
+  /**
+   * App state controller.
+   */
+  private appStateController_: null|AppStateController = null;
+
+  /**
+   * Dialog action controller.
+   */
+  protected dialogActionController_: null|DialogActionController = null;
+
+  /**
+   * List update controller.
+   */
+  private metadataUpdateController_: null|MetadataUpdateController = null;
+
+  /**
+   * Last modified controller.
+   */
+  protected lastModifiedController_: LastModifiedController|null = null;
+
+  /**
+   * Component for main window and its misc UI parts.
+   */
+  protected mainWindowComponent_: null|MainWindowComponent = null;
+  private taskController_: TaskController|null = null;
+  private quickViewUma_: QuickViewUma|null = null;
+  protected quickViewController_: QuickViewController|null = null;
+  protected fileTypeFiltersController_: FileTypeFiltersController|null = null;
+
+  /**
+   * Empty folder controller.
+   */
+  protected emptyFolderController_: null|EmptyFolderController = null;
+
+  /**
+   * Records histograms of directory-changed event.
+   */
+  private navigationUma_: null|NavigationUma = null;
+
+  // ------------------------------------------------------------------------
+  // DOM elements.
+
+  /**
+   */
+  private fileBrowserBackground_: null|FileManagerBase = null;
+
+  /**
+   * The root DOM element of this app.
+   */
+  private dialogDom_: null|HTMLElement = null;
+
+  /**
+   * The document object of this app.
+   */
+  private document_: null|Document = null;
+
+  // ------------------------------------------------------------------------
+  // Miscellaneous FileManager's states.
+
+  /**
+   * Promise object which is fulfilled when initialization for app state
+   * controller is done.
+   */
+  private initSettingsPromise_: null|Promise<void> = null;
+
+  /**
+   * Promise object which is fulfilled when initialization related to the
+   * background page is done.
+   */
+  private initBackgroundPagePromise_: null|Promise<void> = null;
+
+  /**
+   * Whether Drive is enabled. Retrieved from user preferences.
+   */
+  private driveEnabled_: boolean = false;
+
+  /**
+   * Whether Drive bulk-pinning is available on this device. Retrieved from
+   * user preferences.
+   */
+  private bulkPinningAvailable_: boolean = false;
+
+  /**
+   * Whether Drive bulk-pinning has been initialized in Files App.
+   */
+  private bulkPinningInitialized_: boolean = false;
+
+  /**
+   * A fake Drive placeholder item.
+   */
+  private fakeDriveItem_: null|NavigationModelFakeItem = null;
+
+  /**
+   * Whether Trash is enabled or not, retrieved from user preferences.
+   */
+  trashEnabled: boolean = false;
+
+  /**
+   * A fake Trash placeholder item.
+   */
+  private fakeTrashItem_: null|NavigationModelFakeItem = null;
+
+  /**
+   * A fake entry for Recents.
+   */
+  private recentEntry_: null|FakeEntry = null;
+
+  /**
+   * Whether or not we are running in guest mode.
+   */
+  private guestMode_: boolean = false;
+
+  private store_ = getStore();
+
+  constructor() {
+    (function() {
+      ColorChangeUpdater.forDocument().start();
+    })();
+  }
+
+  get progressCenter(): ProgressCenter {
+    assert(this.fileBrowserBackground_);
+    assert(this.fileBrowserBackground_.progressCenter);
+    return this.fileBrowserBackground_.progressCenter;
+  }
+
+  get directoryModel(): DirectoryModel {
+    return this.directoryModel_!;
+  }
+
+  get directoryTreeNamingController(): DirectoryTreeNamingController {
+    assert(this.directoryTreeNamingController_);
+    return this.directoryTreeNamingController_;
+  }
+
+  get fileFilter(): FileFilter {
+    assert(this.fileFilter_);
+    return this.fileFilter_;
+  }
+
+  get folderShortcutsModel(): FolderShortcutsDataModel {
+    assert(this.folderShortcutsModel_);
+    return this.folderShortcutsModel_;
+  }
+
+  get actionsController(): ActionsController {
+    assert(this.actionsController_);
+    return this.actionsController_;
+  }
+
+  get commandHandler(): CommandHandler {
+    assert(this.commandHandler_);
+    return this.commandHandler_;
+  }
+
+  get providersModel(): ProvidersModel {
+    assert(this.providersModel_);
+    return this.providersModel_;
+  }
+
+  get metadataModel(): MetadataModel {
+    assert(this.metadataModel_);
+    return this.metadataModel_;
+  }
+
+  get selectionHandler(): FileSelectionHandler {
+    assert(this.selectionHandler_);
+    return this.selectionHandler_;
+  }
+
+  get document(): Document {
+    assert(this.document_);
+    return this.document_;
+  }
+
+  get fileTransferController(): FileTransferController|null {
+    return this.fileTransferController_;
+  }
+
+  get namingController(): NamingController {
+    assert(this.namingController_);
+    return this.namingController_;
+  }
+
+  get taskController(): TaskController {
+    assert(this.taskController_);
+    return this.taskController_;
+  }
+
+  get spinnerController(): SpinnerController {
+    assert(this.spinnerController_);
+    return this.spinnerController_;
+  }
+
+  get volumeManager(): FilteredVolumeManager {
+    assert(this.volumeManager_);
+    return this.volumeManager_;
+  }
+
+  get crostini(): Crostini {
+    assert(this.crostini_);
+    return this.crostini_;
+  }
+
+  get ui(): FileManagerUI {
+    assert(this.ui_);
+    return this.ui_;
+  }
+
+  /**
+   * @return If the app is running in the guest mode.
+   */
+  get guestMode(): boolean {
+    return this.guestMode_;
+  }
+
+  /**
+   * Launch a new File Manager app.
+   * @param appState App state.
+   */
+  launchFileManager(appState?: FilesAppState) {
+    assert(this.fileBrowserBackground_);
+    this.fileBrowserBackground_.launchFileManager(appState);
+  }
+
+  /**
+   * Returns the last URL visited with visitURL() (e.g. for "Manage in Drive").
+   * Used by the integration tests.
+   */
+  getLastVisitedUrl(): string {
+    return getLastVisitedURL();
+  }
+
+  /**
+   * Returns a string translation from its translation ID.
+   * @param id The id of the translated string.
+   */
+  getTranslatedString(id: string): string {
+    return str(id);
+  }
+
+  /**
+   * One time initialization for app state controller to load view option from
+   * local storage.
+   */
+  private async startInitSettings_(): Promise<void> {
+    startInterval('Load.InitSettings');
+    this.appStateController_ = new AppStateController(this.dialogType);
+    await this.appStateController_.loadInitialViewOptions();
+    recordInterval('Load.InitSettings');
+  }
+
+  /**
+   * Updates guestMode_ field based on what the result of the isInGuestMode
+   * helper function. It errs on the side of not-in-guestmode, if the util
+   * function fails. The worse this causes are extra notifications.
+   */
+  private async setGuestMode_() {
+    try {
+      const guest = await isInGuestMode();
+      if (guest !== null) {
+        this.guestMode_ = guest;
+      }
+    } catch (error) {
+      console.warn(error);
+      // Leave this.guestMode_ as its initial value.
+    }
+  }
+
+  /**
+   * One time initialization for the file system and related things.
+   */
+  private async initFileSystemUi_(): Promise<void> {
+    this.ui.listContainer.startBatchUpdates();
+
+    const fileListPromise = this.initFileList_();
+    const currentDirectoryPromise = this.setupCurrentDirectory_();
+
+    let listBeingUpdated: List|null = null;
+    this.directoryModel.addEventListener('begin-update-files', () => {
+      this.ui.listContainer.currentList.startBatchUpdates();
+      // Remember the list which was used when updating files started, so
+      // endBatchUpdates() is called on the same list.
+      listBeingUpdated = this.ui.listContainer.currentList;
+    });
+    this.directoryModel.addEventListener('end-update-files', () => {
+      this.namingController.restoreItemBeingRenamed();
+      listBeingUpdated?.endBatchUpdates();
+      listBeingUpdated = null;
+    });
+    this.volumeManager.addEventListener(ARCHIVE_OPENED_EVENT_TYPE, event => {
+      assert(event.detail.mountPoint);
+      if (window.isFocused?.()) {
+        this.directoryModel.changeDirectoryEntry(event.detail.mountPoint);
+      }
+    });
+
+    this.directoryModel.addEventListener('directory-changed', event => {
+      this.navigationUma_!.onDirectoryChanged(
+          event.detail.newDirEntry as Entry);
+    });
+
+    this.initCommands_();
+
+    assert(this.directoryModel_);
+    assert(this.spinnerController_);
+    assert(this.commandHandler_);
+    assert(this.selectionHandler_);
+    assert(this.launchParams_);
+    assert(this.volumeManager_);
+    assert(this.dialogDom_);
+    assert(this.fileBrowserBackground_);
+    assert(this.metadataModel_);
+    assert(this.providersModel_);
+    assert(this.folderShortcutsModel_);
+    assert(this.ui_);
+    assert(this.taskController_);
+
+    this.fileBrowserBackground_.driveSyncHandler.metadataModel =
+        this.metadataModel_;
+    this.scanController_ = new ScanController(
+        this.directoryModel_, this.ui.listContainer, this.spinnerController_,
+        this.selectionHandler_);
+    this.sortMenuController_ = new SortMenuController(
+        this.ui.sortButton, this.directoryModel_.getFileList());
+    this.gearMenuController_ = new GearMenuController(
+        this.ui.gearButton, this.ui.gearMenu, this.ui.providersMenu,
+        this.directoryModel_, this.providersModel_);
+    this.selectionMenuController_ = new SelectionMenuController(
+        this.ui.selectionMenuButton,
+        queryDecoratedElement('#file-context-menu', Menu));
+    this.toolbarController_ = new ToolbarController(
+        this.ui.toolbar, this.ui.dialogNavigationList, this.ui.listContainer,
+        this.selectionHandler_, this.directoryModel_, this.volumeManager_,
+        this.ui_);
+    this.actionsController_ = new ActionsController(
+        this.volumeManager_, this.metadataModel_, this.folderShortcutsModel_,
+        this.selectionHandler_, this.ui_);
+    this.lastModifiedController_ = new LastModifiedController(
+        this.ui_.listContainer.table, this.directoryModel_);
+
+    this.quickViewModel_ = new QuickViewModel();
+    const fileListSelectionModel = this.directoryModel_.getFileListSelection();
+    this.quickViewUma_ = new QuickViewUma(this.volumeManager_, this.dialogType);
+    const metadataBoxController = new MetadataBoxController(
+        this.metadataModel_, this.quickViewModel_, this.fileMetadataFormatter_,
+        this.volumeManager_);
+    this.quickViewController_ = new QuickViewController(
+        this, this.metadataModel_, this.selectionHandler_,
+        this.ui_.listContainer, this.ui_.selectionMenuButton,
+        this.quickViewModel_, this.taskController_, fileListSelectionModel,
+        this.quickViewUma_, metadataBoxController, this.dialogType,
+        this.volumeManager_, this.dialogDom_);
+
+    assert(this.fileFilter_);
+    assert(this.namingController_);
+    assert(this.appStateController_);
+    assert(this.taskController_);
+    this.mainWindowComponent_ = new MainWindowComponent(
+        this.dialogType, this.ui_, this.volumeManager_, this.directoryModel_,
+        this.selectionHandler_, this.namingController_,
+        this.appStateController_, this.taskController_);
+
+    this.initDataTransferOperations_();
+    fileListPromise.then(() => {
+      this.taskController_!.setFileTransferController(
+          this.fileTransferController_!);
+    });
+
+    this.selectionHandler_.onFileSelectionChanged();
+    this.ui_.listContainer.endBatchUpdates();
+
+    const bannerController = new BannerController(
+        this.directoryModel_, this.volumeManager_, this.crostini,
+        this.dialogType);
+    this.ui_.initBanners(bannerController);
+    bannerController.initialize();
+
+    this.ui_.attachFilesTooltip();
+    this.ui_.decorateFilesMenuItems();
+    this.ui_.selectionMenuButton.hidden = false;
+
+    await Promise.all([
+      fileListPromise,
+      currentDirectoryPromise,
+      this.setGuestMode_(),
+    ]);
+  }
+
+  /**
+   * Subscribes to bulk-pinning events to ensure the store is kept up to date.
+   * Also tries to retrieve a first bulk pinning progress to populate the store.
+   */
+  private async initBulkPinning_() {
+    try {
+      const promise = getBulkPinProgress();
+
+      if (!this.bulkPinningInitialized_) {
+        chrome.fileManagerPrivate.onBulkPinProgress.addListener(
+            (progress: chrome.fileManagerPrivate.BulkPinProgress) => {
+              console.debug('Got bulk-pinning event:', progress);
+              this.store_.dispatch(updateBulkPinProgress(progress));
+            });
+
+        this.bulkPinningInitialized_ = true;
+      }
+
+      const progress = await promise;
+      if (progress) {
+        console.debug('Got initial bulk-pinning state:', progress);
+        this.store_.dispatch(updateBulkPinProgress(progress));
+      }
+    } catch (e) {
+      console.warn('Cannot get initial bulk-pinning state:', e);
+    }
+  }
+
+  private initDataTransferOperations_() {
+    // CopyManager are required for 'Delete' operation in
+    // Open and Save dialogs. But drag-n-drop and copy-paste are not needed.
+    if (this.dialogType !== DialogType.FULL_PAGE) {
+      return;
+    }
+
+    this.fileTransferController_ = new FileTransferController(
+        this.document, this.ui.listContainer,
+        this.ui.directoryTree as DirectoryTree,
+        this.ui.showConfirmationDialog.bind(this.ui), this.progressCenter,
+        this.metadataModel, this.directoryModel, this.volumeManager,
+        this.selectionHandler, this.ui.toast);
+  }
+
+  /**
+   * One-time initialization of commands.
+   */
+  private initCommands_() {
+    assert(this.ui_);
+    assert(this.ui_.textContextMenu);
+    assert(this.dialogDom_);
+    assert(this.directoryTreeNamingController_);
+
+    this.commandHandler_ = new CommandHandler(this);
+
+    // TODO(hirono): Move the following block to the UI part.
+    // Hook up the cr-button commands.
+    for (const crButton of this.dialogDom_.querySelectorAll<CrButtonElement>(
+             'cr-button[command]')) {
+      crInjectTypeAndInit(crButton, CommandButton);
+    }
+
+    for (const input of this.getDomInputs_()) {
+      this.setContextMenuForInput_(input);
+    }
+
+    this.setContextMenuForInput_(this.ui_.listContainer.renameInput);
+    this.setContextMenuForInput_(
+        this.directoryTreeNamingController_.getInputElement());
+  }
+
+  /**
+   * Get input elements from root DOM element of this app.
+   */
+  private getDomInputs_() {
+    return this.dialogDom_!.querySelectorAll<HTMLInputElement>(
+        'input[type=text], input[type=search], textarea, cr-input');
+  }
+
+  /**
+   * Set context menu and handlers for an input element.
+   */
+  private setContextMenuForInput_(input: HTMLInputElement) {
+    let touchInduced = false;
+
+    // stop contextmenu propagation for touch-induced events.
+    input.addEventListener('touchstart', (_e) => {
+      touchInduced = true;
+    });
+    input.addEventListener('contextmenu', (e) => {
+      if (touchInduced) {
+        e.stopImmediatePropagation();
+      }
+      touchInduced = false;
+    });
+    input.addEventListener('click', (_e) => {
+      touchInduced = false;
+    });
+
+    contextMenuHandler.setContextMenu(input, this.ui.textContextMenu);
+    this.registerInputCommands_(input);
+  }
+
+  /**
+   * Registers cut, copy, paste and delete commands on input element.
+   *
+   * @param node Text input element to register on.
+   */
+  private registerInputCommands_(node: HTMLElement) {
+    forceDefaultHandler(node, 'cut');
+    forceDefaultHandler(node, 'copy');
+    forceDefaultHandler(node, 'paste');
+    forceDefaultHandler(node, 'delete');
+    node.addEventListener('keydown', (e: KeyboardEvent) => {
+      const key = getKeyModifiers(e) + e.keyCode;
+      if (key === '190' /* '/' */ || key === '191' /* '.' */) {
+        // If this key event is propagated, this is handled search command,
+        // which calls 'preventDefault' method.
+        e.stopPropagation();
+      }
+    });
+  }
+
+  /**
+   * Entry point of the initialization.
+   * This method is called from main.js.
+   */
+  initializeCore() {
+    this.initGeneral_();
+    this.initSettingsPromise_ = this.startInitSettings_();
+    this.initBackgroundPagePromise_ =
+        this.startInitBackgroundPage_().then(() => this.initVolumeManager_());
+
+    window.addEventListener('pagehide', this.onUnload_.bind(this));
+  }
+
+  async initializeUi(dialogDom: HTMLElement): Promise<void> {
+    console.warn(`Files app starting up: ${this.dialogType}`);
+    this.dialogDom_ = dialogDom;
+    this.document_ = this.dialogDom_.ownerDocument;
+
+    startInterval('Load.InitDocuments');
+    // importElements depend on loadTimeData which is initialized in the
+    // initBackgroundPagePromise_.
+    await this.initBackgroundPagePromise_;
+    await importElements();
+    recordInterval('Load.InitDocuments');
+
+    startInterval('Load.InitUI');
+    this.document_.documentElement.classList.add('files-ng');
+    this.dialogDom_.classList.add('files-ng');
+
+    chrome.fileManagerPrivate.isTabletModeEnabled(
+        this.onTabletModeChanged_.bind(this));
+    chrome.fileManagerPrivate.onTabletModeChanged.addListener(
+        this.onTabletModeChanged_.bind(this));
+
+    this.initEssentialUi_();
+    this.initAdditionalUi_();
+    await this.initSettingsPromise_;
+    const fileSystemUIPromise = this.initFileSystemUi_();
+    // Initialize the Store for the whole app.
+    const store = getStore();
+    store.init(getEmptyState());
+    this.initUiFocus_();
+    recordInterval('Load.InitUI');
+
+    chrome.fileManagerPrivate.onDeviceConnectionStatusChanged.addListener(
+        this.updateDeviceConnectionState_.bind(this));
+    chrome.fileManagerPrivate.getDeviceConnectionState(
+        this.updateDeviceConnectionState_.bind(this));
+
+    return fileSystemUIPromise;
+  }
+
+  /**
+   * Initializes general purpose basic things, which are used by other
+   * initializing methods.
+   */
+  private initGeneral_() {
+    // Initialize the application state.
+    // TODO(mtomasz): Unify window.appState with location.search format.
+    if (window.appState) {
+      const params: Record<string, any> = {};
+
+      for (const [name, value] of Object.entries(window.appState)) {
+        params[name] = value;
+      }
+
+      this.launchParams_ = new LaunchParam(params);
+    } else {
+      // Used by the select dialog and SWA.
+      let json = {};
+      if (location.search) {
+        const query = location.search.substr(1);
+        try {
+          json = JSON.parse(decodeURIComponent(query));
+        } catch (e) {
+          console.debug(`Error parsing location.search "${query}" due to ${e}`);
+        }
+      }
+      this.launchParams_ = new LaunchParam(json);
+    }
+    this.store_.dispatch(
+        setLaunchParameters({dialogType: this.launchParams_.type}));
+
+    // Initialize the member variables that depend this.launchParams_.
+    this.dialogType = this.launchParams_.type;
+  }
+
+  /**
+   * Initializes the background page.
+   */
+  private async startInitBackgroundPage_(): Promise<void> {
+    startInterval('Load.InitBackgroundPage');
+
+    this.fileBrowserBackground_ = window.background;
+
+    await this.fileBrowserBackground_.ready();
+
+    // For the SWA, we load background and foreground in the same Window, avoid
+    // loading the `data` twice.
+    if (!loadTimeData.isInitialized()) {
+      loadTimeData.data = this.fileBrowserBackground_.stringData;
+    }
+    if (runningInBrowser()) {
+      this.fileBrowserBackground_.registerDialog(window);
+    }
+    this.crostini_ = this.fileBrowserBackground_.crostini;
+
+    recordInterval('Load.InitBackgroundPage');
+  }
+
+  /**
+   * Initializes the VolumeManager instance.
+   */
+  private async initVolumeManager_() {
+    const allowedPaths = this.getAllowedPaths_();
+    assert(this.launchParams_);
+    assert(this.fileBrowserBackground_);
+    const writableOnly =
+        this.launchParams_.type === DialogType.SELECT_SAVEAS_FILE;
+    const disabledVolumes = await this.getDisabledVolumes_();
+
+    // FilteredVolumeManager hides virtual file system related event and data
+    // even depends on the value of |supportVirtualPath|. If it is
+    // VirtualPathSupport.NO_VIRTUAL_PATH, it hides Drive even if Drive is
+    // enabled on preference.
+    // In other words, even if Drive is disabled on preference but the Files app
+    // should show Drive when it is re-enabled, then the value should be set to
+    // true.
+    // Note that the Drive enabling preference change is listened by
+    // DriveIntegrationService, so here we don't need to take care about it.
+    this.volumeManager_ = new FilteredVolumeManager(
+        allowedPaths, writableOnly,
+        this.fileBrowserBackground_.getVolumeManager(),
+        this.launchParams_.volumeFilter, disabledVolumes);
+
+    await this.fileBrowserBackground_.getVolumeManager();
+  }
+
+  /**
+   * One time initialization of the essential UI elements in the Files app.
+   * These elements will be shown to the user. Only visible elements should be
+   * initialized here. Any heavy operation should be avoided. The Files app's
+   * window is shown at the end of this routine.
+   */
+  private initEssentialUi_() {
+    // Record stats of dialog types. New values must NOT be inserted into the
+    // array enumerating the types. It must be in sync with
+    // FileDialogType enum in tools/metrics/histograms/histogram.xml.
+    const metricName = 'SWA.Create';
+    recordEnum(metricName, this.dialogType, [
+      DialogType.SELECT_FOLDER,
+      DialogType.SELECT_UPLOAD_FOLDER,
+      DialogType.SELECT_SAVEAS_FILE,
+      DialogType.SELECT_OPEN_FILE,
+      DialogType.SELECT_OPEN_MULTI_FILE,
+      DialogType.FULL_PAGE,
+    ]);
+
+    // Create the metadata cache.
+    assert(this.volumeManager_);
+    this.metadataModel_ = MetadataModel.create(this.volumeManager_);
+    this.thumbnailModel_ = new ThumbnailModel(this.metadataModel_);
+    this.providersModel_ = new ProvidersModel(this.volumeManager_);
+    this.fileFilter_ = new FileFilter(this.volumeManager_);
+
+    // Set the files-ng class for dialog header styling.
+    const dialogHeader = queryRequiredElement('.dialog-header');
+    dialogHeader.classList.add('files-ng');
+
+    // Create the root view of FileManager.
+    assert(this.dialogDom_);
+    assert(this.launchParams_);
+    assert(this.providersModel_);
+    this.ui_ = new FileManagerUI(
+        this.providersModel_, this.dialogDom_, this.launchParams_);
+  }
+
+  /**
+   * One-time initialization of various DOM nodes. Loads the additional DOM
+   * elements visible to the user. Initialize here elements, which are expensive
+   * or hidden in the beginning.
+   */
+  private initAdditionalUi_() {
+    assert(this.metadataModel_);
+    assert(this.volumeManager_);
+    assert(this.dialogDom_);
+    assert(this.ui_);
+
+    // Cache nodes we'll be manipulating.
+    const dom = this.dialogDom_;
+    assert(dom);
+
+    const table = queryRequiredElement('.detail-table', dom);
+    FileTable.decorate(
+        table, this.metadataModel_, this.volumeManager_, this.ui,
+        this.dialogType == DialogType.FULL_PAGE);
+    const grid = queryRequiredElement('.thumbnail-grid', dom);
+    FileGrid.decorate(grid, this.metadataModel_, this.volumeManager_, this.ui);
+
+    assertInstanceof(table, FileTable);
+    assertInstanceof(grid, FileGrid);
+    this.ui_.initAdditionalUI(table, grid, this.volumeManager_);
+
+    // Handle UI events.
+    this.progressCenter.addPanel(this.ui_.progressCenterPanel);
+
+    // Arrange the file list.
+    this.ui_.listContainer.table.normalizeColumns();
+    this.ui_.listContainer.table.redraw();
+  }
+
+  /**
+   * One-time initialization of focus. This should run at the last of UI
+   * initialization.
+   */
+  private initUiFocus_() {
+    this.ui_?.initUIFocus();
+  }
+
+  /**
+   * Constructs table and grid (heavy operation).
+   */
+  private async initFileList_(): Promise<void> {
+    const singleSelection = this.dialogType == DialogType.SELECT_OPEN_FILE ||
+        this.dialogType == DialogType.SELECT_FOLDER ||
+        this.dialogType == DialogType.SELECT_UPLOAD_FOLDER ||
+        this.dialogType == DialogType.SELECT_SAVEAS_FILE;
+
+    assert(this.volumeManager_);
+    assert(this.metadataModel_);
+    assert(this.fileFilter_);
+    assert(this.launchParams_);
+    assert(this.ui_);
+    assert(this.thumbnailModel_);
+    assert(this.appStateController_);
+    assert(this.crostini_);
+    assert(this.providersModel_);
+
+    this.directoryModel_ = new DirectoryModel(
+        singleSelection, this.fileFilter_, this.metadataModel_,
+        this.volumeManager_);
+    assert(this.directoryModel_);
+
+    this.folderShortcutsModel_ =
+        new FolderShortcutsDataModel(this.volumeManager_);
+
+    this.androidAppListModel_ = new AndroidAppListModel(
+        this.launchParams_.showAndroidPickerApps,
+        this.launchParams_.includeAllFiles, this.launchParams_.typeList);
+
+    this.recentEntry_ = new FakeEntryImpl(
+        str('RECENT_ROOT_LABEL'), RootType.RECENT, this.getSourceRestriction_(),
+        chrome.fileManagerPrivate.FileCategory.ALL);
+    this.store_.dispatch(addUiEntry({entry: this.recentEntry_}));
+    assert(this.launchParams_);
+    this.selectionHandler_ = new FileSelectionHandler(
+        this.directoryModel_, this.ui_.listContainer, this.metadataModel_,
+        this.volumeManager_, this.launchParams_.allowedPaths);
+
+    // TODO(mtomasz, yoshiki): Create navigation list earlier, and here just
+    // attach the directory model.
+    const directoryTreePromise = this.initDirectoryTree_();
+
+    this.ui_.listContainer.listThumbnailLoader = new ListThumbnailLoader(
+        this.directoryModel_, this.thumbnailModel_, this.volumeManager_);
+    this.ui_.listContainer.dataModel = this.directoryModel_.getFileList();
+    this.ui_.listContainer.emptyDataModel =
+        this.directoryModel_.getEmptyFileList();
+    this.ui_.listContainer.selectionModel =
+        this.directoryModel_.getFileListSelection();
+
+    this.appStateController_.initialize(this.ui_, this.directoryModel_);
+
+    // Create metadata update controller.
+    this.metadataUpdateController_ = new MetadataUpdateController(
+        this.ui_.listContainer, this.directoryModel_, this.metadataModel_,
+        this.fileMetadataFormatter_);
+
+    // Create naming controller.
+    this.namingController_ = new NamingController(
+        this.ui_.listContainer, this.ui_.alertDialog, this.ui_.confirmDialog,
+        this.directoryModel_, this.fileFilter_, this.selectionHandler_);
+
+    // Create task controller.
+    this.taskController_ = new TaskController(
+        this.volumeManager_, this.ui_, this.metadataModel_,
+        this.directoryModel_, this.selectionHandler_,
+        this.metadataUpdateController_, this.crostini_, this.progressCenter);
+
+    // Create directory tree naming controller.
+    this.directoryTreeNamingController_ = new DirectoryTreeNamingController(
+        this.directoryModel_, this.ui_.directoryTree as DirectoryTree,
+        this.ui_.directoryTreeContainer, this.ui_.alertDialog);
+
+    // Create spinner controller.
+    this.spinnerController_ =
+        new SpinnerController(this.ui_.listContainer.spinner);
+    this.spinnerController_.blink();
+
+    // Create dialog action controller.
+    this.dialogActionController_ = new DialogActionController(
+        this.dialogType, this.ui_.dialogFooter, this.directoryModel_,
+        this.volumeManager_, this.fileFilter_, this.namingController_,
+        this.selectionHandler_, this.launchParams_);
+
+    // Create file-type filter controller.
+    this.fileTypeFiltersController_ = new FileTypeFiltersController(
+        this.ui_.fileTypeFilterContainer, this.directoryModel_,
+        this.recentEntry_, this.ui);
+    this.emptyFolderController_ = new EmptyFolderController(
+        this.ui_.emptyFolder, this.directoryModel_, this.providersModel_,
+        this.recentEntry_);
+
+
+    return directoryTreePromise;
+  }
+
+  /**
+   * Based on the dialog type and dialog caller, sets the list of volumes
+   * that should be disabled according to Data Leak Prevention rules.
+   */
+  private async getDisabledVolumes_(): Promise<VolumeType[]> {
+    if (this.dialogType !== DialogType.SELECT_SAVEAS_FILE || !isDlpEnabled()) {
+      return [];
+    }
+    const caller = await getDialogCaller();
+    if (!caller.url) {
+      return [];
+    }
+    const dlpBlockedComponents = await getDlpBlockedComponents(caller.url);
+    const disabledVolumes = [];
+    for (const c of dlpBlockedComponents) {
+      disabledVolumes.push(c);
+    }
+    return disabledVolumes as VolumeType[];
+  }
+
+  private async initDirectoryTree_(): Promise<void> {
+    this.navigationUma_ = new NavigationUma(this.volumeManager);
+
+    assert(this.dialogDom_);
+    assert(this.directoryModel_);
+    assert(this.ui_);
+    assert(this.volumeManager_);
+    assert(this.directoryModel_);
+    assert(this.metadataModel_);
+    assert(this.folderShortcutsModel_);
+    assert(this.launchParams_);
+    assert(this.recentEntry_);
+    assert(this.androidAppListModel_);
+    assert(this.crostini_);
+
+    const directoryTree =
+        this.dialogDom_.querySelector<DirectoryTree>('#directory-tree');
+    assert(directoryTree);
+
+    if (isNewDirectoryTreeEnabled()) {
+      const treeContainer = directoryTree.parentElement!;
+      directoryTree.remove();
+      const directoryTreeContainer = new DirectoryTreeContainer(
+          treeContainer, this.directoryModel_, this.volumeManager_);
+      this.ui_.initDirectoryTree(directoryTreeContainer);
+    } else {
+      const fakeEntriesVisible =
+          this.dialogType !== DialogType.SELECT_SAVEAS_FILE;
+
+      DirectoryTree.decorate(
+          directoryTree, this.directoryModel_, this.volumeManager_,
+          this.metadataModel_, fakeEntriesVisible);
+
+      directoryTree.dataModel = new NavigationListModel(
+          this.volumeManager_, this.folderShortcutsModel_,
+          fakeEntriesVisible && !isFolderDialogType(this.launchParams_.type) ?
+              new NavigationModelFakeItem(
+                  str('RECENT_ROOT_LABEL'), NavigationModelItemType.RECENT,
+                  this.recentEntry_) :
+              null,
+          this.directoryModel_, this.androidAppListModel_, this.dialogType);
+      this.ui_.initDirectoryTree(directoryTree);
+    }
+
+    // If 'media-store-files-only' volume filter is enabled, then Android ARC
+    // SelectFile opened files app to pick files from volumes that are indexed
+    // by the Android MediaStore. Never add Drive, Crostini, GuestOS, to the
+    // directory tree in that case: their volume content is not indexed by the
+    // Android MediaStore, and being indexed there is needed for this Android
+    // ARC SelectFile MediaStore filter mode to work: crbug.com/1333385
+    if (this.volumeManager_.getMediaStoreFilesOnlyFilterEnabled()) {
+      return;
+    }
+
+    // Drive add/removes itself from directory tree in onPreferencesChanged_.
+    // Setup a prefs change listener then call onPreferencesChanged_() to add
+    // Drive to the directory tree if Drive is enabled by prefs.
+    chrome.fileManagerPrivate.onPreferencesChanged.addListener(() => {
+      this.onPreferencesChanged_();
+    });
+    this.onPreferencesChanged_();
+
+    chrome.fileManagerPrivate.onDriveConnectionStatusChanged.addListener(() => {
+      this.onDriveConnectionStatusChanged_();
+    });
+    this.onDriveConnectionStatusChanged_();
+
+    // The fmp.onCrostiniChanged receives enabled/disabled events via a pref
+    // watcher and share/unshare events.  The enabled/disabled prefs are
+    // handled in fmp.onCrostiniChanged rather than fmp.onPreferencesChanged
+    // to keep crostini logic colocated, and to have an API that best supports
+    // multiple VMs.
+    chrome.fileManagerPrivate.onCrostiniChanged.addListener(
+        this.onCrostiniChanged_.bind(this));
+    this.crostiniController_ = new CrostiniController(
+        this.crostini_,
+        // TODO(b/285977941): `DirectoryTree` is only used when FileExperimental
+        // flag is off, remove it after the tree replacement.
+        this.ui_.directoryTree as DirectoryTree,
+        this.volumeManager_.isDisabled(VolumeType.CROSTINI));
+    await this.crostiniController_.redraw();
+    // Never show toast in an open-file dialog.
+    const maybeShowToast = this.dialogType === DialogType.FULL_PAGE;
+    await this.crostiniController_.loadSharedPaths(
+        maybeShowToast, this.ui_.toast);
+
+    if (isGuestOsEnabled()) {
+      this.guestOsController_ = new GuestOsController(
+          // TODO(b/285977941): `DirectoryTree` is only used when
+          // FileExperimental flag is off, remove it after the tree replacement.
+          this.ui_.directoryTree as DirectoryTree, this.volumeManager_);
+      await this.guestOsController_.refresh();
+    }
+  }
+
+  /**
+   * Listens for the enable and disable events in order to add or remove the
+   * directory tree 'Linux files' root item.
+   *
+   */
+  private async onCrostiniChanged_(
+      event: chrome.fileManagerPrivate.CrostiniEvent): Promise<void> {
+    assert(this.crostini_);
+    assert(this.crostiniController_);
+    assert(this.ui_);
+    assert(this.volumeManager_);
+    assert(this.metadataModel_);
+    assert(this.directoryModel_);
+    // The background |this.crostini_| object also listens to all crostini
+    // events including enable/disable, and share/unshare.
+    // But to ensure we don't have any race conditions between bg and fg, we
+    // set enabled status on it before calling |setupCrostini_| which reads
+    // enabled status from it to determine whether 'Linux files' is shown.
+    switch (event.eventType) {
+      case chrome.fileManagerPrivate.CrostiniEventType.ENABLE:
+        this.crostini_.setEnabled(event.vmName, event.containerName, true);
+        return this.crostiniController_.redraw();
+
+      case chrome.fileManagerPrivate.CrostiniEventType.DISABLE:
+        this.crostini_.setEnabled(event.vmName, event.containerName, false);
+        return this.crostiniController_.redraw();
+
+      // Event is sent when a user drops an unshared file on Plugin VM.
+      // We show the move dialog so the user can move the file or share the
+      // directory.
+      case chrome.fileManagerPrivate.CrostiniEventType
+          .DROP_FAILED_PLUGIN_VM_DIRECTORY_NOT_SHARED:
+        if (this.ui_.dragInProcess) {
+          const moveMessage =
+              str('UNABLE_TO_DROP_IN_PLUGIN_VM_DIRECTORY_NOT_SHARED_MESSAGE');
+          const copyMessage =
+              str('UNABLE_TO_DROP_IN_PLUGIN_VM_EXTERNAL_DRIVE_MESSAGE');
+          FileTasks.showPluginVmNotSharedDialog(
+              this.selectionHandler.selection.entries, this.volumeManager_,
+              this.metadataModel_, this.ui_, moveMessage, copyMessage,
+              this.fileTransferController_, this.directoryModel_);
+        }
+        break;
+    }
+  }
+
+  /**
+   * Sets up the current directory during initialization.
+   */
+  private async setupCurrentDirectory_(): Promise<void> {
+    assert(this.launchParams_);
+    assert(this.recentEntry_);
+    assert(this.ui_);
+    assert(this.volumeManager_);
+    assert(this.metadataModel_);
+    assert(this.directoryModel_);
+    const tracker = this.directoryModel_.createDirectoryChangeTracker();
+    tracker.start();
+
+    // Wait until the volume manager is initialized.
+    await new Promise<void>(
+        resolve => this.volumeManager.ensureInitialized(resolve));
+
+    let nextCurrentDirEntry: Entry|FilesAppEntry|null = null;
+    let selectionEntry: Entry|null = null;
+
+    // Resolve the selectionURL to selectionEntry or to currentDirectoryEntry in
+    // case of being a display root or a default directory to open files.
+    if (this.launchParams_.selectionURL) {
+      if (this.launchParams_.selectionURL == this.recentEntry_.toURL()) {
+        nextCurrentDirEntry = this.recentEntry_;
+      } else {
+        try {
+          const inEntry = await new Promise<Entry>((resolve, reject) => {
+            window.webkitResolveLocalFileSystemURL(
+                this.launchParams_!.selectionURL, resolve, reject);
+          });
+          const locationInfo = this.volumeManager_.getLocationInfo(inEntry);
+          // If location information is not available, then the volume is no
+          // longer (or never) available.
+          if (locationInfo) {
+            // If the selection is root, use it as a current directory instead.
+            // This is because selecting a root is the same as opening it.
+            if (locationInfo.isRootEntry) {
+              nextCurrentDirEntry = inEntry;
+            }
+
+            // If the |selectionURL| is a directory make it the current
+            // directory.
+            if (inEntry.isDirectory) {
+              nextCurrentDirEntry = inEntry;
+            }
+
+            // By default, the selection should be selected entry and the parent
+            // directory of it should be the current directory.
+            if (!nextCurrentDirEntry) {
+              selectionEntry = inEntry;
+            }
+          }
+        } catch (error: any) {
+          // If `selectionURL` doesn't exist we just don't select it, thus we
+          // don't need to log the failure.
+          if (error.name !== 'NotFoundError') {
+            console.warn(error.stack || error);
+          }
+        }
+      }
+    }
+
+    // If searchQuery param is set, find the first directory that matches the
+    // query, and select it if exists.
+    const searchQuery = this.launchParams_.searchQuery;
+    if (searchQuery) {
+      startInterval('Load.ProcessInitialSearchQuery');
+      if (!isNewDirectoryTreeEnabled()) {
+        this.store_.dispatch(updateSearch({
+          query: searchQuery,
+          status: PropStatus.STARTED,
+          options: getDefaultSearchOptions(),
+        }));
+      }
+      assert(this.spinnerController_);
+      // Show a spinner, as the crossover search function call could be slow.
+      const hideSpinnerCallback = this.spinnerController_.show();
+      const queryMatchedDirEntry = await findQueryMatchedDirectoryEntry(
+          this.volumeManager_, this.directoryModel_, searchQuery);
+      if (queryMatchedDirEntry) {
+        nextCurrentDirEntry = queryMatchedDirEntry;
+      }
+      hideSpinnerCallback();
+      recordInterval('Load.ProcessInitialSearchQuery');
+    }
+
+    // Resolve the currentDirectoryURL to currentDirectoryEntry (if not done by
+    // the previous step).
+    if (!nextCurrentDirEntry && this.launchParams_.currentDirectoryURL) {
+      try {
+        const inEntry = await new Promise<Entry>((resolve, reject) => {
+          window.webkitResolveLocalFileSystemURL(
+              this.launchParams_!.currentDirectoryURL, resolve, reject);
+        });
+        const locationInfo = this.volumeManager_.getLocationInfo(inEntry);
+        if (locationInfo) {
+          nextCurrentDirEntry = inEntry;
+        }
+      } catch (error: any) {
+        console.warn(error.stack || error);
+      }
+    }
+
+    // If the directory to be changed to is not available, then first fallback
+    // to the parent of the selection entry.
+    if (!nextCurrentDirEntry && selectionEntry) {
+      nextCurrentDirEntry = await new Promise(resolve => {
+        selectionEntry!.getParent(resolve);
+      });
+    }
+
+    // Check if the next current directory is not a virtual directory which is
+    // not available in UI. This may happen to shared on Drive.
+    if (nextCurrentDirEntry) {
+      const locationInfo =
+          this.volumeManager_.getLocationInfo(nextCurrentDirEntry);
+      // If we can't check, assume that the directory is illegal.
+      if (!locationInfo) {
+        nextCurrentDirEntry = null;
+      } else {
+        // Having root directory of DRIVE_SHARED_WITH_ME here should be only for
+        // shared with me files. Fallback to Drive root in such case.
+        if (locationInfo.isRootEntry &&
+            locationInfo.rootType === RootType.DRIVE_SHARED_WITH_ME) {
+          const volumeInfo =
+              this.volumeManager_.getVolumeInfo(nextCurrentDirEntry);
+          if (!volumeInfo) {
+            nextCurrentDirEntry = null;
+          } else {
+            try {
+              nextCurrentDirEntry = await volumeInfo.resolveDisplayRoot();
+            } catch (error: any) {
+              console.warn(error.stack || error);
+              nextCurrentDirEntry = null;
+            }
+          }
+        }
+      }
+    }
+
+    // If the resolved directory to be changed is blocked by DLP, we should
+    // fallback to the default display root.
+    if (nextCurrentDirEntry && isDlpEnabled()) {
+      const volumeInfo = this.volumeManager_.getVolumeInfo(nextCurrentDirEntry);
+      if (volumeInfo && this.volumeManager_.isDisabled(volumeInfo.volumeType)) {
+        console.warn('Target directory is DLP blocked, redirecting to MyFiles');
+        nextCurrentDirEntry = null;
+      }
+    }
+
+    // If the directory to be changed to is still not resolved, then fallback to
+    // the default display root.
+    if (!nextCurrentDirEntry) {
+      nextCurrentDirEntry = await new Promise(resolve => {
+        this.volumeManager_!.getDefaultDisplayRoot(resolve);
+      });
+    }
+
+    // If selection failed to be resolved (eg. didn't exist, in case of saving a
+    // file, or in case of a fallback of the current directory, then try to
+    // resolve again using the target name.
+    if (!selectionEntry && nextCurrentDirEntry &&
+        this.launchParams_.targetName) {
+      // Try to resolve as a file first. If it fails, then as a directory.
+      try {
+        selectionEntry = await new Promise((resolve, reject) => {
+          (nextCurrentDirEntry as DirectoryEntry)
+              .getFile(this.launchParams_!.targetName, {}, resolve, reject);
+        });
+      } catch (error1: any) {
+        // Failed to resolve as a file. Try to resolve as a directory.
+        try {
+          selectionEntry = await new Promise((resolve, reject) => {
+            (nextCurrentDirEntry as DirectoryEntry)
+                .getDirectory(
+                    this.launchParams_!.targetName, {}, resolve, reject);
+          });
+        } catch (error2: any) {
+          // If `targetName` doesn't exist we just don't select it, thus we
+          // don't need to log the failure.
+          if (error1.name !== 'NotFoundError') {
+            console.warn(error1.stack || error1);
+            console.log(error1);
+          }
+          if (error2.name !== 'NotFoundError') {
+            console.warn(error2.stack || error2);
+          }
+        }
+      }
+    }
+
+    // If there is no target select MyFiles by default.
+    if (!nextCurrentDirEntry) {
+      assert(this.ui.directoryTree);
+      if (isXfTree(this.ui.directoryTree)) {
+        const myFiles = getMyFiles(this.store_.getState());
+        // When MyFiles volume is mounted, we rely on the current directory
+        // change to make it as selected (controlled by DirectoryModel),
+        // that's why we can't set MyFiles entry list as the current directory
+        // here.
+        // TODO(b/308504417): MyFiles entry list should be selected before
+        // MyFiles volume mounts.
+        if (myFiles.myFilesVolume) {
+          nextCurrentDirEntry = myFiles.myFilesEntry;
+        }
+      } else if (this.ui.directoryTree?.dataModel.myFilesModel) {
+        nextCurrentDirEntry =
+            this.ui.directoryTree.dataModel.myFilesModel.entry;
+      }
+    }
+
+    // Check directory change.
+    tracker.stop();
+    if (!tracker.hasChanged) {
+      // Finish setup current directory.
+      await this.finishSetupCurrentDirectory_(
+          (nextCurrentDirEntry as DirectoryEntry), selectionEntry,
+          this.launchParams_.targetName);
+    }
+  }
+
+  /**
+   * @param directoryEntry Directory to be opened.
+   * @param selectionEntry Entry to be selected.
+   * @param suggestedName Suggested name for a non-existing selection.
+   */
+  private async finishSetupCurrentDirectory_(
+      directoryEntry: null|DirectoryEntry, selectionEntry?: Entry|null,
+      suggestedName?: string): Promise<void> {
+    // Open the directory, and select the selection (if passed).
+    const promise = (async () => {
+      console.warn('Files app has started');
+      if (directoryEntry) {
+        await new Promise(resolve => {
+          this.directoryModel.changeDirectoryEntry(directoryEntry, resolve);
+        });
+        if (selectionEntry) {
+          this.directoryModel.selectEntry(selectionEntry);
+        }
+        if (this.launchParams_?.searchQuery) {
+          const searchState = this.store_.getState().search;
+          this.store_.dispatch(updateSearch({
+            query: this.launchParams_.searchQuery,
+            status: undefined,
+            // Make sure the current directory can be highlighted in the
+            // directory tree.
+            options: {
+              ...getDefaultSearchOptions(),
+              ...searchState?.options,
+              location: SearchLocation.THIS_FOLDER,
+            },
+          }));
+        }
+      } else {
+        console.warn('No entry for finishSetupCurrentDirectory_');
+      }
+      this.ui.addLoadedAttribute();
+    })();
+
+    if (this.dialogType === DialogType.SELECT_SAVEAS_FILE) {
+      this.ui.dialogFooter.filenameInput.value = suggestedName || '';
+      this.ui.dialogFooter.selectTargetNameInFilenameInput();
+    }
+
+    return promise;
+  }
+
+  /**
+   * Returns DirectoryEntry of the current directory.  Returns null if the
+   * directory model is not ready or the current directory is not set.
+   */
+  getCurrentDirectoryEntry(): DirectoryEntry|FakeEntry|FilesAppDirEntry|null
+      |undefined {
+    return this.directoryModel_ && this.directoryModel_.getCurrentDirEntry();
+  }
+
+  /** Expose the unload method for integration tests. */
+  onUnloadForTest() {
+    this.onUnload_();
+  }
+
+  /**
+   * Unload handler for the page.
+   */
+  private onUnload_() {
+    if (this.directoryModel_) {
+      this.directoryModel_.dispose();
+    }
+
+    if (this.volumeManager_) {
+      this.volumeManager_.dispose();
+    }
+
+    if (this.fileTransferController_) {
+      for (const taskId of this.fileTransferController_.pendingTaskIds) {
+        const item = this.progressCenter.getItemById(taskId)!;
+        item.message = '';
+        item.state = ProgressItemState.CANCELED;
+        this.progressCenter.updateItem(item);
+      }
+    }
+
+    if (this.ui_ && this.ui_.progressCenterPanel) {
+      this.progressCenter.removePanel(this.ui_.progressCenterPanel);
+    }
+  }
+
+  /**
+   * Returns allowed path for the dialog by considering:
+   * 1) The launch parameter which specifies generic category of valid files
+   * paths.
+   * 2) Files app's unique capabilities and restrictions.
+   */
+  private getAllowedPaths_(): AllowedPaths {
+    assert(this.launchParams_);
+    let allowedPaths = this.launchParams_.allowedPaths;
+    // The native implementation of the Files app creates snapshot files for
+    // non-native files. But it does not work for folders (e.g., dialog for
+    // loading unpacked extensions).
+    if (allowedPaths === AllowedPaths.NATIVE_PATH &&
+        !isFolderDialogType(this.launchParams_.type)) {
+      if (this.launchParams_.type == DialogType.SELECT_SAVEAS_FILE) {
+        allowedPaths = AllowedPaths.NATIVE_PATH;
+      } else {
+        allowedPaths = AllowedPaths.ANY_PATH;
+      }
+    }
+
+    return allowedPaths;
+  }
+
+  /**
+   * Returns SourceRestriction which is used to communicate restrictions about
+   * sources to chrome.fileManagerPrivate.getRecentFiles API.
+   */
+  private getSourceRestriction_(): chrome.fileManagerPrivate.SourceRestriction {
+    const allowedPaths = this.getAllowedPaths_();
+    if (allowedPaths == AllowedPaths.NATIVE_PATH) {
+      return chrome.fileManagerPrivate.SourceRestriction.NATIVE_SOURCE;
+    }
+    return chrome.fileManagerPrivate.SourceRestriction.ANY_SOURCE;
+  }
+
+  /**
+   * @return Selection object.
+   */
+  getSelection(): FileSelection {
+    return this.selectionHandler.selection;
+  }
+
+  /**
+   * @return File list.
+   */
+  getFileList(): ArrayDataModel {
+    return this.directoryModel.getFileList();
+  }
+
+  /**
+   * @return Current list object.
+   */
+  getCurrentList(): List {
+    return this.ui.listContainer.currentList;
+  }
+
+  /**
+   * Add or remove the fake Drive and Trash item from the directory tree when
+   * the prefs change. If Drive or Trash has been enabled by prefs, add the item
+   * otherwise remove it. This supports dynamic refresh when the pref changes.
+   */
+  private async onPreferencesChanged_() {
+    let prefs = null;
+    try {
+      prefs = await getPreferences();
+    } catch (e) {
+      console.error('Cannot get preferences:', e);
+      return;
+    }
+
+    this.store_.dispatch(updatePreferences(prefs));
+
+    let redraw = false;
+    if (this.driveEnabled_ !== prefs.driveEnabled) {
+      this.driveEnabled_ = prefs.driveEnabled;
+      this.toggleDriveRootOnPreferencesUpdate_();
+      redraw = true;
+    }
+
+    if (this.bulkPinningAvailable_ !== prefs.driveFsBulkPinningAvailable) {
+      this.bulkPinningAvailable_ = prefs.driveFsBulkPinningAvailable;
+      console.debug(`Bulk-pinning is now ${
+          this.bulkPinningAvailable_ ? 'available' : 'unavailable'}`);
+      if (this.bulkPinningAvailable_) {
+        await this.initBulkPinning_();
+      }
+    }
+
+    assert(this.toolbarController_);
+    if (this.trashEnabled !== prefs.trashEnabled) {
+      this.trashEnabled = prefs.trashEnabled;
+      this.toggleTrashRootOnPreferencesUpdate_();
+      this.toolbarController_.moveToTrashCommand.disabled = !this.trashEnabled;
+      this.toolbarController_.moveToTrashCommand.canExecuteChange(
+          this.ui.listContainer.currentList);
+      redraw = true;
+    }
+
+    await this.updateOfficePrefs_(prefs);
+
+    assert(this.ui.directoryTree);
+    if (redraw && !isXfTree(this.ui.directoryTree)) {
+      this.ui.directoryTree.redraw(false);
+    }
+  }
+
+  private async onDriveConnectionStatusChanged_() {
+    let connectionState = null;
+    try {
+      connectionState = await getDriveConnectionState();
+    } catch (e) {
+      console.error('Failed to retrieve drive connection state:', e);
+      return;
+    }
+    this.store_.dispatch(updateDriveConnectionStatus(connectionState));
+  }
+
+  private async updateOfficePrefs_(prefs:
+                                       chrome.fileManagerPrivate.Preferences) {
+    assert(this.ui_);
+    // These prefs starts with value 0. We only want to display when they're
+    // non-zero and show the most recent (larger value).
+    if (prefs.officeFileMovedOneDrive > prefs.officeFileMovedGoogleDrive) {
+      this.ui_.nudgeContainer.showNudge(
+          NudgeType['ONE_DRIVE_MOVED_FILE_NUDGE']);
+    } else if (
+        prefs.officeFileMovedOneDrive < prefs.officeFileMovedGoogleDrive) {
+      this.ui_.nudgeContainer.showNudge(NudgeType['DRIVE_MOVED_FILE_NUDGE']);
+    }
+    // Reset the seen state for office nudge. For normal users these 2 prefs
+    // will never reset to 0, however for manual tests it can be reset in
+    // chrome://files-internals.
+    if (prefs.officeFileMovedOneDrive === 0 &&
+        await this.ui_.nudgeContainer.checkSeen(
+            NudgeType['ONE_DRIVE_MOVED_FILE_NUDGE'])) {
+      this.ui_.nudgeContainer.clearSeen(
+          NudgeType['ONE_DRIVE_MOVED_FILE_NUDGE']);
+      console.debug('Reset OneDrive move to cloud nudge');
+    }
+    if (prefs.officeFileMovedGoogleDrive === 0 &&
+        await this.ui_.nudgeContainer.checkSeen(
+            NudgeType['DRIVE_MOVED_FILE_NUDGE'])) {
+      this.ui_.nudgeContainer.clearSeen(NudgeType['DRIVE_MOVED_FILE_NUDGE']);
+      console.debug('Reset Google Drive move to cloud nudge');
+    }
+  }
+
+  /**
+   * Invoked when the device connection status changes.
+   */
+  private updateDeviceConnectionState_(
+      state: chrome.fileManagerPrivate.DeviceConnectionState) {
+    this.store_.dispatch(updateDeviceConnectionState({connection: state}));
+  }
+
+  /**
+   * Toggles the trash root visibility when the `trashEnabled` preference is
+   * updated.
+   */
+  private toggleTrashRootOnPreferencesUpdate_() {
+    assert(this.ui_);
+    if (this.trashEnabled) {
+      if (!this.fakeTrashItem_) {
+        this.fakeTrashItem_ = new NavigationModelFakeItem(
+            str('TRASH_ROOT_LABEL'), NavigationModelItemType.TRASH,
+            new TrashRootEntry());
+      }
+      this.store_.dispatch(
+          addUiEntry({entry: this.fakeTrashItem_.entry as FakeEntry}));
+      assert(this.ui_.directoryTree);
+      if (!isXfTree(this.ui_.directoryTree)) {
+        this.ui_.directoryTree!.dataModel.fakeTrashItem = this.fakeTrashItem_;
+      }
+      return;
+    }
+
+    this.store_.dispatch(removeUiEntry({key: trashRootKey}));
+    assert(this.ui_.directoryTree);
+    if (!isXfTree(this.ui_.directoryTree)) {
+      this.ui_.directoryTree!.dataModel.fakeTrashItem = null;
+    }
+    this.navigateAwayFromDisabledRoot_(this.fakeTrashItem_);
+  }
+
+  /**
+   * Toggles the drive root visibility when the `driveEnabled` preference is
+   * updated.
+   */
+  private toggleDriveRootOnPreferencesUpdate_() {
+    if (this.driveEnabled_) {
+      let driveFakeRoot =
+          getEntry(this.store_.getState(), driveRootEntryListKey) as EntryList;
+      if (!driveFakeRoot) {
+        driveFakeRoot = new EntryList(
+            str('DRIVE_DIRECTORY_LABEL'), RootType.DRIVE_FAKE_ROOT);
+        this.store_.dispatch(addUiEntry({entry: driveFakeRoot}));
+      }
+      assert(this.ui.directoryTree);
+      if (!isXfTree(this.ui.directoryTree)) {
+        // TODO(b/285977941): Remove the old FakeEntry based drive root.
+        const driveFakeRoot = new FakeEntryImpl(
+            str('DRIVE_DIRECTORY_LABEL'), RootType.DRIVE_FAKE_ROOT);
+        if (!this.fakeDriveItem_) {
+          this.fakeDriveItem_ = new NavigationModelFakeItem(
+              str('DRIVE_DIRECTORY_LABEL'), NavigationModelItemType.DRIVE,
+              driveFakeRoot);
+          this.fakeDriveItem_.disabled =
+              this.volumeManager.isDisabled(VolumeType.DRIVE);
+        }
+        this.ui.directoryTree!.dataModel.fakeDriveItem = this.fakeDriveItem_;
+      }
+      return;
+    }
+    this.store_.dispatch(removeUiEntry({key: driveRootEntryListKey}));
+    assert(this.ui.directoryTree);
+    if (!isXfTree(this.ui.directoryTree)) {
+      this.ui.directoryTree!.dataModel.fakeDriveItem = null;
+    }
+    this.navigateAwayFromDisabledRoot_(this.fakeDriveItem_);
+  }
+
+  /**
+   * If the root item has been disabled but it is the current visible entry,
+   * navigate away from it to the default display root.
+   * @param rootItem The item to navigate away from.
+   */
+  private navigateAwayFromDisabledRoot_(rootItem: null|
+                                        NavigationModelFakeItem) {
+    if (!rootItem) {
+      return;
+    }
+
+    assert(this.directoryModel_);
+    assert(this.volumeManager_);
+    // The fake root item is being hidden so navigate away if it's the
+    // current directory.
+    if (this.directoryModel_.getCurrentDirEntry() === rootItem.entry) {
+      this.volumeManager_.getDefaultDisplayRoot((displayRoot) => {
+        if (this.directoryModel_!.getCurrentDirEntry() === rootItem.entry &&
+            displayRoot) {
+          this.directoryModel_!.changeDirectoryEntry(displayRoot);
+        }
+      });
+    }
+  }
+
+  /**
+   * Updates the DOM to reflect the specified tablet mode `enabled` state.
+   */
+  private onTabletModeChanged_(enabled: boolean) {
+    this.dialogDom_!.classList.toggle('tablet-mode-enabled', enabled);
+  }
+}
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.ts b/ui/file_manager/file_manager/foreground/js/file_manager_commands.ts
index cf598ab..d86717a 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.ts
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.ts
@@ -441,7 +441,7 @@
         return;
       }
       const directoryModel = fileManager.directoryModel;
-      const directoryEntry = fileManager.getCurrentDirectoryEntry();
+      const directoryEntry = fileManager.getCurrentDirectoryEntry()!;
       event.canExecute = !fileManager.directoryModel.isReadOnly() &&
           !fileManager.namingController.isRenamingInProgress() &&
           !directoryModel.isSearching() &&
@@ -461,12 +461,12 @@
   execute(_event: CommandEvent, fileManager: CommandHandlerDeps) {
     fileManager.launchFileManager({
       currentDirectoryURL: fileManager.getCurrentDirectoryEntry() &&
-          fileManager.getCurrentDirectoryEntry().toURL(),
+          fileManager.getCurrentDirectoryEntry()!.toURL(),
     });
   }
 
   override canExecute(event: CanExecuteEvent, fileManager: CommandHandlerDeps) {
-    event.canExecute = fileManager.getCurrentDirectoryEntry() &&
+    event.canExecute = !!fileManager.getCurrentDirectoryEntry() &&
         (fileManager.dialogType === DialogType.FULL_PAGE);
   }
 }
@@ -1104,14 +1104,14 @@
         return false;
       }
 
-      return isMove ? fileTransferController.canCutOrDrag() :
-                      fileTransferController.canCopyOrDrag();
+      return isMove ? fileTransferController?.canCutOrDrag() :
+                      fileTransferController?.canCopyOrDrag();
     }
 
     const canDo = fileManager.ui.directoryTree?.contains(target as Node) ?
         canDoDirectoryTree() :
         canDoFileList();
-    event.canExecute = canDo;
+    event.canExecute = !!canDo;
     command.disabled = !canDo;
   }
 }
@@ -1859,7 +1859,7 @@
                 (metadata, i) => isEncrypted(
                     selection.entries[i]!, metadata.contentMimeType));
 
-    event.canExecute = dirEntry && !fileManager.directoryModel.isReadOnly() &&
+    event.canExecute = !!dirEntry && !fileManager.directoryModel.isReadOnly() &&
         isOnEligibleLocation && selection && selection.totalCount > 0 &&
         !hasEncryptedFile;
   }
diff --git a/ui/file_manager/file_manager/foreground/js/file_selection.ts b/ui/file_manager/file_manager/foreground/js/file_selection.ts
index 0947ea3..dbcf372 100644
--- a/ui/file_manager/file_manager/foreground/js/file_selection.ts
+++ b/ui/file_manager/file_manager/foreground/js/file_selection.ts
@@ -12,7 +12,7 @@
 import {updateSelection} from '../../state/ducks/current_directory.js';
 import {getStore} from '../../state/store.js';
 
-import {constants} from './constants.js';
+import {FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES} from './constants.js';
 import type {DirectoryModel} from './directory_model.js';
 import type {MetadataModel} from './metadata/metadata_model.js';
 import type {ListContainer} from './ui/list_container.js';
@@ -69,8 +69,7 @@
       this.additionalPromise_ =
           metadataModel
               .get(
-                  this.entries,
-                  constants.FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES)
+                  this.entries, FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES)
               .then(props => {
                 this.anyFilesNotInCache = props.some(p => {
                   // If no availableOffline property, then assume it's
diff --git a/ui/file_manager/file_manager/foreground/js/file_tasks.ts b/ui/file_manager/file_manager/foreground/js/file_tasks.ts
index c10e096..65ffebd 100644
--- a/ui/file_manager/file_manager/foreground/js/file_tasks.ts
+++ b/ui/file_manager/file_manager/foreground/js/file_tasks.ts
@@ -24,7 +24,7 @@
 import {getStore} from '../../state/store.js';
 import {USER_CANCELLED, XfPasswordDialog} from '../../widgets/xf_password_dialog.js';
 
-import {constants} from './constants.js';
+import {DEFAULT_CROSTINI_VM} from './constants.js';
 import {type DirectoryChangeTracker, DirectoryModel} from './directory_model.js';
 import {FileTransferController, PastePlan} from './file_transfer_controller.js';
 import {MetadataItem} from './metadata/metadata_item.js';
@@ -104,8 +104,7 @@
     if (entries.length !== 1 ||
         !(isCrostiniEntry(entries[0]!, volumeManager) ||
           crostini.canSharePath(
-              constants.DEFAULT_CROSTINI_VM, entries[0]!,
-              false /* persist */))) {
+              DEFAULT_CROSTINI_VM, entries[0]!, false /* persist */))) {
       resultingTasks.tasks = resultingTasks.tasks.filter(
           (task: chrome.fileManagerPrivate.FileTask) => !descriptorEqual(
               task.descriptor, INSTALL_LINUX_PACKAGE_TASK_DESCRIPTOR));
diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller_unittest.ts b/ui/file_manager/file_manager/foreground/js/file_transfer_controller_unittest.ts
index a6537c468..c553f0f 100644
--- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller_unittest.ts
+++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller_unittest.ts
@@ -97,8 +97,7 @@
   // Create fake VolumeManager and install webkitResolveLocalFileSystemURL.
   volumeManager = new MockVolumeManager();
   window.webkitResolveLocalFileSystemURL =
-      MockVolumeManager.resolveLocalFileSystemUrl.bind(null, volumeManager) as
-      unknown as Window['webkitResolveLocalFileSystemURL'];
+      MockVolumeManager.resolveLocalFileSystemUrl.bind(null, volumeManager);
 
 
   // Fake FileSelectionHandler.
diff --git a/ui/file_manager/file_manager/foreground/js/main.ts b/ui/file_manager/file_manager/foreground/js/main.ts
index 3cf59a6..a9325660 100644
--- a/ui/file_manager/file_manager/foreground/js/main.ts
+++ b/ui/file_manager/file_manager/foreground/js/main.ts
@@ -6,11 +6,10 @@
  * @fileoverview Start point for Files app.
  */
 
-
-import '/strings.m.js';
-import '../../common/js/error_counter.js';
 import '../../background/js/metrics_start.js';
+import '../../common/js/error_counter.js';
 import './metrics_start.js';
+import '/strings.m.js';
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
 
@@ -25,8 +24,6 @@
 
 async function run() {
   try {
-    // @ts-ignore: error TS2339: Property 'appID' does not exist on type 'Window
-    // & typeof globalThis'.
     window.appID = String(loadTimeData.getInteger('WINDOW_NUMBER'));
   } catch (e) {
     reportGlitch(GlitchType.CAUGHT_EXCEPTION);
@@ -37,7 +34,7 @@
 run().then(() => {
   fileManager.initializeCore();
 
-  fileManager.initializeUI(document.body).then(() => {
+  fileManager.initializeUi(document.body).then(() => {
     testSendMessage('ready');
   });
 });
diff --git a/ui/file_manager/file_manager/foreground/js/main_window_component.ts b/ui/file_manager/file_manager/foreground/js/main_window_component.ts
index 597e07b0..070b96d 100644
--- a/ui/file_manager/file_manager/foreground/js/main_window_component.ts
+++ b/ui/file_manager/file_manager/foreground/js/main_window_component.ts
@@ -25,7 +25,7 @@
 import {Command} from './ui/command.js';
 import type {DirectoryItem} from './ui/directory_tree.js';
 import type {FileManagerUI} from './ui/file_manager_ui.js';
-import {FileTapHandler} from './ui/file_tap_handler.js';
+import {FileTapHandler, TapEvent} from './ui/file_tap_handler.js';
 import {EventType, ListType, ListTypesForUMA} from './ui/list_container.js';
 
 /**
@@ -112,7 +112,7 @@
     // Also the 2nd parameter of handleTouchEvents is just passed back to the
     // callback. Therefore we can pass a dummy value -1.
     this.tapHandler_.handleTouchEvents(event, -1, (_e, _index, eventType) => {
-      if (eventType == FileTapHandler.TapEvent.TAP) {
+      if (eventType == TapEvent.TAP) {
         const target = event.target as HTMLElement;
         // Taps on the checkmark should only toggle select the item.
         if (target.classList.contains('detail-checkmark') ||
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_dispatcher.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_dispatcher.js
deleted file mode 100644
index 3f599bd..0000000
--- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_dispatcher.js
+++ /dev/null
@@ -1,299 +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.
-
-import {ExifParser} from './exif_parser.js';
-import {Id3Parser} from './id3_parser.js';
-import {BmpParser, GifParser, IcoParser, PngParser, WebpParser} from './image_parsers.js';
-import {MetadataParser} from './metadata_parser.js';
-import {MpegParser} from './mpeg_parser.js';
-
-/**
- * Dispatches metadata requests to the correct parser.
- * TODO(TS): Implements MetadataParserLogger!
- */
-class MetadataDispatcher {
-  /***
-   * @param {Object} port Worker port.
-   */
-  constructor(port) {
-    this.port_ = port;
-    // @ts-ignore: error TS2339: Property 'onmessage' does not exist on type
-    // 'Object'.
-    this.port_.onmessage = this.onMessage.bind(this);
-
-    /**
-     * Verbose logging for the dispatcher.
-     *
-     * Individual parsers also take this as their default verbosity setting.
-     * @public @type {boolean}
-     */
-    this.verbose = false;
-
-    const patterns = [];
-
-    this.parserInstances_ = [];
-
-    /**
-     * @type {!Array<function(new:MetadataParser,
-     *     !import("./metadata_parser.js").MetadataParserLogger)>}
-     */
-    const parserClasses = [
-      BmpParser,
-      ExifParser,
-      GifParser,
-      IcoParser,
-      Id3Parser,
-      MpegParser,
-      PngParser,
-      WebpParser,
-    ];
-
-    for (const parserClass of parserClasses) {
-      const parser = new parserClass(this);
-      this.parserInstances_.push(parser);
-      patterns.push(parser.urlFilter.source);
-    }
-
-    this.parserRegexp_ = new RegExp('(' + patterns.join('|') + ')', 'i');
-
-    this.messageHandlers_ = {
-      init: this.init_.bind(this),
-      request: this.request_.bind(this),
-    };
-  }
-
-  /**
-   * |init| message handler.
-   * @private
-   */
-  init_() {
-    // Inform our owner that we're done initializing.
-    // If we need to pass more data back, we can add it to the param array.
-    // TODO(cleanup): parserRegexp_ looks unused in content_metadata_provider
-    // and in this file, too.
-    this.postMessage('initialized', [this.parserRegexp_]);
-    this.vlog('initialized with URL filter ' + this.parserRegexp_);
-  }
-
-  /**
-   * |request| message handler.
-   * @param {string} fileURL File URL.
-   * @private
-   */
-  request_(fileURL) {
-    try {
-      // @ts-ignore: error TS7006: Parameter 'metadata' implicitly has an 'any'
-      // type.
-      this.processOneFile(fileURL, function callback(metadata) {
-        // @ts-ignore: error TS2683: 'this' implicitly has type 'any' because it
-        // does not have a type annotation.
-        this.postMessage('result', [fileURL, metadata]);
-      }.bind(this));
-    } catch (ex) {
-      // @ts-ignore: error TS2345: Argument of type 'unknown' is not assignable
-      // to parameter of type 'string | Object'.
-      this.error(fileURL, ex);
-    }
-  }
-
-  /**
-   * Indicate to the caller that an operation has failed.
-   *
-   * No other messages relating to the failed operation should be sent.
-   * @param {...(Object|string)} var_args Arguments.
-   */
-  // @ts-ignore: error TS6133: 'var_args' is declared but its value is never
-  // read.
-  error(var_args) {
-    // TODO(cleanup): Strictly type these arguments to the [url, step, cause]
-    // format that ContentMetadataProvider expects.
-
-    // @ts-ignore: error TS2345: Argument of type 'IArguments' is not assignable
-    // to parameter of type 'unknown[]'.
-    const ary = Array.apply(null, arguments);
-    // @ts-ignore: error TS2345: Argument of type 'unknown[]' is not assignable
-    // to parameter of type 'Object[]'.
-    this.postMessage('error', ary);
-  }
-
-  /**
-   * Send a log message to the caller.
-   *
-   * Callers must not parse log messages for control flow.
-   * @param {...(Object|string)} var_args Arguments.
-   */
-  // @ts-ignore: error TS6133: 'var_args' is declared but its value is never
-  // read.
-  log(var_args) {
-    // @ts-ignore: error TS2345: Argument of type 'IArguments' is not assignable
-    // to parameter of type 'unknown[]'.
-    const ary = Array.apply(null, arguments);
-    // @ts-ignore: error TS2345: Argument of type 'unknown[]' is not assignable
-    // to parameter of type 'Object[]'.
-    this.postMessage('log', ary);
-  }
-
-  /**
-   * Send a log message to the caller only if this.verbose is true.
-   * @param {...(Object|string)} var_args Arguments.
-   */
-  // @ts-ignore: error TS6133: 'var_args' is declared but its value is never
-  // read.
-  vlog(var_args) {
-    if (this.verbose) {
-      // @ts-ignore: error TS2345: Argument of type 'IArguments' is not
-      // assignable to parameter of type '(string | Object)[]'.
-      this.log.apply(this, arguments);
-    }
-  }
-
-  /**
-   * Post a properly formatted message to the caller.
-   * @param {string} verb Message type descriptor.
-   * @param {Array<Object>} args Arguments array.
-   */
-  postMessage(verb, args) {
-    // @ts-ignore: error TS2339: Property 'postMessage' does not exist on type
-    // 'Object'.
-    this.port_.postMessage({verb: verb, arguments: args});
-  }
-
-  /**
-   * Message handler.
-   * @param {Event} event Event object.
-   */
-  onMessage(event) {
-    // @ts-ignore: error TS2339: Property 'data' does not exist on type 'Event'.
-    const data = event.data;
-
-    if (this.messageHandlers_.hasOwnProperty(data.verb)) {
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type 'any' can't be used to index type '{ init: () =>
-      // void; request: (fileURL: string) => void; }'.
-      this.messageHandlers_[data.verb].apply(this, data.arguments);
-    } else {
-      this.log('Unknown message from client: ' + data.verb, data);
-    }
-  }
-
-  /**
-   * @param {string} fileURL File URL.
-   * @param {function(Object):void} callback Completion callback.
-   */
-  processOneFile(fileURL, callback) {
-    const self = this;
-    let currentStep = -1;
-
-    /**
-     * @param {...*} var_args Arguments.
-     */
-    // @ts-ignore: error TS6133: 'var_args' is declared but its value is never
-    // read.
-    function nextStep(var_args) {
-      // @ts-ignore: error TS2532: Object is possibly 'undefined'.
-      self.vlog('nextStep: ' + steps[currentStep + 1].name);
-      // @ts-ignore: error TS2684: The 'this' context of type '((entry: any,
-      // parser: any) => void) | undefined' is not assignable to method's 'this'
-      // of type '(this: this, entry?: any, parser?: any) => void'.
-      steps[++currentStep].apply(self, arguments);
-    }
-
-    // @ts-ignore: error TS7034: Variable 'metadata' implicitly has type 'any'
-    // in some locations where its type cannot be determined.
-    let metadata;
-
-    /**
-     * @param {*} err An error.
-     * @param {string=} opt_stepName Step name.
-     */
-    function onError(err, opt_stepName) {
-      self.error(
-          // @ts-ignore: error TS2532: Object is possibly 'undefined'.
-          fileURL, opt_stepName || steps[currentStep].name, err.toString(),
-          // @ts-ignore: error TS7005: Variable 'metadata' implicitly has an
-          // 'any' type.
-          metadata);
-    }
-
-    const steps = [
-      // Step one, find the parser matching the url.
-      function detectFormat() {
-        for (let i = 0; i != self.parserInstances_.length; i++) {
-          const parser = self.parserInstances_[i];
-          // @ts-ignore: error TS18048: 'parser' is possibly 'undefined'.
-          if (fileURL.match(parser.urlFilter)) {
-            // Create the metadata object as early as possible so that we can
-            // pass it with the error message.
-            // @ts-ignore: error TS18048: 'parser' is possibly 'undefined'.
-            metadata = parser.createDefaultMetadata();
-            nextStep(parser);
-            return;
-          }
-        }
-        onError('unsupported format');
-      },
-
-      // Step two, turn the url into an entry.
-      // @ts-ignore: error TS7006: Parameter 'parser' implicitly has an 'any'
-      // type.
-      function getEntry(parser) {
-        // @ts-ignore: error TS7006: Parameter 'entry' implicitly has an 'any'
-        // type.
-        globalThis.webkitResolveLocalFileSystemURL(fileURL, entry => {
-          nextStep(entry, parser);
-        }, onError);
-      },
-
-      // Step three, turn the entry into a file.
-      // @ts-ignore: error TS7006: Parameter 'parser' implicitly has an 'any'
-      // type.
-      function getFile(entry, parser) {
-        // @ts-ignore: error TS7006: Parameter 'file' implicitly has an 'any'
-        // type.
-        entry.file(file => {
-          nextStep(file, parser);
-        }, onError);
-      },
-
-      // Step four, parse the file content.
-      // @ts-ignore: error TS7006: Parameter 'parser' implicitly has an 'any'
-      // type.
-      function parseContent(file, parser) {
-        // @ts-ignore: error TS7005: Variable 'metadata' implicitly has an 'any'
-        // type.
-        metadata.fileSize = file.size;
-        try {
-          // @ts-ignore: error TS7005: Variable 'metadata' implicitly has an
-          // 'any' type.
-          parser.parse(file, metadata, callback, onError);
-        } catch (e) {
-          // @ts-ignore: error TS18046: 'e' is of type 'unknown'.
-          onError(e.stack);
-        }
-      },
-    ];
-
-    // @ts-ignore: error TS2555: Expected at least 1 arguments, but got 0.
-    nextStep();
-  }
-}
-
-
-// Webworker spec says that the worker global object is called self.  That's
-// a terrible name since we use it all over the chrome codebase to capture
-// the 'this' keyword in lambdas.
-const global = self;
-
-if (global.constructor.name == 'SharedWorkerGlobalScope') {
-  global.addEventListener('connect', e => {
-    // @ts-ignore: error TS2339: Property 'ports' does not exist on type
-    // 'Event'.
-    const port = e.ports[0];
-    new MetadataDispatcher(port);
-    port.start();
-  });
-} else {
-  // Non-shared worker.
-  new MetadataDispatcher(global);
-}
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_dispatcher.ts b/ui/file_manager/file_manager/foreground/js/metadata/metadata_dispatcher.ts
new file mode 100644
index 0000000..282eeb1
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_dispatcher.ts
@@ -0,0 +1,223 @@
+// 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.
+
+import {ExifParser} from './exif_parser.js';
+import {Id3Parser} from './id3_parser.js';
+import {BmpParser, GifParser, IcoParser, PngParser, WebpParser} from './image_parsers.js';
+import {ParserMetadata} from './metadata_item.js';
+import {MetadataParser, MetadataParserLogger} from './metadata_parser.js';
+import {MpegParser} from './mpeg_parser.js';
+
+// Helper function to type entries as FileEntry. We redefine it here because
+// importing entry_utils.js has some transitive side effects that access objects
+// not accessible in a shared worker.
+function isFileEntry(entry: Entry): entry is FileEntry {
+  return entry.isFile;
+}
+
+/**
+ * Dispatches metadata requests to the correct parser.
+ */
+class MetadataDispatcher implements MetadataParserLogger {
+  /**
+   * Verbose logging for the dispatcher.
+   *
+   * Individual parsers also take this as their default verbosity setting.
+   */
+  readonly verbose = false;
+  private parserInstances_: MetadataParser[];
+  private parserRegexp_: RegExp;
+
+  // Explicitly type this as a record so we can index into this object with a
+  // string.
+  private messageHandlers_: Record<string, Function> = {
+    init: this.init_.bind(this),
+    request: this.request_.bind(this),
+  };
+
+  /***
+   * @param port Worker port.
+   */
+  constructor(private port_: WorkerGlobalScope|MessagePort) {
+    this.port_.onmessage = this.onMessage.bind(this);
+
+    const patterns = [];
+
+    this.parserInstances_ = [];
+
+    const parserClasses = [
+      BmpParser,
+      ExifParser,
+      GifParser,
+      IcoParser,
+      Id3Parser,
+      MpegParser,
+      PngParser,
+      WebpParser,
+    ];
+
+    for (const parserClass of parserClasses) {
+      const parser = new parserClass(this);
+      this.parserInstances_.push(parser);
+      patterns.push(parser.urlFilter.source);
+    }
+
+    this.parserRegexp_ = new RegExp('(' + patterns.join('|') + ')', 'i');
+  }
+
+  /**
+   * |init| message handler.
+   */
+  private init_() {
+    // Inform our owner that we're done initializing.
+    // If we need to pass more data back, we can add it to the param array.
+    // TODO(cleanup): parserRegexp_ looks unused in content_metadata_provider
+    // and in this file, too.
+    this.postMessage('initialized', [this.parserRegexp_]);
+    this.vlog('initialized with URL filter ' + this.parserRegexp_);
+  }
+
+  /**
+   * |request| message handler.
+   * @param fileURL File URL.
+   */
+  private request_(fileURL: string) {
+    try {
+      this.processOneFile(fileURL, (metadata: ParserMetadata) => {
+        console.log(metadata);
+        this.postMessage('result', [fileURL, metadata]);
+      });
+    } catch (ex) {
+      this.error(fileURL, ex!);
+    }
+  }
+
+  /**
+   * Indicate to the caller that an operation has failed.
+   *
+   * No other messages relating to the failed operation should be sent.
+   */
+  error(...args: Array<object|string>) {
+    // TODO(cleanup): Strictly type these arguments to the [url, step, cause]
+    // format that ContentMetadataProvider expects.
+
+    this.postMessage('error', args);
+  }
+
+  /**
+   * Send a log message to the caller.
+   *
+   * Callers must not parse log messages for control flow.
+   */
+  log(...args: Array<object|string>) {
+    this.postMessage('log', args);
+  }
+
+  /**
+   * Send a log message to the caller only if this.verbose is true.
+   */
+  vlog(...args: Array<object|string>) {
+    if (this.verbose) {
+      this.log(...args);
+    }
+  }
+
+  /**
+   * Post a properly formatted message to the caller.
+   * @param verb Message type descriptor.
+   * @param args Arguments array.
+   */
+  postMessage(verb: string, args: any[]) {
+    this.port_.postMessage({verb: verb, arguments: args});
+  }
+
+  /**
+   * Message handler.
+   * @param event Event object.
+   */
+  onMessage(event: MessageEvent) {
+    const data = event.data;
+
+    const handler = this.messageHandlers_[data.verb];
+    if (handler instanceof Function) {
+      handler.apply(this, data.arguments);
+    } else {
+      this.log('Unknown message from client: ' + data.verb, data);
+    }
+  }
+
+  private detectFormat_(fileURL: string): MetadataParser|null {
+    for (const parser of this.parserInstances_) {
+      if (fileURL.match(parser.urlFilter)) {
+        return parser;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @param fileURL File URL.
+   * @param callback Completion callback.
+   */
+  async processOneFile(
+      fileURL: string, callback: (metadata: ParserMetadata) => void) {
+    // Step one, find the parser matching the url.
+    const parser = this.detectFormat_(fileURL);
+    if (!parser) {
+      this.error(fileURL, 'detectFormat', 'unsupported format');
+      return;
+    }
+    // Create the metadata object as early as possible so that we can
+    // pass it with the error message.
+    const metadata: ParserMetadata = parser.createDefaultMetadata();
+
+    // Step two, turn the url into an entry.
+    const entry = await new Promise<Entry>(
+        (resolve, reject) => globalThis.webkitResolveLocalFileSystemURL(
+            fileURL, resolve, reject));
+    if (!isFileEntry(entry)) {
+      this.error(fileURL, 'getEntry', 'url does not refer a file', metadata);
+      return;
+    }
+
+    // Step three, turn the entry into a file.
+    const file = await new Promise(entry.file.bind(entry));
+
+    // Step four, parse the file.
+    metadata.fileSize = file.size;
+    try {
+      parser.parse(
+          file, metadata, callback,
+          (error) => this.error(fileURL, 'parseContent', error));
+    } catch (e) {
+      this.error(fileURL, 'parseContent', (e as Error).stack!);
+    }
+  }
+}
+
+// This interface and the following self type assertion is needed as we
+// currently use the same tsconfig to build this as with the rest of Files App.
+// TODO(b/289003444): Use a separate tsconfig to build this file with webworker
+// definitions, and then remove this interface and the following type assertion.
+interface WorkerGlobalScope {
+  onmessage: (ev: MessageEvent) => any;
+  addEventListener(type: 'connect', listener: (ev: MessageEvent) => any): void;
+  postMessage(message: any): void;
+}
+
+// Webworker spec says that the worker global object is called self.  That's
+// a terrible name since we use it all over the chrome codebase to capture
+// the 'this' keyword in lambdas.
+const global = self as WorkerGlobalScope;
+
+if (global.constructor.name == 'SharedWorkerGlobalScope') {
+  global.addEventListener('connect', e => {
+    const port = e.ports[0]!;
+    new MetadataDispatcher(port);
+    port.start();
+  });
+} else {
+  // Non-shared worker.
+  new MetadataDispatcher(global);
+}
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.ts b/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.ts
index 111435028..8c3b3f52 100644
--- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.ts
+++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.ts
@@ -248,6 +248,7 @@
     exif?: Record<ExifTag, ExifEntry>,
     gps?: Record<ExifTag, ExifEntry>,
   };
+  fileSize?: number;
   height?: number;
   width?: number;
   duration?: number;
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_parser.ts b/ui/file_manager/file_manager/foreground/js/metadata/metadata_parser.ts
index d7c10b4..6d3fd71 100644
--- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_parser.ts
+++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_parser.ts
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import {ByteReader} from './byte_reader.js';
+import {ParserMetadata} from './metadata_item.js';
 
 export interface MetadataParserLogger {
   /**
@@ -31,7 +32,7 @@
   vlog(...args: Array<Object|string>): void;
 }
 
-export class MetadataParser implements MetadataParserLogger {
+export abstract class MetadataParser implements MetadataParserLogger {
   readonly verbose: boolean;
   mimeType = 'unknown';
 
@@ -98,13 +99,24 @@
     fileReader.readAsArrayBuffer(file.slice(begin, end));
   }
 
-  // TODO(cleanup): Add parse() abstract method which fills in a ParserMetadata.
+  /**
+   * Parses the file and fills out the given metadata object, returning the
+   * result via the passed in callback.
+   * @param file File object to parse.
+   * @param metadata Metadata object of the file.
+   * @param callback Success callback.
+   * @param onError Error callback.
+   */
+  abstract parse(
+      file: File, metadata: ParserMetadata,
+      callback: (metadata: ParserMetadata) => void,
+      onError: (error: Event|string) => void): void;
 }
 
 /**
  * Base class for image metadata parsers.
  */
-export class ImageParser extends MetadataParser {
+export abstract class ImageParser extends MetadataParser {
   /**
    * @param parent Parent object.
    * @param type Image type.
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
index db3d03e9..6412276 100644
--- a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
+++ b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
@@ -546,6 +546,10 @@
     this.refreshNavigationItems();
   }
 
+  get myFilesModel() {
+    return this.myFilesModel_;
+  }
+
   /**
    * Refresh list of navigation items.
    */
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_list_model_unittest.js b/ui/file_manager/file_manager/foreground/js/navigation_list_model_unittest.js
index df7dc54..e8b59501 100644
--- a/ui/file_manager/file_manager/foreground/js/navigation_list_model_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/navigation_list_model_unittest.js
@@ -18,7 +18,7 @@
 import {DialogType} from '../../externs/ts/state.js';
 
 import {AndroidAppListModel} from './android_app_list_model.js';
-import {constants} from './constants.js';
+import {ODFS_EXTENSION_ID} from './constants.js';
 import {DirectoryModel} from './directory_model.js';
 import {createFakeAndroidAppListModel} from './fake_android_app_list_model.js';
 import {createFakeDirectoryModel} from './mock_directory_model.js';
@@ -423,8 +423,7 @@
       MockVolumeManager.createMockVolumeInfo(VolumeType.SMB, 'smb:file-share'));
   // Add ODFS.
   volumeManager.volumeInfoList.add(MockVolumeManager.createMockVolumeInfo(
-      VolumeType.PROVIDED, 'provided:odfs', '', '',
-      constants.ODFS_EXTENSION_ID));
+      VolumeType.PROVIDED, 'provided:odfs', '', '', ODFS_EXTENSION_ID));
 
   const androidAppListModelWithApps =
       createFakeAndroidAppListModel(['android:app1', 'android:app2']);
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_uma.ts b/ui/file_manager/file_manager/foreground/js/navigation_uma.ts
index f4ca3e3..96ce9b6 100644
--- a/ui/file_manager/file_manager/foreground/js/navigation_uma.ts
+++ b/ui/file_manager/file_manager/foreground/js/navigation_uma.ts
@@ -17,7 +17,7 @@
    *
    * @param entry the new directory
    */
-  onDirectoryChanged(entry: FileEntry) {
+  onDirectoryChanged(entry: Entry) {
     const locationInfo = this.volumeManager_.getLocationInfo(entry);
     if (locationInfo) {
       recordEnum(
diff --git a/ui/file_manager/file_manager/foreground/js/quick_view_controller.ts b/ui/file_manager/file_manager/foreground/js/quick_view_controller.ts
index fb44448..567feec 100644
--- a/ui/file_manager/file_manager/foreground/js/quick_view_controller.ts
+++ b/ui/file_manager/file_manager/foreground/js/quick_view_controller.ts
@@ -30,7 +30,7 @@
 import {TaskController} from './task_controller.js';
 import {THUMBNAIL_MAX_HEIGHT, THUMBNAIL_MAX_WIDTH} from './thumbnail_loader.js';
 import type {CommandEvent} from './ui/command.js';
-import {FileListSelectionModel} from './ui/file_list_selection_model.js';
+import {FileListSelectionModel, FileListSingleSelectionModel} from './ui/file_list_selection_model.js';
 import {FilesConfirmDialog} from './ui/files_confirm_dialog.js';
 import {ListContainer} from './ui/list_container.js';
 import {MultiMenuButton} from './ui/multi_menu_button.js';
@@ -75,7 +75,8 @@
       selectionMenuButton: MultiMenuButton,
       private quickViewModel_: QuickViewModel,
       private taskController_: TaskController,
-      private fileListSelectionModel_: FileListSelectionModel,
+      private fileListSelectionModel_: FileListSelectionModel|
+      FileListSingleSelectionModel,
       private quickViewUma_: QuickViewUma,
       private metadataBoxController_: MetadataBoxController,
       private dialogType_: DialogType, private volumeManager_: VolumeManager,
diff --git a/ui/file_manager/file_manager/foreground/js/toolbar_controller.ts b/ui/file_manager/file_manager/foreground/js/toolbar_controller.ts
index 19ea665..a1190ad 100644
--- a/ui/file_manager/file_manager/foreground/js/toolbar_controller.ts
+++ b/ui/file_manager/file_manager/foreground/js/toolbar_controller.ts
@@ -18,7 +18,7 @@
 import {getStore} from '../../state/store.js';
 import {XfCloudPanel} from '../../widgets/xf_cloud_panel.js';
 
-import {constants} from './constants.js';
+import {ICON_TYPES} from './constants.js';
 import type {DirectoryChangeEvent} from './directory_model.js';
 import {DirectoryModel} from './directory_model.js';
 import {EventType, FileSelectionHandler} from './file_selection.js';
@@ -58,7 +58,7 @@
   private readonly cloudButtonIcon_: HTMLElement;
   // Commands
   private readonly deleteCommand_: Command;
-  private readonly moveToTrashCommand: Command;
+  readonly moveToTrashCommand: Command;
   private readonly restoreFromTrashCommand_: Command;
   private readonly refreshCommand_: Command;
   private readonly newFolderCommand_: Command;
@@ -415,52 +415,48 @@
       isNetworkMetered: boolean) {
     if (isNetworkMetered) {
       this.cloudButton_.ariaLabel = str('BULK_PINNING_BUTTON_LABEL_PAUSED');
-      this.cloudButtonIcon_.setAttribute('type', constants.ICON_TYPES.CLOUD);
-      this.cloudStatusIcon_.setAttribute(
-          'type', constants.ICON_TYPES.CLOUD_PAUSED);
+      this.cloudButtonIcon_.setAttribute('type', ICON_TYPES.CLOUD);
+      this.cloudStatusIcon_.setAttribute('type', ICON_TYPES.CLOUD_PAUSED);
       this.cloudStatusIcon_.removeAttribute('size');
       return;
     }
 
     switch (progress?.stage) {
       case chrome.fileManagerPrivate.BulkPinStage.SYNCING:
-        this.cloudButtonIcon_.setAttribute('type', constants.ICON_TYPES.CLOUD);
+        this.cloudButtonIcon_.setAttribute('type', ICON_TYPES.CLOUD);
         if (progress.bytesToPin === 0 ||
             progress.pinnedBytes / progress.bytesToPin === 1) {
           this.cloudButton_.ariaLabel = str('BULK_PINNING_FILE_SYNC_ON');
-          this.cloudStatusIcon_.setAttribute(
-              'type', constants.ICON_TYPES.BLANK);
+          this.cloudStatusIcon_.setAttribute('type', ICON_TYPES.BLANK);
         } else {
           this.cloudButton_.ariaLabel =
               str('BULK_PINNING_BUTTON_LABEL_SYNCING');
-          this.cloudStatusIcon_.setAttribute(
-              'type', constants.ICON_TYPES.CLOUD_SYNC);
+          this.cloudStatusIcon_.setAttribute('type', ICON_TYPES.CLOUD_SYNC);
         }
         break;
       case chrome.fileManagerPrivate.BulkPinStage.NOT_ENOUGH_SPACE:
         this.cloudButton_.ariaLabel = str('BULK_PINNING_BUTTON_LABEL_ISSUE');
-        this.cloudButtonIcon_.setAttribute('type', constants.ICON_TYPES.CLOUD);
-        this.cloudStatusIcon_.setAttribute(
-            'type', constants.ICON_TYPES.CLOUD_ERROR);
+        this.cloudButtonIcon_.setAttribute('type', ICON_TYPES.CLOUD);
+        this.cloudStatusIcon_.setAttribute('type', ICON_TYPES.CLOUD_ERROR);
         break;
       case chrome.fileManagerPrivate.BulkPinStage.PAUSED_OFFLINE:
         this.cloudButton_.ariaLabel = str('BULK_PINNING_BUTTON_LABEL_OFFLINE');
         this.cloudButtonIcon_.setAttribute(
-            'type', constants.ICON_TYPES.BULK_PINNING_OFFLINE);
+            'type', ICON_TYPES.BULK_PINNING_OFFLINE);
         this.cloudStatusIcon_.removeAttribute('type');
         this.cloudStatusIcon_.removeAttribute('size');
         break;
       case chrome.fileManagerPrivate.BulkPinStage.PAUSED_BATTERY_SAVER:
         this.cloudButton_.ariaLabel = str('BULK_PINNING_BUTTON_LABEL_PAUSED');
         this.cloudButtonIcon_.setAttribute(
-            'type', constants.ICON_TYPES.BULK_PINNING_BATTERY_SAVER);
+            'type', ICON_TYPES.BULK_PINNING_BATTERY_SAVER);
         this.cloudStatusIcon_.removeAttribute('type');
         this.cloudStatusIcon_.removeAttribute('size');
         break;
       default:
         this.cloudButton_.ariaLabel = str('BULK_PINNING_FILE_SYNC_ON');
-        this.cloudButtonIcon_.setAttribute('type', constants.ICON_TYPES.CLOUD);
-        this.cloudStatusIcon_.setAttribute('type', constants.ICON_TYPES.BLANK);
+        this.cloudButtonIcon_.setAttribute('type', ICON_TYPES.CLOUD);
+        this.cloudStatusIcon_.setAttribute('type', ICON_TYPES.BLANK);
         this.cloudStatusIcon_.removeAttribute('size');
         break;
     }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/actions_submenu.js b/ui/file_manager/file_manager/foreground/js/ui/actions_submenu.js
deleted file mode 100644
index 15a1b46..0000000
--- a/ui/file_manager/file_manager/foreground/js/ui/actions_submenu.js
+++ /dev/null
@@ -1,167 +0,0 @@
-// 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.
-
-import {crInjectTypeAndInit} from '../../../common/js/cr_ui.js';
-import {queryDecoratedElement, queryRequiredElement} from '../../../common/js/dom_utils.js';
-import {ActionsModel, CommonActionId, InternalActionId} from '../actions_model.js';
-
-import {Command} from './command.js';
-import {FilesMenuItem} from './files_menu.js';
-import {Menu} from './menu.js';
-import {MenuItem} from './menu_item.js';
-
-export class ActionsSubmenu {
-  /** @param {!Menu} menu */
-  constructor(menu) {
-    /**
-     * @private @type {!Menu}
-     * @const
-     */
-    this.menu_ = menu;
-
-    /**
-     * @private @type {!MenuItem}
-     * @const
-     */
-    this.separator_ = /** @type {!MenuItem} */
-        // @ts-ignore: error TS2345: Argument of type 'Menu' is not assignable
-        // to parameter of type 'Document | Element | HTMLElement |
-        // DocumentFragment | undefined'.
-        (queryRequiredElement('#actions-separator', this.menu_));
-
-    /**
-     * @private @type {!Array<!MenuItem>}
-     */
-    // @ts-ignore: error TS7008: Member 'items_' implicitly has an 'any[]' type.
-    this.items_ = [];
-  }
-
-  /**
-   * @param {!Object} options
-   * @return {MenuItem}
-   * @private
-   */
-  addMenuItem_(options) {
-    const menuItem = this.menu_.addMenuItem(options);
-    crInjectTypeAndInit(menuItem, FilesMenuItem);
-    menuItem.parentNode?.insertBefore(menuItem, this.separator_);
-    this.items_.push(menuItem);
-    return menuItem;
-  }
-
-  /**
-   * @param {ActionsModel} actionsModel
-   * @param {Element} element The target element.
-   */
-  setActionsModel(actionsModel, element) {
-    this.items_.forEach(item => {
-      // @ts-ignore: error TS18047: 'item.parentNode' is possibly 'null'.
-      item.parentNode.removeChild(item);
-    });
-    this.items_ = [];
-
-    const remainingActions = {};
-    if (actionsModel) {
-      const actions = actionsModel.getActions();
-      Object.keys(actions).forEach(key => {
-        // @ts-ignore: error TS7053: Element implicitly has an 'any' type
-        // because expression of type 'string' can't be used to index type '{}'.
-        remainingActions[key] = actions[key];
-      });
-    }
-
-    // First add the sharing item (if available).
-    // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-    // expression of type 'string' can't be used to index type '{}'.
-    const shareAction = remainingActions[CommonActionId.SHARE];
-    if (shareAction) {
-      const menuItem = this.addMenuItem_({});
-      // @ts-ignore: error TS2339: Property 'command' does not exist on type
-      // 'MenuItem'.
-      menuItem.command = '#share';
-      menuItem.classList.toggle('hide-on-toolbar', true);
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type 'string' can't be used to index type '{}'.
-      delete remainingActions[CommonActionId.SHARE];
-    }
-    queryDecoratedElement('#share', Command).canExecuteChange(element);
-
-    // Then add the Manage in Drive item (if available).
-    const manageInDriveAction =
-        // @ts-ignore: error TS7053: Element implicitly has an 'any' type
-        // because expression of type 'string' can't be used to index type '{}'.
-        remainingActions[InternalActionId.MANAGE_IN_DRIVE];
-    if (manageInDriveAction) {
-      const menuItem = this.addMenuItem_({});
-      // @ts-ignore: error TS2339: Property 'command' does not exist on type
-      // 'MenuItem'.
-      menuItem.command = '#manage-in-drive';
-      menuItem.classList.toggle('hide-on-toolbar', true);
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type 'string' can't be used to index type '{}'.
-      delete remainingActions[InternalActionId.MANAGE_IN_DRIVE];
-    }
-    queryDecoratedElement('#manage-in-drive', Command)
-        .canExecuteChange(element);
-
-    // Removing shortcuts is not rendered in the submenu to keep the previous
-    // behavior. Shortcuts can be removed in the left nav using the roots menu.
-    // TODO(mtomasz): Consider rendering the menu item here for consistency.
-    queryDecoratedElement('#unpin-folder', Command).canExecuteChange(element);
-
-    // Both save-for-offline and offline-not-necessary are handled by the single
-    // #toggle-pinned command.
-    const saveForOfflineAction =
-        // @ts-ignore: error TS7053: Element implicitly has an 'any' type
-        // because expression of type 'string' can't be used to index type '{}'.
-        remainingActions[CommonActionId.SAVE_FOR_OFFLINE];
-    const offlineNotNecessaryAction =
-        // @ts-ignore: error TS7053: Element implicitly has an 'any' type
-        // because expression of type 'string' can't be used to index type '{}'.
-        remainingActions[CommonActionId.OFFLINE_NOT_NECESSARY];
-    if (saveForOfflineAction || offlineNotNecessaryAction) {
-      const menuItem = this.addMenuItem_({});
-      // @ts-ignore: error TS2339: Property 'command' does not exist on type
-      // 'MenuItem'.
-      menuItem.command = '#toggle-pinned';
-      menuItem.classList.toggle('hide-on-toolbar', true);
-      if (saveForOfflineAction) {
-        // @ts-ignore: error TS7053: Element implicitly has an 'any' type
-        // because expression of type 'string' can't be used to index type '{}'.
-        delete remainingActions[CommonActionId.SAVE_FOR_OFFLINE];
-      }
-      if (offlineNotNecessaryAction) {
-        // @ts-ignore: error TS7053: Element implicitly has an 'any' type
-        // because expression of type 'string' can't be used to index type '{}'.
-        delete remainingActions[CommonActionId.OFFLINE_NOT_NECESSARY];
-      }
-    }
-    queryDecoratedElement('#toggle-pinned', Command).canExecuteChange(element);
-
-    let hasCustomActions = false;
-    // Process all the rest as custom actions.
-    Object.keys(remainingActions).forEach(key => {
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type 'string' can't be used to index type '{}'.
-      const action = remainingActions[key];
-      // If the action has no title it isn't visible to users, so we skip here.
-      if (!action.getTitle()) {
-        return;
-      }
-      hasCustomActions = true;
-      const options = {label: action.getTitle()};
-      const menuItem = this.addMenuItem_(options);
-
-      menuItem.addEventListener('activate', () => {
-        action.execute();
-      });
-    });
-
-    // All actions that are not custom actions are hide-on-toolbar, so
-    // set hide-on-toolbar for the separator if there are no custom actions.
-    this.separator_.classList.toggle('hide-on-toolbar', !hasCustomActions);
-
-    this.separator_.hidden = !this.items_.length;
-  }
-}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/actions_submenu.ts b/ui/file_manager/file_manager/foreground/js/ui/actions_submenu.ts
new file mode 100644
index 0000000..2d6f0118
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/ui/actions_submenu.ts
@@ -0,0 +1,111 @@
+// 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.
+
+import {crInjectTypeAndInit} from '../../../common/js/cr_ui.js';
+import {queryDecoratedElement, queryRequiredElement} from '../../../common/js/dom_utils.js';
+import {Action, ActionsModel, CommonActionId, InternalActionId} from '../actions_model.js';
+
+import {Command} from './command.js';
+import {FilesMenuItem} from './files_menu.js';
+import {Menu} from './menu.js';
+import {MenuItem} from './menu_item.js';
+
+export class ActionsSubmenu {
+  private readonly items_: MenuItem[] = [];
+  private readonly separator_ =
+      queryRequiredElement('#actions-separator', this.menu_) as MenuItem;
+  constructor(private menu_: Menu) {}
+
+  private addMenuItem_(label?: string): MenuItem {
+    const menuItem = this.menu_.addMenuItem({label});
+    crInjectTypeAndInit(menuItem, FilesMenuItem);
+    menuItem.parentNode?.insertBefore(menuItem, this.separator_);
+    this.items_.push(menuItem);
+    return menuItem;
+  }
+
+  /**
+   * @param element The target element.
+   */
+  setActionsModel(actionsModel: ActionsModel, element: Element) {
+    this.items_.forEach((item: MenuItem) => {
+      item.parentNode!.removeChild(item);
+    });
+    this.items_.length = 0;
+
+    const remainingActions: Record<string, Action> = {};
+    if (actionsModel) {
+      const actions = actionsModel.getActions();
+      for (const [key, action] of Object.entries(actions)) {
+        remainingActions[key] = action!;
+      }
+    }
+
+    // First add the sharing item (if available).
+    const shareAction = remainingActions[CommonActionId.SHARE];
+    if (shareAction) {
+      const menuItem = this.addMenuItem_();
+      menuItem.command = '#share';
+      menuItem.classList.toggle('hide-on-toolbar', true);
+      delete remainingActions[CommonActionId.SHARE];
+    }
+    queryDecoratedElement('#share', Command).canExecuteChange(element);
+
+    // Then add the Manage in Drive item (if available).
+    const manageInDriveAction =
+        remainingActions[InternalActionId.MANAGE_IN_DRIVE];
+    if (manageInDriveAction) {
+      const menuItem = this.addMenuItem_();
+      menuItem.command = '#manage-in-drive';
+      menuItem.classList.toggle('hide-on-toolbar', true);
+      delete remainingActions[InternalActionId.MANAGE_IN_DRIVE];
+    }
+    queryDecoratedElement('#manage-in-drive', Command)
+        .canExecuteChange(element);
+
+    // Removing shortcuts is not rendered in the submenu to keep the previous
+    // behavior. Shortcuts can be removed in the left nav using the roots menu.
+    // TODO(mtomasz): Consider rendering the menu item here for consistency.
+    queryDecoratedElement('#unpin-folder', Command).canExecuteChange(element);
+
+    // Both save-for-offline and offline-not-necessary are handled by the single
+    // #toggle-pinned command.
+    const saveForOfflineAction =
+        remainingActions[CommonActionId.SAVE_FOR_OFFLINE];
+    const offlineNotNecessaryAction =
+        remainingActions[CommonActionId.OFFLINE_NOT_NECESSARY];
+    if (saveForOfflineAction || offlineNotNecessaryAction) {
+      const menuItem = this.addMenuItem_();
+      menuItem.command = '#toggle-pinned';
+      menuItem.classList.toggle('hide-on-toolbar', true);
+      if (saveForOfflineAction) {
+        delete remainingActions[CommonActionId.SAVE_FOR_OFFLINE];
+      }
+      if (offlineNotNecessaryAction) {
+        delete remainingActions[CommonActionId.OFFLINE_NOT_NECESSARY];
+      }
+    }
+    queryDecoratedElement('#toggle-pinned', Command).canExecuteChange(element);
+
+    let hasCustomActions = false;
+    // Process all the rest as custom actions.
+    for (const action of Object.values(remainingActions)) {
+      // If the action has no title it isn't visible to users, so we skip here.
+      const label = action.getTitle();
+      if (!label) {
+        continue;
+      }
+
+      hasCustomActions = true;
+      const menuItem = this.addMenuItem_(label);
+      menuItem.addEventListener('activate', () => action.execute());
+    }
+
+    // All actions that are not custom actions are hide-on-toolbar, so
+    // set hide-on-toolbar for the separator if there are no custom actions.
+    this.separator_.classList.toggle('hide-on-toolbar', !hasCustomActions);
+
+    this.separator_.hidden = !this.items_.length;
+  }
+}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/banners/shared_with_crostini_pluginvm_banner.ts b/ui/file_manager/file_manager/foreground/js/ui/banners/shared_with_crostini_pluginvm_banner.ts
index fa8e5070..c8b53de4 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/banners/shared_with_crostini_pluginvm_banner.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/banners/shared_with_crostini_pluginvm_banner.ts
@@ -4,7 +4,7 @@
 
 import {str} from '../../../../common/js/translations.js';
 import {RootType} from '../../../../common/js/volume_manager_types.js';
-import {constants} from '../../constants.js';
+import {DEFAULT_CROSTINI_VM, PLUGIN_VM} from '../../constants.js';
 
 import {getTemplate} from './shared_with_crostini_pluginvm_banner.html.js';
 import {StateBanner} from './state_banner.js';
@@ -74,14 +74,13 @@
         this.shadowRoot!.querySelector<HTMLSpanElement>('span[slot="text"]')!;
     const button = this.shadowRoot!.querySelector<HTMLButtonElement>(
         'cr-button[slot="extra-button"]')!;
-    if (context.type ===
-        (constants.DEFAULT_CROSTINI_VM + constants.PLUGIN_VM)) {
+    if (context.type === (DEFAULT_CROSTINI_VM + PLUGIN_VM)) {
       text.innerText = str('MESSAGE_FOLDER_SHARED_WITH_CROSTINI_AND_PLUGIN_VM');
       button.setAttribute(
           'href', 'chrome://os-settings/app-management/pluginVm/sharedPaths');
       return;
     }
-    if (context.type === constants.PLUGIN_VM) {
+    if (context.type === PLUGIN_VM) {
       text.innerText = str('MESSAGE_FOLDER_SHARED_WITH_PLUGIN_VM');
       button.setAttribute(
           'href', 'chrome://os-settings/app-management/pluginVm/sharedPaths');
diff --git a/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler.js b/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler.js
deleted file mode 100644
index d65f594..0000000
--- a/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler.js
+++ /dev/null
@@ -1,398 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {assertInstanceof} from 'chrome://resources/ash/common/assert.js';
-import {dispatchPropertyChange} from 'chrome://resources/ash/common/cr_deprecated.js';
-import {NativeEventTarget as EventTarget} from 'chrome://resources/ash/common/event_target.js';
-
-import {crInjectTypeAndInit} from '../../../common/js/cr_ui.js';
-
-import {Menu} from './menu.js';
-import {MenuItem} from './menu_item.js';
-import {HideType} from './multi_menu_button.js';
-import {positionPopupAtPoint} from './position_util.js';
-
-/**
- * Handles context menus.
- * @implements {EventListener}
- */
-// @ts-ignore: error TS2420: Class 'ContextMenuHandler' incorrectly implements
-// interface 'EventListener'.
-class ContextMenuHandler extends EventTarget {
-  constructor() {
-    super();
-    /** @private @type {AbortController|null} */
-    this.abortController_ = null;
-
-    /**
-     * The menu that we are currently showing.
-     * @private @type {?Menu}
-     */
-    this.menu_ = null;
-
-    /** @private @type {?number} */
-    this.hideTimestamp_ = null;
-
-    /** @private @type {boolean} */
-    this.keyIsDown_ = false;
-
-    /** @private @type {?ResizeObserver} */
-    this.resizeObserver_ = null;
-  }
-
-  get menu() {
-    return this.menu_;
-  }
-
-  /**
-   * @param {!HTMLElement} target
-   * @param {number} clientX
-   * @param {number} clientY
-   * @return {{x: number, y: number}}
-   * @private
-   */
-  getMenuPosition_(target, clientX, clientY) {
-    // When the user presses the context menu key (on the keyboard) we need
-    // to detect this.
-    let x;
-    let y;
-    if (this.keyIsDown_) {
-      // @ts-ignore: error TS2339: Property 'getRectForContextMenu' does not
-      // exist on type 'HTMLElement'.
-      const rect = target.getRectForContextMenu ?
-          // @ts-ignore: error TS2339: Property 'getRectForContextMenu' does not
-          // exist on type 'HTMLElement'.
-          target.getRectForContextMenu() :
-          target.getBoundingClientRect();
-      const offset = Math.min(rect.width, rect.height) / 2;
-      x = rect.left + offset;
-      y = rect.top + offset;
-    } else {
-      x = clientX;
-      y = clientY;
-    }
-
-    return {x, y};
-  }
-
-  /**
-   * Shows a menu as a context menu.
-   * @param {!Event} e The event triggering the show (usually a contextmenu
-   *     event).
-   * @param {!Menu} menu The menu to show.
-   */
-  showMenu(e, menu) {
-    // @ts-ignore: error TS2339: Property 'updateCommands' does not exist on
-    // type 'Menu'.
-    menu.updateCommands(assertInstanceof(e.currentTarget, Node));
-    // @ts-ignore: error TS2339: Property 'hasVisibleItems' does not exist on
-    // type 'Menu'.
-    if (!menu.hasVisibleItems()) {
-      return;
-    }
-
-    const {x, y} = this.getMenuPosition_(
-        // @ts-ignore: error TS2339: Property 'clientY' does not exist on type
-        // 'Event'.
-        /** @type {!HTMLElement} */ (e.currentTarget), e.clientX, e.clientY);
-    this.menu_ = menu;
-    // @ts-ignore: error TS2339: Property 'classList' does not exist on type
-    // 'Menu'.
-    menu.classList.remove('hide-delayed');
-    // @ts-ignore: error TS2339: Property 'show' does not exist on type 'Menu'.
-    menu.show({x, y});
-    // @ts-ignore: error TS2339: Property 'contextElement' does not exist on
-    // type 'Menu'.
-    menu.contextElement = e.currentTarget;
-
-    // When the menu is shown we steal a lot of events.
-    // @ts-ignore: error TS2339: Property 'ownerDocument' does not exist on type
-    // 'Menu'.
-    const doc = menu.ownerDocument;
-    if (this.resizeObserver_) {
-      this.resizeObserver_.disconnect();
-    }
-    // @ts-ignore: error TS6133: 'entries' is declared but its value is never
-    // read.
-    this.resizeObserver_ = new ResizeObserver((entries) => {
-      // @ts-ignore: error TS2345: Argument of type 'Menu' is not assignable to
-      // parameter of type 'HTMLElement'.
-      positionPopupAtPoint(x, y, menu);
-    });
-    // @ts-ignore: error TS2345: Argument of type 'Menu' is not assignable to
-    // parameter of type 'Element'.
-    this.resizeObserver_.observe(menu);
-    this.abortController_ = new AbortController();
-    doc.addEventListener(
-        'keydown', this, {signal: this.abortController_.signal, capture: true});
-    doc.addEventListener(
-        'mousedown', this,
-        {signal: this.abortController_.signal, capture: true});
-    doc.addEventListener(
-        'touchstart', this,
-        {signal: this.abortController_.signal, capture: true});
-    doc.addEventListener('focus', this, {signal: this.abortController_.signal});
-    doc.defaultView?.addEventListener(
-        'popstate', this, {signal: this.abortController_.signal});
-    doc.defaultView?.addEventListener(
-        'resize', this, {signal: this.abortController_.signal});
-    doc.defaultView?.addEventListener(
-        'blur', this, {signal: this.abortController_.signal});
-    menu.addEventListener(
-        'contextmenu', this, {signal: this.abortController_.signal});
-    menu.addEventListener(
-        'activate', this, {signal: this.abortController_.signal});
-
-    const ev =
-        new CustomEvent('show', {detail: {element: menu.contextElement, menu}});
-    this.dispatchEvent(ev);
-  }
-
-  /**
-   * Hide the currently shown menu.
-   * @param {HideType=} opt_hideType Type of hide.
-   *     default: HideType.INSTANT.
-   */
-  hideMenu(opt_hideType) {
-    const menu = this.menu;
-    if (!menu) {
-      return;
-    }
-
-    if (opt_hideType === HideType.DELAYED) {
-      // @ts-ignore: error TS2339: Property 'classList' does not exist on type
-      // 'Menu'.
-      menu.classList.add('hide-delayed');
-    } else {
-      // @ts-ignore: error TS2339: Property 'classList' does not exist on type
-      // 'Menu'.
-      menu.classList.remove('hide-delayed');
-    }
-    // @ts-ignore: error TS2339: Property 'hide' does not exist on type 'Menu'.
-    menu.hide();
-    // @ts-ignore: error TS2339: Property 'contextElement' does not exist on
-    // type 'Menu'.
-    const originalContextElement = menu.contextElement;
-    // @ts-ignore: error TS2339: Property 'contextElement' does not exist on
-    // type 'Menu'.
-    menu.contextElement = null;
-    this.abortController_?.abort();
-    if (this.resizeObserver_) {
-      // @ts-ignore: error TS2345: Argument of type 'Menu' is not assignable to
-      // parameter of type 'Element'.
-      this.resizeObserver_.unobserve(menu);
-      this.resizeObserver_ = null;
-    }
-    menu.selectedIndex = -1;
-    this.menu_ = null;
-
-    // On windows we might hide the menu in a right mouse button up and if
-    // that is the case we wait some short period before we allow the menu
-    // to be shown again.
-    this.hideTimestamp_ = 0;
-
-    const ev = new CustomEvent(
-        'hide', {detail: {element: originalContextElement, menu}});
-    this.dispatchEvent(ev);
-  }
-
-  /**
-   * Handles event callbacks.
-   * @param {!Event} e The event object.
-   */
-  handleEvent(e) {
-    // Keep track of keydown state so that we can use that to determine the
-    // reason for the contextmenu event.
-    switch (e.type) {
-      case 'keydown':
-        // @ts-ignore: error TS2339: Property 'altKey' does not exist on type
-        // 'Event'.
-        this.keyIsDown_ = !e.ctrlKey && !e.altKey &&
-            // context menu key or Shift-F10
-            // @ts-ignore: error TS2339: Property 'shiftKey' does not exist on
-            // type 'Event'.
-            (e.keyCode === 93 && !e.shiftKey || e.key === 'F10' && e.shiftKey);
-        break;
-
-      case 'keyup':
-        this.keyIsDown_ = false;
-        break;
-    }
-
-    // Context menu is handled even when we have no menu.
-    if (e.type !== 'contextmenu' && !this.menu) {
-      return;
-    }
-
-    switch (e.type) {
-      case 'mousedown':
-        // @ts-ignore: error TS2339: Property 'contains' does not exist on type
-        // 'Menu'.
-        if (!this.menu.contains(e.target)) {
-          this.hideMenu();
-        } else {
-          e.preventDefault();
-        }
-        break;
-
-      case 'touchstart':
-        // @ts-ignore: error TS2339: Property 'contains' does not exist on type
-        // 'Menu'.
-        if (!this.menu.contains(e.target)) {
-          this.hideMenu();
-        }
-        break;
-
-      case 'keydown':
-        // @ts-ignore: error TS2339: Property 'key' does not exist on type
-        // 'Event'.
-        if (e.key === 'Escape') {
-          this.hideMenu();
-          e.stopPropagation();
-          e.preventDefault();
-
-          // If the menu is visible we let it handle all the keyboard events
-          // unless Ctrl is held down.
-          // @ts-ignore: error TS2339: Property 'ctrlKey' does not exist on type
-          // 'Event'.
-        } else if (this.menu && !e.ctrlKey) {
-          // @ts-ignore: error TS2339: Property 'handleKeyDown' does not exist
-          // on type 'Menu'.
-          this.menu.handleKeyDown(e);
-          e.preventDefault();
-          e.stopPropagation();
-        }
-        break;
-
-      case 'activate':
-        const hideDelayed = e.target instanceof MenuItem && e.target.checkable;
-        this.hideMenu(hideDelayed ? HideType.DELAYED : HideType.INSTANT);
-        break;
-
-      case 'focus':
-        // @ts-ignore: error TS2339: Property 'contains' does not exist on type
-        // 'Menu'.
-        if (!this.menu.contains(e.target)) {
-          this.hideMenu();
-        }
-        break;
-
-      case 'blur':
-        this.hideMenu();
-        break;
-
-      case 'popstate':
-      case 'resize':
-        this.hideMenu();
-        break;
-
-      case 'contextmenu':
-        // @ts-ignore: error TS2339: Property 'contains' does not exist on type
-        // 'Menu'.
-        if ((!this.menu || !this.menu.contains(e.target)) &&
-            (!this.hideTimestamp_ || Date.now() - this.hideTimestamp_ > 50)) {
-          // @ts-ignore: error TS2339: Property 'contextMenu' does not exist on
-          // type 'EventTarget'.
-          this.showMenu(e, e.currentTarget.contextMenu);
-        }
-        e.preventDefault();
-        // Don't allow elements further up in the DOM to show their menus.
-        e.stopPropagation();
-        break;
-    }
-  }
-
-  /**
-   * Adds a contextMenu property to an element or element class.
-   * @param {!Element|!Function} elementOrClass The element or class to add
-   *     the contextMenu property to.
-   */
-  addContextMenuProperty(elementOrClass) {
-    const target = typeof elementOrClass === 'function' ?
-        elementOrClass.prototype :
-        elementOrClass;
-
-    Object.defineProperty(target, 'contextMenu', {
-      get: function() {
-        return this.contextMenu_;
-      },
-      set: function(menu) {
-        const oldContextMenu = this.contextMenu;
-
-        if (typeof menu === 'string' && menu[0] === '#') {
-          menu = this.ownerDocument.getElementById(menu.slice(1));
-          crInjectTypeAndInit(menu, Menu);
-        }
-
-        if (menu === oldContextMenu) {
-          return;
-        }
-
-        if (oldContextMenu && !menu) {
-          this.removeEventListener('contextmenu', contextMenuHandler);
-          this.removeEventListener('keydown', contextMenuHandler);
-          this.removeEventListener('keyup', contextMenuHandler);
-        }
-        if (menu && !oldContextMenu) {
-          this.addEventListener('contextmenu', contextMenuHandler);
-          this.addEventListener('keydown', contextMenuHandler);
-          this.addEventListener('keyup', contextMenuHandler);
-        }
-
-        this.contextMenu_ = menu;
-
-        if (menu && menu.id) {
-          this.setAttribute('contextmenu', '#' + menu.id);
-        }
-
-        dispatchPropertyChange(this, 'contextMenu', menu, oldContextMenu);
-      },
-    });
-
-    if (!target.getRectForContextMenu) {
-      /**
-       * @return {!ClientRect} The rect to use for positioning the context
-       *     menu when the context menu is not opened using a mouse position.
-       */
-      target.getRectForContextMenu = function() {
-        return this.getBoundingClientRect();
-      };
-    }
-  }
-
-  /**
-   * Sets the given contextMenu to the given element. A contextMenu property
-   * would be added if necessary.
-   * @param {!Element} element The element or class to set the contextMenu to.
-   * @param {!Menu} contextMenu The contextMenu property to be set.
-   */
-  setContextMenu(element, contextMenu) {
-    // @ts-ignore: error TS2339: Property 'contextMenu' does not exist on type
-    // 'Element'.
-    if (!element.contextMenu) {
-      this.addContextMenuProperty(element);
-    }
-    // @ts-ignore: error TS2339: Property 'contextMenu' does not exist on type
-    // 'Element'.
-    element.contextMenu = contextMenu;
-  }
-}
-
-/**
- * Use this interface to define an element that also might have a context menu
- * attached, e.g. HTMLInputElement & WithContextMenu.
- * @interface
- */
-export class WithContextMenu {
-  constructor() {
-    /** @type {Menu|undefined} */
-    this.contextMenu = undefined;
-  }
-}
-
-/**
- * The singleton context menu handler.
- * @type {!ContextMenuHandler}
- */
-export const contextMenuHandler = new ContextMenuHandler();
diff --git a/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler.ts b/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler.ts
new file mode 100644
index 0000000..e6b0069
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler.ts
@@ -0,0 +1,338 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {dispatchPropertyChange} from 'chrome://resources/ash/common/cr_deprecated.js';
+import {assertInstanceof} from 'chrome://resources/js/assert.js';
+
+import {crInjectTypeAndInit} from '../../../common/js/cr_ui.js';
+import {CustomEventMap, FilesEventTarget} from '../../../common/js/files_event_target.js';
+
+import {Menu} from './menu.js';
+import {MenuItem} from './menu_item.js';
+import {HideType} from './multi_menu_button.js';
+import {positionPopupAtPoint} from './position_util.js';
+
+interface ContextMenuEventDetail {
+  element: HTMLElement;
+  menu: Menu;
+}
+
+export type HideEvent = CustomEvent<ContextMenuEventDetail>;
+
+export type ShowEvent = CustomEvent<ContextMenuEventDetail>;
+
+interface ContextMenuHandlerEventMap extends CustomEventMap {
+  'show': ShowEvent;
+  'hide': HideEvent;
+}
+
+/**
+ * Handles context menus.
+ */
+class ContextMenuHandler extends FilesEventTarget<ContextMenuHandlerEventMap> {
+  private abortController_: AbortController|null = null;
+
+  private menu_: Menu|null = null;
+  private hideTimestamp_: number|null = null;
+  private keyIsDown_ = false;
+  private resizeObserver_: ResizeObserver|null = null;
+
+  get menu() {
+    return this.menu_;
+  }
+
+  private getMenuPosition_(
+      target: HTMLElement, clientX: number,
+      clientY: number): {x: number, y: number} {
+    // When the user presses the context menu key (on the keyboard) we need
+    // to detect this.
+    let x;
+    let y;
+    if (this.keyIsDown_) {
+      let rect: DOMRect;
+      if ('getRectForContextMenu' in target) {
+        rect = (target.getRectForContextMenu as (() => DOMRect))();
+      } else {
+        rect = target.getBoundingClientRect();
+      }
+      const offset = Math.min(rect.width, rect.height) / 2;
+      x = rect.left + offset;
+      y = rect.top + offset;
+    } else {
+      x = clientX;
+      y = clientY;
+    }
+
+    return {x, y};
+  }
+
+  /**
+   * Shows a menu as a context menu.
+   * @param e The event triggering the show (usually a contextmenu event).
+   * @param menu The menu to show.
+   */
+  showMenu(e: MouseEvent, menu: Menu) {
+    assertInstanceof(e.currentTarget, Node);
+    menu.updateCommands(e.currentTarget);
+    if (!menu.hasVisibleItems()) {
+      return;
+    }
+
+    const htmlElement = e.currentTarget as HTMLElement;
+    const {x, y} = this.getMenuPosition_(htmlElement, e.clientX, e.clientY);
+    this.menu_ = menu;
+    menu.classList.remove('hide-delayed');
+    menu.show({x, y});
+    menu.contextElement = htmlElement;
+
+    // When the menu is shown we steal a lot of events.
+    const doc = menu.ownerDocument;
+    if (this.resizeObserver_) {
+      this.resizeObserver_.disconnect();
+    }
+    this.resizeObserver_ = new ResizeObserver((_entries) => {
+      positionPopupAtPoint(x, y, menu);
+    });
+    this.resizeObserver_.observe(menu);
+    this.abortController_ = new AbortController();
+    const signal = this.abortController_.signal;
+    doc.addEventListener(
+        'keydown', this.handleKeyboardEvent_.bind(this),
+        {signal, capture: true});
+    doc.addEventListener(
+        'mousedown', this.handleMouseEvent_.bind(this),
+        {signal, capture: true});
+    doc.addEventListener(
+        'touchstart', this.handleTouchEvent_.bind(this),
+        {signal, capture: true});
+    doc.addEventListener('focus', this.handleFocusEvent_.bind(this), {signal});
+    doc.defaultView?.addEventListener(
+        'popstate', this.handleHideMenuEvent_.bind(this), {signal});
+    doc.defaultView?.addEventListener(
+        'resize', this.handleHideMenuEvent_.bind(this), {signal});
+    doc.defaultView?.addEventListener(
+        'blur', this.handleHideMenuEvent_.bind(this), {signal});
+    menu.addEventListener(
+        'contextmenu', this.handleContextMenuEvent_.bind(this), {signal});
+    menu.addEventListener(
+        'activate', this.handleActivateEvent_.bind(this), {signal});
+
+    const ev =
+        new CustomEvent('show', {detail: {element: menu.contextElement, menu}});
+    this.dispatchEvent(ev);
+  }
+
+  /**
+   * Hide the currently shown menu.
+   * @param hideType Type of hide.
+   *     default: HideType.INSTANT.
+   */
+  hideMenu(hideType?: HideType) {
+    const menu = this.menu;
+    if (!menu) {
+      return;
+    }
+
+    if (hideType === HideType.DELAYED) {
+      menu.classList.add('hide-delayed');
+    } else {
+      menu.classList.remove('hide-delayed');
+    }
+    menu.hide();
+    const originalContextElement = menu.contextElement;
+    menu.contextElement = null;
+    this.abortController_?.abort();
+    if (this.resizeObserver_) {
+      this.resizeObserver_.unobserve(menu);
+      this.resizeObserver_ = null;
+    }
+    menu.selectedIndex = -1;
+    this.menu_ = null;
+
+    // On windows we might hide the menu in a right mouse button up and if
+    // that is the case we wait some short period before we allow the menu
+    // to be shown again.
+    this.hideTimestamp_ = 0;
+
+    const ev = new CustomEvent(
+        'hide', {detail: {element: originalContextElement, menu}});
+    this.dispatchEvent(ev);
+  }
+
+  private handleKeyboardEvent_(e: KeyboardEvent) {
+    // Keep track of keydown state so that we can use that to determine the
+    // reason for the contextmenu event.
+    switch (e.type) {
+      case 'keydown':
+        this.keyIsDown_ = !e.ctrlKey && !e.altKey &&
+            // context menu key or Shift-F10.
+            (e.keyCode === 93 && !e.shiftKey || e.key === 'F10' && e.shiftKey);
+        break;
+      case 'keyup':
+        this.keyIsDown_ = false;
+        break;
+    }
+
+    if (!this.menu || e.type !== 'keydown') {
+      return;
+    }
+
+    if (e.key === 'Escape') {
+      this.hideMenu();
+      e.stopPropagation();
+      e.preventDefault();
+
+      // If the menu is visible we let it handle all the keyboard events
+      // unless Ctrl is held down.
+    } else if (this.menu && !e.ctrlKey) {
+      this.menu.handleKeyDown(e);
+      e.preventDefault();
+      e.stopPropagation();
+    }
+  }
+
+  private handleTouchEvent_(e: TouchEvent) {
+    if (!this.menu?.contains(e.target as Node)) {
+      this.hideMenu();
+    }
+  }
+
+  private handleFocusEvent_(e: FocusEvent) {
+    if (!this.menu?.contains(e.target as Node)) {
+      this.hideMenu();
+    }
+  }
+
+  private handleHideMenuEvent_(_e: Event) {
+    if (this.menu) {
+      this.hideMenu();
+    }
+  }
+
+  private handleActivateEvent_(e: Event) {
+    if (this.menu) {
+      const hideDelayed = e.target instanceof MenuItem && e.target.checkable;
+      this.hideMenu(hideDelayed ? HideType.DELAYED : HideType.INSTANT);
+    }
+  }
+
+  private handleContextMenuEvent_(e: MouseEvent) {
+    if ((!this.menu || !this.menu.contains(e.target as Node)) &&
+        (!this.hideTimestamp_ || Date.now() - this.hideTimestamp_ > 50)) {
+      this.showMenu(
+          e, (e.currentTarget as Element & WithContextMenu).contextMenu!);
+    }
+    e.preventDefault();
+    e.stopPropagation();
+  }
+
+  /**
+   * Handles mouse event callbacks.
+   */
+  private handleMouseEvent_(e: MouseEvent) {
+    if (!this.menu) {
+      return;
+    }
+
+    if (!this.menu.contains(e.target as Node)) {
+      this.hideMenu();
+    } else {
+      e.preventDefault();
+    }
+  }
+
+  /**
+   * Adds a contextMenu property to an element or element class.
+   * @param elementOrClass The element or class to add the contextMenu property
+   *     to.
+   */
+  addContextMenuProperty(elementOrClass: Element|Function) {
+    const target = typeof elementOrClass === 'function' ?
+        elementOrClass.prototype :
+        elementOrClass;
+
+    Object.defineProperty(target, 'contextMenu', {
+      get: function() {
+        return this.contextMenu_;
+      },
+      set: function(menu) {
+        const oldContextMenu = this.contextMenu;
+
+        if (typeof menu === 'string' && menu[0] === '#') {
+          menu = this.ownerDocument.getElementById(menu.slice(1));
+          crInjectTypeAndInit(menu, Menu);
+        }
+
+        if (menu === oldContextMenu) {
+          return;
+        }
+
+        if (oldContextMenu && !menu) {
+          this.abortController_?.abort();
+        }
+        if (menu && !oldContextMenu) {
+          this.abortController_ = new AbortController();
+          const signal = this.abortController_.signal;
+          this.addEventListener(
+              'contextmenu',
+              contextMenuHandler.handleContextMenuEvent_.bind(
+                  contextMenuHandler),
+              {signal});
+          this.addEventListener(
+              'keydown',
+              contextMenuHandler.handleKeyboardEvent_.bind(contextMenuHandler),
+              {signal});
+          this.addEventListener(
+              'keyup',
+              contextMenuHandler.handleKeyboardEvent_.bind(contextMenuHandler),
+              {signal});
+        }
+
+        this.contextMenu_ = menu;
+
+        if (menu && menu.id) {
+          this.setAttribute('contextmenu', '#' + menu.id);
+        }
+
+        dispatchPropertyChange(this, 'contextMenu', menu, oldContextMenu);
+      },
+    });
+
+    if (!target.getRectForContextMenu) {
+      /**
+       * @return The rect to use for positioning the context menu when the
+       *     context menu is not opened using a mouse position.
+       */
+      target.getRectForContextMenu = function(): ClientRect {
+        return this.getBoundingClientRect();
+      };
+    }
+  }
+
+  /**
+   * Sets the given contextMenu to the given element. A contextMenu property
+   * would be added if necessary.
+   * @param element The element or class to set the contextMenu to.
+   * @param contextMenu The contextMenu property to be set.
+   */
+  setContextMenu(element: Element&WithContextMenu, contextMenu: Menu) {
+    if (!element || !element.contextMenu) {
+      this.addContextMenuProperty(element);
+    }
+    element.contextMenu = contextMenu;
+  }
+}
+
+/**
+ * Use this interface to define an element that also might have a context menu
+ * attached, e.g. HTMLInputElement & WithContextMenu.
+ */
+export interface WithContextMenu {
+  contextMenu?: Menu;
+}
+
+/**
+ * The singleton context menu handler.
+ */
+export const contextMenuHandler = new ContextMenuHandler();
diff --git a/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler_unittest.js b/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler_unittest.js
deleted file mode 100644
index f666a02..0000000
--- a/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler_unittest.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {assertEquals} from 'chrome://webui-test/chromeos/chai_assert.js';
-
-import {crInjectTypeAndInit} from '../../../common/js/cr_ui.js';
-
-import {contextMenuHandler} from './context_menu_handler.js';
-import {Menu} from './menu.js';
-
-export function testShowAndHideEvents() {
-  // Keep original Date.now not to affect other code.
-  const originalDateNow = Date.now;
-
-  // Initial value is 1 since 0 becomes false.
-  let currentTime = 1;
-
-  // Overrides Date.now to simulate time.
-  Date.now = function() {
-    return currentTime;
-  };
-
-  const cmh = contextMenuHandler;
-
-  // Create context menu.
-  const menu = document.createElement('div');
-  crInjectTypeAndInit(menu, Menu);
-  document.body.appendChild(menu);
-
-  const menuItem = document.createElement('div');
-  // @ts-ignore: error TS2339: Property 'addMenuItem' does not exist on type
-  // 'HTMLDivElement'.
-  menu.addMenuItem(menuItem);
-
-  // Create target elements.
-  const elem1 = document.createElement('div');
-  const elem2 = document.createElement('div');
-
-  // @ts-ignore: error TS2345: Argument of type 'HTMLDivElement' is not
-  // assignable to parameter of type 'Menu'.
-  cmh.setContextMenu(elem1, menu);
-  // @ts-ignore: error TS2345: Argument of type 'HTMLDivElement' is not
-  // assignable to parameter of type 'Menu'.
-  cmh.setContextMenu(elem2, menu);
-
-  // @ts-ignore: error TS7034: Variable 'events' implicitly has type 'any[]' in
-  // some locations where its type cannot be determined.
-  const events = [];
-  cmh.addEventListener('show', function(e) {
-    events.push(e);
-  });
-  cmh.addEventListener('hide', function(e) {
-    events.push(e);
-  });
-
-  // Show context menu of elem1.
-  elem1.dispatchEvent(new MouseEvent('contextmenu'));
-  assertEquals(1, events.length);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals('show', events[0].type);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals(elem1, events[0].detail.element);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals(menu, events[0].detail.menu);
-
-  // Show context menu of elem2.
-  document.dispatchEvent(new MouseEvent('mousedown'));
-
-  // On Windows to prevent context menu show again by mouse right button up,
-  // we need to wait at least 50ms from the last hide of context menu.
-  currentTime += 51;  // ms
-
-  elem2.dispatchEvent(new MouseEvent('contextmenu'));
-  assertEquals(3, events.length);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals('hide', events[1].type);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals(elem1, events[1].detail.element);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals(menu, events[1].detail.menu);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals('show', events[2].type);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals(elem2, events[2].detail.element);
-  // @ts-ignore: error TS7005: Variable 'events' implicitly has an 'any[]' type.
-  assertEquals(menu, events[2].detail.menu);
-
-  Date.now = originalDateNow;
-}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler_unittest.ts b/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler_unittest.ts
new file mode 100644
index 0000000..388609a
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/ui/context_menu_handler_unittest.ts
@@ -0,0 +1,72 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {assertEquals} from 'chrome://webui-test/chromeos/chai_assert.js';
+
+import {crInjectTypeAndInit} from '../../../common/js/cr_ui.js';
+
+import type {HideEvent, ShowEvent} from './context_menu_handler.js';
+import {contextMenuHandler} from './context_menu_handler.js';
+import {Menu} from './menu.js';
+
+export async function testShowAndHideEvents() {
+  // Keep original Date.now not to affect other code.
+  const originalDateNow = Date.now;
+
+  // Initial value is 1 since 0 becomes false.
+  let currentTime = 1;
+
+  // Overrides Date.now to simulate time.
+  Date.now = function() {
+    return currentTime;
+  };
+
+  const cmh = contextMenuHandler;
+
+  // Create context menu.
+  const rawDiv = document.createElement('div');
+  const menu = crInjectTypeAndInit(rawDiv, Menu);
+  document.body.appendChild(menu);
+
+  menu.addMenuItem();
+
+  // Create target elements.
+  const elem1 = document.createElement('div');
+  const elem2 = document.createElement('div');
+
+  cmh.setContextMenu(elem1, menu);
+  cmh.setContextMenu(elem2, menu);
+
+  const events: Array<ShowEvent|HideEvent> = [];
+  cmh.addEventListener('show', function(e) {
+    events.push(e);
+  });
+  cmh.addEventListener('hide', function(e) {
+    events.push(e);
+  });
+
+  // Show context menu of elem1.
+  elem1.dispatchEvent(new MouseEvent('contextmenu'));
+  assertEquals('show', events[0]!.type);
+  assertEquals(elem1, events[0]!.detail.element);
+  assertEquals(menu, events[0]!.detail.menu);
+
+  // Show context menu of elem2.
+  document.dispatchEvent(new MouseEvent('mousedown'));
+
+  // On Windows to prevent context menu show again by mouse right button up,
+  // we need to wait at least 50ms from the last hide of context menu.
+  currentTime += 51;  // ms
+
+  elem2.dispatchEvent(new MouseEvent('contextmenu'));
+  assertEquals(3, events.length);
+  assertEquals('hide', events[1]!.type);
+  assertEquals(elem1, events[1]!.detail.element);
+  assertEquals(menu, events[1]!.detail.menu);
+  assertEquals('show', events[2]!.type);
+  assertEquals(elem2, events[2]!.detail.element);
+  assertEquals(menu, events[2]!.detail.menu);
+
+  Date.now = originalDateNow;
+}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/default_task_dialog.js b/ui/file_manager/file_manager/foreground/js/ui/default_task_dialog.js
index 0610a7bb..b48648fb 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/default_task_dialog.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/default_task_dialog.js
@@ -17,7 +17,7 @@
  */
 export class DefaultTaskDialog extends FileManagerDialogBase {
   /**
-   * @param {HTMLDialogElement} parentNode Node to be parent for this dialog.
+   * @param {HTMLElement} parentNode Node to be parent for this dialog.
    */
   constructor(parentNode) {
     super(parentNode);
diff --git a/ui/file_manager/file_manager/foreground/js/ui/dialogs.ts b/ui/file_manager/file_manager/foreground/js/ui/dialogs.ts
index 90bd5ed..3cf7752 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/dialogs.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/dialogs.ts
@@ -65,7 +65,7 @@
 
   private tabIndexes_: string[]|null = null;
 
-  constructor(protected parentNode_: HTMLDialogElement) {
+  constructor(protected parentNode_: HTMLElement) {
     const doc = this.parentNode_.ownerDocument;
     this.document_ = doc;
     this.container = doc.createElement('div');
@@ -349,7 +349,7 @@
 
 /** AlertDialog contains just a message and an ok button. */
 export class AlertDialog extends BaseDialog {
-  constructor(parentNode: HTMLDialogElement) {
+  constructor(parentNode: HTMLElement) {
     super(parentNode);
     this.cancelButton.style.display = 'none';
   }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
index b8654178..123df2d 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -17,7 +17,7 @@
 import {FilesAppDirEntry} from '../../../externs/files_app_entry_interfaces.js';
 import {PropStatus, SearchData, SearchLocation, State} from '../../../externs/ts/state.js';
 import {getStore} from '../../../state/store.js';
-import {constants} from '../constants.js';
+import {DLP_METADATA_PREFETCH_PROPERTY_NAMES, LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES} from '../constants.js';
 import {FileFilter} from '../directory_contents.js';
 import {DirectoryModel} from '../directory_model.js';
 import {MetadataModel} from '../metadata/metadata_model.js';
@@ -624,8 +624,8 @@
           if (this.insideDrive) {
             this.parentTree_.metadataModel_.get(
                 this.entries_,
-                constants.LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES
-                    .concat(constants.DLP_METADATA_PREFETCH_PROPERTY_NAMES));
+                LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES.concat(
+                    DLP_METADATA_PREFETCH_PROPERTY_NAMES));
           }
 
           recordInterval(metricName);
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base.ts b/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base.ts
index 40eae42..091b705a 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base.ts
@@ -19,7 +19,7 @@
   /**
    * @param parentNode Parent node of the dialog.
    */
-  constructor(parentNode: HTMLDialogElement) {
+  constructor(parentNode: HTMLElement) {
     super(parentNode);
 
     this.container.classList.add('files-ng');
@@ -120,11 +120,16 @@
 
     super.show_(title, onOk, onCancel, onShow);
 
-    this.parentNode_.showModal();
+    this.parentNode.showModal();
+  }
+
+  get parentNode(): HTMLDialogElement {
+    this.parentNode_ = getFilesAppModalDialogInstance();
+    return this.parentNode_ as HTMLDialogElement;
   }
 
   override hide(onHide?: VoidCallback) {
-    this.parentNode_.close();
+    this.parentNode.close();
 
     FileManagerDialogBase.shown = false;
     super.hide(onHide);
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.ts
similarity index 75%
rename from ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js
rename to ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.ts
index fa8b792..3fb73bb 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.ts
@@ -8,17 +8,15 @@
 
 import {FileManagerDialogBase} from './file_manager_dialog_base.js';
 
-// @ts-ignore: error TS7006: Parameter 'done' implicitly has an 'any' type.
-export async function testShowDialogAfterHide(done) {
+export async function testShowDialogAfterHide() {
   const dialogElement = document.createElement('dialog');
   document.body.append(dialogElement);
   const dialog = new FileManagerDialogBase(dialogElement);
 
-  /** @return {boolean} True if cr.ui.dialog container has .shown class */
-  function isShown() {
+  /** Returns true if cr.ui.dialog container has .shown class */
+  function isShown(): boolean {
     const element = document.querySelector('.cr-dialog-container');
-    // @ts-ignore: error TS18047: 'element' is possibly 'null'.
-    return element.classList.contains('shown');
+    return !!element?.classList.contains('shown');
   }
 
   // Show the dialog and wait until .shown is set on .cr-dialog-container.
@@ -35,6 +33,4 @@
   // the dialog showing again at all if it was called too soon.
   dialog.showBlankDialog();
   await waitUntil(isShown);
-
-  done();
 }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.ts b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.ts
index ac2fd1d..b20700f4 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.ts
@@ -167,7 +167,7 @@
   /**
    * The toolbar which contains controls.
    */
-  readonly toolbar: Element;
+  readonly toolbar: HTMLElement;
 
   /**
    * The tooltip element.
@@ -288,7 +288,7 @@
    * @param launchParam Launch param.
    */
   constructor(
-      providersModel: ProvidersModel, public element: HTMLDialogElement,
+      providersModel: ProvidersModel, public element: HTMLElement,
       launchParam: LaunchParam) {
     // Initialize the dialog label. This should be done before constructing
     // dialog instances.
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js b/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js
deleted file mode 100644
index 217a771c..0000000
--- a/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {dispatchSimpleEvent} from 'chrome://resources/ash/common/cr_deprecated.js';
-import {NativeEventTarget as EventTarget} from 'chrome://resources/ash/common/event_target.js';
-
-import {bytesToString, getCurrentLocaleOrDefault, strf} from '../../../common/js/translations.js';
-
-/**
- * Formatter class for file metadatas.
- */
-export class FileMetadataFormatter extends EventTarget {
-  constructor() {
-    super();
-
-    /** @private @type {?Intl.DateTimeFormat} */
-    this.timeFormatter_;
-
-    /** @private @type {?Intl.DateTimeFormat} */
-    this.dateFormatter_;
-  }
-
-  /**
-   * Sets date and time format.
-   * @param {boolean} use12hourClock True if 12 hours clock, False if 24 hours.
-   */
-  setDateTimeFormat(use12hourClock) {
-    const locale = getCurrentLocaleOrDefault();
-    const options = {
-      hour: 'numeric',
-      minute: 'numeric',
-    };
-    if (use12hourClock) {
-      // @ts-ignore: error TS2551: Property 'hour12' does not exist on type '{
-      // hour: string; minute: string; }'. Did you mean 'hour'?
-      options['hour12'] = true;
-    } else {
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type '"hourCycle"' can't be used to index type '{ hour:
-      // string; minute: string; }'.
-      options['hourCycle'] = 'h23';
-    }
-    // @ts-ignore: error TS2345: Argument of type '{ hour: string; minute:
-    // string; }' is not assignable to parameter of type
-    // 'DateTimeFormatOptions'.
-    this.timeFormatter_ = new Intl.DateTimeFormat(locale, options);
-    const dateOptions = {
-      year: 'numeric',
-      month: 'short',
-      day: 'numeric',
-      hour: 'numeric',
-      minute: 'numeric',
-    };
-    if (use12hourClock) {
-      // @ts-ignore: error TS2551: Property 'hour12' does not exist on type '{
-      // year: string; month: string; day: string; hour: string; minute: string;
-      // }'. Did you mean 'hour'?
-      dateOptions['hour12'] = true;
-    } else {
-      // @ts-ignore: error TS7053: Element implicitly has an 'any' type because
-      // expression of type '"hourCycle"' can't be used to index type '{ year:
-      // string; month: string; day: string; hour: string; minute: string; }'.
-      dateOptions['hourCycle'] = 'h23';
-    }
-
-    // @ts-ignore: error TS2345: Argument of type '{ year: string; month:
-    // string; day: string; hour: string; minute: string; }' is not assignable
-    // to parameter of type 'DateTimeFormatOptions'.
-    this.dateFormatter_ = new Intl.DateTimeFormat(locale, dateOptions);
-    dispatchSimpleEvent(this, 'date-time-format-changed');
-  }
-
-  /**
-   * Generates a formatted modification time text.
-   * @param {Date=} modTime
-   * @return {string} A string that represents modification time.
-   */
-  formatModDate(modTime) {
-    if (!modTime) {
-      return '--';
-    }
-
-    if (!(this.timeFormatter_ && this.dateFormatter_)) {
-      this.setDateTimeFormat(true);
-    }
-
-    const today = new Date();
-    today.setHours(0);
-    today.setMinutes(0);
-    today.setSeconds(0);
-    today.setMilliseconds(0);
-
-    /**
-     * Number of milliseconds in a day.
-     */
-    const MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;
-
-    if (isNaN(modTime.getTime())) {
-      // In case of 'Invalid Date'.
-      return '--';
-    } else if (
-        // @ts-ignore: error TS2365: Operator '<' cannot be applied to types
-        // 'Date' and 'number'.
-        modTime >= today && modTime < today.getTime() + MILLISECONDS_IN_DAY) {
-      // @ts-ignore: error TS2532: Object is possibly 'undefined'.
-      return strf('TIME_TODAY', this.timeFormatter_.format(modTime));
-      // @ts-ignore: error TS2362: The left-hand side of an arithmetic operation
-      // must be of type 'any', 'number', 'bigint' or an enum type.
-    } else if (modTime >= today - MILLISECONDS_IN_DAY && modTime < today) {
-      // @ts-ignore: error TS2532: Object is possibly 'undefined'.
-      return strf('TIME_YESTERDAY', this.timeFormatter_.format(modTime));
-    } else {
-      // @ts-ignore: error TS2532: Object is possibly 'undefined'.
-      return this.dateFormatter_.format(modTime);
-    }
-  }
-
-  /**
-   * Generates a formatted filesize text.
-   * @param {number=} size
-   * @param {boolean=} hosted
-   * @param {boolean=} addPrecision addPrecision used to optionally add more
-   *     precision digits to the formatted filesize text.
-   * @return {string} A string that represents a file size.
-   */
-  formatSize(size, hosted, addPrecision = false) {
-    if (size === null || size === undefined) {
-      return '...';
-    } else if (size === -1) {
-      return '--';
-    } else if (size === 0 && hosted) {
-      return '--';
-    } else {
-      return bytesToString(size, addPrecision ? 1 : 0);
-    }
-  }
-}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.ts b/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.ts
new file mode 100644
index 0000000..2b8d156
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.ts
@@ -0,0 +1,109 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {dispatchSimpleEvent} from 'chrome://resources/ash/common/cr_deprecated.js';
+import {NativeEventTarget as EventTarget} from 'chrome://resources/ash/common/event_target.js';
+
+import {bytesToString, getCurrentLocaleOrDefault, strf} from '../../../common/js/translations.js';
+
+/**
+ * Formatter class for file metadatas.
+ */
+export class FileMetadataFormatter extends EventTarget {
+  private timeFormatter_: Intl.DateTimeFormat|null = null;
+
+  private dateFormatter_: Intl.DateTimeFormat|null = null;
+
+  /**
+   * Sets date and time format.
+   * @param use12hourClock True if 12 hours clock, False if 24 hours.
+   */
+  setDateTimeFormat(use12hourClock: boolean) {
+    const locale = getCurrentLocaleOrDefault();
+    const options: Intl.DateTimeFormatOptions = {
+      hour: 'numeric',
+      minute: 'numeric',
+    };
+    if (use12hourClock) {
+      options['hour12'] = true;
+    } else {
+      options['hourCycle'] = 'h23';
+    }
+    this.timeFormatter_ = new Intl.DateTimeFormat(locale, options);
+    const dateOptions: Intl.DateTimeFormatOptions = {
+      year: 'numeric',
+      month: 'short',
+      day: 'numeric',
+      hour: 'numeric',
+      minute: 'numeric',
+    };
+    if (use12hourClock) {
+      dateOptions['hour12'] = true;
+    } else {
+      dateOptions['hourCycle'] = 'h23';
+    }
+
+    this.dateFormatter_ = new Intl.DateTimeFormat(locale, dateOptions);
+    dispatchSimpleEvent(this, 'date-time-format-changed');
+  }
+
+  /**
+   * Generates a formatted modification time text.
+   * @return A string that represents modification time.
+   */
+  formatModDate(modTime?: Date): string {
+    if (!modTime) {
+      return '--';
+    }
+
+    if (!(this.timeFormatter_ && this.dateFormatter_)) {
+      this.setDateTimeFormat(true);
+    }
+
+    const today = new Date();
+    today.setHours(0);
+    today.setMinutes(0);
+    today.setSeconds(0);
+    today.setMilliseconds(0);
+
+    /**
+     * Number of milliseconds in a day.
+     */
+    const MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;
+
+    if (isNaN(modTime.getTime())) {
+      // In case of 'Invalid Date'.
+      return '--';
+    } else if (
+        modTime >= today &&
+        modTime.getTime() < today.getTime() + MILLISECONDS_IN_DAY) {
+      return strf('TIME_TODAY', this.timeFormatter_!.format(modTime));
+    } else if (
+        modTime.getTime() >= today.getTime() - MILLISECONDS_IN_DAY &&
+        modTime < today) {
+      return strf('TIME_YESTERDAY', this.timeFormatter_!.format(modTime));
+    } else {
+      return this.dateFormatter_!.format(modTime);
+    }
+  }
+
+  /**
+   * Generates a formatted filesize text.
+   * @param addPrecision addPrecision used to optionally add more
+   *     precision digits to the formatted filesize text.
+   * @return A string that represents a file size.
+   */
+  formatSize(size?: number, hosted?: boolean, addPrecision: boolean = false):
+      string {
+    if (size === null || size === undefined) {
+      return '...';
+    } else if (size === -1) {
+      return '--';
+    } else if (size === 0 && hosted) {
+      return '--';
+    } else {
+      return bytesToString(size, addPrecision ? 1 : 0);
+    }
+  }
+}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_table_list.ts b/ui/file_manager/file_manager/foreground/js/ui/file_table_list.ts
index df79c01..ec6bb11 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_table_list.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_table_list.ts
@@ -21,7 +21,7 @@
 import {FileGridSelectionController} from './file_grid.js';
 import {FileListSelectionModel} from './file_list_selection_model.js';
 import {FileTable} from './file_table.js';
-import {FileTapHandler} from './file_tap_handler.js';
+import {FileTapHandler, TapEvent} from './file_tap_handler.js';
 import {List} from './list.js';
 import {ListItem} from './list_item.js';
 import {ListSelectionController} from './list_selection_controller.js';
@@ -505,11 +505,11 @@
  */
 export function handleTap(
     this: FileListSelectionController|FileGridSelectionController,
-    e: TouchEvent, index: number, eventType: FileTapHandler.TapEvent) {
+    e: TouchEvent, index: number, eventType: TapEvent) {
   const sm = this.selectionModel as FileListSelectionModel;
   const a11y = this.filesView.a11y!;
 
-  if (eventType === FileTapHandler.TapEvent.TWO_FINGER_TAP) {
+  if (eventType === TapEvent.TWO_FINGER_TAP) {
     // Prepare to open the context menu in the same manner as the right
     // click. If the target is any of the selected files, open a one for
     // those files. If the target is a non-selected file, cancel current
@@ -547,15 +547,14 @@
 
   const target = e.target as HTMLElement;
   // Single finger tap.
-  const isTap = eventType === FileTapHandler.TapEvent.TAP ||
-      eventType === FileTapHandler.TapEvent.LONG_TAP;
+  const isTap = eventType === TapEvent.TAP || eventType === TapEvent.LONG_TAP;
   // Revert to click handling for single tap on the checkmark or rename
   // input. Single tap on the item checkmark should toggle select the item.
   // Single tap on rename input should focus on input.
   const isCheckmark = target.classList.contains('detail-checkmark') ||
       target.classList.contains('detail-icon');
   const isRename = target.localName === 'input';
-  if (eventType === FileTapHandler.TapEvent.TAP && (isCheckmark || isRename)) {
+  if (eventType === TapEvent.TAP && (isCheckmark || isRename)) {
     return false;
   }
 
@@ -574,8 +573,7 @@
     sm.anchorIndex = index;
     sm.endChange();
     return true;
-  } else if (
-      sm.multiple && (eventType === FileTapHandler.TapEvent.LONG_PRESS)) {
+  } else if (sm.multiple && (eventType === TapEvent.LONG_PRESS)) {
     sm.beginChange();
     if (!sm.getCheckSelectMode()) {
       // Make sure to unselect the leading item that was not the touch
@@ -589,8 +587,7 @@
     sm.endChange();
     return true;
     // Do not toggle selection yet, so as to avoid unselecting before drag.
-  } else if (
-      eventType === FileTapHandler.TapEvent.TAP && !sm.getCheckSelectMode()) {
+  } else if (eventType === TapEvent.TAP && !sm.getCheckSelectMode()) {
     // Single tap should open the item with default action.
     // Select the item, so that MainWindowComponent will execute action of
     // it.
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_tap_handler.js b/ui/file_manager/file_manager/foreground/js/ui/file_tap_handler.ts
similarity index 61%
rename from ui/file_manager/file_manager/foreground/js/ui/file_tap_handler.js
rename to ui/file_manager/file_manager/foreground/js/ui/file_tap_handler.ts
index 5770861..64c00eb6 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_tap_handler.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_tap_handler.ts
@@ -11,64 +11,46 @@
  * to let it be handled by mouse event handlers.
  */
 export class FileTapHandler {
-  constructor() {
-    /**
-     * Whether the pointer is currently down and at the same place as the
-     * initial position.
-     * @private @type {boolean}
-     */
-    this.tapStarted_ = false;
+  /**
+   * Whether the pointer is currently down and at the same place as the
+   * initial position.
+   */
+  private tapStarted_ = false;
+  private isLongTap_ = false;
+  private isTwoFingerTap_ = false;
+  private hasLongPressProcessed_ = false;
+  private longTapDetectorTimerId_ = -1;
+  /**
+   * If defined, the identifier of the active touch. Note that 0 is a valid
+   * touch identifier.
+   */
+  private activeTouchId_: number|undefined = undefined;
 
-    /** @private @type {boolean} */
-    this.isLongTap_ = false;
+  /**
+   * The index of the item which is being touched by the active touch. Valid
+   * only when |activeTouchId_| is defined.
+   */
+  private activeItemIndex_ = -1;
 
-    /** @private @type {boolean} */
-    this.isTwoFingerTap_ = false;
+  /**
+   * Last touch X position in client co-ords.
+   */
+  private lastTouchX_ = 0;
 
-    /** @private @type {boolean} */
-    this.hasLongPressProcessed_ = false;
+  /**
+   * Last touch Y position in client co-ords.
+   */
+  private lastTouchY_ = 0;
 
-    /** @private @type {number} */
-    this.longTapDetectorTimerId_ = -1;
+  /**
+   * The absolute sum of all touch X deltas.
+   */
+  private totalMoveX_ = 0;
 
-    /**
-     * If defined, the identifier of the active touch. Note that 0 is a valid
-     * touch identifier.
-     * @private @type {number|undefined}
-     */
-    this.activeTouchId_ = undefined;
-
-    /**
-     * The index of the item which is being touched by the active touch. Valid
-     * only when |activeTouchId_| is defined.
-     * @private @type {number}
-     */
-    this.activeItemIndex_ = -1;
-
-    /**
-     * Last touch X position in client co-ords.
-     * @private @type {number}
-     */
-    this.lastTouchX_ = 0;
-
-    /**
-     * Last touch Y position in client co-ords.
-     * @private @type {number}
-     */
-    this.lastTouchY_ = 0;
-
-    /**
-     * The absolute sum of all touch X deltas.
-     * @private @type {number}
-     */
-    this.totalMoveX_ = 0;
-
-    /**
-     * The absolute sum of all touch Y deltas.
-     * @private @type {number}
-     */
-    this.totalMoveY_ = 0;
-  }
+  /**
+   * The absolute sum of all touch Y deltas.
+   */
+  private totalMoveY_ = 0;
 
   /**
    * Handles touch events. Calls touchend.preventDefault() if the |callback|
@@ -79,15 +61,17 @@
    *    ... if touchend.preventDefault() not called ...
    *      browser events: mouseover > mousedown > [mousemove] > mouseup
    *
-   * @param {!TouchEvent} event Touch event.
-   * @param {number} index Index of the target item in the file list.
-   * @param {function(!TouchEvent, number, !FileTapHandler.TapEvent):boolean}
-   *     callback Called when a tap event is detected. Should return true if it
-   *     has taken any action, and false if it ignores the event.
-   * @return {boolean} True if a tap event was detected and the |callback|
-   *     processed the event. False otherwise.
+   * @param event Touch event.
+   * @param index Index of the target item in the file list.
+   * @param callback Called when a tap event is detected. Should return true if
+   *     it has taken any action, and false if it ignores the event.
+   * @return True if a tap event was detected and the |callback| processed the
+   *     event. False otherwise.
    */
-  handleTouchEvents(event, index, callback) {
+  handleTouchEvents(
+      event: TouchEvent, index: number,
+      callback:
+          (event: TouchEvent, index: number, eventType: TapEvent) => boolean) {
     // If the event is not cancelable, touch scrolling is active. Reset the
     // touch tracking to disable tap event detection during scrolling.
     if (event.cancelable === false) {
@@ -127,10 +111,10 @@
             return;
           }
           this.isLongTap_ = true;
-          if (callback(event, index, FileTapHandler.TapEvent.LONG_PRESS)) {
+          if (callback(event, index, TapEvent.LONG_PRESS)) {
             this.hasLongPressProcessed_ = true;
           }
-        }, FileTapHandler.LONG_PRESS_THRESHOLD_MILLISECONDS);
+        }, LONG_PRESS_THRESHOLD_MILLISECONDS);
 
         this.lastTouchX_ = touch?.clientX ?? 0;
         this.lastTouchY_ = touch?.clientY ?? 0;
@@ -139,8 +123,6 @@
       } break;
 
       case 'touchmove': {
-        // @ts-ignore: error TS2339: Property 'changedTouches' does not exist on
-        // type 'Event'.
         const touch = this.findActiveTouch_(event.changedTouches);
         if (touch === undefined) {
           break;
@@ -156,7 +138,7 @@
         // Allow some movement for two-finger taps, and none otherwise.
         let moveLimit = 0;
         if (this.isTwoFingerTap_) {
-          moveLimit = FileTapHandler.MAX_TRACKING_FOR_TAP_;
+          moveLimit = MAX_TRACKING_FOR_TAP_;
         }
 
         // If the touch has moved outside limits, it's no longer a tap.
@@ -183,9 +165,7 @@
           // rather than the one at the touch end position. Note that |index| is
           // the latter.
           if (this.hasLongPressProcessed_ ||
-              callback(
-                  event, this.activeItemIndex_,
-                  FileTapHandler.TapEvent.LONG_TAP)) {
+              callback(event, this.activeItemIndex_, TapEvent.LONG_TAP)) {
             event.preventDefault();
             return true;
           }
@@ -195,9 +175,8 @@
           // point points to the target.
           if (callback(
                   event, this.activeItemIndex_,
-                  this.isTwoFingerTap_ ?
-                      FileTapHandler.TapEvent.TWO_FINGER_TAP :
-                      FileTapHandler.TapEvent.TAP)) {
+                  this.isTwoFingerTap_ ? TapEvent.TWO_FINGER_TAP :
+                                         TapEvent.TAP)) {
             event.preventDefault();
             return true;
           }
@@ -212,11 +191,10 @@
    * Resets the touch tracking state variables. Saves the |this.tapStarted_|
    * state first, then resets all tracking state variables.
    *
-   * @return {boolean} The saved |this.tapStarted_| state or false if there
-   *    is no active touch Id.
-   * @private
+   * @return The saved |this.tapStarted_| state or false if there is no active
+   *     touch Id.
    */
-  resetTouchTracking_() {
+  private resetTouchTracking_(): boolean {
     const tapStarted = this.tapStarted_;
     this.tapStarted_ = false;
 
@@ -240,17 +218,15 @@
    * Chrome currently always uses 0 as the Id, so we end up always choosing
    * the first element in the list.
    *
-   * @param {TouchList} touches List of Touch objects to search.
-   * @return {!Touch|undefined} Touch matching the active touch Id, or
-   *     undefined if there is no active touch Id or no match was found.
-   * @private
+   * @param touches List of Touch objects to search.
+   * @return Touch matching the active touch Id, or undefined if there is no
+   *     active touch Id or no match was found.
    */
-  findActiveTouch_(touches) {
+  private findActiveTouch_(touches: TouchList): Touch|undefined {
     if (this.activeTouchId_ !== undefined) {
-      for (let i = 0; i < touches.length; i++) {
-        // @ts-ignore: error TS2532: Object is possibly 'undefined'.
-        if (touches[i].identifier === this.activeTouchId_) {
-          return touches[i];
+      for (const touch of touches) {
+        if (touch.identifier === this.activeTouchId_) {
+          return touch;
         }
       }
     }
@@ -264,27 +240,17 @@
  * https://android.googlesource.com/platform/frameworks/base/+/HEAD/core/java/android/view/ViewConfiguration.java
  * Also this should also be consistent with Chrome's behavior for issuing
  * drag-and-drop events by touchscreen.
- * @type {number}
- * @const
  */
-FileTapHandler.LONG_PRESS_THRESHOLD_MILLISECONDS = 500;
+const LONG_PRESS_THRESHOLD_MILLISECONDS = 500;
 
 /**
  * Maximum movement of touch required to be considered a tap.
- * @type {number}
- * @private
  */
-// @ts-ignore: error TS2341: Property 'MAX_TRACKING_FOR_TAP_' is private and
-// only accessible within class 'FileTapHandler'.
-FileTapHandler.MAX_TRACKING_FOR_TAP_ = 8;
+const MAX_TRACKING_FOR_TAP_ = 8;
 
-/**
- * @enum {string}
- * @const
- */
-FileTapHandler.TapEvent = {
-  TAP: 'tap',
-  LONG_PRESS: 'longpress',
-  LONG_TAP: 'longtap',
-  TWO_FINGER_TAP: 'twofingertap',
-};
+export enum TapEvent {
+  TAP = 'tap',
+  LONG_PRESS = 'longpress',
+  LONG_TAP = 'longtap',
+  TWO_FINGER_TAP = 'twofingertap',
+}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_tap_handler_unittest.js b/ui/file_manager/file_manager/foreground/js/ui/file_tap_handler_unittest.js
index 343872e..0915dd3d 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_tap_handler_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_tap_handler_unittest.js
@@ -4,7 +4,7 @@
 
 import {assertEquals} from 'chrome://webui-test/chromeos/chai_assert.js';
 
-import {FileTapHandler} from './file_tap_handler.js';
+import {FileTapHandler, TapEvent} from './file_tap_handler.js';
 
 /** @type {!FileTapHandler} handler the handler. */
 let handler;
@@ -20,7 +20,7 @@
 let events;
 
 /**
- * @type {function(!Event, number, !FileTapHandler.TapEvent):boolean}
+ * @type {function(!Event, number, !TapEvent):boolean}
  */
 // @ts-ignore: error TS6133: 'e' is declared but its value is never read.
 const handleTap = (e, index, eventType) => {
@@ -72,7 +72,7 @@
   assertEquals(1, events.length);
   // @ts-ignore: error TS2339: Property 'eventType' does not exist on type
   // 'Object'.
-  assertEquals(FileTapHandler.TapEvent.TAP, events[0].eventType);
+  assertEquals(TapEvent.TAP, events[0].eventType);
   // @ts-ignore: error TS2339: Property 'index' does not exist on type 'Object'.
   assertEquals(0, events[0].index);
 }
@@ -131,7 +131,7 @@
   assertEquals(1, events.length);
   // @ts-ignore: error TS2339: Property 'eventType' does not exist on type
   // 'Object'.
-  assertEquals(FileTapHandler.TapEvent.LONG_PRESS, events[0].eventType);
+  assertEquals(TapEvent.LONG_PRESS, events[0].eventType);
   // @ts-ignore: error TS2339: Property 'index' does not exist on type
   // 'Object'.
   assertEquals(0, events[0].index);
@@ -147,7 +147,7 @@
   assertEquals(2, events.length);
   // @ts-ignore: error TS2339: Property 'eventType' does not exist on type
   // 'Object'.
-  assertEquals(FileTapHandler.TapEvent.LONG_TAP, events[1].eventType);
+  assertEquals(TapEvent.LONG_TAP, events[1].eventType);
   // @ts-ignore: error TS2339: Property 'index' does not exist on type
   // 'Object'.
   assertEquals(0, events[1].index);
@@ -246,7 +246,7 @@
   assertEquals(1, events.length);
   // @ts-ignore: error TS2339: Property 'eventType' does not exist on type
   // 'Object'.
-  assertEquals(FileTapHandler.TapEvent.TWO_FINGER_TAP, events[0].eventType);
+  assertEquals(TapEvent.TWO_FINGER_TAP, events[0].eventType);
   // @ts-ignore: error TS2339: Property 'index' does not exist on type 'Object'.
   assertEquals(0, events[0].index);
 
@@ -288,7 +288,7 @@
   assertEquals(2, events.length);
   // @ts-ignore: error TS2339: Property 'eventType' does not exist on type
   // 'Object'.
-  assertEquals(FileTapHandler.TapEvent.TWO_FINGER_TAP, events[1].eventType);
+  assertEquals(TapEvent.TWO_FINGER_TAP, events[1].eventType);
   // @ts-ignore: error TS2339: Property 'index' does not exist on type 'Object'.
   assertEquals(10, events[1].index);
 }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/files_alert_dialog.ts b/ui/file_manager/file_manager/foreground/js/ui/files_alert_dialog.ts
index 48d5e42a..8299fd6 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/files_alert_dialog.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/files_alert_dialog.ts
@@ -12,7 +12,7 @@
 export class FilesAlertDialog extends AlertDialog {
   /**
    */
-  constructor(parentNode: HTMLDialogElement) {
+  constructor(parentNode: HTMLElement) {
     super(parentNode);
 
     this.container.classList.add('files-ng');
@@ -25,6 +25,11 @@
     this.frame.classList.add('files-alert-dialog');
   }
 
+  get parentNode(): HTMLDialogElement {
+    this.parentNode_ = getFilesAppModalDialogInstance();
+    return this.parentNode_ as HTMLDialogElement;
+  }
+
   protected override show_(
       title: string, onOk?: VoidCallback, onCancel?: VoidCallback,
       onShow?: VoidCallback) {
@@ -32,11 +37,11 @@
 
     super.show_(title, onOk, onCancel, onShow);
 
-    this.parentNode_.showModal();
+    this.parentNode.showModal();
   }
 
   override hide(onHide?: VoidCallback) {
-    this.parentNode_.close();
+    this.parentNode.close();
 
     super.hide(onHide);
   }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/files_confirm_dialog.ts b/ui/file_manager/file_manager/foreground/js/ui/files_confirm_dialog.ts
index adc0497..4efb24b 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/files_confirm_dialog.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/files_confirm_dialog.ts
@@ -31,7 +31,7 @@
 
   /**
    */
-  constructor(parentElement: HTMLDialogElement) {
+  constructor(parentElement: HTMLElement) {
     super(parentElement);
 
     this.container.classList.add('files-ng');
@@ -59,18 +59,24 @@
     super.show_(title, onOk, onCancel, onShow);
 
     if (!this.showModalElement) {
-      this.parentNode_.showModal();
+      this.parentNodeAsDialogTag.showModal();
     }
   }
 
   override hide(onHide?: VoidCallback) {
     if (!this.showModalElement) {
-      this.parentNode_.close();
+      this.parentNodeAsDialogTag.close();
     }
 
     super.hide(onHide);
   }
 
+  get parentNodeAsDialogTag(): HTMLDialogElement {
+    // Before calling this, it's expected that this.parentNode_ was assigned to
+    // a <dialog> element.
+    return this.parentNode_ as HTMLDialogElement;
+  }
+
   override showWithTitle(
       title: string, message: string, onOk?: VoidCallback,
       onCancel?: VoidCallback, onShow?: VoidCallback) {
diff --git a/ui/file_manager/file_manager/foreground/js/ui/import_crostini_image_dialog.ts b/ui/file_manager/file_manager/foreground/js/ui/import_crostini_image_dialog.ts
index 29978ae..e527088 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/import_crostini_image_dialog.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/import_crostini_image_dialog.ts
@@ -16,7 +16,7 @@
   /**
    * @param parentNode Node to be parent for this dialog.
    */
-  constructor(parentNode: HTMLDialogElement) {
+  constructor(parentNode: HTMLElement) {
     super(parentNode);
     super.setOkLabel(str('IMPORT_CROSTINI_IMAGE_DIALOG_OK_LABEL'));
 
@@ -35,4 +35,3 @@
             null, unwrapEntry(entry) as Entry));
   }
 }
-
diff --git a/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog.js b/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog.js
index 571ad7b..c54b810 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog.js
@@ -20,7 +20,7 @@
 // extends base class 'FileManagerDialogBase'.
 export class InstallLinuxPackageDialog extends FileManagerDialogBase {
   /**
-   * @param {HTMLDialogElement} parentNode Node to be parent for this dialog.
+   * @param {HTMLElement} parentNode Node to be parent for this dialog.
    */
   constructor(parentNode) {
     super(parentNode);
diff --git a/ui/file_manager/file_manager/state/ducks/all_entries.ts b/ui/file_manager/file_manager/state/ducks/all_entries.ts
index a4fca688..4b64fbee 100644
--- a/ui/file_manager/file_manager/state/ducks/all_entries.ts
+++ b/ui/file_manager/file_manager/state/ducks/all_entries.ts
@@ -14,7 +14,7 @@
 import {FilesAppDirEntry, FilesAppEntry} from '../../externs/files_app_entry_interfaces.js';
 import {CurrentDirectory, DialogType, EntryType, FileData, State, Volume, VolumeMap} from '../../externs/ts/state.js';
 import type {VolumeInfo} from '../../externs/volume_info.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ACTIONS_MODEL_METADATA_PREFETCH_PROPERTY_NAMES, DLP_METADATA_PREFETCH_PROPERTY_NAMES, FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES, ICON_TYPES, LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES} from '../../foreground/js/constants.js';
 import {MetadataItem} from '../../foreground/js/metadata/metadata_item.js';
 import type {ActionsProducerGen} from '../../lib/actions_producer.js';
 import {Slice} from '../../lib/base_store.js';
@@ -138,10 +138,10 @@
 }
 
 const prefetchPropertyNames = Array.from(new Set([
-  ...constants.LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES,
-  ...constants.ACTIONS_MODEL_METADATA_PREFETCH_PROPERTY_NAMES,
-  ...constants.FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES,
-  ...constants.DLP_METADATA_PREFETCH_PROPERTY_NAMES,
+  ...LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES,
+  ...ACTIONS_MODEL_METADATA_PREFETCH_PROPERTY_NAMES,
+  ...FILE_SELECTION_METADATA_PREFETCH_PROPERTY_NAMES,
+  ...DLP_METADATA_PREFETCH_PROPERTY_NAMES,
 ]));
 
 /** Get the icon for an entry. */
@@ -152,9 +152,9 @@
 
   // Pre-defined icons based on the URL.
   const urlToIconPath: Record<FileKey, string> = {
-    [recentRootKey]: constants.ICON_TYPES.RECENT,
-    [myFilesEntryListKey]: constants.ICON_TYPES.MY_FILES,
-    [driveRootEntryListKey]: constants.ICON_TYPES.SERVICE_DRIVE,
+    [recentRootKey]: ICON_TYPES.RECENT,
+    [myFilesEntryListKey]: ICON_TYPES.MY_FILES,
+    [driveRootEntryListKey]: ICON_TYPES.SERVICE_DRIVE,
   };
 
   if (urlToIconPath[url]) {
@@ -166,9 +166,8 @@
   // not, because normal directory can also have the same full path. We also
   // need to check if the entry is a direct child of the drive root entry list.
   const grandRootPathToIconMap = {
-    [COMPUTERS_DIRECTORY_PATH]: constants.ICON_TYPES.COMPUTERS_GRAND_ROOT,
-    [SHARED_DRIVES_DIRECTORY_PATH]:
-        constants.ICON_TYPES.SHARED_DRIVES_GRAND_ROOT,
+    [COMPUTERS_DIRECTORY_PATH]: ICON_TYPES.COMPUTERS_GRAND_ROOT,
+    [SHARED_DRIVES_DIRECTORY_PATH]: ICON_TYPES.SHARED_DRIVES_GRAND_ROOT,
   };
   if (volumeType === VolumeType.DRIVE &&
       grandRootPathToIconMap[entry.fullPath]) {
@@ -178,15 +177,15 @@
   // For grouped removable devices, its parent folder is an entry list, we
   // should use USB icon for it.
   if ('rootType' in entry && entry.rootType === RootType.REMOVABLE) {
-    return constants.ICON_TYPES.USB;
+    return ICON_TYPES.USB;
   }
 
   if (isVolumeEntry(entry) && entry.volumeInfo) {
     switch (entry.volumeInfo.volumeType) {
       case VolumeType.DOWNLOADS:
-        return constants.ICON_TYPES.MY_FILES;
+        return ICON_TYPES.MY_FILES;
       case VolumeType.SMB:
-        return constants.ICON_TYPES.SMB;
+        return ICON_TYPES.SMB;
       case VolumeType.PROVIDED:
       // Fallthrough
       case VolumeType.DOCUMENTS_PROVIDER: {
@@ -202,22 +201,21 @@
         // If no background is generated from IconSet, set the icon to the
         // generic one for certain volume type.
         if (volumeType && shouldProvideIcons(volumeType)) {
-          return constants.ICON_TYPES.GENERIC;
+          return ICON_TYPES.GENERIC;
         }
         return '';
       }
       case VolumeType.MTP:
-        return constants.ICON_TYPES.MTP;
+        return ICON_TYPES.MTP;
       case VolumeType.ARCHIVE:
-        return constants.ICON_TYPES.ARCHIVE;
+        return ICON_TYPES.ARCHIVE;
       case VolumeType.REMOVABLE:
         // For sub-partition from a removable volume, its children icon should
         // be UNKNOWN_REMOVABLE.
-        return entry.volumeInfo.prefixEntry ?
-            constants.ICON_TYPES.UNKNOWN_REMOVABLE :
-            constants.ICON_TYPES.USB;
+        return entry.volumeInfo.prefixEntry ? ICON_TYPES.UNKNOWN_REMOVABLE :
+                                              ICON_TYPES.USB;
       case VolumeType.DRIVE:
-        return constants.ICON_TYPES.DRIVE;
+        return ICON_TYPES.DRIVE;
     }
   }
 
@@ -548,8 +546,8 @@
       });
       if (entriesNeedMetadata.length > 0) {
         window.fileManager.metadataModel.get(entriesNeedMetadata, [
-          ...constants.LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES,
-          ...constants.DLP_METADATA_PREFETCH_PROPERTY_NAMES,
+          ...LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES,
+          ...DLP_METADATA_PREFETCH_PROPERTY_NAMES,
         ]);
       }
     }
diff --git a/ui/file_manager/file_manager/state/ducks/all_entries_unittest.ts b/ui/file_manager/file_manager/state/ducks/all_entries_unittest.ts
index 1aefd059..e3115f08 100644
--- a/ui/file_manager/file_manager/state/ducks/all_entries_unittest.ts
+++ b/ui/file_manager/file_manager/state/ducks/all_entries_unittest.ts
@@ -12,7 +12,7 @@
 import {RootType, VolumeType} from '../../common/js/volume_manager_types.js';
 import {EntryType, FileData, State} from '../../externs/ts/state.js';
 import type {VolumeInfo} from '../../externs/volume_info.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ICON_TYPES} from '../../foreground/js/constants.js';
 import {MetadataItem} from '../../foreground/js/metadata/metadata_item.js';
 import {MockMetadataModel} from '../../foreground/js/metadata/mock_metadata.js';
 import {allEntriesSize, assertAllEntriesEqual, cd, changeSelection, createFakeVolumeMetadata, setUpFileManagerOnWindow, setupStore, updMetadata, waitDeepEquals} from '../for_tests.js';
@@ -346,7 +346,7 @@
   const got = convertEntryToFileData(downloadsEntry);
   const want: FileData = {
     entry: downloadsEntry,
-    icon: constants.ICON_TYPES.MY_FILES,
+    icon: ICON_TYPES.MY_FILES,
     type: EntryType.VOLUME_ROOT,
     isDirectory: true,
     label: 'Downloads',
@@ -386,7 +386,7 @@
   const got = convertEntryToFileData(documentsProviderEntry);
   const want: FileData = {
     entry: documentsProviderEntry,
-    icon: constants.ICON_TYPES.GENERIC,
+    icon: ICON_TYPES.GENERIC,
     type: EntryType.VOLUME_ROOT,
     isDirectory: true,
     label: 'Google Photos',
@@ -411,7 +411,7 @@
   const got = convertEntryToFileData(myFilesEntryList);
   const want: FileData = {
     entry: myFilesEntryList,
-    icon: constants.ICON_TYPES.MY_FILES,
+    icon: ICON_TYPES.MY_FILES,
     type: EntryType.ENTRY_LIST,
     isDirectory: true,
     label: 'My files',
@@ -437,7 +437,7 @@
   const got = convertEntryToFileData(androidFakeEntry);
   const want: FileData = {
     entry: androidFakeEntry,
-    icon: constants.ICON_TYPES.ANDROID_FILES,
+    icon: ICON_TYPES.ANDROID_FILES,
     type: EntryType.PLACEHOLDER,
     isDirectory: true,
     label: 'Android files',
@@ -488,7 +488,7 @@
   const got = convertEntryToFileData(directoryEntry);
   const want: FileData = {
     entry: directoryEntry,
-    icon: constants.ICON_TYPES.FOLDER,
+    icon: ICON_TYPES.FOLDER,
     type: EntryType.FS_API,
     isDirectory: true,
     label: 'dir-1',
diff --git a/ui/file_manager/file_manager/state/ducks/android_apps.ts b/ui/file_manager/file_manager/state/ducks/android_apps.ts
index ec3e7ca..13ae060 100644
--- a/ui/file_manager/file_manager/state/ducks/android_apps.ts
+++ b/ui/file_manager/file_manager/state/ducks/android_apps.ts
@@ -4,7 +4,7 @@
 
 import {iconSetToCSSBackgroundImageValue} from '../../common/js/util.js';
 import {AndroidApp, State} from '../../externs/ts/state.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ICON_TYPES} from '../../foreground/js/constants.js';
 import {Slice} from '../../lib/base_store.js';
 
 /**
@@ -28,8 +28,7 @@
   for (const app of payload.apps) {
     // For android app item, if no icon is derived from IconSet, set the icon to
     // the generic one.
-    let icon: string|chrome.fileManagerPrivate.IconSet =
-        constants.ICON_TYPES.GENERIC;
+    let icon: string|chrome.fileManagerPrivate.IconSet = ICON_TYPES.GENERIC;
     if (app.iconSet) {
       const backgroundImage = iconSetToCSSBackgroundImageValue(app.iconSet);
       if (backgroundImage !== 'none') {
diff --git a/ui/file_manager/file_manager/state/ducks/android_apps_unittest.ts b/ui/file_manager/file_manager/state/ducks/android_apps_unittest.ts
index 54abec5..7d3d39d 100644
--- a/ui/file_manager/file_manager/state/ducks/android_apps_unittest.ts
+++ b/ui/file_manager/file_manager/state/ducks/android_apps_unittest.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {State} from '../../externs/ts/state.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ICON_TYPES} from '../../foreground/js/constants.js';
 import {setupStore, waitDeepEquals} from '../for_tests.js';
 
 import {addAndroidApps} from './android_apps.js';
@@ -36,7 +36,7 @@
     },
     'com.test.app2': {
       ...app2,
-      icon: constants.ICON_TYPES.GENERIC,
+      icon: ICON_TYPES.GENERIC,
     },
   };
   await waitDeepEquals(store, want, (state) => state.androidApps);
diff --git a/ui/file_manager/file_manager/state/ducks/current_directory.ts b/ui/file_manager/file_manager/state/ducks/current_directory.ts
index e28fa6d..bfe6f7e 100644
--- a/ui/file_manager/file_manager/state/ducks/current_directory.ts
+++ b/ui/file_manager/file_manager/state/ducks/current_directory.ts
@@ -9,7 +9,7 @@
 import {RootType} from '../../common/js/volume_manager_types.js';
 import {FakeEntry, FilesAppDirEntry, FilesAppEntry} from '../../externs/files_app_entry_interfaces.js';
 import {CurrentDirectory, DialogType, DirectoryContent, FileData, FileKey, FileTask, FileTasks, PropStatus, Selection, State} from '../../externs/ts/state.js';
-import {constants} from '../../foreground/js/constants.js';
+import {DEFAULT_CROSTINI_VM} from '../../foreground/js/constants.js';
 import {PathComponent} from '../../foreground/js/path_component.js';
 import type {ActionsProducerGen} from '../../lib/actions_producer.js';
 import {Slice} from '../../lib/base_store.js';
@@ -334,7 +334,7 @@
   }
   const crostini = window.fileManager.crostini;
   return crostini.canSharePath(
-      constants.DEFAULT_CROSTINI_VM, (fileData.entry as Entry),
+      DEFAULT_CROSTINI_VM, (fileData.entry as Entry),
       /*persiste=*/ false);
 }
 
diff --git a/ui/file_manager/file_manager/state/ducks/device_unittest.ts b/ui/file_manager/file_manager/state/ducks/device_unittest.ts
index 5c5d0a5..d961960 100644
--- a/ui/file_manager/file_manager/state/ducks/device_unittest.ts
+++ b/ui/file_manager/file_manager/state/ducks/device_unittest.ts
@@ -8,7 +8,7 @@
 import {VolumeEntry} from '../../common/js/files_app_entry_types.js';
 import {VolumeType} from '../../common/js/volume_manager_types.js';
 import {State} from '../../externs/ts/state.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ODFS_EXTENSION_ID} from '../../foreground/js/constants.js';
 import {createFakeVolumeMetadata, setUpFileManagerOnWindow, waitDeepEquals} from '../for_tests.js';
 import {getEmptyState, getEntry, getFileData, getStore, type Store} from '../store.js';
 
@@ -25,8 +25,7 @@
 
 export async function testUpdateDeviceConnection(done: () => void) {
   const volumeInfo = MockVolumeManager.createMockVolumeInfo(
-      VolumeType.PROVIDED, 'odfs', 'OneDrive', '', constants.ODFS_EXTENSION_ID,
-      '');
+      VolumeType.PROVIDED, 'odfs', 'OneDrive', '', ODFS_EXTENSION_ID, '');
   const volumeMetadata = createFakeVolumeMetadata(volumeInfo);
   store.dispatch(addVolume({
     volumeInfo,
diff --git a/ui/file_manager/file_manager/state/ducks/navigation_unittest.ts b/ui/file_manager/file_manager/state/ducks/navigation_unittest.ts
index bbe15cad..aacacb1 100644
--- a/ui/file_manager/file_manager/state/ducks/navigation_unittest.ts
+++ b/ui/file_manager/file_manager/state/ducks/navigation_unittest.ts
@@ -8,7 +8,7 @@
 import {TrashRootEntry} from '../../common/js/trash.js';
 import {RootType, VolumeType} from '../../common/js/volume_manager_types.js';
 import {AndroidApp, FileData, NavigationSection, NavigationType, State, Volume} from '../../externs/ts/state.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ICON_TYPES, ODFS_EXTENSION_ID} from '../../foreground/js/constants.js';
 import {convertEntryToFileData} from '../ducks/all_entries.js';
 import {createFakeVolumeMetadata, setUpFileManagerOnWindow, setupStore, waitDeepEquals} from '../for_tests.js';
 import {getEmptyState} from '../store.js';
@@ -80,7 +80,7 @@
       packageName: 'com.test.app2',
       activityName: 'Activity2',
       iconSet: {icon16x16Url: '', icon32x32Url: ''},
-      icon: constants.ICON_TYPES.GENERIC,
+      icon: ICON_TYPES.GENERIC,
     },
   ];
 }
@@ -195,8 +195,7 @@
   initialState.volumes[smbVolume.volume.volumeId] = smbVolume.volume;
 
   const odfsVolume = createVolumeFileData(
-      VolumeType.PROVIDED, 'provided:odfs', '', '',
-      constants.ODFS_EXTENSION_ID);
+      VolumeType.PROVIDED, 'provided:odfs', '', '', ODFS_EXTENSION_ID);
   initialState.allEntries[odfsVolume.fileData.entry.toURL()] =
       odfsVolume.fileData;
   initialState.volumes[odfsVolume.volume.volumeId] = odfsVolume.volume;
diff --git a/ui/file_manager/file_manager/state/ducks/volumes.ts b/ui/file_manager/file_manager/state/ducks/volumes.ts
index b1f0b407..3678cc0 100644
--- a/ui/file_manager/file_manager/state/ducks/volumes.ts
+++ b/ui/file_manager/file_manager/state/ducks/volumes.ts
@@ -10,7 +10,7 @@
 import {FilesAppEntry} from '../../externs/files_app_entry_interfaces.js';
 import {FileKey, PropStatus, State, Volume, VolumeId} from '../../externs/ts/state.js';
 import type {VolumeInfo} from '../../externs/volume_info.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ICON_TYPES} from '../../foreground/js/constants.js';
 import {Slice} from '../../lib/base_store.js';
 import {getEntry, getFileData} from '../store.js';
 
@@ -359,7 +359,7 @@
               // should be UNKNOWN_REMOVABLE, and it shouldn't be ejectable.
               currentState.allEntries[v.rootKey!] = {
                 ...fileData,
-                icon: constants.ICON_TYPES.UNKNOWN_REMOVABLE,
+                icon: ICON_TYPES.UNKNOWN_REMOVABLE,
                 isEjectable: false,
               };
             }
@@ -374,7 +374,7 @@
       const fileData = getFileData(currentState, volumeRootKey)!;
       currentState.allEntries[volumeRootKey] = {
         ...fileData,
-        icon: constants.ICON_TYPES.UNKNOWN_REMOVABLE,
+        icon: ICON_TYPES.UNKNOWN_REMOVABLE,
         isEjectable: false,
       };
       currentState.allEntries[parentKey] = {
diff --git a/ui/file_manager/file_manager/state/ducks/volumes_unittest.ts b/ui/file_manager/file_manager/state/ducks/volumes_unittest.ts
index 9a2e143b..9059e06 100644
--- a/ui/file_manager/file_manager/state/ducks/volumes_unittest.ts
+++ b/ui/file_manager/file_manager/state/ducks/volumes_unittest.ts
@@ -14,7 +14,7 @@
 import {RootType, VolumeType} from '../../common/js/volume_manager_types.js';
 import {FileData, State, Volume} from '../../externs/ts/state.js';
 import type {VolumeInfo} from '../../externs/volume_info.js';
-import {constants} from '../../foreground/js/constants.js';
+import {ICON_TYPES} from '../../foreground/js/constants.js';
 import {convertEntryToFileData} from '../ducks/all_entries.js';
 import {createFakeVolumeMetadata, setUpFileManagerOnWindow, setupStore, waitDeepEquals} from '../for_tests.js';
 import {getEmptyState, getEntry} from '../store.js';
@@ -294,11 +294,11 @@
         // When there is a parent wrapper, icon and ejectable values are
         // different.
         ...(hasParentWrapper ? {
-          icon: constants.ICON_TYPES.UNKNOWN_REMOVABLE,
+          icon: ICON_TYPES.UNKNOWN_REMOVABLE,
           isEjectable: false,
         } :
                                {
-                                 icon: constants.ICON_TYPES.USB,
+                                 icon: ICON_TYPES.USB,
                                  isEjectable: true,
                                }),
       },
@@ -401,19 +401,19 @@
       // Partition-1 volume.
       [partition1VolumeEntry.toURL()]: {
         ...convertEntryToFileData(partition1VolumeEntry),
-        icon: constants.ICON_TYPES.UNKNOWN_REMOVABLE,
+        icon: ICON_TYPES.UNKNOWN_REMOVABLE,
         isEjectable: false,
       },
       // Partition-2 volume.
       [partition2VolumeEntry.toURL()]: {
         ...convertEntryToFileData(partition2VolumeEntry),
-        icon: constants.ICON_TYPES.UNKNOWN_REMOVABLE,
+        icon: ICON_TYPES.UNKNOWN_REMOVABLE,
         isEjectable: false,
       },
       // Partition-3 volume.
       [partition3VolumeEntry.toURL()]: {
         ...convertEntryToFileData(partition3VolumeEntry),
-        icon: constants.ICON_TYPES.UNKNOWN_REMOVABLE,
+        icon: ICON_TYPES.UNKNOWN_REMOVABLE,
         isEjectable: false,
       },
       // My Files entry list.
diff --git a/ui/file_manager/file_manager/state/for_tests.ts b/ui/file_manager/file_manager/state/for_tests.ts
index d73f643e..28e3f9f 100644
--- a/ui/file_manager/file_manager/state/for_tests.ts
+++ b/ui/file_manager/file_manager/state/for_tests.ts
@@ -152,7 +152,7 @@
     directoryModel: createFakeDirectoryModel(),
     directoryTreeNamingController: {} as unknown as
         DirectoryTreeNamingController,
-    getLastVisitedURL() {
+    getLastVisitedUrl() {
       return '';
     },
     getTranslatedString(_id: string) {
diff --git a/ui/file_manager/file_manager/widgets/xf_cloud_panel.ts b/ui/file_manager/file_manager/widgets/xf_cloud_panel.ts
index 13c21c0a..abc33ff 100644
--- a/ui/file_manager/file_manager/widgets/xf_cloud_panel.ts
+++ b/ui/file_manager/file_manager/widgets/xf_cloud_panel.ts
@@ -9,7 +9,7 @@
 import type {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 
 import {getCurrentLocaleOrDefault, secondsToRemainingTimeString, str, strf} from '../common/js/translations.js';
-import {constants} from '../foreground/js/constants.js';
+import {ICON_TYPES} from '../foreground/js/constants.js';
 
 import {css, customElement, html, property, query, XfBase} from './xf_base.js';
 
@@ -200,35 +200,33 @@
           </div>
         </div>
         <div class="static" id="progress-finished">
-          <xf-icon type="${constants.ICON_TYPES.CLOUD}" size="large"></xf-icon>
+          <xf-icon type="${ICON_TYPES.CLOUD}" size="large"></xf-icon>
           <div class="status-description">
             ${str('BULK_PINNING_FILE_SYNC_ON')}
           </div>
         </div>
         <div class="static" id="progress-offline">
         <xf-icon type="${
-        constants.ICON_TYPES.BULK_PINNING_OFFLINE}" size="large"></xf-icon>
+        ICON_TYPES.BULK_PINNING_OFFLINE}" size="large"></xf-icon>
           <div class="status-description">
             ${str('DRIVE_BULK_PINNING_OFFLINE')}
           </div>
         </div>
         <div class="static" id="progress-battery-saver">
         <xf-icon type="${
-        constants.ICON_TYPES
-            .BULK_PINNING_BATTERY_SAVER}" size="large"></xf-icon>
+        ICON_TYPES.BULK_PINNING_BATTERY_SAVER}" size="large"></xf-icon>
           <div class="status-description">
             ${str('DRIVE_BULK_PINNING_BATTERY_SAVER')}
           </div>
         </div>
         <div class="static" id="progress-not-enough-space">
-        <xf-icon type="${
-        constants.ICON_TYPES.ERROR_BANNER}" size="large"></xf-icon>
+        <xf-icon type="${ICON_TYPES.ERROR_BANNER}" size="large"></xf-icon>
           <div class="status-description">
             ${str('DRIVE_BULK_PINNING_NOT_ENOUGH_SPACE')}
           </div>
         </div>
         <div class="static" id="progress-metered-network">
-          <xf-icon type="${constants.ICON_TYPES.CLOUD}" size="large"></xf-icon>
+          <xf-icon type="${ICON_TYPES.CLOUD}" size="large"></xf-icon>
           <div class="status-description">
             ${str('DRIVE_BULK_PINNING_METERED_NETWORK')}
           </div>
diff --git a/ui/file_manager/file_manager/widgets/xf_icon.ts b/ui/file_manager/file_manager/widgets/xf_icon.ts
index 3ff66f7..75fa548 100644
--- a/ui/file_manager/file_manager/widgets/xf_icon.ts
+++ b/ui/file_manager/file_manager/widgets/xf_icon.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {iconSetToCSSBackgroundImageValue} from '../common/js/util.js';
-import {constants} from '../foreground/js/constants.js';
+import {ICON_TYPES} from '../foreground/js/constants.js';
 
 import {css, customElement, html, property, type PropertyValues, styleMap, svg, XfBase} from './xf_base.js';
 
@@ -17,7 +17,7 @@
 
   /**
    * The icon type, different type will render different SVG file
-   * (from `constants.ICON_TYPES`).
+   * (from `ICON_TYPES`).
    */
   @property({type: String, reflect: true}) type = '';
 
@@ -39,21 +39,21 @@
 
   static get multiColor() {
     return {
-      [constants.ICON_TYPES.CANT_PIN]:
+      [ICON_TYPES.CANT_PIN]:
           svg`<use xlink:href="foreground/images/files/ui/cant_pin.svg#cant_pin"></use>`,
-      [constants.ICON_TYPES.CLOUD_DONE]:
+      [ICON_TYPES.CLOUD_DONE]:
           svg`<use xlink:href="foreground/images/files/ui/cloud_done.svg#cloud_done"></use>`,
-      [constants.ICON_TYPES.CLOUD_ERROR]:
+      [ICON_TYPES.CLOUD_ERROR]:
           svg`<use xlink:href="foreground/images/files/ui/cloud_error.svg#cloud_error"></use>`,
-      [constants.ICON_TYPES.CLOUD_OFFLINE]:
+      [ICON_TYPES.CLOUD_OFFLINE]:
           svg`<use xlink:href="foreground/images/files/ui/cloud_offline.svg#cloud_offline"></use>`,
-      [constants.ICON_TYPES.CLOUD_PAUSED]:
+      [ICON_TYPES.CLOUD_PAUSED]:
           svg`<use xlink:href="foreground/images/files/ui/cloud_paused.svg#cloud_paused"></use>`,
-      [constants.ICON_TYPES.CLOUD_SYNC]:
+      [ICON_TYPES.CLOUD_SYNC]:
           svg`<use xlink:href="foreground/images/files/ui/cloud_sync.svg#cloud_sync"></use>`,
-      [constants.ICON_TYPES.ERROR]:
+      [ICON_TYPES.ERROR]:
           svg`<use xlink:href="foreground/images/files/ui/error.svg#error"></use>`,
-      [constants.ICON_TYPES.OFFLINE]:
+      [ICON_TYPES.OFFLINE]:
           svg`<use xlink:href="foreground/images/files/ui/offline.svg#offline"></use>`,
     };
   }
@@ -63,7 +63,7 @@
   }
 
   override render() {
-    if (this.type === constants.ICON_TYPES.BLANK) {
+    if (this.type === ICON_TYPES.BLANK) {
       return html``;
     }
 
@@ -104,10 +104,10 @@
       console.warn('Empty type will result in an square being rendered.');
       return;
     }
-    const validTypes = Object.values(constants.ICON_TYPES);
+    const validTypes = Object.values(ICON_TYPES);
     if (!validTypes.find((t) => t === type)) {
-      console.warn(`Type ${
-          type} is not a valid icon type, please check constants.ICON_TYPES.`);
+      console.warn(
+          `Type ${type} is not a valid icon type, please check ICON_TYPES.`);
     }
   }
 }
diff --git a/ui/file_manager/file_manager/widgets/xf_icon_unittest.ts b/ui/file_manager/file_manager/widgets/xf_icon_unittest.ts
index d220a3a..25ba927 100644
--- a/ui/file_manager/file_manager/widgets/xf_icon_unittest.ts
+++ b/ui/file_manager/file_manager/widgets/xf_icon_unittest.ts
@@ -6,7 +6,7 @@
 import {assertEquals, assertFalse, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
 
 import {waitForElementUpdate} from '../common/js/unittest_util.js';
-import {constants} from '../foreground/js/constants.js';
+import {ICON_TYPES} from '../foreground/js/constants.js';
 
 import {XfIcon} from './xf_icon.js';
 
@@ -104,7 +104,7 @@
 
 export async function testBlankRendersNoIconAtAll(done: () => void) {
   const icon = await getIcon();
-  icon.type = constants.ICON_TYPES.BLANK;
+  icon.type = ICON_TYPES.BLANK;
   await waitForElementUpdate(icon);
 
   assertEquals(null, getSpanFromIcon(icon));
diff --git a/ui/file_manager/file_manager/widgets/xf_tree_item.ts b/ui/file_manager/file_manager/widgets/xf_tree_item.ts
index 0a25d0e..461152a 100644
--- a/ui/file_manager/file_manager/widgets/xf_tree_item.ts
+++ b/ui/file_manager/file_manager/widgets/xf_tree_item.ts
@@ -7,7 +7,7 @@
 
 import {css, customElement, html, ifDefined, property, type PropertyValues, query, state, styleMap, XfBase} from './xf_base.js';
 import type {XfTree} from './xf_tree.js';
-import {handleTreeSlotChange, isTree, isTreeItem} from './xf_tree_util.js';
+import {handleTreeSlotChange, isTreeItem, isXfTree} from './xf_tree_util.js';
 
 /**
  * The number of pixels to indent per level.
@@ -50,7 +50,7 @@
 
   /**
    * The icon of the tree item, will be displayed before the label text.
-   * The icon value should come from `constants.ICON_TYPES`, it will be passed
+   * The icon value should come from `ICON_TYPES`, it will be passed
    * as `type` to a <xf-icon> widget to render an icon element.
    */
   @property({type: String, reflect: true}) icon = '';
@@ -142,7 +142,7 @@
       if (isTreeItem(p)) {
         return p;
       }
-      if (isTree(p)) {
+      if (isXfTree(p)) {
         return null;
       }
       p = p.parentElement;
@@ -152,7 +152,7 @@
 
   get tree(): XfTree|null {
     let t = this.parentElement;
-    while (t && !isTree(t)) {
+    while (t && !isXfTree(t)) {
       t = t.parentElement;
     }
     return t;
diff --git a/ui/file_manager/file_manager/widgets/xf_tree_item_unittest.ts b/ui/file_manager/file_manager/widgets/xf_tree_item_unittest.ts
index 285bcf3..0e6f61f 100644
--- a/ui/file_manager/file_manager/widgets/xf_tree_item_unittest.ts
+++ b/ui/file_manager/file_manager/widgets/xf_tree_item_unittest.ts
@@ -7,7 +7,7 @@
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {waitForElementUpdate} from '../common/js/unittest_util.js';
-import {constants} from '../foreground/js/constants.js';
+import {ICON_TYPES} from '../foreground/js/constants.js';
 
 import {XfIcon} from './xf_icon.js';
 import {XfTree} from './xf_tree.js';
@@ -457,7 +457,7 @@
 
   // Set both icon and iconSet.
   const item1 = getTreeItemById('item1');
-  item1.icon = constants.ICON_TYPES.ANDROID_FILES;
+  item1.icon = ICON_TYPES.ANDROID_FILES;
   item1.iconSet = {
     icon16x16Url: undefined,
     icon32x32Url: 'fake-base64-data',
diff --git a/ui/file_manager/file_manager/widgets/xf_tree_util.ts b/ui/file_manager/file_manager/widgets/xf_tree_util.ts
index d8223c9b..67ee5fc 100644
--- a/ui/file_manager/file_manager/widgets/xf_tree_util.ts
+++ b/ui/file_manager/file_manager/widgets/xf_tree_util.ts
@@ -6,12 +6,13 @@
 import type {XfTreeItem} from './xf_tree_item.js';
 
 /** Check if an `Element` is a tree or not. */
-export function isTree(element: Element): element is XfTree {
-  return element.tagName === 'XF-TREE';
+export function isXfTree(element: HTMLElement): element is XfTree {
+  return !!element && element.tagName === 'XF-TREE';
 }
 
 /** Check if an `Element` is a tree item or not. */
-export function isTreeItem(element: Element): element is XfTreeItem {
+export function isTreeItem(element: HTMLElement|
+                           Element): element is XfTreeItem {
   return element.tagName === 'XF-TREE-ITEM';
 }
 
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni
index 7abe8daa..b35899f 100644
--- a/ui/file_manager/file_names.gni
+++ b/ui/file_manager/file_names.gni
@@ -14,8 +14,6 @@
 image_loader_ts = [ "image_loader/background.ts" ]
 
 static_js_files = [
-  # Files Common:
-
   # Externs:
   "file_manager/externs/background/crostini.js",
   "file_manager/externs/background/drive_sync_handler.js",
@@ -29,26 +27,16 @@
   "file_manager/externs/ts/store.js",
 
   # Files app Foreground:
-  "file_manager/foreground/js/app_state_controller.js",
-  "file_manager/foreground/js/constants.js",
-  "file_manager/foreground/js/file_manager.js",
   "file_manager/foreground/js/metrics_start.js",
   "file_manager/foreground/js/mock_navigation_list_model.js",
   "file_manager/foreground/js/navigation_list_model.js",
 
-  # Metadata:
-  "file_manager/foreground/js/metadata/metadata_dispatcher.js",
-
   # Files app UI:
   "file_manager/foreground/js/ui/a11y_announce.js",
-  "file_manager/foreground/js/ui/actions_submenu.js",
-  "file_manager/foreground/js/ui/context_menu_handler.js",
   "file_manager/foreground/js/ui/default_task_dialog.js",
   "file_manager/foreground/js/ui/dialog_footer.js",
   "file_manager/foreground/js/ui/directory_tree.js",
   "file_manager/foreground/js/ui/drag_selector.js",
-  "file_manager/foreground/js/ui/file_metadata_formatter.js",
-  "file_manager/foreground/js/ui/file_tap_handler.js",
   "file_manager/foreground/js/ui/gear_menu.js",
   "file_manager/foreground/js/ui/install_linux_package_dialog.js",
   "file_manager/foreground/js/ui/tree.js",
@@ -173,16 +161,20 @@
   # These lines will be removed at the end of the TS migration.
   # Foreground UI.
   "file_manager/foreground/js/ui/action_model_ui.ts",
+  "file_manager/foreground/js/ui/actions_submenu.ts",
   "file_manager/foreground/js/ui/dialogs.ts",
   "file_manager/foreground/js/ui/commandbutton.ts",
   "file_manager/foreground/js/ui/combobutton.ts",
   "file_manager/foreground/js/ui/command.ts",
+  "file_manager/foreground/js/ui/context_menu_handler.ts",
   "file_manager/foreground/js/ui/file_grid.ts",
   "file_manager/foreground/js/ui/file_list_selection_model.ts",
   "file_manager/foreground/js/ui/file_manager_dialog_base.ts",
   "file_manager/foreground/js/ui/file_manager_ui.ts",
+  "file_manager/foreground/js/ui/file_metadata_formatter.ts",
   "file_manager/foreground/js/ui/file_table.ts",
   "file_manager/foreground/js/ui/file_table_list.ts",
+  "file_manager/foreground/js/ui/file_tap_handler.ts",
   "file_manager/foreground/js/ui/files_alert_dialog.ts",
   "file_manager/foreground/js/ui/files_confirm_dialog.ts",
   "file_manager/foreground/js/ui/files_menu.ts",
@@ -264,8 +256,10 @@
   "file_manager/foreground/js/actions_controller.ts",
   "file_manager/foreground/js/actions_model.ts",
   "file_manager/foreground/js/android_app_list_model.ts",
+  "file_manager/foreground/js/app_state_controller.ts",
   "file_manager/foreground/js/banner_controller.ts",
   "file_manager/foreground/js/command_handler.ts",
+  "file_manager/foreground/js/constants.ts",
   "file_manager/foreground/js/crossover_search_utils.ts",
   "file_manager/foreground/js/crostini_controller.ts",
   "file_manager/foreground/js/deferred_elements.ts",
@@ -277,6 +271,7 @@
   "file_manager/foreground/js/empty_folder_controller.ts",
   "file_manager/foreground/js/fake_android_app_list_model.ts",
   "file_manager/foreground/js/file_list_model.ts",
+  "file_manager/foreground/js/file_manager.ts",
   "file_manager/foreground/js/file_manager_commands.ts",
   "file_manager/foreground/js/file_manager_commands_util.ts",
   "file_manager/foreground/js/file_rename.ts",
@@ -356,6 +351,7 @@
   "file_manager/foreground/js/metadata/image_parsers.ts",
   "file_manager/foreground/js/metadata/metadata_cache_item.ts",
   "file_manager/foreground/js/metadata/metadata_cache_set.ts",
+  "file_manager/foreground/js/metadata/metadata_dispatcher.ts",
   "file_manager/foreground/js/metadata/metadata_item.ts",
   "file_manager/foreground/js/metadata/metadata_model.ts",
   "file_manager/foreground/js/metadata/metadata_parser.ts",
@@ -534,8 +530,10 @@
   # These lines will be removed at the end of the TS migration.
   # UI:
   "file_manager/foreground/js/ui/command_unittest.ts",
+  "file_manager/foreground/js/ui/context_menu_handler_unittest.ts",
   "file_manager/foreground/js/ui/file_grid_unittest.ts",
   "file_manager/foreground/js/ui/file_list_selection_model_unittest.ts",
+  "file_manager/foreground/js/ui/file_manager_dialog_base_unittest.ts",
   "file_manager/foreground/js/ui/file_table_list_unittest.ts",
   "file_manager/foreground/js/ui/file_table_unittest.ts",
   "file_manager/foreground/js/ui/grid_unittest.ts",
@@ -593,7 +591,6 @@
 
 # d.ts. files that are manually created and checked-in in the repo.
 checked_in_dts_files = [
-  "file_manager/definitions/context_menu_handler_events.d.ts",
   "file_manager/definitions/file_error.d.ts",
   "file_manager/definitions/file_manager.d.ts",
   "file_manager/externs/volume_info.d.ts",
@@ -625,9 +622,7 @@
 # Test files:
 unittest_files = [
   # Foreground:
-  "file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js",
   "file_manager/foreground/js/ui/actions_submenu_unittest.js",
-  "file_manager/foreground/js/ui/context_menu_handler_unittest.js",
   "file_manager/foreground/js/ui/file_tap_handler_unittest.js",
   "file_manager/foreground/js/ui/install_linux_package_dialog_unittest.js",
   "file_manager/foreground/js/ui/position_util_unittest.js",
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index c6f4185..3702eefa 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -330,6 +330,7 @@
     "//mojo/public/cpp/bindings:struct_traits",
     "//skia",
     "//third_party/zlib",
+    "//ui/base:ozone_buildflags",
     "//ui/base:ui_data_pack",
   ]
 
@@ -445,10 +446,6 @@
       "nine_image_painter.h",
     ]
   }
-
-  if (use_ozone) {
-    deps += [ "//ui/ozone:buildflags" ]
-  }
 }
 
 component("color_space") {
diff --git a/ui/gfx/DEPS b/ui/gfx/DEPS
index 146df86..0ddd58a 100644
--- a/ui/gfx/DEPS
+++ b/ui/gfx/DEPS
@@ -8,11 +8,11 @@
   "+third_party/harfbuzz-ng",
   "+third_party/skia",
   "+third_party/test_fonts",
+  "+ui/base/ozone_buildflags.h",
   "+ui/base/resource/resource_scale_factor.h",
   "+ui/base/ui_base_features.h",
   "+ui/ios",
   "+ui/linux",
-  "+ui/ozone/buildflags.h",
 
   "-testing/gmock",
 ]
diff --git a/ui/gfx/gpu_extra_info.h b/ui/gfx/gpu_extra_info.h
index e8fa594..0221652 100644
--- a/ui/gfx/gpu_extra_info.h
+++ b/ui/gfx/gpu_extra_info.h
@@ -9,16 +9,10 @@
 #include <vector>
 
 #include "build/build_config.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/gfx/buffer_types.h"
 #include "ui/gfx/gfx_export.h"
 
-#if BUILDFLAG(IS_OZONE)
-#include "ui/ozone/buildflags.h"
-#if BUILDFLAG(OZONE_PLATFORM_X11)
-#define USE_OZONE_PLATFORM_X11
-#endif
-#endif
-
 namespace gfx {
 
 // Specification of a feature that can be enabled/disable in ANGLE
@@ -62,9 +56,9 @@
   // applicable.
   ANGLEFeatures angle_features;
 
-#if defined(USE_OZONE_PLATFORM_X11)
+#if BUILDFLAG(IS_OZONE_X11)
   std::vector<gfx::BufferUsageAndFormat> gpu_memory_buffer_support_x11;
-#endif
+#endif  // BUILDFLAG(IS_OZONE_X11)
 };
 
 }  // namespace gfx
diff --git a/ui/gfx/mojom/BUILD.gn b/ui/gfx/mojom/BUILD.gn
index e917ea9..6f68260 100644
--- a/ui/gfx/mojom/BUILD.gn
+++ b/ui/gfx/mojom/BUILD.gn
@@ -486,10 +486,10 @@
     ":native_handle_types",
     "//ui/gfx",
   ]
-  deps = [ "//skia/public/mojom" ]
-  if (use_ozone) {
-    public_deps += [ "//ui/ozone:buildflags" ]
-  }
+  deps = [
+    "//skia/public/mojom",
+    "//ui/base:ozone_buildflags",
+  ]
   frameworks = [
     "CoreFoundation.framework",
     "IOSurface.framework",
diff --git a/ui/gfx/mojom/gpu_extra_info_mojom_traits.cc b/ui/gfx/mojom/gpu_extra_info_mojom_traits.cc
index 15c7340..f2be2f4f 100644
--- a/ui/gfx/mojom/gpu_extra_info_mojom_traits.cc
+++ b/ui/gfx/mojom/gpu_extra_info_mojom_traits.cc
@@ -5,6 +5,7 @@
 #include "ui/gfx/mojom/gpu_extra_info_mojom_traits.h"
 
 #include "build/build_config.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/gfx/mojom/buffer_types_mojom_traits.h"
 
 namespace mojo {
@@ -24,10 +25,10 @@
     gfx::GpuExtraInfo* out) {
   if (!data.ReadAngleFeatures(&out->angle_features))
     return false;
-#if defined(USE_OZONE_PLATFORM_X11)
+#if BUILDFLAG(IS_OZONE_X11)
   if (!data.ReadGpuMemoryBufferSupportX11(&out->gpu_memory_buffer_support_x11))
     return false;
-#endif
+#endif  // BUILDFLAG(IS_OZONE_X11)
   return true;
 }
 
diff --git a/ui/gfx/mojom/gpu_extra_info_mojom_traits.h b/ui/gfx/mojom/gpu_extra_info_mojom_traits.h
index 12b616f5..8cc0c54 100644
--- a/ui/gfx/mojom/gpu_extra_info_mojom_traits.h
+++ b/ui/gfx/mojom/gpu_extra_info_mojom_traits.h
@@ -7,17 +7,11 @@
 
 #include "base/component_export.h"
 #include "build/build_config.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/gfx/gpu_extra_info.h"
 #include "ui/gfx/mojom/buffer_types_mojom_traits.h"
 #include "ui/gfx/mojom/gpu_extra_info.mojom-shared.h"
 
-#if BUILDFLAG(IS_OZONE)
-#include "ui/ozone/buildflags.h"
-#if BUILDFLAG(OZONE_PLATFORM_X11)
-#define USE_OZONE_PLATFORM_X11
-#endif
-#endif
-
 namespace mojo {
 
 template <>
@@ -62,12 +56,12 @@
     return input.angle_features;
   }
 
-#if defined(USE_OZONE_PLATFORM_X11)
+#if BUILDFLAG(IS_OZONE_X11)
   static const std::vector<gfx::BufferUsageAndFormat>&
   gpu_memory_buffer_support_x11(const gfx::GpuExtraInfo& input) {
     return input.gpu_memory_buffer_support_x11;
   }
-#endif
+#endif  // BUILDFLAG(IS_OZONE_X11)
 };
 
 }  // namespace mojo
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index bb793df..debd258f 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -168,6 +168,7 @@
 
     # ANGLE includes are used cross-platform.
     "//third_party/angle:includes",
+    "//ui/base:ozone_buildflags",
     "//ui/gfx/mojom",
   ]
   public_deps = [
@@ -241,7 +242,6 @@
   }
 
   if (use_ozone) {
-    deps += [ "//ui/ozone:buildflags" ]
     if (use_egl && !is_fuchsia) {
       data_deps += [
         "//third_party/angle:libEGL",
diff --git a/ui/gl/DEPS b/ui/gl/DEPS
index 88434bc..17849d35 100644
--- a/ui/gl/DEPS
+++ b/ui/gl/DEPS
@@ -8,8 +8,8 @@
   "+ui/events",
   "+ui/base/x",
   "+ui/base/moving_max.h",
+  "+ui/base/ozone_buildflags.h",
   "+ui/gfx",
-  "+ui/ozone/buildflags.h",
   "+third_party/angle/src/gpu_info_util/SystemInfo.h",
 ]
 
diff --git a/ui/gl/gl_display.cc b/ui/gl/gl_display.cc
index 830e229..5017b7c3 100644
--- a/ui/gl/gl_display.cc
+++ b/ui/gl/gl_display.cc
@@ -19,6 +19,7 @@
 #include "base/strings/string_split.h"
 #include "base/system/sys_info.h"
 #include "build/build_config.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/gl/angle_platform_impl.h"
 #include "ui/gl/egl_util.h"
 #include "ui/gl/gl_bindings.h"
@@ -28,10 +29,6 @@
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface.h"
 
-#if BUILDFLAG(IS_OZONE)
-#include "ui/ozone/buildflags.h"
-#endif  // BUILDFLAG(IS_OZONE)
-
 #if BUILDFLAG(IS_ANDROID)
 #include "base/android/build_info.h"
 #endif
@@ -376,14 +373,12 @@
       extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
       extra_display_attribs.push_back(
           EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE);
-#if BUILDFLAG(IS_OZONE)
-#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(OZONE_PLATFORM_X11)
+#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(IS_OZONE_X11)
       extra_display_attribs.push_back(
           EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE);
       extra_display_attribs.push_back(
           EGL_PLATFORM_VULKAN_DISPLAY_MODE_HEADLESS_ANGLE);
-#endif  // BUILDFLAG(OZONE_PLATFORM_X11)
-#endif  // BUILDFLAG(IS_OZONE)
+#endif  // BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(IS_OZONE_X11)
       return GetPlatformANGLEDisplay(
           display, EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE, enabled_angle_features,
           disabled_angle_features, extra_display_attribs);
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc
index 16b1c34..a9eda1d 100644
--- a/ui/gl/gl_surface_egl.cc
+++ b/ui/gl/gl_surface_egl.cc
@@ -35,10 +35,6 @@
 #include "ui/gl/scoped_make_current.h"
 #include "ui/gl/sync_control_vsync_provider.h"
 
-#if BUILDFLAG(IS_OZONE)
-#include "ui/ozone/buildflags.h"
-#endif  // BUILDFLAG(IS_OZONE)
-
 #if !defined(EGL_FIXED_SIZE_ANGLE)
 #define EGL_FIXED_SIZE_ANGLE 0x3201
 #endif
diff --git a/ui/gtk/BUILD.gn b/ui/gtk/BUILD.gn
index f4c5a2b..24f3289 100644
--- a/ui/gtk/BUILD.gn
+++ b/ui/gtk/BUILD.gn
@@ -124,6 +124,7 @@
     "//ui/aura",
     "//ui/base",
     "//ui/base:buildflags",
+    "//ui/base:ozone_buildflags",
     "//ui/base/ime",
     "//ui/base/ime/linux",
     "//ui/color",
diff --git a/ui/gtk/gtk_ui.cc b/ui/gtk/gtk_ui.cc
index ce42101b..a26cc74 100644
--- a/ui/gtk/gtk_ui.cc
+++ b/ui/gtk/gtk_ui.cc
@@ -34,6 +34,7 @@
 #include "ui/base/ime/linux/fake_input_method_context.h"
 #include "ui/base/ime/linux/linux_input_method_context.h"
 #include "ui/base/ime/text_input_flags.h"
+#include "ui/base/ozone_buildflags.h"
 #include "ui/color/color_id.h"
 #include "ui/color/color_provider.h"
 #include "ui/color/color_provider_key.h"
@@ -71,26 +72,18 @@
 #include "ui/linux/nav_button_provider.h"
 #include "ui/linux/window_button_order_observer.h"
 #include "ui/native_theme/native_theme.h"
-#include "ui/ozone/buildflags.h"
 #include "ui/ozone/public/ozone_platform.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
 #include "ui/shell_dialogs/select_file_policy.h"
 #include "ui/views/window/window_button_order_provider.h"
 
-#if BUILDFLAG(OZONE_PLATFORM_WAYLAND)
-#define USE_WAYLAND
-#endif
-#if BUILDFLAG(OZONE_PLATFORM_X11)
-#define USE_X11
-#endif
-
-#if defined(USE_WAYLAND)
+#if BUILDFLAG(IS_OZONE_WAYLAND)
 #include "ui/gtk/wayland/gtk_ui_platform_wayland.h"
-#endif
+#endif  // BUILDFLAG(IS_OZONE_WAYLAND)
 
-#if defined(USE_X11)
+#if BUILDFLAG(IS_OZONE_X11)
 #include "ui/gtk/x/gtk_ui_platform_x11.h"
-#endif
+#endif  // BUILDFLAG(IS_OZONE_X11)
 
 namespace gtk {
 
@@ -160,14 +153,14 @@
   switch (backend) {
     case ui::LinuxUiBackend::kStub:
       return std::make_unique<GtkUiPlatformStub>();
-#if defined(USE_X11)
+#if BUILDFLAG(IS_OZONE_X11)
     case ui::LinuxUiBackend::kX11:
       return std::make_unique<GtkUiPlatformX11>();
-#endif
-#if defined(USE_WAYLAND)
+#endif  // BUILDFLAG(IS_OZONE_X11)
+#if BUILDFLAG(IS_OZONE_WAYLAND)
     case ui::LinuxUiBackend::kWayland:
       return std::make_unique<GtkUiPlatformWayland>();
-#endif
+#endif  // BUILDFLAG(IS_OZONE_WAYLAND)
     default:
       NOTREACHED();
       return nullptr;
diff --git a/ui/ozone/BUILD.gn b/ui/ozone/BUILD.gn
index 096badf..4c1c77c 100644
--- a/ui/ozone/BUILD.gn
+++ b/ui/ozone/BUILD.gn
@@ -262,10 +262,7 @@
 component("ozone") {
   visibility = []
   visibility = [ "*" ]
-  public_deps = [
-    ":buildflags",
-    ":platform",
-  ]
+  public_deps = [ ":platform" ]
 }
 
 source_set("drm_modifiers_filter") {
@@ -483,17 +480,6 @@
   deps += ozone_platform_integration_test_deps
 }
 
-# This is deprecated. Use //ui/base:ozone_buildflags instead.
-# TODO(crbug.com/1500494): Remove this.
-buildflag_header("buildflags") {
-  header = "buildflags.h"
-  flags = [
-    "OZONE_PLATFORM_WAYLAND=$ozone_platform_wayland",
-    "OZONE_PLATFORM_X11=$ozone_platform_x11",
-  ]
-  visibility += [ "*" ]
-}
-
 group("unittests") {
   testonly = true
 
diff --git a/ui/ozone/platform/wayland/test/test_keyboard.cc b/ui/ozone/platform/wayland/test/test_keyboard.cc
index b17b452..6a71b57 100644
--- a/ui/ozone/platform/wayland/test/test_keyboard.cc
+++ b/ui/ozone/platform/wayland/test/test_keyboard.cc
@@ -6,8 +6,7 @@
 
 namespace wl {
 
-const struct wl_pointer_interface kTestKeyboardImpl = {
-    nullptr,           // set_cursor
+const struct wl_keyboard_interface kTestKeyboardImpl = {
     &DestroyResource,  // release
 };
 
diff --git a/ui/ozone/platform/wayland/test/test_keyboard.h b/ui/ozone/platform/wayland/test/test_keyboard.h
index 791b52e1..ce46acb 100644
--- a/ui/ozone/platform/wayland/test/test_keyboard.h
+++ b/ui/ozone/platform/wayland/test/test_keyboard.h
@@ -13,7 +13,7 @@
 
 namespace wl {
 
-extern const struct wl_pointer_interface kTestKeyboardImpl;
+extern const struct wl_keyboard_interface kTestKeyboardImpl;
 
 class TestKeyboard : public ServerObject {
  public:
diff --git a/ui/ozone/platform/wayland/test/test_touch.cc b/ui/ozone/platform/wayland/test/test_touch.cc
index 784c0c1c7..2780107 100644
--- a/ui/ozone/platform/wayland/test/test_touch.cc
+++ b/ui/ozone/platform/wayland/test/test_touch.cc
@@ -6,8 +6,7 @@
 
 namespace wl {
 
-const struct wl_pointer_interface kTestTouchImpl = {
-    nullptr,           // set_cursor
+const struct wl_touch_interface kTestTouchImpl = {
     &DestroyResource,  // release
 };
 
diff --git a/ui/ozone/platform/wayland/test/test_touch.h b/ui/ozone/platform/wayland/test/test_touch.h
index 1f004243..3a87c86 100644
--- a/ui/ozone/platform/wayland/test/test_touch.h
+++ b/ui/ozone/platform/wayland/test/test_touch.h
@@ -14,7 +14,7 @@
 
 namespace wl {
 
-extern const struct wl_pointer_interface kTestTouchImpl;
+extern const struct wl_touch_interface kTestTouchImpl;
 
 class TestZcrTouchStylus;
 
diff --git a/ui/ozone/platform/wayland/test/wayland_test.h b/ui/ozone/platform/wayland/test/wayland_test.h
index 02acdf2..4905e46 100644
--- a/ui/ozone/platform/wayland/test/wayland_test.h
+++ b/ui/ozone/platform/wayland/test/wayland_test.h
@@ -46,7 +46,7 @@
   void SetUp();
   void TearDown();
 
-  // Posts 'callback' or 'closure' to run on the client thread; blocks till the
+  // Posts 'callback' or 'closure' to run on the server thread; blocks till the
   // callable is run and all pending Wayland requests and events are delivered.
   void PostToServerAndWait(
       base::OnceCallback<void(wl::TestWaylandServerThread* server)> callback);
diff --git a/ui/strings/translations/ax_strings_id.xtb b/ui/strings/translations/ax_strings_id.xtb
index eb3e9dc..931f736e 100644
--- a/ui/strings/translations/ax_strings_id.xtb
+++ b/ui/strings/translations/ax_strings_id.xtb
@@ -46,7 +46,7 @@
 <translation id="3920932319529768807">kesimpulan</translation>
 <translation id="3924558731517983934">aplikasi</translation>
 <translation id="3944740393230681990">prolog</translation>
-<translation id="3960700977367013758">bilah gulir</translation>
+<translation id="3960700977367013758">scroll bar</translation>
 <translation id="4151657705144244502">grafis</translation>
 <translation id="4160057747563657758">telepon</translation>
 <translation id="4193965531860883258">kata pengantar</translation>
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb
index d4c5754..0877ab5 100644
--- a/ui/strings/translations/ui_strings_id.xtb
+++ b/ui/strings/translations/ui_strings_id.xtb
@@ -75,7 +75,7 @@
 <translation id="3087734570205094154">Bawah</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3157931365184549694">Pulihkan</translation>
-<translation id="3183922693828471536">Gulir ke Sini</translation>
+<translation id="3183922693828471536">Scroll ke Sini</translation>
 <translation id="3234408098842461169">Panah Bawah</translation>
 <translation id="3240426699337459095">Tautan disalin</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 hari}other{# hari}}</translation>
@@ -107,7 +107,7 @@
 <translation id="4289540628985791613">Ringkasan</translation>
 <translation id="4491109536499578614">Gambar</translation>
 <translation id="4565377596337484307">Sembunyikan sandi</translation>
-<translation id="4588090240171750605">Gulir ke Kanan</translation>
+<translation id="4588090240171750605">Scroll ke Kanan</translation>
 <translation id="4689010477870442157">{YEARS,plural, =1{1 Tahun Lalu}other{# Tahun Lalu}}</translation>
 <translation id="4724120544754982507">Pusat Notifikasi, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifikasi belum dibaca</translation>
 <translation id="4729257764711776855">nomor</translation>
@@ -149,7 +149,7 @@
 <translation id="6237461503717005873"><ph name="ROW_NAME" /> dipilih.</translation>
 <translation id="6264365405983206840">Pilih Semu&amp;a</translation>
 <translation id="6346952829206698721">Tempel dari papan klip</translation>
-<translation id="6364916375976753737">Gulir ke Kiri</translation>
+<translation id="6364916375976753737">Scroll ke Kiri</translation>
 <translation id="6394627529324717982">Koma</translation>
 <translation id="6397363302884558537">Berhenti Berbicara</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 dtk yang lalu}other{# dtk yang lalu}}</translation>
@@ -196,14 +196,14 @@
 <translation id="8106081041558092062">{HOURS,plural, =1{1 jam yang lalu}other{# jam yang lalu}}</translation>
 <translation id="8131263257437993507">{SECONDS,plural, =1{1 dtk lagi}other{# dtk lagi}}</translation>
 <translation id="8134065097954893699">Memuat ulang halaman ini</translation>
-<translation id="815598010540052116">Gulir ke Bawah</translation>
+<translation id="815598010540052116">Scroll ke Bawah</translation>
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8210608804940886430">Page Down</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8245914219290430011">Tab</translation>
 <translation id="8259556432390118667">Nilai warna hex</translation>
 <translation id="8328145009876646418">Tepi Kiri</translation>
-<translation id="8331626408530291785">Gulir ke Atas</translation>
+<translation id="8331626408530291785">Scroll ke Atas</translation>
 <translation id="8352146631962686268">{YEARS,plural, =1{1 tahun}other{# tahun}}</translation>
 <translation id="8393700583063109961">Kirim pesan</translation>
 <translation id="8394908167088220973">Putar/Jeda Media</translation>
diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc
index 8bd1ce8..82efa0d 100644
--- a/ui/views/controls/menu/menu_controller_unittest.cc
+++ b/ui/views/controls/menu/menu_controller_unittest.cc
@@ -1040,7 +1040,7 @@
 
   GetRootWindow(owner())->RemovePreTargetHandler(&test_event_handler);
 }
-#endif  // defined(USE_OZONE_PLATFORM_X11)
+#endif  // BUILDFLAG(IS_OZONE_X11)
 
 // Tests that initial selected menu items are correct when items are enabled or
 // disabled.
diff --git a/v8 b/v8
index 279e031..0d37bab 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 279e0319cb5e66dbed2cdd32ed1699a3b64a9695
+Subproject commit 0d37babc6f0101301fece0d680cb63f77b27c012